diff options
author | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2010-11-16 14:06:22 -0500 |
---|---|---|
committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2010-11-16 14:06:22 -0500 |
commit | 20b4755e4fbb226eb42951bd40b53fcbce9ef944 (patch) | |
tree | 43da70e0b32ee423d3643ecd422821383411ab72 /include | |
parent | 744f9f104ea262de1dc3e29265870c649f0d9473 (diff) | |
parent | e53beacd23d9cb47590da6a7a7f6d417b941a994 (diff) |
Merge commit 'v2.6.37-rc2' into upstream/xenfs
* commit 'v2.6.37-rc2': (10093 commits)
Linux 2.6.37-rc2
capabilities/syslog: open code cap_syslog logic to fix build failure
i2c: Sanity checks on adapter registration
i2c: Mark i2c_adapter.id as deprecated
i2c: Drivers shouldn't include <linux/i2c-id.h>
i2c: Delete unused adapter IDs
i2c: Remove obsolete cleanup for clientdata
include/linux/kernel.h: Move logging bits to include/linux/printk.h
Fix gcc 4.5.1 miscompiling drivers/char/i8k.c (again)
hwmon: (w83795) Check for BEEP pin availability
hwmon: (w83795) Clear intrusion alarm immediately
hwmon: (w83795) Read the intrusion state properly
hwmon: (w83795) Print the actual temperature channels as sources
hwmon: (w83795) List all usable temperature sources
hwmon: (w83795) Expose fan control method
hwmon: (w83795) Fix fan control mode attributes
hwmon: (lm95241) Check validity of input values
hwmon: Change mail address of Hans J. Koch
PCI: sysfs: fix printk warnings
GFS2: Fix inode deallocation race
...
Diffstat (limited to 'include')
534 files changed, 15296 insertions, 6211 deletions
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 4de84ce3a927..359ef11725a6 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -184,7 +184,7 @@ struct acpi_device_pnp { | |||
184 | 184 | ||
185 | #define acpi_device_bid(d) ((d)->pnp.bus_id) | 185 | #define acpi_device_bid(d) ((d)->pnp.bus_id) |
186 | #define acpi_device_adr(d) ((d)->pnp.bus_address) | 186 | #define acpi_device_adr(d) ((d)->pnp.bus_address) |
187 | char *acpi_device_hid(struct acpi_device *device); | 187 | const char *acpi_device_hid(struct acpi_device *device); |
188 | #define acpi_device_name(d) ((d)->pnp.device_name) | 188 | #define acpi_device_name(d) ((d)->pnp.device_name) |
189 | #define acpi_device_class(d) ((d)->pnp.device_class) | 189 | #define acpi_device_class(d) ((d)->pnp.device_class) |
190 | 190 | ||
@@ -389,21 +389,25 @@ struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle); | |||
389 | int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state); | 389 | int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state); |
390 | int acpi_disable_wakeup_device_power(struct acpi_device *dev); | 390 | int acpi_disable_wakeup_device_power(struct acpi_device *dev); |
391 | 391 | ||
392 | #ifdef CONFIG_PM_SLEEP | 392 | #ifdef CONFIG_PM_OPS |
393 | int acpi_pm_device_sleep_state(struct device *, int *); | 393 | int acpi_pm_device_sleep_state(struct device *, int *); |
394 | int acpi_pm_device_sleep_wake(struct device *, bool); | 394 | #else |
395 | #else /* !CONFIG_PM_SLEEP */ | ||
396 | static inline int acpi_pm_device_sleep_state(struct device *d, int *p) | 395 | static inline int acpi_pm_device_sleep_state(struct device *d, int *p) |
397 | { | 396 | { |
398 | if (p) | 397 | if (p) |
399 | *p = ACPI_STATE_D0; | 398 | *p = ACPI_STATE_D0; |
400 | return ACPI_STATE_D3; | 399 | return ACPI_STATE_D3; |
401 | } | 400 | } |
401 | #endif | ||
402 | |||
403 | #ifdef CONFIG_PM_SLEEP | ||
404 | int acpi_pm_device_sleep_wake(struct device *, bool); | ||
405 | #else | ||
402 | static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable) | 406 | static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable) |
403 | { | 407 | { |
404 | return -ENODEV; | 408 | return -ENODEV; |
405 | } | 409 | } |
406 | #endif /* !CONFIG_PM_SLEEP */ | 410 | #endif |
407 | 411 | ||
408 | #endif /* CONFIG_ACPI */ | 412 | #endif /* CONFIG_ACPI */ |
409 | 413 | ||
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h index 23d78b4d088b..3090471b2a5e 100644 --- a/include/acpi/acpi_drivers.h +++ b/include/acpi/acpi_drivers.h | |||
@@ -115,8 +115,6 @@ void pci_acpi_crs_quirks(void); | |||
115 | #define ACPI_PROCESSOR_LIMIT_INCREMENT 0x01 | 115 | #define ACPI_PROCESSOR_LIMIT_INCREMENT 0x01 |
116 | #define ACPI_PROCESSOR_LIMIT_DECREMENT 0x02 | 116 | #define ACPI_PROCESSOR_LIMIT_DECREMENT 0x02 |
117 | 117 | ||
118 | int acpi_processor_set_thermal_limit(acpi_handle handle, int type); | ||
119 | |||
120 | /*-------------------------------------------------------------------------- | 118 | /*-------------------------------------------------------------------------- |
121 | Dock Station | 119 | Dock Station |
122 | -------------------------------------------------------------------------- */ | 120 | -------------------------------------------------------------------------- */ |
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 29bf945143e8..65b3f5888f42 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -98,8 +98,6 @@ acpi_os_table_override(struct acpi_table_header *existing_table, | |||
98 | /* | 98 | /* |
99 | * Spinlock primitives | 99 | * Spinlock primitives |
100 | */ | 100 | */ |
101 | acpi_status acpi_os_create_lock(acpi_spinlock * out_handle); | ||
102 | |||
103 | void acpi_os_delete_lock(acpi_spinlock handle); | 101 | void acpi_os_delete_lock(acpi_spinlock handle); |
104 | 102 | ||
105 | acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle); | 103 | acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle); |
@@ -223,25 +221,15 @@ acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width); | |||
223 | */ | 221 | */ |
224 | acpi_status | 222 | acpi_status |
225 | acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, | 223 | acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, |
226 | u32 reg, u32 *value, u32 width); | 224 | u32 reg, u64 *value, u32 width); |
227 | 225 | ||
228 | acpi_status | 226 | acpi_status |
229 | acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, | 227 | acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, |
230 | u32 reg, u64 value, u32 width); | 228 | u32 reg, u64 value, u32 width); |
231 | 229 | ||
232 | /* | 230 | /* |
233 | * Interim function needed for PCI IRQ routing | ||
234 | */ | ||
235 | void | ||
236 | acpi_os_derive_pci_id(acpi_handle device, | ||
237 | acpi_handle region, struct acpi_pci_id **pci_id); | ||
238 | |||
239 | /* | ||
240 | * Miscellaneous | 231 | * Miscellaneous |
241 | */ | 232 | */ |
242 | acpi_status acpi_os_validate_interface(char *interface); | ||
243 | acpi_status acpi_osi_invalidate(char* interface); | ||
244 | |||
245 | acpi_status | 233 | acpi_status |
246 | acpi_os_validate_address(u8 space_id, acpi_physical_address address, | 234 | acpi_os_validate_address(u8 space_id, acpi_physical_address address, |
247 | acpi_size length, char *name); | 235 | acpi_size length, char *name); |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 984cdc62e30b..53b7cfd924a3 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -47,7 +47,7 @@ | |||
47 | 47 | ||
48 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 48 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
49 | 49 | ||
50 | #define ACPI_CA_VERSION 0x20100702 | 50 | #define ACPI_CA_VERSION 0x20101013 |
51 | 51 | ||
52 | #include "actypes.h" | 52 | #include "actypes.h" |
53 | #include "actbl.h" | 53 | #include "actbl.h" |
@@ -72,6 +72,7 @@ extern u8 acpi_gbl_truncate_io_addresses; | |||
72 | 72 | ||
73 | extern u32 acpi_current_gpe_count; | 73 | extern u32 acpi_current_gpe_count; |
74 | extern struct acpi_table_fadt acpi_gbl_FADT; | 74 | extern struct acpi_table_fadt acpi_gbl_FADT; |
75 | extern u8 acpi_gbl_system_awake_and_running; | ||
75 | 76 | ||
76 | extern u32 acpi_rsdt_forced; | 77 | extern u32 acpi_rsdt_forced; |
77 | /* | 78 | /* |
@@ -105,6 +106,10 @@ const char *acpi_format_exception(acpi_status exception); | |||
105 | 106 | ||
106 | acpi_status acpi_purge_cached_objects(void); | 107 | acpi_status acpi_purge_cached_objects(void); |
107 | 108 | ||
109 | acpi_status acpi_install_interface(acpi_string interface_name); | ||
110 | |||
111 | acpi_status acpi_remove_interface(acpi_string interface_name); | ||
112 | |||
108 | /* | 113 | /* |
109 | * ACPI Memory management | 114 | * ACPI Memory management |
110 | */ | 115 | */ |
@@ -263,6 +268,8 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, | |||
263 | acpi_status acpi_install_exception_handler(acpi_exception_handler handler); | 268 | acpi_status acpi_install_exception_handler(acpi_exception_handler handler); |
264 | #endif | 269 | #endif |
265 | 270 | ||
271 | acpi_status acpi_install_interface_handler(acpi_interface_handler handler); | ||
272 | |||
266 | /* | 273 | /* |
267 | * Event interfaces | 274 | * Event interfaces |
268 | */ | 275 | */ |
@@ -308,6 +315,8 @@ acpi_install_gpe_block(acpi_handle gpe_device, | |||
308 | 315 | ||
309 | acpi_status acpi_remove_gpe_block(acpi_handle gpe_device); | 316 | acpi_status acpi_remove_gpe_block(acpi_handle gpe_device); |
310 | 317 | ||
318 | acpi_status acpi_update_gpes(void); | ||
319 | |||
311 | /* | 320 | /* |
312 | * Resource interfaces | 321 | * Resource interfaces |
313 | */ | 322 | */ |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 5db8f472fec9..2b134b691e34 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -115,7 +115,6 @@ | |||
115 | * | 115 | * |
116 | * ACPI_SIZE 16/32/64-bit unsigned value | 116 | * ACPI_SIZE 16/32/64-bit unsigned value |
117 | * ACPI_NATIVE_INT 16/32/64-bit signed value | 117 | * ACPI_NATIVE_INT 16/32/64-bit signed value |
118 | * | ||
119 | */ | 118 | */ |
120 | 119 | ||
121 | /******************************************************************************* | 120 | /******************************************************************************* |
@@ -132,6 +131,16 @@ typedef COMPILER_DEPENDENT_INT64 INT64; | |||
132 | 131 | ||
133 | /*! [End] no source code translation !*/ | 132 | /*! [End] no source code translation !*/ |
134 | 133 | ||
134 | /* | ||
135 | * Value returned by acpi_os_get_thread_id. There is no standard "thread_id" | ||
136 | * across operating systems or even the various UNIX systems. Since ACPICA | ||
137 | * only needs the thread ID as a unique thread identifier, we use a u64 | ||
138 | * as the only common data type - it will accommodate any type of pointer or | ||
139 | * any type of integer. It is up to the host-dependent OSL to cast the | ||
140 | * native thread ID type to a u64 (in acpi_os_get_thread_id). | ||
141 | */ | ||
142 | #define acpi_thread_id u64 | ||
143 | |||
135 | /******************************************************************************* | 144 | /******************************************************************************* |
136 | * | 145 | * |
137 | * Types specific to 64-bit targets | 146 | * Types specific to 64-bit targets |
@@ -211,12 +220,6 @@ typedef u32 acpi_physical_address; | |||
211 | * | 220 | * |
212 | ******************************************************************************/ | 221 | ******************************************************************************/ |
213 | 222 | ||
214 | /* Value returned by acpi_os_get_thread_id */ | ||
215 | |||
216 | #ifndef acpi_thread_id | ||
217 | #define acpi_thread_id acpi_size | ||
218 | #endif | ||
219 | |||
220 | /* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ | 223 | /* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ |
221 | 224 | ||
222 | #ifndef acpi_cpu_flags | 225 | #ifndef acpi_cpu_flags |
@@ -375,16 +378,6 @@ typedef void *acpi_handle; /* Actually a ptr to a NS Node */ | |||
375 | typedef u8 acpi_owner_id; | 378 | typedef u8 acpi_owner_id; |
376 | #define ACPI_OWNER_ID_MAX 0xFF | 379 | #define ACPI_OWNER_ID_MAX 0xFF |
377 | 380 | ||
378 | struct uint64_struct { | ||
379 | u32 lo; | ||
380 | u32 hi; | ||
381 | }; | ||
382 | |||
383 | union uint64_overlay { | ||
384 | u64 full; | ||
385 | struct uint64_struct part; | ||
386 | }; | ||
387 | |||
388 | #define ACPI_INTEGER_BIT_SIZE 64 | 381 | #define ACPI_INTEGER_BIT_SIZE 64 |
389 | #define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */ | 382 | #define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */ |
390 | 383 | ||
@@ -950,6 +943,9 @@ acpi_status(*acpi_walk_callback) (acpi_handle object, | |||
950 | u32 nesting_level, | 943 | u32 nesting_level, |
951 | void *context, void **return_value); | 944 | void *context, void **return_value); |
952 | 945 | ||
946 | typedef | ||
947 | u32 (*acpi_interface_handler) (acpi_string interface_name, u32 supported); | ||
948 | |||
953 | /* Interrupt handler return values */ | 949 | /* Interrupt handler return values */ |
954 | 950 | ||
955 | #define ACPI_INTERRUPT_NOT_HANDLED 0x00 | 951 | #define ACPI_INTERRUPT_NOT_HANDLED 0x00 |
diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h index c05aeba9e8f0..a3e334ab1119 100644 --- a/include/acpi/platform/acenv.h +++ b/include/acpi/platform/acenv.h | |||
@@ -193,6 +193,12 @@ | |||
193 | #define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE | 193 | #define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE |
194 | #endif | 194 | #endif |
195 | 195 | ||
196 | /* "inline" keywords - configurable since inline is not standardized */ | ||
197 | |||
198 | #ifndef ACPI_INLINE | ||
199 | #define ACPI_INLINE | ||
200 | #endif | ||
201 | |||
196 | /* | 202 | /* |
197 | * Debugger threading model | 203 | * Debugger threading model |
198 | * Use single threaded if the entire subsystem is contained in an application | 204 | * Use single threaded if the entire subsystem is contained in an application |
diff --git a/include/acpi/platform/acgcc.h b/include/acpi/platform/acgcc.h index 0cd53e3cd1a3..5dcb9537343c 100644 --- a/include/acpi/platform/acgcc.h +++ b/include/acpi/platform/acgcc.h | |||
@@ -44,6 +44,8 @@ | |||
44 | #ifndef __ACGCC_H__ | 44 | #ifndef __ACGCC_H__ |
45 | #define __ACGCC_H__ | 45 | #define __ACGCC_H__ |
46 | 46 | ||
47 | #define ACPI_INLINE __inline__ | ||
48 | |||
47 | /* Function name is used for debug output. Non-ANSI, compiler-dependent */ | 49 | /* Function name is used for debug output. Non-ANSI, compiler-dependent */ |
48 | 50 | ||
49 | #define ACPI_GET_FUNCTION_NAME __func__ | 51 | #define ACPI_GET_FUNCTION_NAME __func__ |
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 103f08aca764..572189e37133 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h | |||
@@ -75,7 +75,6 @@ | |||
75 | #define acpi_cache_t struct kmem_cache | 75 | #define acpi_cache_t struct kmem_cache |
76 | #define acpi_spinlock spinlock_t * | 76 | #define acpi_spinlock spinlock_t * |
77 | #define acpi_cpu_flags unsigned long | 77 | #define acpi_cpu_flags unsigned long |
78 | #define acpi_thread_id struct task_struct * | ||
79 | 78 | ||
80 | #else /* !__KERNEL__ */ | 79 | #else /* !__KERNEL__ */ |
81 | 80 | ||
@@ -88,7 +87,7 @@ | |||
88 | /* Host-dependent types and defines for user-space ACPICA */ | 87 | /* Host-dependent types and defines for user-space ACPICA */ |
89 | 88 | ||
90 | #define ACPI_FLUSH_CPU_CACHE() | 89 | #define ACPI_FLUSH_CPU_CACHE() |
91 | #define acpi_thread_id pthread_t | 90 | #define ACPI_CAST_PTHREAD_T(pthread) ((acpi_thread_id) (pthread)) |
92 | 91 | ||
93 | #if defined(__ia64__) || defined(__x86_64__) | 92 | #if defined(__ia64__) || defined(__x86_64__) |
94 | #define ACPI_MACHINE_WIDTH 64 | 93 | #define ACPI_MACHINE_WIDTH 64 |
@@ -113,12 +112,13 @@ | |||
113 | 112 | ||
114 | 113 | ||
115 | #ifdef __KERNEL__ | 114 | #ifdef __KERNEL__ |
115 | #include <acpi/actypes.h> | ||
116 | /* | 116 | /* |
117 | * Overrides for in-kernel ACPICA | 117 | * Overrides for in-kernel ACPICA |
118 | */ | 118 | */ |
119 | static inline acpi_thread_id acpi_os_get_thread_id(void) | 119 | static inline acpi_thread_id acpi_os_get_thread_id(void) |
120 | { | 120 | { |
121 | return current; | 121 | return (acpi_thread_id)(unsigned long)current; |
122 | } | 122 | } |
123 | 123 | ||
124 | /* | 124 | /* |
@@ -127,7 +127,6 @@ static inline acpi_thread_id acpi_os_get_thread_id(void) | |||
127 | * However, boot has (system_state != SYSTEM_RUNNING) | 127 | * However, boot has (system_state != SYSTEM_RUNNING) |
128 | * to quiet __might_sleep() in kmalloc() and resume does not. | 128 | * to quiet __might_sleep() in kmalloc() and resume does not. |
129 | */ | 129 | */ |
130 | #include <acpi/actypes.h> | ||
131 | static inline void *acpi_os_allocate(acpi_size size) | 130 | static inline void *acpi_os_allocate(acpi_size size) |
132 | { | 131 | { |
133 | return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); | 132 | return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); |
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index e53347fbf1da..e994197f84b7 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h | |||
@@ -43,6 +43,7 @@ | |||
43 | */ | 43 | */ |
44 | #define atomic_set(v, i) (((v)->counter) = (i)) | 44 | #define atomic_set(v, i) (((v)->counter) = (i)) |
45 | 45 | ||
46 | #include <linux/irqflags.h> | ||
46 | #include <asm/system.h> | 47 | #include <asm/system.h> |
47 | 48 | ||
48 | /** | 49 | /** |
@@ -57,7 +58,7 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
57 | unsigned long flags; | 58 | unsigned long flags; |
58 | int temp; | 59 | int temp; |
59 | 60 | ||
60 | raw_local_irq_save(flags); /* Don't trace it in a irqsoff handler */ | 61 | raw_local_irq_save(flags); /* Don't trace it in an irqsoff handler */ |
61 | temp = v->counter; | 62 | temp = v->counter; |
62 | temp += i; | 63 | temp += i; |
63 | v->counter = temp; | 64 | v->counter = temp; |
@@ -78,7 +79,7 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
78 | unsigned long flags; | 79 | unsigned long flags; |
79 | int temp; | 80 | int temp; |
80 | 81 | ||
81 | raw_local_irq_save(flags); /* Don't trace it in a irqsoff handler */ | 82 | raw_local_irq_save(flags); /* Don't trace it in an irqsoff handler */ |
82 | temp = v->counter; | 83 | temp = v->counter; |
83 | temp -= i; | 84 | temp -= i; |
84 | v->counter = temp; | 85 | v->counter = temp; |
@@ -119,14 +120,23 @@ static inline void atomic_dec(atomic_t *v) | |||
119 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | 120 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) |
120 | #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) | 121 | #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) |
121 | 122 | ||
122 | #define atomic_add_unless(v, a, u) \ | 123 | #define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) |
123 | ({ \ | 124 | #define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) |
124 | int c, old; \ | 125 | |
125 | c = atomic_read(v); \ | 126 | #define cmpxchg_local(ptr, o, n) \ |
126 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | 127 | ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ |
127 | c = old; \ | 128 | (unsigned long)(n), sizeof(*(ptr)))) |
128 | c != (u); \ | 129 | |
129 | }) | 130 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) |
131 | |||
132 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | ||
133 | { | ||
134 | int c, old; | ||
135 | c = atomic_read(v); | ||
136 | while (c != u && (old = atomic_cmpxchg(v, c, c + a)) != c) | ||
137 | c = old; | ||
138 | return c != u; | ||
139 | } | ||
130 | 140 | ||
131 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 141 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
132 | 142 | ||
@@ -140,15 +150,6 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) | |||
140 | raw_local_irq_restore(flags); | 150 | raw_local_irq_restore(flags); |
141 | } | 151 | } |
142 | 152 | ||
143 | #define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) | ||
144 | #define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) | ||
145 | |||
146 | #define cmpxchg_local(ptr, o, n) \ | ||
147 | ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ | ||
148 | (unsigned long)(n), sizeof(*(ptr)))) | ||
149 | |||
150 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | ||
151 | |||
152 | /* Assume that atomic operations are already serializing */ | 153 | /* Assume that atomic operations are already serializing */ |
153 | #define smp_mb__before_atomic_dec() barrier() | 154 | #define smp_mb__before_atomic_dec() barrier() |
154 | #define smp_mb__after_atomic_dec() barrier() | 155 | #define smp_mb__after_atomic_dec() barrier() |
diff --git a/include/asm-generic/audit_change_attr.h b/include/asm-generic/audit_change_attr.h index 50764550a60c..bcbab3e4a3be 100644 --- a/include/asm-generic/audit_change_attr.h +++ b/include/asm-generic/audit_change_attr.h | |||
@@ -20,3 +20,7 @@ __NR_chown32, | |||
20 | __NR_fchown32, | 20 | __NR_fchown32, |
21 | __NR_lchown32, | 21 | __NR_lchown32, |
22 | #endif | 22 | #endif |
23 | __NR_link, | ||
24 | #ifdef __NR_linkat | ||
25 | __NR_linkat, | ||
26 | #endif | ||
diff --git a/include/asm-generic/bitops/find.h b/include/asm-generic/bitops/find.h index 1914e9742512..110fa700f853 100644 --- a/include/asm-generic/bitops/find.h +++ b/include/asm-generic/bitops/find.h | |||
@@ -1,15 +1,50 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_FIND_H_ | 1 | #ifndef _ASM_GENERIC_BITOPS_FIND_H_ |
2 | #define _ASM_GENERIC_BITOPS_FIND_H_ | 2 | #define _ASM_GENERIC_BITOPS_FIND_H_ |
3 | 3 | ||
4 | #ifndef CONFIG_GENERIC_FIND_NEXT_BIT | 4 | /** |
5 | * find_next_bit - find the next set bit in a memory region | ||
6 | * @addr: The address to base the search on | ||
7 | * @offset: The bitnumber to start searching at | ||
8 | * @size: The bitmap size in bits | ||
9 | */ | ||
5 | extern unsigned long find_next_bit(const unsigned long *addr, unsigned long | 10 | extern unsigned long find_next_bit(const unsigned long *addr, unsigned long |
6 | size, unsigned long offset); | 11 | size, unsigned long offset); |
7 | 12 | ||
13 | /** | ||
14 | * find_next_zero_bit - find the next cleared bit in a memory region | ||
15 | * @addr: The address to base the search on | ||
16 | * @offset: The bitnumber to start searching at | ||
17 | * @size: The bitmap size in bits | ||
18 | */ | ||
8 | extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned | 19 | extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned |
9 | long size, unsigned long offset); | 20 | long size, unsigned long offset); |
10 | #endif | 21 | |
22 | #ifdef CONFIG_GENERIC_FIND_FIRST_BIT | ||
23 | |||
24 | /** | ||
25 | * find_first_bit - find the first set bit in a memory region | ||
26 | * @addr: The address to start the search at | ||
27 | * @size: The maximum size to search | ||
28 | * | ||
29 | * Returns the bit number of the first set bit. | ||
30 | */ | ||
31 | extern unsigned long find_first_bit(const unsigned long *addr, | ||
32 | unsigned long size); | ||
33 | |||
34 | /** | ||
35 | * find_first_zero_bit - find the first cleared bit in a memory region | ||
36 | * @addr: The address to start the search at | ||
37 | * @size: The maximum size to search | ||
38 | * | ||
39 | * Returns the bit number of the first cleared bit. | ||
40 | */ | ||
41 | extern unsigned long find_first_zero_bit(const unsigned long *addr, | ||
42 | unsigned long size); | ||
43 | #else /* CONFIG_GENERIC_FIND_FIRST_BIT */ | ||
11 | 44 | ||
12 | #define find_first_bit(addr, size) find_next_bit((addr), (size), 0) | 45 | #define find_first_bit(addr, size) find_next_bit((addr), (size), 0) |
13 | #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) | 46 | #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) |
14 | 47 | ||
48 | #endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ | ||
49 | |||
15 | #endif /*_ASM_GENERIC_BITOPS_FIND_H_ */ | 50 | #endif /*_ASM_GENERIC_BITOPS_FIND_H_ */ |
diff --git a/include/asm-generic/cmpxchg-local.h b/include/asm-generic/cmpxchg-local.h index b2ba2fc8829a..2533fddd34a6 100644 --- a/include/asm-generic/cmpxchg-local.h +++ b/include/asm-generic/cmpxchg-local.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ASM_GENERIC_CMPXCHG_LOCAL_H | 2 | #define __ASM_GENERIC_CMPXCHG_LOCAL_H |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <linux/irqflags.h> | ||
5 | 6 | ||
6 | extern unsigned long wrong_size_cmpxchg(volatile void *ptr); | 7 | extern unsigned long wrong_size_cmpxchg(volatile void *ptr); |
7 | 8 | ||
diff --git a/include/asm-generic/cputime.h b/include/asm-generic/cputime.h index ca0f239f0e13..2bcc5c7c22a6 100644 --- a/include/asm-generic/cputime.h +++ b/include/asm-generic/cputime.h | |||
@@ -33,10 +33,10 @@ typedef u64 cputime64_t; | |||
33 | 33 | ||
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Convert cputime to milliseconds and back. | 36 | * Convert cputime to microseconds and back. |
37 | */ | 37 | */ |
38 | #define cputime_to_msecs(__ct) jiffies_to_msecs(__ct) | 38 | #define cputime_to_usecs(__ct) jiffies_to_usecs(__ct); |
39 | #define msecs_to_cputime(__msecs) msecs_to_jiffies(__msecs) | 39 | #define usecs_to_cputime(__msecs) usecs_to_jiffies(__msecs); |
40 | 40 | ||
41 | /* | 41 | /* |
42 | * Convert cputime to seconds and back. | 42 | * Convert cputime to seconds and back. |
diff --git a/include/asm-generic/fcntl.h b/include/asm-generic/fcntl.h index a70b2d2bfc14..0fc16e3f0bfc 100644 --- a/include/asm-generic/fcntl.h +++ b/include/asm-generic/fcntl.h | |||
@@ -122,7 +122,7 @@ | |||
122 | 122 | ||
123 | struct f_owner_ex { | 123 | struct f_owner_ex { |
124 | int type; | 124 | int type; |
125 | pid_t pid; | 125 | __kernel_pid_t pid; |
126 | }; | 126 | }; |
127 | 127 | ||
128 | /* for F_[GET|SET]FL */ | 128 | /* for F_[GET|SET]FL */ |
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index 8ca18e26d7e3..ff5c66080c8c 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h | |||
@@ -210,7 +210,7 @@ extern void gpio_unexport(unsigned gpio); | |||
210 | 210 | ||
211 | #endif /* CONFIG_GPIO_SYSFS */ | 211 | #endif /* CONFIG_GPIO_SYSFS */ |
212 | 212 | ||
213 | #else /* !CONFIG_HAVE_GPIO_LIB */ | 213 | #else /* !CONFIG_GPIOLIB */ |
214 | 214 | ||
215 | static inline int gpio_is_valid(int number) | 215 | static inline int gpio_is_valid(int number) |
216 | { | 216 | { |
@@ -239,7 +239,7 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value) | |||
239 | gpio_set_value(gpio, value); | 239 | gpio_set_value(gpio, value); |
240 | } | 240 | } |
241 | 241 | ||
242 | #endif /* !CONFIG_HAVE_GPIO_LIB */ | 242 | #endif /* !CONFIG_GPIOLIB */ |
243 | 243 | ||
244 | #ifndef CONFIG_GPIO_SYSFS | 244 | #ifndef CONFIG_GPIO_SYSFS |
245 | 245 | ||
diff --git a/include/asm-generic/hardirq.h b/include/asm-generic/hardirq.h index 62f59080e5cc..04d0a977cd43 100644 --- a/include/asm-generic/hardirq.h +++ b/include/asm-generic/hardirq.h | |||
@@ -3,13 +3,13 @@ | |||
3 | 3 | ||
4 | #include <linux/cache.h> | 4 | #include <linux/cache.h> |
5 | #include <linux/threads.h> | 5 | #include <linux/threads.h> |
6 | #include <linux/irq.h> | ||
7 | 6 | ||
8 | typedef struct { | 7 | typedef struct { |
9 | unsigned int __softirq_pending; | 8 | unsigned int __softirq_pending; |
10 | } ____cacheline_aligned irq_cpustat_t; | 9 | } ____cacheline_aligned irq_cpustat_t; |
11 | 10 | ||
12 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | 11 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ |
12 | #include <linux/irq.h> | ||
13 | 13 | ||
14 | #ifndef ack_bad_irq | 14 | #ifndef ack_bad_irq |
15 | static inline void ack_bad_irq(unsigned int irq) | 15 | static inline void ack_bad_irq(unsigned int irq) |
diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 118601fce92d..3577ca11a0be 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h | |||
@@ -19,7 +19,9 @@ | |||
19 | #include <asm-generic/iomap.h> | 19 | #include <asm-generic/iomap.h> |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #ifndef mmiowb | ||
22 | #define mmiowb() do {} while (0) | 23 | #define mmiowb() do {} while (0) |
24 | #endif | ||
23 | 25 | ||
24 | /*****************************************************************************/ | 26 | /*****************************************************************************/ |
25 | /* | 27 | /* |
@@ -28,39 +30,51 @@ | |||
28 | * differently. On the simple architectures, we just read/write the | 30 | * differently. On the simple architectures, we just read/write the |
29 | * memory location directly. | 31 | * memory location directly. |
30 | */ | 32 | */ |
33 | #ifndef __raw_readb | ||
31 | static inline u8 __raw_readb(const volatile void __iomem *addr) | 34 | static inline u8 __raw_readb(const volatile void __iomem *addr) |
32 | { | 35 | { |
33 | return *(const volatile u8 __force *) addr; | 36 | return *(const volatile u8 __force *) addr; |
34 | } | 37 | } |
38 | #endif | ||
35 | 39 | ||
40 | #ifndef __raw_readw | ||
36 | static inline u16 __raw_readw(const volatile void __iomem *addr) | 41 | static inline u16 __raw_readw(const volatile void __iomem *addr) |
37 | { | 42 | { |
38 | return *(const volatile u16 __force *) addr; | 43 | return *(const volatile u16 __force *) addr; |
39 | } | 44 | } |
45 | #endif | ||
40 | 46 | ||
47 | #ifndef __raw_readl | ||
41 | static inline u32 __raw_readl(const volatile void __iomem *addr) | 48 | static inline u32 __raw_readl(const volatile void __iomem *addr) |
42 | { | 49 | { |
43 | return *(const volatile u32 __force *) addr; | 50 | return *(const volatile u32 __force *) addr; |
44 | } | 51 | } |
52 | #endif | ||
45 | 53 | ||
46 | #define readb __raw_readb | 54 | #define readb __raw_readb |
47 | #define readw(addr) __le16_to_cpu(__raw_readw(addr)) | 55 | #define readw(addr) __le16_to_cpu(__raw_readw(addr)) |
48 | #define readl(addr) __le32_to_cpu(__raw_readl(addr)) | 56 | #define readl(addr) __le32_to_cpu(__raw_readl(addr)) |
49 | 57 | ||
58 | #ifndef __raw_writeb | ||
50 | static inline void __raw_writeb(u8 b, volatile void __iomem *addr) | 59 | static inline void __raw_writeb(u8 b, volatile void __iomem *addr) |
51 | { | 60 | { |
52 | *(volatile u8 __force *) addr = b; | 61 | *(volatile u8 __force *) addr = b; |
53 | } | 62 | } |
63 | #endif | ||
54 | 64 | ||
65 | #ifndef __raw_writew | ||
55 | static inline void __raw_writew(u16 b, volatile void __iomem *addr) | 66 | static inline void __raw_writew(u16 b, volatile void __iomem *addr) |
56 | { | 67 | { |
57 | *(volatile u16 __force *) addr = b; | 68 | *(volatile u16 __force *) addr = b; |
58 | } | 69 | } |
70 | #endif | ||
59 | 71 | ||
72 | #ifndef __raw_writel | ||
60 | static inline void __raw_writel(u32 b, volatile void __iomem *addr) | 73 | static inline void __raw_writel(u32 b, volatile void __iomem *addr) |
61 | { | 74 | { |
62 | *(volatile u32 __force *) addr = b; | 75 | *(volatile u32 __force *) addr = b; |
63 | } | 76 | } |
77 | #endif | ||
64 | 78 | ||
65 | #define writeb __raw_writeb | 79 | #define writeb __raw_writeb |
66 | #define writew(b,addr) __raw_writew(__cpu_to_le16(b),addr) | 80 | #define writew(b,addr) __raw_writew(__cpu_to_le16(b),addr) |
@@ -122,6 +136,7 @@ static inline void outl(u32 b, unsigned long addr) | |||
122 | #define outw_p(x, addr) outw((x), (addr)) | 136 | #define outw_p(x, addr) outw((x), (addr)) |
123 | #define outl_p(x, addr) outl((x), (addr)) | 137 | #define outl_p(x, addr) outl((x), (addr)) |
124 | 138 | ||
139 | #ifndef insb | ||
125 | static inline void insb(unsigned long addr, void *buffer, int count) | 140 | static inline void insb(unsigned long addr, void *buffer, int count) |
126 | { | 141 | { |
127 | if (count) { | 142 | if (count) { |
@@ -132,7 +147,9 @@ static inline void insb(unsigned long addr, void *buffer, int count) | |||
132 | } while (--count); | 147 | } while (--count); |
133 | } | 148 | } |
134 | } | 149 | } |
150 | #endif | ||
135 | 151 | ||
152 | #ifndef insw | ||
136 | static inline void insw(unsigned long addr, void *buffer, int count) | 153 | static inline void insw(unsigned long addr, void *buffer, int count) |
137 | { | 154 | { |
138 | if (count) { | 155 | if (count) { |
@@ -143,7 +160,9 @@ static inline void insw(unsigned long addr, void *buffer, int count) | |||
143 | } while (--count); | 160 | } while (--count); |
144 | } | 161 | } |
145 | } | 162 | } |
163 | #endif | ||
146 | 164 | ||
165 | #ifndef insl | ||
147 | static inline void insl(unsigned long addr, void *buffer, int count) | 166 | static inline void insl(unsigned long addr, void *buffer, int count) |
148 | { | 167 | { |
149 | if (count) { | 168 | if (count) { |
@@ -154,7 +173,9 @@ static inline void insl(unsigned long addr, void *buffer, int count) | |||
154 | } while (--count); | 173 | } while (--count); |
155 | } | 174 | } |
156 | } | 175 | } |
176 | #endif | ||
157 | 177 | ||
178 | #ifndef outsb | ||
158 | static inline void outsb(unsigned long addr, const void *buffer, int count) | 179 | static inline void outsb(unsigned long addr, const void *buffer, int count) |
159 | { | 180 | { |
160 | if (count) { | 181 | if (count) { |
@@ -164,7 +185,9 @@ static inline void outsb(unsigned long addr, const void *buffer, int count) | |||
164 | } while (--count); | 185 | } while (--count); |
165 | } | 186 | } |
166 | } | 187 | } |
188 | #endif | ||
167 | 189 | ||
190 | #ifndef outsw | ||
168 | static inline void outsw(unsigned long addr, const void *buffer, int count) | 191 | static inline void outsw(unsigned long addr, const void *buffer, int count) |
169 | { | 192 | { |
170 | if (count) { | 193 | if (count) { |
@@ -174,7 +197,9 @@ static inline void outsw(unsigned long addr, const void *buffer, int count) | |||
174 | } while (--count); | 197 | } while (--count); |
175 | } | 198 | } |
176 | } | 199 | } |
200 | #endif | ||
177 | 201 | ||
202 | #ifndef outsl | ||
178 | static inline void outsl(unsigned long addr, const void *buffer, int count) | 203 | static inline void outsl(unsigned long addr, const void *buffer, int count) |
179 | { | 204 | { |
180 | if (count) { | 205 | if (count) { |
@@ -184,6 +209,7 @@ static inline void outsl(unsigned long addr, const void *buffer, int count) | |||
184 | } while (--count); | 209 | } while (--count); |
185 | } | 210 | } |
186 | } | 211 | } |
212 | #endif | ||
187 | 213 | ||
188 | #ifndef CONFIG_GENERIC_IOMAP | 214 | #ifndef CONFIG_GENERIC_IOMAP |
189 | #define ioread8(addr) readb(addr) | 215 | #define ioread8(addr) readb(addr) |
diff --git a/include/asm-generic/ioctls.h b/include/asm-generic/ioctls.h index 8554cb6a81b9..a3216655d657 100644 --- a/include/asm-generic/ioctls.h +++ b/include/asm-generic/ioctls.h | |||
@@ -62,7 +62,9 @@ | |||
62 | #define TCSETSW2 _IOW('T', 0x2C, struct termios2) | 62 | #define TCSETSW2 _IOW('T', 0x2C, struct termios2) |
63 | #define TCSETSF2 _IOW('T', 0x2D, struct termios2) | 63 | #define TCSETSF2 _IOW('T', 0x2D, struct termios2) |
64 | #define TIOCGRS485 0x542E | 64 | #define TIOCGRS485 0x542E |
65 | #ifndef TIOCSRS485 | ||
65 | #define TIOCSRS485 0x542F | 66 | #define TIOCSRS485 0x542F |
67 | #endif | ||
66 | #define TIOCGPTN _IOR('T', 0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | 68 | #define TIOCGPTN _IOR('T', 0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ |
67 | #define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */ | 69 | #define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */ |
68 | #define TCGETX 0x5432 /* SYS5 TCGETX compatibility */ | 70 | #define TCGETX 0x5432 /* SYS5 TCGETX compatibility */ |
diff --git a/include/asm-generic/irqflags.h b/include/asm-generic/irqflags.h index 9aebf618275a..1f40d0024cf3 100644 --- a/include/asm-generic/irqflags.h +++ b/include/asm-generic/irqflags.h | |||
@@ -5,68 +5,62 @@ | |||
5 | * All architectures should implement at least the first two functions, | 5 | * All architectures should implement at least the first two functions, |
6 | * usually inline assembly will be the best way. | 6 | * usually inline assembly will be the best way. |
7 | */ | 7 | */ |
8 | #ifndef RAW_IRQ_DISABLED | 8 | #ifndef ARCH_IRQ_DISABLED |
9 | #define RAW_IRQ_DISABLED 0 | 9 | #define ARCH_IRQ_DISABLED 0 |
10 | #define RAW_IRQ_ENABLED 1 | 10 | #define ARCH_IRQ_ENABLED 1 |
11 | #endif | 11 | #endif |
12 | 12 | ||
13 | /* read interrupt enabled status */ | 13 | /* read interrupt enabled status */ |
14 | #ifndef __raw_local_save_flags | 14 | #ifndef arch_local_save_flags |
15 | unsigned long __raw_local_save_flags(void); | 15 | unsigned long arch_local_save_flags(void); |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | /* set interrupt enabled status */ | 18 | /* set interrupt enabled status */ |
19 | #ifndef raw_local_irq_restore | 19 | #ifndef arch_local_irq_restore |
20 | void raw_local_irq_restore(unsigned long flags); | 20 | void arch_local_irq_restore(unsigned long flags); |
21 | #endif | 21 | #endif |
22 | 22 | ||
23 | /* get status and disable interrupts */ | 23 | /* get status and disable interrupts */ |
24 | #ifndef __raw_local_irq_save | 24 | #ifndef arch_local_irq_save |
25 | static inline unsigned long __raw_local_irq_save(void) | 25 | static inline unsigned long arch_local_irq_save(void) |
26 | { | 26 | { |
27 | unsigned long flags; | 27 | unsigned long flags; |
28 | flags = __raw_local_save_flags(); | 28 | flags = arch_local_save_flags(); |
29 | raw_local_irq_restore(RAW_IRQ_DISABLED); | 29 | arch_local_irq_restore(ARCH_IRQ_DISABLED); |
30 | return flags; | 30 | return flags; |
31 | } | 31 | } |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | /* test flags */ | 34 | /* test flags */ |
35 | #ifndef raw_irqs_disabled_flags | 35 | #ifndef arch_irqs_disabled_flags |
36 | static inline int raw_irqs_disabled_flags(unsigned long flags) | 36 | static inline int arch_irqs_disabled_flags(unsigned long flags) |
37 | { | 37 | { |
38 | return flags == RAW_IRQ_DISABLED; | 38 | return flags == ARCH_IRQ_DISABLED; |
39 | } | 39 | } |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | /* unconditionally enable interrupts */ | 42 | /* unconditionally enable interrupts */ |
43 | #ifndef raw_local_irq_enable | 43 | #ifndef arch_local_irq_enable |
44 | static inline void raw_local_irq_enable(void) | 44 | static inline void arch_local_irq_enable(void) |
45 | { | 45 | { |
46 | raw_local_irq_restore(RAW_IRQ_ENABLED); | 46 | arch_local_irq_restore(ARCH_IRQ_ENABLED); |
47 | } | 47 | } |
48 | #endif | 48 | #endif |
49 | 49 | ||
50 | /* unconditionally disable interrupts */ | 50 | /* unconditionally disable interrupts */ |
51 | #ifndef raw_local_irq_disable | 51 | #ifndef arch_local_irq_disable |
52 | static inline void raw_local_irq_disable(void) | 52 | static inline void arch_local_irq_disable(void) |
53 | { | 53 | { |
54 | raw_local_irq_restore(RAW_IRQ_DISABLED); | 54 | arch_local_irq_restore(ARCH_IRQ_DISABLED); |
55 | } | 55 | } |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* test hardware interrupt enable bit */ | 58 | /* test hardware interrupt enable bit */ |
59 | #ifndef raw_irqs_disabled | 59 | #ifndef arch_irqs_disabled |
60 | static inline int raw_irqs_disabled(void) | 60 | static inline int arch_irqs_disabled(void) |
61 | { | 61 | { |
62 | return raw_irqs_disabled_flags(__raw_local_save_flags()); | 62 | return arch_irqs_disabled_flags(arch_local_save_flags()); |
63 | } | 63 | } |
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | #define raw_local_save_flags(flags) \ | ||
67 | do { (flags) = __raw_local_save_flags(); } while (0) | ||
68 | |||
69 | #define raw_local_irq_save(flags) \ | ||
70 | do { (flags) = __raw_local_irq_save(); } while (0) | ||
71 | |||
72 | #endif /* __ASM_GENERIC_IRQFLAGS_H */ | 66 | #endif /* __ASM_GENERIC_IRQFLAGS_H */ |
diff --git a/include/asm-generic/kdebug.h b/include/asm-generic/kdebug.h index 11e57b6a85fc..d1814497bcdb 100644 --- a/include/asm-generic/kdebug.h +++ b/include/asm-generic/kdebug.h | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | enum die_val { | 4 | enum die_val { |
5 | DIE_UNUSED, | 5 | DIE_UNUSED, |
6 | DIE_OOPS=1 | 6 | DIE_OOPS = 1, |
7 | }; | 7 | }; |
8 | 8 | ||
9 | #endif /* _ASM_GENERIC_KDEBUG_H */ | 9 | #endif /* _ASM_GENERIC_KDEBUG_H */ |
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 08923b684768..d17784ea37ff 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h | |||
@@ -55,14 +55,18 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
55 | */ | 55 | */ |
56 | #define per_cpu(var, cpu) \ | 56 | #define per_cpu(var, cpu) \ |
57 | (*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu))) | 57 | (*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu))) |
58 | #define __get_cpu_var(var) \ | ||
59 | (*SHIFT_PERCPU_PTR(&(var), my_cpu_offset)) | ||
60 | #define __raw_get_cpu_var(var) \ | ||
61 | (*SHIFT_PERCPU_PTR(&(var), __my_cpu_offset)) | ||
62 | 58 | ||
63 | #define this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, my_cpu_offset) | 59 | #ifndef __this_cpu_ptr |
64 | #define __this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset) | 60 | #define __this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset) |
61 | #endif | ||
62 | #ifdef CONFIG_DEBUG_PREEMPT | ||
63 | #define this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, my_cpu_offset) | ||
64 | #else | ||
65 | #define this_cpu_ptr(ptr) __this_cpu_ptr(ptr) | ||
66 | #endif | ||
65 | 67 | ||
68 | #define __get_cpu_var(var) (*this_cpu_ptr(&(var))) | ||
69 | #define __raw_get_cpu_var(var) (*__this_cpu_ptr(&(var))) | ||
66 | 70 | ||
67 | #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA | 71 | #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA |
68 | extern void setup_per_cpu_areas(void); | 72 | extern void setup_per_cpu_areas(void); |
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index e2bd73e8f9c0..6f3c6ae4fe03 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h | |||
@@ -108,7 +108,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres | |||
108 | #endif | 108 | #endif |
109 | 109 | ||
110 | #ifndef __HAVE_ARCH_PAGE_CLEAR_DIRTY | 110 | #ifndef __HAVE_ARCH_PAGE_CLEAR_DIRTY |
111 | #define page_clear_dirty(page) do { } while (0) | 111 | #define page_clear_dirty(page, mapped) do { } while (0) |
112 | #endif | 112 | #endif |
113 | 113 | ||
114 | #ifndef __HAVE_ARCH_PAGE_TEST_DIRTY | 114 | #ifndef __HAVE_ARCH_PAGE_TEST_DIRTY |
@@ -129,6 +129,10 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres | |||
129 | #define move_pte(pte, prot, old_addr, new_addr) (pte) | 129 | #define move_pte(pte, prot, old_addr, new_addr) (pte) |
130 | #endif | 130 | #endif |
131 | 131 | ||
132 | #ifndef flush_tlb_fix_spurious_fault | ||
133 | #define flush_tlb_fix_spurious_fault(vma, address) flush_tlb_page(vma, address) | ||
134 | #endif | ||
135 | |||
132 | #ifndef pgprot_noncached | 136 | #ifndef pgprot_noncached |
133 | #define pgprot_noncached(prot) (prot) | 137 | #define pgprot_noncached(prot) (prot) |
134 | #endif | 138 | #endif |
diff --git a/include/asm-generic/stat.h b/include/asm-generic/stat.h index 47e64170305d..bd8cad21998e 100644 --- a/include/asm-generic/stat.h +++ b/include/asm-generic/stat.h | |||
@@ -33,18 +33,18 @@ struct stat { | |||
33 | int st_blksize; /* Optimal block size for I/O. */ | 33 | int st_blksize; /* Optimal block size for I/O. */ |
34 | int __pad2; | 34 | int __pad2; |
35 | long st_blocks; /* Number 512-byte blocks allocated. */ | 35 | long st_blocks; /* Number 512-byte blocks allocated. */ |
36 | int st_atime; /* Time of last access. */ | 36 | long st_atime; /* Time of last access. */ |
37 | unsigned int st_atime_nsec; | 37 | unsigned long st_atime_nsec; |
38 | int st_mtime; /* Time of last modification. */ | 38 | long st_mtime; /* Time of last modification. */ |
39 | unsigned int st_mtime_nsec; | 39 | unsigned long st_mtime_nsec; |
40 | int st_ctime; /* Time of last status change. */ | 40 | long st_ctime; /* Time of last status change. */ |
41 | unsigned int st_ctime_nsec; | 41 | unsigned long st_ctime_nsec; |
42 | unsigned int __unused4; | 42 | unsigned int __unused4; |
43 | unsigned int __unused5; | 43 | unsigned int __unused5; |
44 | }; | 44 | }; |
45 | 45 | ||
46 | #if __BITS_PER_LONG != 64 | ||
47 | /* This matches struct stat64 in glibc2.1. Only used for 32 bit. */ | 46 | /* This matches struct stat64 in glibc2.1. Only used for 32 bit. */ |
47 | #if __BITS_PER_LONG != 64 || defined(__ARCH_WANT_STAT64) | ||
48 | struct stat64 { | 48 | struct stat64 { |
49 | unsigned long long st_dev; /* Device. */ | 49 | unsigned long long st_dev; /* Device. */ |
50 | unsigned long long st_ino; /* File serial number. */ | 50 | unsigned long long st_ino; /* File serial number. */ |
diff --git a/include/asm-generic/system.h b/include/asm-generic/system.h index efa403b5e121..4b0b9cbbfae5 100644 --- a/include/asm-generic/system.h +++ b/include/asm-generic/system.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/irqflags.h> | 21 | #include <linux/irqflags.h> |
22 | 22 | ||
23 | #include <asm/cmpxchg-local.h> | 23 | #include <asm/cmpxchg-local.h> |
24 | #include <asm/cmpxchg.h> | ||
24 | 25 | ||
25 | struct task_struct; | 26 | struct task_struct; |
26 | 27 | ||
@@ -136,25 +137,6 @@ unsigned long __xchg(unsigned long x, volatile void *ptr, int size) | |||
136 | #define xchg(ptr, x) \ | 137 | #define xchg(ptr, x) \ |
137 | ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) | 138 | ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) |
138 | 139 | ||
139 | static inline unsigned long __cmpxchg(volatile unsigned long *m, | ||
140 | unsigned long old, unsigned long new) | ||
141 | { | ||
142 | unsigned long retval; | ||
143 | unsigned long flags; | ||
144 | |||
145 | local_irq_save(flags); | ||
146 | retval = *m; | ||
147 | if (retval == old) | ||
148 | *m = new; | ||
149 | local_irq_restore(flags); | ||
150 | return retval; | ||
151 | } | ||
152 | |||
153 | #define cmpxchg(ptr, o, n) \ | ||
154 | ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ | ||
155 | (unsigned long)(o), \ | ||
156 | (unsigned long)(n))) | ||
157 | |||
158 | #endif /* !__ASSEMBLY__ */ | 140 | #endif /* !__ASSEMBLY__ */ |
159 | 141 | ||
160 | #endif /* __KERNEL__ */ | 142 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 8a92a170fb7d..bd69d79208de 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -150,6 +150,7 @@ | |||
150 | #define DATA_DATA \ | 150 | #define DATA_DATA \ |
151 | *(.data) \ | 151 | *(.data) \ |
152 | *(.ref.data) \ | 152 | *(.ref.data) \ |
153 | *(.data..shared_aligned) /* percpu related */ \ | ||
153 | DEV_KEEP(init.data) \ | 154 | DEV_KEEP(init.data) \ |
154 | DEV_KEEP(exit.data) \ | 155 | DEV_KEEP(exit.data) \ |
155 | CPU_KEEP(init.data) \ | 156 | CPU_KEEP(init.data) \ |
@@ -220,6 +221,8 @@ | |||
220 | \ | 221 | \ |
221 | BUG_TABLE \ | 222 | BUG_TABLE \ |
222 | \ | 223 | \ |
224 | JUMP_TABLE \ | ||
225 | \ | ||
223 | /* PCI quirks */ \ | 226 | /* PCI quirks */ \ |
224 | .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ | 227 | .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ |
225 | VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ | 228 | VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ |
@@ -563,6 +566,14 @@ | |||
563 | #define BUG_TABLE | 566 | #define BUG_TABLE |
564 | #endif | 567 | #endif |
565 | 568 | ||
569 | #define JUMP_TABLE \ | ||
570 | . = ALIGN(8); \ | ||
571 | __jump_table : AT(ADDR(__jump_table) - LOAD_OFFSET) { \ | ||
572 | VMLINUX_SYMBOL(__start___jump_table) = .; \ | ||
573 | *(__jump_table) \ | ||
574 | VMLINUX_SYMBOL(__stop___jump_table) = .; \ | ||
575 | } | ||
576 | |||
566 | #ifdef CONFIG_PM_TRACE | 577 | #ifdef CONFIG_PM_TRACE |
567 | #define TRACEDATA \ | 578 | #define TRACEDATA \ |
568 | . = ALIGN(4); \ | 579 | . = ALIGN(4); \ |
@@ -626,10 +637,11 @@ | |||
626 | 637 | ||
627 | #ifdef CONFIG_BLK_DEV_INITRD | 638 | #ifdef CONFIG_BLK_DEV_INITRD |
628 | #define INIT_RAM_FS \ | 639 | #define INIT_RAM_FS \ |
629 | . = ALIGN(PAGE_SIZE); \ | 640 | . = ALIGN(4); \ |
630 | VMLINUX_SYMBOL(__initramfs_start) = .; \ | 641 | VMLINUX_SYMBOL(__initramfs_start) = .; \ |
631 | *(.init.ramfs) \ | 642 | *(.init.ramfs) \ |
632 | VMLINUX_SYMBOL(__initramfs_end) = .; | 643 | . = ALIGN(8); \ |
644 | *(.init.ramfs.info) | ||
633 | #else | 645 | #else |
634 | #define INIT_RAM_FS | 646 | #define INIT_RAM_FS |
635 | #endif | 647 | #endif |
@@ -677,7 +689,9 @@ | |||
677 | - LOAD_OFFSET) { \ | 689 | - LOAD_OFFSET) { \ |
678 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ | 690 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ |
679 | *(.data..percpu..first) \ | 691 | *(.data..percpu..first) \ |
692 | . = ALIGN(PAGE_SIZE); \ | ||
680 | *(.data..percpu..page_aligned) \ | 693 | *(.data..percpu..page_aligned) \ |
694 | *(.data..percpu..readmostly) \ | ||
681 | *(.data..percpu) \ | 695 | *(.data..percpu) \ |
682 | *(.data..percpu..shared_aligned) \ | 696 | *(.data..percpu..shared_aligned) \ |
683 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | 697 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |
@@ -703,7 +717,9 @@ | |||
703 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ | 717 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ |
704 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ | 718 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ |
705 | *(.data..percpu..first) \ | 719 | *(.data..percpu..first) \ |
720 | . = ALIGN(PAGE_SIZE); \ | ||
706 | *(.data..percpu..page_aligned) \ | 721 | *(.data..percpu..page_aligned) \ |
722 | *(.data..percpu..readmostly) \ | ||
707 | *(.data..percpu) \ | 723 | *(.data..percpu) \ |
708 | *(.data..percpu..shared_aligned) \ | 724 | *(.data..percpu..shared_aligned) \ |
709 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | 725 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |
diff --git a/include/crypto/cryptd.h b/include/crypto/cryptd.h index 1c96b255017c..ba98918bbd9b 100644 --- a/include/crypto/cryptd.h +++ b/include/crypto/cryptd.h | |||
@@ -1,5 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Software async crypto daemon | 2 | * Software async crypto daemon |
3 | * | ||
4 | * Added AEAD support to cryptd. | ||
5 | * Authors: Tadeusz Struk (tadeusz.struk@intel.com) | ||
6 | * Adrian Hoban <adrian.hoban@intel.com> | ||
7 | * Gabriele Paoloni <gabriele.paoloni@intel.com> | ||
8 | * Aidan O'Mahony (aidan.o.mahony@intel.com) | ||
9 | * Copyright (c) 2010, Intel Corporation. | ||
3 | */ | 10 | */ |
4 | 11 | ||
5 | #ifndef _CRYPTO_CRYPT_H | 12 | #ifndef _CRYPTO_CRYPT_H |
@@ -42,4 +49,21 @@ struct crypto_shash *cryptd_ahash_child(struct cryptd_ahash *tfm); | |||
42 | struct shash_desc *cryptd_shash_desc(struct ahash_request *req); | 49 | struct shash_desc *cryptd_shash_desc(struct ahash_request *req); |
43 | void cryptd_free_ahash(struct cryptd_ahash *tfm); | 50 | void cryptd_free_ahash(struct cryptd_ahash *tfm); |
44 | 51 | ||
52 | struct cryptd_aead { | ||
53 | struct crypto_aead base; | ||
54 | }; | ||
55 | |||
56 | static inline struct cryptd_aead *__cryptd_aead_cast( | ||
57 | struct crypto_aead *tfm) | ||
58 | { | ||
59 | return (struct cryptd_aead *)tfm; | ||
60 | } | ||
61 | |||
62 | struct cryptd_aead *cryptd_alloc_aead(const char *alg_name, | ||
63 | u32 type, u32 mask); | ||
64 | |||
65 | struct crypto_aead *cryptd_aead_child(struct cryptd_aead *tfm); | ||
66 | |||
67 | void cryptd_free_aead(struct cryptd_aead *tfm); | ||
68 | |||
45 | #endif | 69 | #endif |
diff --git a/include/crypto/gf128mul.h b/include/crypto/gf128mul.h index 4086b8ebfafe..da2530e34b26 100644 --- a/include/crypto/gf128mul.h +++ b/include/crypto/gf128mul.h | |||
@@ -54,8 +54,8 @@ | |||
54 | 54 | ||
55 | /* Comment by Rik: | 55 | /* Comment by Rik: |
56 | * | 56 | * |
57 | * For some background on GF(2^128) see for example: http://- | 57 | * For some background on GF(2^128) see for example: |
58 | * csrc.nist.gov/CryptoToolkit/modes/proposedmodes/gcm/gcm-revised-spec.pdf | 58 | * http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf |
59 | * | 59 | * |
60 | * The elements of GF(2^128) := GF(2)[X]/(X^128-X^7-X^2-X^1-1) can | 60 | * The elements of GF(2^128) := GF(2)[X]/(X^128-X^7-X^2-X^1-1) can |
61 | * be mapped to computer memory in a variety of ways. Let's examine | 61 | * be mapped to computer memory in a variety of ways. Let's examine |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 4c9461a4f9e6..274eaaa15c36 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -699,13 +699,8 @@ struct drm_driver { | |||
699 | int (*suspend) (struct drm_device *, pm_message_t state); | 699 | int (*suspend) (struct drm_device *, pm_message_t state); |
700 | int (*resume) (struct drm_device *); | 700 | int (*resume) (struct drm_device *); |
701 | int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv); | 701 | int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv); |
702 | void (*dma_ready) (struct drm_device *); | ||
703 | int (*dma_quiescent) (struct drm_device *); | 702 | int (*dma_quiescent) (struct drm_device *); |
704 | int (*context_ctor) (struct drm_device *dev, int context); | ||
705 | int (*context_dtor) (struct drm_device *dev, int context); | 703 | int (*context_dtor) (struct drm_device *dev, int context); |
706 | int (*kernel_context_switch) (struct drm_device *dev, int old, | ||
707 | int new); | ||
708 | void (*kernel_context_switch_unlock) (struct drm_device *dev); | ||
709 | 704 | ||
710 | /** | 705 | /** |
711 | * get_vblank_counter - get raw hardware vblank counter | 706 | * get_vblank_counter - get raw hardware vblank counter |
@@ -777,8 +772,6 @@ struct drm_driver { | |||
777 | struct drm_file *file_priv); | 772 | struct drm_file *file_priv); |
778 | void (*reclaim_buffers_idlelocked) (struct drm_device *dev, | 773 | void (*reclaim_buffers_idlelocked) (struct drm_device *dev, |
779 | struct drm_file *file_priv); | 774 | struct drm_file *file_priv); |
780 | resource_size_t (*get_map_ofs) (struct drm_local_map * map); | ||
781 | resource_size_t (*get_reg_ofs) (struct drm_device *dev); | ||
782 | void (*set_version) (struct drm_device *dev, | 775 | void (*set_version) (struct drm_device *dev, |
783 | struct drm_set_version *sv); | 776 | struct drm_set_version *sv); |
784 | 777 | ||
@@ -795,8 +788,6 @@ struct drm_driver { | |||
795 | void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv, | 788 | void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv, |
796 | bool from_release); | 789 | bool from_release); |
797 | 790 | ||
798 | int (*proc_init)(struct drm_minor *minor); | ||
799 | void (*proc_cleanup)(struct drm_minor *minor); | ||
800 | int (*debugfs_init)(struct drm_minor *minor); | 791 | int (*debugfs_init)(struct drm_minor *minor); |
801 | void (*debugfs_cleanup)(struct drm_minor *minor); | 792 | void (*debugfs_cleanup)(struct drm_minor *minor); |
802 | 793 | ||
@@ -972,7 +963,6 @@ struct drm_device { | |||
972 | __volatile__ long context_flag; /**< Context swapping flag */ | 963 | __volatile__ long context_flag; /**< Context swapping flag */ |
973 | __volatile__ long interrupt_flag; /**< Interruption handler flag */ | 964 | __volatile__ long interrupt_flag; /**< Interruption handler flag */ |
974 | __volatile__ long dma_flag; /**< DMA dispatch flag */ | 965 | __volatile__ long dma_flag; /**< DMA dispatch flag */ |
975 | struct timer_list timer; /**< Timer for delaying ctx switch */ | ||
976 | wait_queue_head_t context_wait; /**< Processes waiting on ctx switch */ | 966 | wait_queue_head_t context_wait; /**< Processes waiting on ctx switch */ |
977 | int last_checked; /**< Last context checked for DMA */ | 967 | int last_checked; /**< Last context checked for DMA */ |
978 | int last_context; /**< Last current context */ | 968 | int last_context; /**< Last current context */ |
@@ -1045,25 +1035,12 @@ struct drm_device { | |||
1045 | struct drm_minor *control; /**< Control node for card */ | 1035 | struct drm_minor *control; /**< Control node for card */ |
1046 | struct drm_minor *primary; /**< render type primary screen head */ | 1036 | struct drm_minor *primary; /**< render type primary screen head */ |
1047 | 1037 | ||
1048 | /** \name Drawable information */ | ||
1049 | /*@{ */ | ||
1050 | spinlock_t drw_lock; | ||
1051 | struct idr drw_idr; | ||
1052 | /*@} */ | ||
1053 | |||
1054 | struct drm_mode_config mode_config; /**< Current mode config */ | 1038 | struct drm_mode_config mode_config; /**< Current mode config */ |
1055 | 1039 | ||
1056 | /** \name GEM information */ | 1040 | /** \name GEM information */ |
1057 | /*@{ */ | 1041 | /*@{ */ |
1058 | spinlock_t object_name_lock; | 1042 | spinlock_t object_name_lock; |
1059 | struct idr object_name_idr; | 1043 | struct idr object_name_idr; |
1060 | atomic_t object_count; | ||
1061 | atomic_t object_memory; | ||
1062 | atomic_t pin_count; | ||
1063 | atomic_t pin_memory; | ||
1064 | atomic_t gtt_count; | ||
1065 | atomic_t gtt_memory; | ||
1066 | uint32_t gtt_total; | ||
1067 | uint32_t invalidate_domains; /* domains pending invalidation */ | 1044 | uint32_t invalidate_domains; /* domains pending invalidation */ |
1068 | uint32_t flush_domains; /* domains pending flush */ | 1045 | uint32_t flush_domains; /* domains pending flush */ |
1069 | /*@} */ | 1046 | /*@} */ |
@@ -1175,8 +1152,6 @@ extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); | |||
1175 | extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); | 1152 | extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); |
1176 | extern void drm_vm_open_locked(struct vm_area_struct *vma); | 1153 | extern void drm_vm_open_locked(struct vm_area_struct *vma); |
1177 | extern void drm_vm_close_locked(struct vm_area_struct *vma); | 1154 | extern void drm_vm_close_locked(struct vm_area_struct *vma); |
1178 | extern resource_size_t drm_core_get_map_ofs(struct drm_local_map * map); | ||
1179 | extern resource_size_t drm_core_get_reg_ofs(struct drm_device *dev); | ||
1180 | extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); | 1155 | extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); |
1181 | 1156 | ||
1182 | /* Memory management support (drm_memory.h) */ | 1157 | /* Memory management support (drm_memory.h) */ |
@@ -1186,8 +1161,7 @@ extern int drm_mem_info(char *buf, char **start, off_t offset, | |||
1186 | int request, int *eof, void *data); | 1161 | int request, int *eof, void *data); |
1187 | extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area); | 1162 | extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area); |
1188 | 1163 | ||
1189 | extern DRM_AGP_MEM *drm_alloc_agp(struct drm_device *dev, int pages, u32 type); | 1164 | extern void drm_free_agp(DRM_AGP_MEM * handle, int pages); |
1190 | extern int drm_free_agp(DRM_AGP_MEM * handle, int pages); | ||
1191 | extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start); | 1165 | extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start); |
1192 | extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev, | 1166 | extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev, |
1193 | struct page **pages, | 1167 | struct page **pages, |
@@ -1239,17 +1213,6 @@ extern int drm_setsareactx(struct drm_device *dev, void *data, | |||
1239 | extern int drm_getsareactx(struct drm_device *dev, void *data, | 1213 | extern int drm_getsareactx(struct drm_device *dev, void *data, |
1240 | struct drm_file *file_priv); | 1214 | struct drm_file *file_priv); |
1241 | 1215 | ||
1242 | /* Drawable IOCTL support (drm_drawable.h) */ | ||
1243 | extern int drm_adddraw(struct drm_device *dev, void *data, | ||
1244 | struct drm_file *file_priv); | ||
1245 | extern int drm_rmdraw(struct drm_device *dev, void *data, | ||
1246 | struct drm_file *file_priv); | ||
1247 | extern int drm_update_drawable_info(struct drm_device *dev, void *data, | ||
1248 | struct drm_file *file_priv); | ||
1249 | extern struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, | ||
1250 | drm_drawable_t id); | ||
1251 | extern void drm_drawable_free_all(struct drm_device *dev); | ||
1252 | |||
1253 | /* Authentication IOCTL support (drm_auth.h) */ | 1216 | /* Authentication IOCTL support (drm_auth.h) */ |
1254 | extern int drm_getmagic(struct drm_device *dev, void *data, | 1217 | extern int drm_getmagic(struct drm_device *dev, void *data, |
1255 | struct drm_file *file_priv); | 1218 | struct drm_file *file_priv); |
@@ -1264,7 +1227,6 @@ extern int drm_lock(struct drm_device *dev, void *data, | |||
1264 | struct drm_file *file_priv); | 1227 | struct drm_file *file_priv); |
1265 | extern int drm_unlock(struct drm_device *dev, void *data, | 1228 | extern int drm_unlock(struct drm_device *dev, void *data, |
1266 | struct drm_file *file_priv); | 1229 | struct drm_file *file_priv); |
1267 | extern int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context); | ||
1268 | extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context); | 1230 | extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context); |
1269 | extern void drm_idlelock_take(struct drm_lock_data *lock_data); | 1231 | extern void drm_idlelock_take(struct drm_lock_data *lock_data); |
1270 | extern void drm_idlelock_release(struct drm_lock_data *lock_data); | 1232 | extern void drm_idlelock_release(struct drm_lock_data *lock_data); |
@@ -1359,10 +1321,6 @@ extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, | |||
1359 | extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); | 1321 | extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); |
1360 | extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data, | 1322 | extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data, |
1361 | struct drm_file *file_priv); | 1323 | struct drm_file *file_priv); |
1362 | extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type); | ||
1363 | extern int drm_agp_free_memory(DRM_AGP_MEM * handle); | ||
1364 | extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start); | ||
1365 | extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle); | ||
1366 | extern void drm_agp_chipset_flush(struct drm_device *dev); | 1324 | extern void drm_agp_chipset_flush(struct drm_device *dev); |
1367 | 1325 | ||
1368 | /* Stub support (drm_stub.h) */ | 1326 | /* Stub support (drm_stub.h) */ |
@@ -1414,7 +1372,6 @@ extern int drm_bufs_info(struct seq_file *m, void *data); | |||
1414 | extern int drm_vblank_info(struct seq_file *m, void *data); | 1372 | extern int drm_vblank_info(struct seq_file *m, void *data); |
1415 | extern int drm_clients_info(struct seq_file *m, void* data); | 1373 | extern int drm_clients_info(struct seq_file *m, void* data); |
1416 | extern int drm_gem_name_info(struct seq_file *m, void *data); | 1374 | extern int drm_gem_name_info(struct seq_file *m, void *data); |
1417 | extern int drm_gem_object_info(struct seq_file *m, void* data); | ||
1418 | 1375 | ||
1419 | #if DRM_DEBUG_CODE | 1376 | #if DRM_DEBUG_CODE |
1420 | extern int drm_vma_info(struct seq_file *m, void *data); | 1377 | extern int drm_vma_info(struct seq_file *m, void *data); |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 3e5a51af757c..029aa688e787 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -221,7 +221,8 @@ struct drm_framebuffer_funcs { | |||
221 | * the semantics and arguments have a one to one mapping | 221 | * the semantics and arguments have a one to one mapping |
222 | * on this function. | 222 | * on this function. |
223 | */ | 223 | */ |
224 | int (*dirty)(struct drm_framebuffer *framebuffer, unsigned flags, | 224 | int (*dirty)(struct drm_framebuffer *framebuffer, |
225 | struct drm_file *file_priv, unsigned flags, | ||
225 | unsigned color, struct drm_clip_rect *clips, | 226 | unsigned color, struct drm_clip_rect *clips, |
226 | unsigned num_clips); | 227 | unsigned num_clips); |
227 | }; | 228 | }; |
@@ -762,6 +763,7 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device *dev, | |||
762 | extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, | 763 | extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, |
763 | void *data, struct drm_file *file_priv); | 764 | void *data, struct drm_file *file_priv); |
764 | extern bool drm_detect_hdmi_monitor(struct edid *edid); | 765 | extern bool drm_detect_hdmi_monitor(struct edid *edid); |
766 | extern bool drm_detect_monitor_audio(struct edid *edid); | ||
765 | extern int drm_mode_page_flip_ioctl(struct drm_device *dev, | 767 | extern int drm_mode_page_flip_ioctl(struct drm_device *dev, |
766 | void *data, struct drm_file *file_priv); | 768 | void *data, struct drm_file *file_priv); |
767 | extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | 769 | extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, |
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index 59b7073b13fe..73b071203dcc 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h | |||
@@ -39,6 +39,11 @@ | |||
39 | 39 | ||
40 | #include <linux/fb.h> | 40 | #include <linux/fb.h> |
41 | 41 | ||
42 | enum mode_set_atomic { | ||
43 | LEAVE_ATOMIC_MODE_SET, | ||
44 | ENTER_ATOMIC_MODE_SET, | ||
45 | }; | ||
46 | |||
42 | struct drm_crtc_helper_funcs { | 47 | struct drm_crtc_helper_funcs { |
43 | /* | 48 | /* |
44 | * Control power levels on the CRTC. If the mode passed in is | 49 | * Control power levels on the CRTC. If the mode passed in is |
@@ -61,7 +66,8 @@ struct drm_crtc_helper_funcs { | |||
61 | int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, | 66 | int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, |
62 | struct drm_framebuffer *old_fb); | 67 | struct drm_framebuffer *old_fb); |
63 | int (*mode_set_base_atomic)(struct drm_crtc *crtc, | 68 | int (*mode_set_base_atomic)(struct drm_crtc *crtc, |
64 | struct drm_framebuffer *fb, int x, int y); | 69 | struct drm_framebuffer *fb, int x, int y, |
70 | enum mode_set_atomic); | ||
65 | 71 | ||
66 | /* reload the current crtc LUT */ | 72 | /* reload the current crtc LUT */ |
67 | void (*load_lut)(struct drm_crtc *crtc); | 73 | void (*load_lut)(struct drm_crtc *crtc); |
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index a49e791db0b0..83a389e44543 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h | |||
@@ -23,6 +23,9 @@ | |||
23 | #ifndef _DRM_DP_HELPER_H_ | 23 | #ifndef _DRM_DP_HELPER_H_ |
24 | #define _DRM_DP_HELPER_H_ | 24 | #define _DRM_DP_HELPER_H_ |
25 | 25 | ||
26 | #include <linux/types.h> | ||
27 | #include <linux/i2c.h> | ||
28 | |||
26 | /* From the VESA DisplayPort spec */ | 29 | /* From the VESA DisplayPort spec */ |
27 | 30 | ||
28 | #define AUX_NATIVE_WRITE 0x8 | 31 | #define AUX_NATIVE_WRITE 0x8 |
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index e41c74facb6a..8c641bed9bbd 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
@@ -286,6 +286,7 @@ typedef struct drm_i915_irq_wait { | |||
286 | #define I915_PARAM_HAS_PAGEFLIPPING 8 | 286 | #define I915_PARAM_HAS_PAGEFLIPPING 8 |
287 | #define I915_PARAM_HAS_EXECBUF2 9 | 287 | #define I915_PARAM_HAS_EXECBUF2 9 |
288 | #define I915_PARAM_HAS_BSD 10 | 288 | #define I915_PARAM_HAS_BSD 10 |
289 | #define I915_PARAM_HAS_BLT 11 | ||
289 | 290 | ||
290 | typedef struct drm_i915_getparam { | 291 | typedef struct drm_i915_getparam { |
291 | int param; | 292 | int param; |
@@ -627,8 +628,11 @@ struct drm_i915_gem_execbuffer2 { | |||
627 | __u32 num_cliprects; | 628 | __u32 num_cliprects; |
628 | /** This is a struct drm_clip_rect *cliprects */ | 629 | /** This is a struct drm_clip_rect *cliprects */ |
629 | __u64 cliprects_ptr; | 630 | __u64 cliprects_ptr; |
631 | #define I915_EXEC_RING_MASK (7<<0) | ||
632 | #define I915_EXEC_DEFAULT (0<<0) | ||
630 | #define I915_EXEC_RENDER (1<<0) | 633 | #define I915_EXEC_RENDER (1<<0) |
631 | #define I915_EXEC_BSD (1<<1) | 634 | #define I915_EXEC_BSD (2<<0) |
635 | #define I915_EXEC_BLT (3<<0) | ||
632 | __u64 flags; | 636 | __u64 flags; |
633 | __u64 rsvd1; | 637 | __u64 rsvd1; |
634 | __u64 rsvd2; | 638 | __u64 rsvd2; |
diff --git a/include/drm/intel-gtt.h b/include/drm/intel-gtt.h new file mode 100644 index 000000000000..d3c81946f613 --- /dev/null +++ b/include/drm/intel-gtt.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* Common header for intel-gtt.ko and i915.ko */ | ||
2 | |||
3 | #ifndef _DRM_INTEL_GTT_H | ||
4 | #define _DRM_INTEL_GTT_H | ||
5 | struct intel_gtt { | ||
6 | /* Number of stolen gtt entries at the beginning. */ | ||
7 | unsigned int gtt_stolen_entries; | ||
8 | /* Total number of gtt entries. */ | ||
9 | unsigned int gtt_total_entries; | ||
10 | /* Part of the gtt that is mappable by the cpu, for those chips where | ||
11 | * this is not the full gtt. */ | ||
12 | unsigned int gtt_mappable_entries; | ||
13 | }; | ||
14 | |||
15 | struct intel_gtt *intel_gtt_get(void); | ||
16 | |||
17 | #endif | ||
18 | |||
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 2040e6c4f172..beafc156a535 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h | |||
@@ -102,7 +102,8 @@ struct ttm_bus_placement { | |||
102 | */ | 102 | */ |
103 | 103 | ||
104 | struct ttm_mem_reg { | 104 | struct ttm_mem_reg { |
105 | struct drm_mm_node *mm_node; | 105 | void *mm_node; |
106 | unsigned long start; | ||
106 | unsigned long size; | 107 | unsigned long size; |
107 | unsigned long num_pages; | 108 | unsigned long num_pages; |
108 | uint32_t page_alignment; | 109 | uint32_t page_alignment; |
@@ -431,6 +432,10 @@ extern void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo); | |||
431 | * together with the @destroy function, | 432 | * together with the @destroy function, |
432 | * enables driver-specific objects derived from a ttm_buffer_object. | 433 | * enables driver-specific objects derived from a ttm_buffer_object. |
433 | * On successful return, the object kref and list_kref are set to 1. | 434 | * On successful return, the object kref and list_kref are set to 1. |
435 | * If a failure occurs, the function will call the @destroy function, or | ||
436 | * kfree() if @destroy is NULL. Thus, after a failure, dereferencing @bo is | ||
437 | * illegal and will likely cause memory corruption. | ||
438 | * | ||
434 | * Returns | 439 | * Returns |
435 | * -ENOMEM: Out of memory. | 440 | * -ENOMEM: Out of memory. |
436 | * -EINVAL: Invalid placement flags. | 441 | * -EINVAL: Invalid placement flags. |
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index b87504235f18..8e0c848326b6 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h | |||
@@ -203,7 +203,92 @@ struct ttm_tt { | |||
203 | * It's set up by the ttm_bo_driver::init_mem_type method. | 203 | * It's set up by the ttm_bo_driver::init_mem_type method. |
204 | */ | 204 | */ |
205 | 205 | ||
206 | struct ttm_mem_type_manager; | ||
207 | |||
208 | struct ttm_mem_type_manager_func { | ||
209 | /** | ||
210 | * struct ttm_mem_type_manager member init | ||
211 | * | ||
212 | * @man: Pointer to a memory type manager. | ||
213 | * @p_size: Implementation dependent, but typically the size of the | ||
214 | * range to be managed in pages. | ||
215 | * | ||
216 | * Called to initialize a private range manager. The function is | ||
217 | * expected to initialize the man::priv member. | ||
218 | * Returns 0 on success, negative error code on failure. | ||
219 | */ | ||
220 | int (*init)(struct ttm_mem_type_manager *man, unsigned long p_size); | ||
221 | |||
222 | /** | ||
223 | * struct ttm_mem_type_manager member takedown | ||
224 | * | ||
225 | * @man: Pointer to a memory type manager. | ||
226 | * | ||
227 | * Called to undo the setup done in init. All allocated resources | ||
228 | * should be freed. | ||
229 | */ | ||
230 | int (*takedown)(struct ttm_mem_type_manager *man); | ||
231 | |||
232 | /** | ||
233 | * struct ttm_mem_type_manager member get_node | ||
234 | * | ||
235 | * @man: Pointer to a memory type manager. | ||
236 | * @bo: Pointer to the buffer object we're allocating space for. | ||
237 | * @placement: Placement details. | ||
238 | * @mem: Pointer to a struct ttm_mem_reg to be filled in. | ||
239 | * | ||
240 | * This function should allocate space in the memory type managed | ||
241 | * by @man. Placement details if | ||
242 | * applicable are given by @placement. If successful, | ||
243 | * @mem::mm_node should be set to a non-null value, and | ||
244 | * @mem::start should be set to a value identifying the beginning | ||
245 | * of the range allocated, and the function should return zero. | ||
246 | * If the memory region accomodate the buffer object, @mem::mm_node | ||
247 | * should be set to NULL, and the function should return 0. | ||
248 | * If a system error occured, preventing the request to be fulfilled, | ||
249 | * the function should return a negative error code. | ||
250 | * | ||
251 | * Note that @mem::mm_node will only be dereferenced by | ||
252 | * struct ttm_mem_type_manager functions and optionally by the driver, | ||
253 | * which has knowledge of the underlying type. | ||
254 | * | ||
255 | * This function may not be called from within atomic context, so | ||
256 | * an implementation can and must use either a mutex or a spinlock to | ||
257 | * protect any data structures managing the space. | ||
258 | */ | ||
259 | int (*get_node)(struct ttm_mem_type_manager *man, | ||
260 | struct ttm_buffer_object *bo, | ||
261 | struct ttm_placement *placement, | ||
262 | struct ttm_mem_reg *mem); | ||
263 | |||
264 | /** | ||
265 | * struct ttm_mem_type_manager member put_node | ||
266 | * | ||
267 | * @man: Pointer to a memory type manager. | ||
268 | * @mem: Pointer to a struct ttm_mem_reg to be filled in. | ||
269 | * | ||
270 | * This function frees memory type resources previously allocated | ||
271 | * and that are identified by @mem::mm_node and @mem::start. May not | ||
272 | * be called from within atomic context. | ||
273 | */ | ||
274 | void (*put_node)(struct ttm_mem_type_manager *man, | ||
275 | struct ttm_mem_reg *mem); | ||
276 | |||
277 | /** | ||
278 | * struct ttm_mem_type_manager member debug | ||
279 | * | ||
280 | * @man: Pointer to a memory type manager. | ||
281 | * @prefix: Prefix to be used in printout to identify the caller. | ||
282 | * | ||
283 | * This function is called to print out the state of the memory | ||
284 | * type manager to aid debugging of out-of-memory conditions. | ||
285 | * It may not be called from within atomic context. | ||
286 | */ | ||
287 | void (*debug)(struct ttm_mem_type_manager *man, const char *prefix); | ||
288 | }; | ||
289 | |||
206 | struct ttm_mem_type_manager { | 290 | struct ttm_mem_type_manager { |
291 | struct ttm_bo_device *bdev; | ||
207 | 292 | ||
208 | /* | 293 | /* |
209 | * No protection. Constant from start. | 294 | * No protection. Constant from start. |
@@ -216,14 +301,13 @@ struct ttm_mem_type_manager { | |||
216 | uint64_t size; | 301 | uint64_t size; |
217 | uint32_t available_caching; | 302 | uint32_t available_caching; |
218 | uint32_t default_caching; | 303 | uint32_t default_caching; |
304 | const struct ttm_mem_type_manager_func *func; | ||
305 | void *priv; | ||
219 | 306 | ||
220 | /* | 307 | /* |
221 | * Protected by the bdev->lru_lock. | 308 | * Protected by the global->lru_lock. |
222 | * TODO: Consider one lru_lock per ttm_mem_type_manager. | ||
223 | * Plays ill with list removal, though. | ||
224 | */ | 309 | */ |
225 | 310 | ||
226 | struct drm_mm manager; | ||
227 | struct list_head lru; | 311 | struct list_head lru; |
228 | }; | 312 | }; |
229 | 313 | ||
@@ -649,6 +733,12 @@ extern int ttm_bo_mem_space(struct ttm_buffer_object *bo, | |||
649 | struct ttm_mem_reg *mem, | 733 | struct ttm_mem_reg *mem, |
650 | bool interruptible, | 734 | bool interruptible, |
651 | bool no_wait_reserve, bool no_wait_gpu); | 735 | bool no_wait_reserve, bool no_wait_gpu); |
736 | |||
737 | extern void ttm_bo_mem_put(struct ttm_buffer_object *bo, | ||
738 | struct ttm_mem_reg *mem); | ||
739 | extern void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo, | ||
740 | struct ttm_mem_reg *mem); | ||
741 | |||
652 | /** | 742 | /** |
653 | * ttm_bo_wait_for_cpu | 743 | * ttm_bo_wait_for_cpu |
654 | * | 744 | * |
@@ -891,6 +981,8 @@ extern int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo, | |||
891 | */ | 981 | */ |
892 | extern pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp); | 982 | extern pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp); |
893 | 983 | ||
984 | extern const struct ttm_mem_type_manager_func ttm_bo_manager_func; | ||
985 | |||
894 | #if (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE))) | 986 | #if (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE))) |
895 | #define TTM_HAS_AGP | 987 | #define TTM_HAS_AGP |
896 | #include <linux/agp_backend.h> | 988 | #include <linux/agp_backend.h> |
diff --git a/include/drm/vmwgfx_drm.h b/include/drm/vmwgfx_drm.h index 4d0842391edc..650e6bf6f69f 100644 --- a/include/drm/vmwgfx_drm.h +++ b/include/drm/vmwgfx_drm.h | |||
@@ -72,6 +72,7 @@ | |||
72 | #define DRM_VMW_PARAM_FIFO_OFFSET 3 | 72 | #define DRM_VMW_PARAM_FIFO_OFFSET 3 |
73 | #define DRM_VMW_PARAM_HW_CAPS 4 | 73 | #define DRM_VMW_PARAM_HW_CAPS 4 |
74 | #define DRM_VMW_PARAM_FIFO_CAPS 5 | 74 | #define DRM_VMW_PARAM_FIFO_CAPS 5 |
75 | #define DRM_VMW_PARAM_MAX_FB_SIZE 6 | ||
75 | 76 | ||
76 | /** | 77 | /** |
77 | * struct drm_vmw_getparam_arg | 78 | * struct drm_vmw_getparam_arg |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 4e8ea8c8ec1e..97319a8fc1e0 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -118,6 +118,7 @@ header-y += eventpoll.h | |||
118 | header-y += ext2_fs.h | 118 | header-y += ext2_fs.h |
119 | header-y += fadvise.h | 119 | header-y += fadvise.h |
120 | header-y += falloc.h | 120 | header-y += falloc.h |
121 | header-y += fanotify.h | ||
121 | header-y += fb.h | 122 | header-y += fb.h |
122 | header-y += fcntl.h | 123 | header-y += fcntl.h |
123 | header-y += fd.h | 124 | header-y += fd.h |
@@ -301,6 +302,7 @@ header-y += quota.h | |||
301 | header-y += radeonfb.h | 302 | header-y += radeonfb.h |
302 | header-y += random.h | 303 | header-y += random.h |
303 | header-y += raw.h | 304 | header-y += raw.h |
305 | header-y += rds.h | ||
304 | header-y += reboot.h | 306 | header-y += reboot.h |
305 | header-y += reiserfs_fs.h | 307 | header-y += reiserfs_fs.h |
306 | header-y += reiserfs_xattr.h | 308 | header-y += reiserfs_xattr.h |
@@ -325,10 +327,6 @@ header-y += serio.h | |||
325 | header-y += shm.h | 327 | header-y += shm.h |
326 | header-y += signal.h | 328 | header-y += signal.h |
327 | header-y += signalfd.h | 329 | header-y += signalfd.h |
328 | header-y += smb.h | ||
329 | header-y += smb_fs.h | ||
330 | header-y += smb_mount.h | ||
331 | header-y += smbno.h | ||
332 | header-y += snmp.h | 330 | header-y += snmp.h |
333 | header-y += socket.h | 331 | header-y += socket.h |
334 | header-y += sockios.h | 332 | header-y += sockios.h |
@@ -371,7 +369,6 @@ header-y += veth.h | |||
371 | header-y += vhost.h | 369 | header-y += vhost.h |
372 | header-y += videodev.h | 370 | header-y += videodev.h |
373 | header-y += videodev2.h | 371 | header-y += videodev2.h |
374 | header-y += videotext.h | ||
375 | header-y += virtio_9p.h | 372 | header-y += virtio_9p.h |
376 | header-y += virtio_balloon.h | 373 | header-y += virtio_balloon.h |
377 | header-y += virtio_blk.h | 374 | header-y += virtio_blk.h |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index c227757feb06..050a7bccb836 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -245,8 +245,6 @@ int acpi_check_resource_conflict(const struct resource *res); | |||
245 | 245 | ||
246 | int acpi_check_region(resource_size_t start, resource_size_t n, | 246 | int acpi_check_region(resource_size_t start, resource_size_t n, |
247 | const char *name); | 247 | const char *name); |
248 | int acpi_check_mem_region(resource_size_t start, resource_size_t n, | ||
249 | const char *name); | ||
250 | 248 | ||
251 | int acpi_resources_are_enforced(void); | 249 | int acpi_resources_are_enforced(void); |
252 | 250 | ||
@@ -308,6 +306,9 @@ extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, | |||
308 | u32 *mask, u32 req); | 306 | u32 *mask, u32 req); |
309 | extern void acpi_early_init(void); | 307 | extern void acpi_early_init(void); |
310 | 308 | ||
309 | int acpi_os_map_generic_address(struct acpi_generic_address *addr); | ||
310 | void acpi_os_unmap_generic_address(struct acpi_generic_address *addr); | ||
311 | |||
311 | #else /* !CONFIG_ACPI */ | 312 | #else /* !CONFIG_ACPI */ |
312 | 313 | ||
313 | #define acpi_disabled 1 | 314 | #define acpi_disabled 1 |
@@ -344,12 +345,6 @@ static inline int acpi_check_region(resource_size_t start, resource_size_t n, | |||
344 | return 0; | 345 | return 0; |
345 | } | 346 | } |
346 | 347 | ||
347 | static inline int acpi_check_mem_region(resource_size_t start, | ||
348 | resource_size_t n, const char *name) | ||
349 | { | ||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | struct acpi_table_header; | 348 | struct acpi_table_header; |
354 | static inline int acpi_table_parse(char *id, | 349 | static inline int acpi_table_parse(char *id, |
355 | int (*handler)(struct acpi_table_header *)) | 350 | int (*handler)(struct acpi_table_header *)) |
diff --git a/include/linux/acpi_pmtmr.h b/include/linux/acpi_pmtmr.h index 7e3d2859be50..1d0ef1ae8036 100644 --- a/include/linux/acpi_pmtmr.h +++ b/include/linux/acpi_pmtmr.h | |||
@@ -25,8 +25,6 @@ static inline u32 acpi_pm_read_early(void) | |||
25 | return acpi_pm_read_verified() & ACPI_PM_MASK; | 25 | return acpi_pm_read_verified() & ACPI_PM_MASK; |
26 | } | 26 | } |
27 | 27 | ||
28 | extern void pmtimer_wait(unsigned); | ||
29 | |||
30 | #else | 28 | #else |
31 | 29 | ||
32 | static inline u32 acpi_pm_read_early(void) | 30 | static inline u32 acpi_pm_read_early(void) |
diff --git a/include/linux/altera_uart.h b/include/linux/altera_uart.h index 8d441064a30d..a10a90791976 100644 --- a/include/linux/altera_uart.h +++ b/include/linux/altera_uart.h | |||
@@ -5,10 +5,15 @@ | |||
5 | #ifndef __ALTUART_H | 5 | #ifndef __ALTUART_H |
6 | #define __ALTUART_H | 6 | #define __ALTUART_H |
7 | 7 | ||
8 | #include <linux/init.h> | ||
9 | |||
8 | struct altera_uart_platform_uart { | 10 | struct altera_uart_platform_uart { |
9 | unsigned long mapbase; /* Physical address base */ | 11 | unsigned long mapbase; /* Physical address base */ |
10 | unsigned int irq; /* Interrupt vector */ | 12 | unsigned int irq; /* Interrupt vector */ |
11 | unsigned int uartclk; /* UART clock rate */ | 13 | unsigned int uartclk; /* UART clock rate */ |
14 | unsigned int bus_shift; /* Bus shift (address stride) */ | ||
12 | }; | 15 | }; |
13 | 16 | ||
17 | int __init early_altera_uart_setup(struct altera_uart_platform_uart *platp); | ||
18 | |||
14 | #endif /* __ALTUART_H */ | 19 | #endif /* __ALTUART_H */ |
diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index b0c174012436..c6454cca0447 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/resource.h> | 20 | #include <linux/resource.h> |
21 | 21 | ||
22 | #define AMBA_NR_IRQS 2 | 22 | #define AMBA_NR_IRQS 2 |
23 | #define AMBA_CID 0xb105f00d | ||
23 | 24 | ||
24 | struct clk; | 25 | struct clk; |
25 | 26 | ||
@@ -70,9 +71,15 @@ void amba_release_regions(struct amba_device *); | |||
70 | #define amba_pclk_disable(d) \ | 71 | #define amba_pclk_disable(d) \ |
71 | do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0) | 72 | do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0) |
72 | 73 | ||
73 | #define amba_config(d) (((d)->periphid >> 24) & 0xff) | 74 | /* Some drivers don't use the struct amba_device */ |
74 | #define amba_rev(d) (((d)->periphid >> 20) & 0x0f) | 75 | #define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff) |
75 | #define amba_manf(d) (((d)->periphid >> 12) & 0xff) | 76 | #define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f) |
76 | #define amba_part(d) ((d)->periphid & 0xfff) | 77 | #define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff) |
78 | #define AMBA_PART_BITS(a) ((a) & 0xfff) | ||
79 | |||
80 | #define amba_config(d) AMBA_CONFIG_BITS((d)->periphid) | ||
81 | #define amba_rev(d) AMBA_REV_BITS((d)->periphid) | ||
82 | #define amba_manf(d) AMBA_MANF_BITS((d)->periphid) | ||
83 | #define amba_part(d) AMBA_PART_BITS((d)->periphid) | ||
77 | 84 | ||
78 | #endif | 85 | #endif |
diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h index ca84ce70d5d5..f4ee9acc9721 100644 --- a/include/linux/amba/mmci.h +++ b/include/linux/amba/mmci.h | |||
@@ -24,6 +24,7 @@ | |||
24 | * whether a card is present in the MMC slot or not | 24 | * whether a card is present in the MMC slot or not |
25 | * @gpio_wp: read this GPIO pin to see if the card is write protected | 25 | * @gpio_wp: read this GPIO pin to see if the card is write protected |
26 | * @gpio_cd: read this GPIO pin to detect card insertion | 26 | * @gpio_cd: read this GPIO pin to detect card insertion |
27 | * @cd_invert: true if the gpio_cd pin value is active low | ||
27 | * @capabilities: the capabilities of the block as implemented in | 28 | * @capabilities: the capabilities of the block as implemented in |
28 | * this platform, signify anything MMC_CAP_* from mmc/host.h | 29 | * this platform, signify anything MMC_CAP_* from mmc/host.h |
29 | */ | 30 | */ |
@@ -35,6 +36,7 @@ struct mmci_platform_data { | |||
35 | unsigned int (*status)(struct device *); | 36 | unsigned int (*status)(struct device *); |
36 | int gpio_wp; | 37 | int gpio_wp; |
37 | int gpio_cd; | 38 | int gpio_cd; |
39 | bool cd_invert; | ||
38 | unsigned long capabilities; | 40 | unsigned long capabilities; |
39 | }; | 41 | }; |
40 | 42 | ||
diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h index abf26cc47a2b..4ce98f54186b 100644 --- a/include/linux/amba/pl022.h +++ b/include/linux/amba/pl022.h | |||
@@ -228,6 +228,7 @@ enum ssp_chip_select { | |||
228 | }; | 228 | }; |
229 | 229 | ||
230 | 230 | ||
231 | struct dma_chan; | ||
231 | /** | 232 | /** |
232 | * struct pl022_ssp_master - device.platform_data for SPI controller devices. | 233 | * struct pl022_ssp_master - device.platform_data for SPI controller devices. |
233 | * @num_chipselect: chipselects are used to distinguish individual | 234 | * @num_chipselect: chipselects are used to distinguish individual |
@@ -235,11 +236,16 @@ enum ssp_chip_select { | |||
235 | * each slave has a chipselect signal, but it's common that not | 236 | * each slave has a chipselect signal, but it's common that not |
236 | * every chipselect is connected to a slave. | 237 | * every chipselect is connected to a slave. |
237 | * @enable_dma: if true enables DMA driven transfers. | 238 | * @enable_dma: if true enables DMA driven transfers. |
239 | * @dma_rx_param: parameter to locate an RX DMA channel. | ||
240 | * @dma_tx_param: parameter to locate a TX DMA channel. | ||
238 | */ | 241 | */ |
239 | struct pl022_ssp_controller { | 242 | struct pl022_ssp_controller { |
240 | u16 bus_id; | 243 | u16 bus_id; |
241 | u8 num_chipselect; | 244 | u8 num_chipselect; |
242 | u8 enable_dma:1; | 245 | u8 enable_dma:1; |
246 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | ||
247 | void *dma_rx_param; | ||
248 | void *dma_tx_param; | ||
243 | }; | 249 | }; |
244 | 250 | ||
245 | /** | 251 | /** |
@@ -270,20 +276,13 @@ struct pl022_ssp_controller { | |||
270 | * @dma_config: DMA configuration for SSP controller and peripheral | 276 | * @dma_config: DMA configuration for SSP controller and peripheral |
271 | */ | 277 | */ |
272 | struct pl022_config_chip { | 278 | struct pl022_config_chip { |
273 | struct device *dev; | ||
274 | enum ssp_loopback lbm; | ||
275 | enum ssp_interface iface; | 279 | enum ssp_interface iface; |
276 | enum ssp_hierarchy hierarchy; | 280 | enum ssp_hierarchy hierarchy; |
277 | bool slave_tx_disable; | 281 | bool slave_tx_disable; |
278 | struct ssp_clock_params clk_freq; | 282 | struct ssp_clock_params clk_freq; |
279 | enum ssp_rx_endian endian_rx; | ||
280 | enum ssp_tx_endian endian_tx; | ||
281 | enum ssp_data_size data_size; | ||
282 | enum ssp_mode com_mode; | 283 | enum ssp_mode com_mode; |
283 | enum ssp_rx_level_trig rx_lev_trig; | 284 | enum ssp_rx_level_trig rx_lev_trig; |
284 | enum ssp_tx_level_trig tx_lev_trig; | 285 | enum ssp_tx_level_trig tx_lev_trig; |
285 | enum ssp_spi_clk_phase clk_phase; | ||
286 | enum ssp_spi_clk_pol clk_pol; | ||
287 | enum ssp_microwire_ctrl_len ctrl_len; | 286 | enum ssp_microwire_ctrl_len ctrl_len; |
288 | enum ssp_microwire_wait_state wait_state; | 287 | enum ssp_microwire_wait_state wait_state; |
289 | enum ssp_duplex duplex; | 288 | enum ssp_duplex duplex; |
diff --git a/include/linux/amba/pl08x.h b/include/linux/amba/pl08x.h new file mode 100644 index 000000000000..521a0f8974ac --- /dev/null +++ b/include/linux/amba/pl08x.h | |||
@@ -0,0 +1,222 @@ | |||
1 | /* | ||
2 | * linux/amba/pl08x.h - ARM PrimeCell DMA Controller driver | ||
3 | * | ||
4 | * Copyright (C) 2005 ARM Ltd | ||
5 | * Copyright (C) 2010 ST-Ericsson SA | ||
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 | * pl08x information required by platform code | ||
12 | * | ||
13 | * Please credit ARM.com | ||
14 | * Documentation: ARM DDI 0196D | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #ifndef AMBA_PL08X_H | ||
19 | #define AMBA_PL08X_H | ||
20 | |||
21 | /* We need sizes of structs from this header */ | ||
22 | #include <linux/dmaengine.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | |||
25 | /** | ||
26 | * struct pl08x_channel_data - data structure to pass info between | ||
27 | * platform and PL08x driver regarding channel configuration | ||
28 | * @bus_id: name of this device channel, not just a device name since | ||
29 | * devices may have more than one channel e.g. "foo_tx" | ||
30 | * @min_signal: the minimum DMA signal number to be muxed in for this | ||
31 | * channel (for platforms supporting muxed signals). If you have | ||
32 | * static assignments, make sure this is set to the assigned signal | ||
33 | * number, PL08x have 16 possible signals in number 0 thru 15 so | ||
34 | * when these are not enough they often get muxed (in hardware) | ||
35 | * disabling simultaneous use of the same channel for two devices. | ||
36 | * @max_signal: the maximum DMA signal number to be muxed in for | ||
37 | * the channel. Set to the same as min_signal for | ||
38 | * devices with static assignments | ||
39 | * @muxval: a number usually used to poke into some mux regiser to | ||
40 | * mux in the signal to this channel | ||
41 | * @cctl_opt: default options for the channel control register | ||
42 | * @addr: source/target address in physical memory for this DMA channel, | ||
43 | * can be the address of a FIFO register for burst requests for example. | ||
44 | * This can be left undefined if the PrimeCell API is used for configuring | ||
45 | * this. | ||
46 | * @circular_buffer: whether the buffer passed in is circular and | ||
47 | * shall simply be looped round round (like a record baby round | ||
48 | * round round round) | ||
49 | * @single: the device connected to this channel will request single | ||
50 | * DMA transfers, not bursts. (Bursts are default.) | ||
51 | */ | ||
52 | struct pl08x_channel_data { | ||
53 | char *bus_id; | ||
54 | int min_signal; | ||
55 | int max_signal; | ||
56 | u32 muxval; | ||
57 | u32 cctl; | ||
58 | u32 ccfg; | ||
59 | dma_addr_t addr; | ||
60 | bool circular_buffer; | ||
61 | bool single; | ||
62 | }; | ||
63 | |||
64 | /** | ||
65 | * Struct pl08x_bus_data - information of source or destination | ||
66 | * busses for a transfer | ||
67 | * @addr: current address | ||
68 | * @maxwidth: the maximum width of a transfer on this bus | ||
69 | * @buswidth: the width of this bus in bytes: 1, 2 or 4 | ||
70 | * @fill_bytes: bytes required to fill to the next bus memory | ||
71 | * boundary | ||
72 | */ | ||
73 | struct pl08x_bus_data { | ||
74 | dma_addr_t addr; | ||
75 | u8 maxwidth; | ||
76 | u8 buswidth; | ||
77 | u32 fill_bytes; | ||
78 | }; | ||
79 | |||
80 | /** | ||
81 | * struct pl08x_phy_chan - holder for the physical channels | ||
82 | * @id: physical index to this channel | ||
83 | * @lock: a lock to use when altering an instance of this struct | ||
84 | * @signal: the physical signal (aka channel) serving this | ||
85 | * physical channel right now | ||
86 | * @serving: the virtual channel currently being served by this | ||
87 | * physical channel | ||
88 | */ | ||
89 | struct pl08x_phy_chan { | ||
90 | unsigned int id; | ||
91 | void __iomem *base; | ||
92 | spinlock_t lock; | ||
93 | int signal; | ||
94 | struct pl08x_dma_chan *serving; | ||
95 | u32 csrc; | ||
96 | u32 cdst; | ||
97 | u32 clli; | ||
98 | u32 cctl; | ||
99 | u32 ccfg; | ||
100 | }; | ||
101 | |||
102 | /** | ||
103 | * struct pl08x_txd - wrapper for struct dma_async_tx_descriptor | ||
104 | * @llis_bus: DMA memory address (physical) start for the LLIs | ||
105 | * @llis_va: virtual memory address start for the LLIs | ||
106 | */ | ||
107 | struct pl08x_txd { | ||
108 | struct dma_async_tx_descriptor tx; | ||
109 | struct list_head node; | ||
110 | enum dma_data_direction direction; | ||
111 | struct pl08x_bus_data srcbus; | ||
112 | struct pl08x_bus_data dstbus; | ||
113 | int len; | ||
114 | dma_addr_t llis_bus; | ||
115 | void *llis_va; | ||
116 | struct pl08x_channel_data *cd; | ||
117 | bool active; | ||
118 | /* | ||
119 | * Settings to be put into the physical channel when we | ||
120 | * trigger this txd | ||
121 | */ | ||
122 | u32 csrc; | ||
123 | u32 cdst; | ||
124 | u32 clli; | ||
125 | u32 cctl; | ||
126 | }; | ||
127 | |||
128 | /** | ||
129 | * struct pl08x_dma_chan_state - holds the PL08x specific virtual | ||
130 | * channel states | ||
131 | * @PL08X_CHAN_IDLE: the channel is idle | ||
132 | * @PL08X_CHAN_RUNNING: the channel has allocated a physical transport | ||
133 | * channel and is running a transfer on it | ||
134 | * @PL08X_CHAN_PAUSED: the channel has allocated a physical transport | ||
135 | * channel, but the transfer is currently paused | ||
136 | * @PL08X_CHAN_WAITING: the channel is waiting for a physical transport | ||
137 | * channel to become available (only pertains to memcpy channels) | ||
138 | */ | ||
139 | enum pl08x_dma_chan_state { | ||
140 | PL08X_CHAN_IDLE, | ||
141 | PL08X_CHAN_RUNNING, | ||
142 | PL08X_CHAN_PAUSED, | ||
143 | PL08X_CHAN_WAITING, | ||
144 | }; | ||
145 | |||
146 | /** | ||
147 | * struct pl08x_dma_chan - this structure wraps a DMA ENGINE channel | ||
148 | * @chan: wrappped abstract channel | ||
149 | * @phychan: the physical channel utilized by this channel, if there is one | ||
150 | * @tasklet: tasklet scheduled by the IRQ to handle actual work etc | ||
151 | * @name: name of channel | ||
152 | * @cd: channel platform data | ||
153 | * @runtime_addr: address for RX/TX according to the runtime config | ||
154 | * @runtime_direction: current direction of this channel according to | ||
155 | * runtime config | ||
156 | * @lc: last completed transaction on this channel | ||
157 | * @desc_list: queued transactions pending on this channel | ||
158 | * @at: active transaction on this channel | ||
159 | * @lockflags: sometimes we let a lock last between two function calls, | ||
160 | * especially prep/submit, and then we need to store the IRQ flags | ||
161 | * in the channel state, here | ||
162 | * @lock: a lock for this channel data | ||
163 | * @host: a pointer to the host (internal use) | ||
164 | * @state: whether the channel is idle, paused, running etc | ||
165 | * @slave: whether this channel is a device (slave) or for memcpy | ||
166 | * @waiting: a TX descriptor on this channel which is waiting for | ||
167 | * a physical channel to become available | ||
168 | */ | ||
169 | struct pl08x_dma_chan { | ||
170 | struct dma_chan chan; | ||
171 | struct pl08x_phy_chan *phychan; | ||
172 | struct tasklet_struct tasklet; | ||
173 | char *name; | ||
174 | struct pl08x_channel_data *cd; | ||
175 | dma_addr_t runtime_addr; | ||
176 | enum dma_data_direction runtime_direction; | ||
177 | atomic_t last_issued; | ||
178 | dma_cookie_t lc; | ||
179 | struct list_head desc_list; | ||
180 | struct pl08x_txd *at; | ||
181 | unsigned long lockflags; | ||
182 | spinlock_t lock; | ||
183 | void *host; | ||
184 | enum pl08x_dma_chan_state state; | ||
185 | bool slave; | ||
186 | struct pl08x_txd *waiting; | ||
187 | }; | ||
188 | |||
189 | /** | ||
190 | * struct pl08x_platform_data - the platform configuration for the | ||
191 | * PL08x PrimeCells. | ||
192 | * @slave_channels: the channels defined for the different devices on the | ||
193 | * platform, all inclusive, including multiplexed channels. The available | ||
194 | * physical channels will be multiplexed around these signals as they | ||
195 | * are requested, just enumerate all possible channels. | ||
196 | * @get_signal: request a physical signal to be used for a DMA | ||
197 | * transfer immediately: if there is some multiplexing or similar blocking | ||
198 | * the use of the channel the transfer can be denied by returning | ||
199 | * less than zero, else it returns the allocated signal number | ||
200 | * @put_signal: indicate to the platform that this physical signal is not | ||
201 | * running any DMA transfer and multiplexing can be recycled | ||
202 | * @bus_bit_lli: Bit[0] of the address indicated which AHB bus master the | ||
203 | * LLI addresses are on 0/1 Master 1/2. | ||
204 | */ | ||
205 | struct pl08x_platform_data { | ||
206 | struct pl08x_channel_data *slave_channels; | ||
207 | unsigned int num_slave_channels; | ||
208 | struct pl08x_channel_data memcpy_channel; | ||
209 | int (*get_signal)(struct pl08x_dma_chan *); | ||
210 | void (*put_signal)(struct pl08x_dma_chan *); | ||
211 | }; | ||
212 | |||
213 | #ifdef CONFIG_AMBA_PL08X | ||
214 | bool pl08x_filter_id(struct dma_chan *chan, void *chan_id); | ||
215 | #else | ||
216 | static inline bool pl08x_filter_id(struct dma_chan *chan, void *chan_id) | ||
217 | { | ||
218 | return false; | ||
219 | } | ||
220 | #endif | ||
221 | |||
222 | #endif /* AMBA_PL08X_H */ | ||
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index e1b634b635f2..6021588ba0a8 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h | |||
@@ -32,7 +32,9 @@ | |||
32 | #define UART01x_RSR 0x04 /* Receive status register (Read). */ | 32 | #define UART01x_RSR 0x04 /* Receive status register (Read). */ |
33 | #define UART01x_ECR 0x04 /* Error clear register (Write). */ | 33 | #define UART01x_ECR 0x04 /* Error clear register (Write). */ |
34 | #define UART010_LCRH 0x08 /* Line control register, high byte. */ | 34 | #define UART010_LCRH 0x08 /* Line control register, high byte. */ |
35 | #define ST_UART011_DMAWM 0x08 /* DMA watermark configure register. */ | ||
35 | #define UART010_LCRM 0x0C /* Line control register, middle byte. */ | 36 | #define UART010_LCRM 0x0C /* Line control register, middle byte. */ |
37 | #define ST_UART011_TIMEOUT 0x0C /* Timeout period register. */ | ||
36 | #define UART010_LCRL 0x10 /* Line control register, low byte. */ | 38 | #define UART010_LCRL 0x10 /* Line control register, low byte. */ |
37 | #define UART010_CR 0x14 /* Control register. */ | 39 | #define UART010_CR 0x14 /* Control register. */ |
38 | #define UART01x_FR 0x18 /* Flag register (Read only). */ | 40 | #define UART01x_FR 0x18 /* Flag register (Read only). */ |
@@ -51,6 +53,15 @@ | |||
51 | #define UART011_MIS 0x40 /* Masked interrupt status. */ | 53 | #define UART011_MIS 0x40 /* Masked interrupt status. */ |
52 | #define UART011_ICR 0x44 /* Interrupt clear register. */ | 54 | #define UART011_ICR 0x44 /* Interrupt clear register. */ |
53 | #define UART011_DMACR 0x48 /* DMA control register. */ | 55 | #define UART011_DMACR 0x48 /* DMA control register. */ |
56 | #define ST_UART011_XFCR 0x50 /* XON/XOFF control register. */ | ||
57 | #define ST_UART011_XON1 0x54 /* XON1 register. */ | ||
58 | #define ST_UART011_XON2 0x58 /* XON2 register. */ | ||
59 | #define ST_UART011_XOFF1 0x5C /* XON1 register. */ | ||
60 | #define ST_UART011_XOFF2 0x60 /* XON2 register. */ | ||
61 | #define ST_UART011_ITCR 0x80 /* Integration test control register. */ | ||
62 | #define ST_UART011_ITIP 0x84 /* Integration test input register. */ | ||
63 | #define ST_UART011_ABCR 0x100 /* Autobaud control register. */ | ||
64 | #define ST_UART011_ABIMSC 0x15C /* Autobaud interrupt mask/clear register. */ | ||
54 | 65 | ||
55 | #define UART011_DR_OE (1 << 11) | 66 | #define UART011_DR_OE (1 << 11) |
56 | #define UART011_DR_BE (1 << 10) | 67 | #define UART011_DR_BE (1 << 10) |
diff --git a/include/linux/ata.h b/include/linux/ata.h index fe6e681a9d74..0c4929fa34d3 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_LOGICAL_SECTOR_SIZE = 117, /* and 118 */ | ||
92 | ATA_ID_LAST_LUN = 126, | 93 | ATA_ID_LAST_LUN = 126, |
93 | ATA_ID_DLF = 128, | 94 | ATA_ID_DLF = 128, |
94 | ATA_ID_CSFO = 129, | 95 | ATA_ID_CSFO = 129, |
@@ -640,16 +641,49 @@ static inline int ata_id_flush_ext_enabled(const u16 *id) | |||
640 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; | 641 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; |
641 | } | 642 | } |
642 | 643 | ||
643 | static inline int ata_id_has_large_logical_sectors(const u16 *id) | 644 | static inline u32 ata_id_logical_sector_size(const u16 *id) |
644 | { | 645 | { |
645 | if ((id[ATA_ID_SECTOR_SIZE] & 0xc000) != 0x4000) | 646 | /* T13/1699-D Revision 6a, Sep 6, 2008. Page 128. |
646 | return 0; | 647 | * IDENTIFY DEVICE data, word 117-118. |
647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); | 648 | * 0xd000 ignores bit 13 (logical:physical > 1) |
649 | */ | ||
650 | if ((id[ATA_ID_SECTOR_SIZE] & 0xd000) == 0x5000) | ||
651 | return (((id[ATA_ID_LOGICAL_SECTOR_SIZE+1] << 16) | ||
652 | + id[ATA_ID_LOGICAL_SECTOR_SIZE]) * sizeof(u16)) ; | ||
653 | return ATA_SECT_SIZE; | ||
654 | } | ||
655 | |||
656 | static inline u8 ata_id_log2_per_physical_sector(const u16 *id) | ||
657 | { | ||
658 | /* T13/1699-D Revision 6a, Sep 6, 2008. Page 128. | ||
659 | * IDENTIFY DEVICE data, word 106. | ||
660 | * 0xe000 ignores bit 12 (logical sector > 512 bytes) | ||
661 | */ | ||
662 | if ((id[ATA_ID_SECTOR_SIZE] & 0xe000) == 0x6000) | ||
663 | return (id[ATA_ID_SECTOR_SIZE] & 0xf); | ||
664 | return 0; | ||
648 | } | 665 | } |
649 | 666 | ||
650 | static inline u16 ata_id_logical_per_physical_sectors(const u16 *id) | 667 | /* Offset of logical sectors relative to physical sectors. |
668 | * | ||
669 | * If device has more than one logical sector per physical sector | ||
670 | * (aka 512 byte emulation), vendors might offset the "sector 0" address | ||
671 | * so sector 63 is "naturally aligned" - e.g. FAT partition table. | ||
672 | * This avoids Read/Mod/Write penalties when using FAT partition table | ||
673 | * and updating "well aligned" (FS perspective) physical sectors on every | ||
674 | * transaction. | ||
675 | */ | ||
676 | static inline u16 ata_id_logical_sector_offset(const u16 *id, | ||
677 | u8 log2_per_phys) | ||
651 | { | 678 | { |
652 | return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf); | 679 | u16 word_209 = id[209]; |
680 | |||
681 | if ((log2_per_phys > 1) && (word_209 & 0xc000) == 0x4000) { | ||
682 | u16 first = word_209 & 0x3fff; | ||
683 | if (first > 0) | ||
684 | return (1 << log2_per_phys) - first; | ||
685 | } | ||
686 | return 0; | ||
653 | } | 687 | } |
654 | 688 | ||
655 | static inline int ata_id_has_lba48(const u16 *id) | 689 | static inline int ata_id_has_lba48(const u16 *id) |
diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index f6481daf6e52..a8e4e832cdbb 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h | |||
@@ -449,7 +449,7 @@ void vcc_insert_socket(struct sock *sk); | |||
449 | 449 | ||
450 | static inline int atm_guess_pdu2truesize(int size) | 450 | static inline int atm_guess_pdu2truesize(int size) |
451 | { | 451 | { |
452 | return (SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info)); | 452 | return SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info); |
453 | } | 453 | } |
454 | 454 | ||
455 | 455 | ||
diff --git a/include/linux/atomic.h b/include/linux/atomic.h new file mode 100644 index 000000000000..96c038e43d66 --- /dev/null +++ b/include/linux/atomic.h | |||
@@ -0,0 +1,37 @@ | |||
1 | #ifndef _LINUX_ATOMIC_H | ||
2 | #define _LINUX_ATOMIC_H | ||
3 | #include <asm/atomic.h> | ||
4 | |||
5 | /** | ||
6 | * atomic_inc_not_zero_hint - increment if not null | ||
7 | * @v: pointer of type atomic_t | ||
8 | * @hint: probable value of the atomic before the increment | ||
9 | * | ||
10 | * This version of atomic_inc_not_zero() gives a hint of probable | ||
11 | * value of the atomic. This helps processor to not read the memory | ||
12 | * before doing the atomic read/modify/write cycle, lowering | ||
13 | * number of bus transactions on some arches. | ||
14 | * | ||
15 | * Returns: 0 if increment was not done, 1 otherwise. | ||
16 | */ | ||
17 | #ifndef atomic_inc_not_zero_hint | ||
18 | static inline int atomic_inc_not_zero_hint(atomic_t *v, int hint) | ||
19 | { | ||
20 | int val, c = hint; | ||
21 | |||
22 | /* sanity test, should be removed by compiler if hint is a constant */ | ||
23 | if (!hint) | ||
24 | return atomic_inc_not_zero(v); | ||
25 | |||
26 | do { | ||
27 | val = atomic_cmpxchg(v, c, c + 1); | ||
28 | if (val == c) | ||
29 | return 1; | ||
30 | c = val; | ||
31 | } while (c); | ||
32 | |||
33 | return 0; | ||
34 | } | ||
35 | #endif | ||
36 | |||
37 | #endif /* _LINUX_ATOMIC_H */ | ||
diff --git a/include/linux/audit.h b/include/linux/audit.h index e24afabc548f..8b5c0620abf9 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -102,6 +102,7 @@ | |||
102 | #define AUDIT_EOE 1320 /* End of multi-record event */ | 102 | #define AUDIT_EOE 1320 /* End of multi-record event */ |
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 | 106 | ||
106 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ | 107 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ |
107 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ | 108 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ |
@@ -478,6 +479,7 @@ extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm, | |||
478 | const struct cred *new, | 479 | const struct cred *new, |
479 | const struct cred *old); | 480 | const struct cred *old); |
480 | extern void __audit_log_capset(pid_t pid, const struct cred *new, const struct cred *old); | 481 | extern void __audit_log_capset(pid_t pid, const struct cred *new, const struct cred *old); |
482 | extern void __audit_mmap_fd(int fd, int flags); | ||
481 | 483 | ||
482 | static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp) | 484 | static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp) |
483 | { | 485 | { |
@@ -531,6 +533,12 @@ static inline void audit_log_capset(pid_t pid, const struct cred *new, | |||
531 | __audit_log_capset(pid, new, old); | 533 | __audit_log_capset(pid, new, old); |
532 | } | 534 | } |
533 | 535 | ||
536 | static inline void audit_mmap_fd(int fd, int flags) | ||
537 | { | ||
538 | if (unlikely(!audit_dummy_context())) | ||
539 | __audit_mmap_fd(fd, flags); | ||
540 | } | ||
541 | |||
534 | extern int audit_n_rules; | 542 | extern int audit_n_rules; |
535 | extern int audit_signals; | 543 | extern int audit_signals; |
536 | #else | 544 | #else |
@@ -564,6 +572,7 @@ extern int audit_signals; | |||
564 | #define audit_mq_getsetattr(d,s) ((void)0) | 572 | #define audit_mq_getsetattr(d,s) ((void)0) |
565 | #define audit_log_bprm_fcaps(b, ncr, ocr) ({ 0; }) | 573 | #define audit_log_bprm_fcaps(b, ncr, ocr) ({ 0; }) |
566 | #define audit_log_capset(pid, ncr, ocr) ((void)0) | 574 | #define audit_log_capset(pid, ncr, ocr) ((void)0) |
575 | #define audit_mmap_fd(fd, flags) ((void)0) | ||
567 | #define audit_ptrace(t) ((void)0) | 576 | #define audit_ptrace(t) ((void)0) |
568 | #define audit_n_rules 0 | 577 | #define audit_n_rules 0 |
569 | #define audit_signals 0 | 578 | #define audit_signals 0 |
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 35b00746c712..4ce34fa937d4 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
@@ -111,6 +111,7 @@ void bdi_wakeup_thread_delayed(struct backing_dev_info *bdi); | |||
111 | 111 | ||
112 | extern spinlock_t bdi_lock; | 112 | extern spinlock_t bdi_lock; |
113 | extern struct list_head bdi_list; | 113 | extern struct list_head bdi_list; |
114 | extern struct list_head bdi_pending_list; | ||
114 | 115 | ||
115 | static inline int wb_has_dirty_io(struct bdi_writeback *wb) | 116 | static inline int wb_has_dirty_io(struct bdi_writeback *wb) |
116 | { | 117 | { |
@@ -285,7 +286,7 @@ enum { | |||
285 | void clear_bdi_congested(struct backing_dev_info *bdi, int sync); | 286 | void clear_bdi_congested(struct backing_dev_info *bdi, int sync); |
286 | void set_bdi_congested(struct backing_dev_info *bdi, int sync); | 287 | void set_bdi_congested(struct backing_dev_info *bdi, int sync); |
287 | long congestion_wait(int sync, long timeout); | 288 | long congestion_wait(int sync, long timeout); |
288 | 289 | long wait_iff_congested(struct zone *zone, int sync, long timeout); | |
289 | 290 | ||
290 | static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi) | 291 | static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi) |
291 | { | 292 | { |
diff --git a/include/linux/basic_mmio_gpio.h b/include/linux/basic_mmio_gpio.h new file mode 100644 index 000000000000..198087a16fc4 --- /dev/null +++ b/include/linux/basic_mmio_gpio.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * Basic memory-mapped GPIO controllers. | ||
3 | * | ||
4 | * Copyright 2008 MontaVista Software, Inc. | ||
5 | * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef __BASIC_MMIO_GPIO_H | ||
14 | #define __BASIC_MMIO_GPIO_H | ||
15 | |||
16 | struct bgpio_pdata { | ||
17 | int base; | ||
18 | }; | ||
19 | |||
20 | #endif /* __BASIC_MMIO_GPIO_H */ | ||
diff --git a/include/linux/bfin_mac.h b/include/linux/bfin_mac.h new file mode 100644 index 000000000000..904dec7d03a1 --- /dev/null +++ b/include/linux/bfin_mac.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* | ||
2 | * Blackfin On-Chip MAC Driver | ||
3 | * | ||
4 | * Copyright 2004-2010 Analog Devices Inc. | ||
5 | * | ||
6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
7 | * | ||
8 | * Licensed under the GPL-2 or later. | ||
9 | */ | ||
10 | |||
11 | #ifndef _LINUX_BFIN_MAC_H_ | ||
12 | #define _LINUX_BFIN_MAC_H_ | ||
13 | |||
14 | #include <linux/phy.h> | ||
15 | |||
16 | struct bfin_phydev_platform_data { | ||
17 | unsigned short addr; | ||
18 | int irq; | ||
19 | }; | ||
20 | |||
21 | struct bfin_mii_bus_platform_data { | ||
22 | int phydev_number; | ||
23 | struct bfin_phydev_platform_data *phydev_data; | ||
24 | const unsigned short *mac_peripherals; | ||
25 | int phy_mode; | ||
26 | unsigned int phy_mask; | ||
27 | }; | ||
28 | |||
29 | #endif | ||
diff --git a/include/linux/bio.h b/include/linux/bio.h index 5274103434ad..35dcdb3589bc 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
@@ -66,10 +66,6 @@ | |||
66 | #define bio_offset(bio) bio_iovec((bio))->bv_offset | 66 | #define bio_offset(bio) bio_iovec((bio))->bv_offset |
67 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) | 67 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) |
68 | #define bio_sectors(bio) ((bio)->bi_size >> 9) | 68 | #define bio_sectors(bio) ((bio)->bi_size >> 9) |
69 | #define bio_empty_barrier(bio) \ | ||
70 | ((bio->bi_rw & REQ_HARDBARRIER) && \ | ||
71 | !bio_has_data(bio) && \ | ||
72 | !(bio->bi_rw & REQ_DISCARD)) | ||
73 | 69 | ||
74 | static inline unsigned int bio_cur_bytes(struct bio *bio) | 70 | static inline unsigned int bio_cur_bytes(struct bio *bio) |
75 | { | 71 | { |
@@ -346,8 +342,15 @@ static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags) | |||
346 | } | 342 | } |
347 | 343 | ||
348 | #else | 344 | #else |
349 | #define bvec_kmap_irq(bvec, flags) (page_address((bvec)->bv_page) + (bvec)->bv_offset) | 345 | static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags) |
350 | #define bvec_kunmap_irq(buf, flags) do { *(flags) = 0; } while (0) | 346 | { |
347 | return page_address(bvec->bv_page) + bvec->bv_offset; | ||
348 | } | ||
349 | |||
350 | static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags) | ||
351 | { | ||
352 | *flags = 0; | ||
353 | } | ||
351 | #endif | 354 | #endif |
352 | 355 | ||
353 | static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx, | 356 | static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx, |
@@ -496,6 +499,10 @@ static inline struct bio *bio_list_get(struct bio_list *bl) | |||
496 | #define bip_for_each_vec(bvl, bip, i) \ | 499 | #define bip_for_each_vec(bvl, bip, i) \ |
497 | __bip_for_each_vec(bvl, bip, i, (bip)->bip_idx) | 500 | __bip_for_each_vec(bvl, bip, i, (bip)->bip_idx) |
498 | 501 | ||
502 | #define bio_for_each_integrity_vec(_bvl, _bio, _iter) \ | ||
503 | for_each_bio(_bio) \ | ||
504 | bip_for_each_vec(_bvl, _bio->bi_integrity, _iter) | ||
505 | |||
499 | #define bio_integrity(bio) (bio->bi_integrity != NULL) | 506 | #define bio_integrity(bio) (bio->bi_integrity != NULL) |
500 | 507 | ||
501 | extern struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *, gfp_t, unsigned int, struct bio_set *); | 508 | extern struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *, gfp_t, unsigned int, struct bio_set *); |
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index fc68053378ce..827cc95711ef 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h | |||
@@ -136,28 +136,6 @@ static inline unsigned long __ffs64(u64 word) | |||
136 | } | 136 | } |
137 | 137 | ||
138 | #ifdef __KERNEL__ | 138 | #ifdef __KERNEL__ |
139 | #ifdef CONFIG_GENERIC_FIND_FIRST_BIT | ||
140 | |||
141 | /** | ||
142 | * find_first_bit - find the first set bit in a memory region | ||
143 | * @addr: The address to start the search at | ||
144 | * @size: The maximum size to search | ||
145 | * | ||
146 | * Returns the bit number of the first set bit. | ||
147 | */ | ||
148 | extern unsigned long find_first_bit(const unsigned long *addr, | ||
149 | unsigned long size); | ||
150 | |||
151 | /** | ||
152 | * find_first_zero_bit - find the first cleared bit in a memory region | ||
153 | * @addr: The address to start the search at | ||
154 | * @size: The maximum size to search | ||
155 | * | ||
156 | * Returns the bit number of the first cleared bit. | ||
157 | */ | ||
158 | extern unsigned long find_first_zero_bit(const unsigned long *addr, | ||
159 | unsigned long size); | ||
160 | #endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ | ||
161 | 139 | ||
162 | #ifdef CONFIG_GENERIC_FIND_LAST_BIT | 140 | #ifdef CONFIG_GENERIC_FIND_LAST_BIT |
163 | /** | 141 | /** |
@@ -171,28 +149,5 @@ extern unsigned long find_last_bit(const unsigned long *addr, | |||
171 | unsigned long size); | 149 | unsigned long size); |
172 | #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ | 150 | #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ |
173 | 151 | ||
174 | #ifdef CONFIG_GENERIC_FIND_NEXT_BIT | ||
175 | |||
176 | /** | ||
177 | * find_next_bit - find the next set bit in a memory region | ||
178 | * @addr: The address to base the search on | ||
179 | * @offset: The bitnumber to start searching at | ||
180 | * @size: The bitmap size in bits | ||
181 | */ | ||
182 | extern unsigned long find_next_bit(const unsigned long *addr, | ||
183 | unsigned long size, unsigned long offset); | ||
184 | |||
185 | /** | ||
186 | * find_next_zero_bit - find the next cleared bit in a memory region | ||
187 | * @addr: The address to base the search on | ||
188 | * @offset: The bitnumber to start searching at | ||
189 | * @size: The bitmap size in bits | ||
190 | */ | ||
191 | |||
192 | extern unsigned long find_next_zero_bit(const unsigned long *addr, | ||
193 | unsigned long size, | ||
194 | unsigned long offset); | ||
195 | |||
196 | #endif /* CONFIG_GENERIC_FIND_NEXT_BIT */ | ||
197 | #endif /* __KERNEL__ */ | 152 | #endif /* __KERNEL__ */ |
198 | #endif | 153 | #endif |
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index ca83a97c9715..46ad5197537a 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h | |||
@@ -97,6 +97,7 @@ struct bio { | |||
97 | #define BIO_NULL_MAPPED 9 /* contains invalid user pages */ | 97 | #define BIO_NULL_MAPPED 9 /* contains invalid user pages */ |
98 | #define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */ | 98 | #define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */ |
99 | #define BIO_QUIET 11 /* Make BIO Quiet */ | 99 | #define BIO_QUIET 11 /* Make BIO Quiet */ |
100 | #define BIO_MAPPED_INTEGRITY 12/* integrity metadata has been remapped */ | ||
100 | #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) | 101 | #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) |
101 | 102 | ||
102 | /* | 103 | /* |
@@ -121,7 +122,6 @@ enum rq_flag_bits { | |||
121 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ | 122 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ |
122 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ | 123 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ |
123 | 124 | ||
124 | __REQ_HARDBARRIER, /* may not be passed by drive either */ | ||
125 | __REQ_SYNC, /* request is sync (sync write or read) */ | 125 | __REQ_SYNC, /* request is sync (sync write or read) */ |
126 | __REQ_META, /* metadata io request */ | 126 | __REQ_META, /* metadata io request */ |
127 | __REQ_DISCARD, /* request to discard sectors */ | 127 | __REQ_DISCARD, /* request to discard sectors */ |
@@ -130,6 +130,8 @@ enum rq_flag_bits { | |||
130 | /* bio only flags */ | 130 | /* bio only flags */ |
131 | __REQ_UNPLUG, /* unplug the immediately after submission */ | 131 | __REQ_UNPLUG, /* unplug the immediately after submission */ |
132 | __REQ_RAHEAD, /* read ahead, can fail anytime */ | 132 | __REQ_RAHEAD, /* read ahead, can fail anytime */ |
133 | __REQ_THROTTLED, /* This bio has already been subjected to | ||
134 | * throttling rules. Don't do it again. */ | ||
133 | 135 | ||
134 | /* request only flags */ | 136 | /* request only flags */ |
135 | __REQ_SORTED, /* elevator knows about this request */ | 137 | __REQ_SORTED, /* elevator knows about this request */ |
@@ -143,10 +145,8 @@ enum rq_flag_bits { | |||
143 | __REQ_FAILED, /* set if the request failed */ | 145 | __REQ_FAILED, /* set if the request failed */ |
144 | __REQ_QUIET, /* don't worry about errors */ | 146 | __REQ_QUIET, /* don't worry about errors */ |
145 | __REQ_PREEMPT, /* set for "ide_preempt" requests */ | 147 | __REQ_PREEMPT, /* set for "ide_preempt" requests */ |
146 | __REQ_ORDERED_COLOR, /* is before or after barrier */ | ||
147 | __REQ_ALLOCED, /* request came from our alloc pool */ | 148 | __REQ_ALLOCED, /* request came from our alloc pool */ |
148 | __REQ_COPY_USER, /* contains copies of user pages */ | 149 | __REQ_COPY_USER, /* contains copies of user pages */ |
149 | __REQ_INTEGRITY, /* integrity metadata has been remapped */ | ||
150 | __REQ_FLUSH, /* request for cache flush */ | 150 | __REQ_FLUSH, /* request for cache flush */ |
151 | __REQ_IO_STAT, /* account I/O stat */ | 151 | __REQ_IO_STAT, /* account I/O stat */ |
152 | __REQ_MIXED_MERGE, /* merge of different types, fail separately */ | 152 | __REQ_MIXED_MERGE, /* merge of different types, fail separately */ |
@@ -158,7 +158,6 @@ enum rq_flag_bits { | |||
158 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) | 158 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) |
159 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) | 159 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) |
160 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) | 160 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) |
161 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) | ||
162 | #define REQ_SYNC (1 << __REQ_SYNC) | 161 | #define REQ_SYNC (1 << __REQ_SYNC) |
163 | #define REQ_META (1 << __REQ_META) | 162 | #define REQ_META (1 << __REQ_META) |
164 | #define REQ_DISCARD (1 << __REQ_DISCARD) | 163 | #define REQ_DISCARD (1 << __REQ_DISCARD) |
@@ -167,11 +166,13 @@ enum rq_flag_bits { | |||
167 | #define REQ_FAILFAST_MASK \ | 166 | #define REQ_FAILFAST_MASK \ |
168 | (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) | 167 | (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) |
169 | #define REQ_COMMON_MASK \ | 168 | #define REQ_COMMON_MASK \ |
170 | (REQ_WRITE | REQ_FAILFAST_MASK | REQ_HARDBARRIER | REQ_SYNC | \ | 169 | (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_DISCARD | \ |
171 | REQ_META| REQ_DISCARD | REQ_NOIDLE) | 170 | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) |
171 | #define REQ_CLONE_MASK REQ_COMMON_MASK | ||
172 | 172 | ||
173 | #define REQ_UNPLUG (1 << __REQ_UNPLUG) | 173 | #define REQ_UNPLUG (1 << __REQ_UNPLUG) |
174 | #define REQ_RAHEAD (1 << __REQ_RAHEAD) | 174 | #define REQ_RAHEAD (1 << __REQ_RAHEAD) |
175 | #define REQ_THROTTLED (1 << __REQ_THROTTLED) | ||
175 | 176 | ||
176 | #define REQ_SORTED (1 << __REQ_SORTED) | 177 | #define REQ_SORTED (1 << __REQ_SORTED) |
177 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | 178 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) |
@@ -184,10 +185,8 @@ enum rq_flag_bits { | |||
184 | #define REQ_FAILED (1 << __REQ_FAILED) | 185 | #define REQ_FAILED (1 << __REQ_FAILED) |
185 | #define REQ_QUIET (1 << __REQ_QUIET) | 186 | #define REQ_QUIET (1 << __REQ_QUIET) |
186 | #define REQ_PREEMPT (1 << __REQ_PREEMPT) | 187 | #define REQ_PREEMPT (1 << __REQ_PREEMPT) |
187 | #define REQ_ORDERED_COLOR (1 << __REQ_ORDERED_COLOR) | ||
188 | #define REQ_ALLOCED (1 << __REQ_ALLOCED) | 188 | #define REQ_ALLOCED (1 << __REQ_ALLOCED) |
189 | #define REQ_COPY_USER (1 << __REQ_COPY_USER) | 189 | #define REQ_COPY_USER (1 << __REQ_COPY_USER) |
190 | #define REQ_INTEGRITY (1 << __REQ_INTEGRITY) | ||
191 | #define REQ_FLUSH (1 << __REQ_FLUSH) | 190 | #define REQ_FLUSH (1 << __REQ_FLUSH) |
192 | #define REQ_IO_STAT (1 << __REQ_IO_STAT) | 191 | #define REQ_IO_STAT (1 << __REQ_IO_STAT) |
193 | #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) | 192 | #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 2c54906f678f..aae86fd10c4f 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -124,6 +124,9 @@ struct request { | |||
124 | * physical address coalescing is performed. | 124 | * physical address coalescing is performed. |
125 | */ | 125 | */ |
126 | unsigned short nr_phys_segments; | 126 | unsigned short nr_phys_segments; |
127 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | ||
128 | unsigned short nr_integrity_segments; | ||
129 | #endif | ||
127 | 130 | ||
128 | unsigned short ioprio; | 131 | unsigned short ioprio; |
129 | 132 | ||
@@ -243,6 +246,7 @@ struct queue_limits { | |||
243 | 246 | ||
244 | unsigned short logical_block_size; | 247 | unsigned short logical_block_size; |
245 | unsigned short max_segments; | 248 | unsigned short max_segments; |
249 | unsigned short max_integrity_segments; | ||
246 | 250 | ||
247 | unsigned char misaligned; | 251 | unsigned char misaligned; |
248 | unsigned char discard_misaligned; | 252 | unsigned char discard_misaligned; |
@@ -355,18 +359,25 @@ struct request_queue | |||
355 | struct blk_trace *blk_trace; | 359 | struct blk_trace *blk_trace; |
356 | #endif | 360 | #endif |
357 | /* | 361 | /* |
358 | * reserved for flush operations | 362 | * for flush operations |
359 | */ | 363 | */ |
360 | unsigned int ordered, next_ordered, ordseq; | 364 | unsigned int flush_flags; |
361 | int orderr, ordcolor; | 365 | unsigned int flush_seq; |
362 | struct request pre_flush_rq, bar_rq, post_flush_rq; | 366 | int flush_err; |
363 | struct request *orig_bar_rq; | 367 | struct request flush_rq; |
368 | struct request *orig_flush_rq; | ||
369 | struct list_head pending_flushes; | ||
364 | 370 | ||
365 | struct mutex sysfs_lock; | 371 | struct mutex sysfs_lock; |
366 | 372 | ||
367 | #if defined(CONFIG_BLK_DEV_BSG) | 373 | #if defined(CONFIG_BLK_DEV_BSG) |
368 | struct bsg_class_device bsg_dev; | 374 | struct bsg_class_device bsg_dev; |
369 | #endif | 375 | #endif |
376 | |||
377 | #ifdef CONFIG_BLK_DEV_THROTTLING | ||
378 | /* Throttle data */ | ||
379 | struct throtl_data *td; | ||
380 | #endif | ||
370 | }; | 381 | }; |
371 | 382 | ||
372 | #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ | 383 | #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ |
@@ -462,56 +473,6 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) | |||
462 | __clear_bit(flag, &q->queue_flags); | 473 | __clear_bit(flag, &q->queue_flags); |
463 | } | 474 | } |
464 | 475 | ||
465 | enum { | ||
466 | /* | ||
467 | * Hardbarrier is supported with one of the following methods. | ||
468 | * | ||
469 | * NONE : hardbarrier unsupported | ||
470 | * DRAIN : ordering by draining is enough | ||
471 | * DRAIN_FLUSH : ordering by draining w/ pre and post flushes | ||
472 | * DRAIN_FUA : ordering by draining w/ pre flush and FUA write | ||
473 | * TAG : ordering by tag is enough | ||
474 | * TAG_FLUSH : ordering by tag w/ pre and post flushes | ||
475 | * TAG_FUA : ordering by tag w/ pre flush and FUA write | ||
476 | */ | ||
477 | QUEUE_ORDERED_BY_DRAIN = 0x01, | ||
478 | QUEUE_ORDERED_BY_TAG = 0x02, | ||
479 | QUEUE_ORDERED_DO_PREFLUSH = 0x10, | ||
480 | QUEUE_ORDERED_DO_BAR = 0x20, | ||
481 | QUEUE_ORDERED_DO_POSTFLUSH = 0x40, | ||
482 | QUEUE_ORDERED_DO_FUA = 0x80, | ||
483 | |||
484 | QUEUE_ORDERED_NONE = 0x00, | ||
485 | |||
486 | QUEUE_ORDERED_DRAIN = QUEUE_ORDERED_BY_DRAIN | | ||
487 | QUEUE_ORDERED_DO_BAR, | ||
488 | QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN | | ||
489 | QUEUE_ORDERED_DO_PREFLUSH | | ||
490 | QUEUE_ORDERED_DO_POSTFLUSH, | ||
491 | QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN | | ||
492 | QUEUE_ORDERED_DO_PREFLUSH | | ||
493 | QUEUE_ORDERED_DO_FUA, | ||
494 | |||
495 | QUEUE_ORDERED_TAG = QUEUE_ORDERED_BY_TAG | | ||
496 | QUEUE_ORDERED_DO_BAR, | ||
497 | QUEUE_ORDERED_TAG_FLUSH = QUEUE_ORDERED_TAG | | ||
498 | QUEUE_ORDERED_DO_PREFLUSH | | ||
499 | QUEUE_ORDERED_DO_POSTFLUSH, | ||
500 | QUEUE_ORDERED_TAG_FUA = QUEUE_ORDERED_TAG | | ||
501 | QUEUE_ORDERED_DO_PREFLUSH | | ||
502 | QUEUE_ORDERED_DO_FUA, | ||
503 | |||
504 | /* | ||
505 | * Ordered operation sequence | ||
506 | */ | ||
507 | QUEUE_ORDSEQ_STARTED = 0x01, /* flushing in progress */ | ||
508 | QUEUE_ORDSEQ_DRAIN = 0x02, /* waiting for the queue to be drained */ | ||
509 | QUEUE_ORDSEQ_PREFLUSH = 0x04, /* pre-flushing in progress */ | ||
510 | QUEUE_ORDSEQ_BAR = 0x08, /* original barrier req in progress */ | ||
511 | QUEUE_ORDSEQ_POSTFLUSH = 0x10, /* post-flushing in progress */ | ||
512 | QUEUE_ORDSEQ_DONE = 0x20, | ||
513 | }; | ||
514 | |||
515 | #define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags) | 476 | #define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags) |
516 | #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) | 477 | #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) |
517 | #define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags) | 478 | #define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags) |
@@ -521,7 +482,6 @@ enum { | |||
521 | #define blk_queue_nonrot(q) test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags) | 482 | #define blk_queue_nonrot(q) test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags) |
522 | #define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags) | 483 | #define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags) |
523 | #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags) | 484 | #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags) |
524 | #define blk_queue_flushing(q) ((q)->ordseq) | ||
525 | #define blk_queue_stackable(q) \ | 485 | #define blk_queue_stackable(q) \ |
526 | test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags) | 486 | test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags) |
527 | #define blk_queue_discard(q) test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags) | 487 | #define blk_queue_discard(q) test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags) |
@@ -592,7 +552,7 @@ static inline void blk_clear_queue_full(struct request_queue *q, int sync) | |||
592 | * it already be started by driver. | 552 | * it already be started by driver. |
593 | */ | 553 | */ |
594 | #define RQ_NOMERGE_FLAGS \ | 554 | #define RQ_NOMERGE_FLAGS \ |
595 | (REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER) | 555 | (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA) |
596 | #define rq_mergeable(rq) \ | 556 | #define rq_mergeable(rq) \ |
597 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ | 557 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ |
598 | (((rq)->cmd_flags & REQ_DISCARD) || \ | 558 | (((rq)->cmd_flags & REQ_DISCARD) || \ |
@@ -851,7 +811,7 @@ extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); | |||
851 | extern void blk_queue_max_discard_sectors(struct request_queue *q, | 811 | extern void blk_queue_max_discard_sectors(struct request_queue *q, |
852 | unsigned int max_discard_sectors); | 812 | unsigned int max_discard_sectors); |
853 | extern void blk_queue_logical_block_size(struct request_queue *, unsigned short); | 813 | extern void blk_queue_logical_block_size(struct request_queue *, unsigned short); |
854 | extern void blk_queue_physical_block_size(struct request_queue *, unsigned short); | 814 | extern void blk_queue_physical_block_size(struct request_queue *, unsigned int); |
855 | extern void blk_queue_alignment_offset(struct request_queue *q, | 815 | extern void blk_queue_alignment_offset(struct request_queue *q, |
856 | unsigned int alignment); | 816 | unsigned int alignment); |
857 | extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min); | 817 | extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min); |
@@ -881,12 +841,8 @@ extern void blk_queue_update_dma_alignment(struct request_queue *, int); | |||
881 | extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *); | 841 | extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *); |
882 | extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *); | 842 | extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *); |
883 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); | 843 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); |
844 | extern void blk_queue_flush(struct request_queue *q, unsigned int flush); | ||
884 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); | 845 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
885 | extern int blk_queue_ordered(struct request_queue *, unsigned); | ||
886 | extern bool blk_do_ordered(struct request_queue *, struct request **); | ||
887 | extern unsigned blk_ordered_cur_seq(struct request_queue *); | ||
888 | extern unsigned blk_ordered_req_seq(struct request *); | ||
889 | extern bool blk_ordered_complete_seq(struct request_queue *, unsigned, int); | ||
890 | 846 | ||
891 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); | 847 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); |
892 | extern void blk_dump_rq_flags(struct request *, char *); | 848 | extern void blk_dump_rq_flags(struct request *, char *); |
@@ -919,27 +875,28 @@ static inline struct request *blk_map_queue_find_tag(struct blk_queue_tag *bqt, | |||
919 | return NULL; | 875 | return NULL; |
920 | return bqt->tag_index[tag]; | 876 | return bqt->tag_index[tag]; |
921 | } | 877 | } |
922 | enum{ | 878 | |
923 | BLKDEV_WAIT, /* wait for completion */ | 879 | #define BLKDEV_DISCARD_SECURE 0x01 /* secure discard */ |
924 | BLKDEV_BARRIER, /* issue request with barrier */ | 880 | |
925 | BLKDEV_SECURE, /* secure discard */ | 881 | extern int blkdev_issue_flush(struct block_device *, gfp_t, sector_t *); |
926 | }; | ||
927 | #define BLKDEV_IFL_WAIT (1 << BLKDEV_WAIT) | ||
928 | #define BLKDEV_IFL_BARRIER (1 << BLKDEV_BARRIER) | ||
929 | #define BLKDEV_IFL_SECURE (1 << BLKDEV_SECURE) | ||
930 | extern int blkdev_issue_flush(struct block_device *, gfp_t, sector_t *, | ||
931 | unsigned long); | ||
932 | extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | 882 | extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, |
933 | sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); | 883 | sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); |
934 | extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, | 884 | extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, |
935 | sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); | 885 | sector_t nr_sects, gfp_t gfp_mask); |
936 | static inline int sb_issue_discard(struct super_block *sb, | 886 | static inline int sb_issue_discard(struct super_block *sb, sector_t block, |
937 | sector_t block, sector_t nr_blocks) | 887 | sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags) |
938 | { | 888 | { |
939 | block <<= (sb->s_blocksize_bits - 9); | 889 | return blkdev_issue_discard(sb->s_bdev, block << (sb->s_blocksize_bits - 9), |
940 | nr_blocks <<= (sb->s_blocksize_bits - 9); | 890 | nr_blocks << (sb->s_blocksize_bits - 9), |
941 | return blkdev_issue_discard(sb->s_bdev, block, nr_blocks, GFP_NOFS, | 891 | gfp_mask, flags); |
942 | BLKDEV_IFL_WAIT | BLKDEV_IFL_BARRIER); | 892 | } |
893 | static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, | ||
894 | sector_t nr_blocks, gfp_t gfp_mask) | ||
895 | { | ||
896 | return blkdev_issue_zeroout(sb->s_bdev, | ||
897 | block << (sb->s_blocksize_bits - 9), | ||
898 | nr_blocks << (sb->s_blocksize_bits - 9), | ||
899 | gfp_mask); | ||
943 | } | 900 | } |
944 | 901 | ||
945 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); | 902 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); |
@@ -1004,7 +961,7 @@ static inline unsigned int queue_physical_block_size(struct request_queue *q) | |||
1004 | return q->limits.physical_block_size; | 961 | return q->limits.physical_block_size; |
1005 | } | 962 | } |
1006 | 963 | ||
1007 | static inline int bdev_physical_block_size(struct block_device *bdev) | 964 | static inline unsigned int bdev_physical_block_size(struct block_device *bdev) |
1008 | { | 965 | { |
1009 | return queue_physical_block_size(bdev_get_queue(bdev)); | 966 | return queue_physical_block_size(bdev_get_queue(bdev)); |
1010 | } | 967 | } |
@@ -1093,11 +1050,11 @@ static inline int queue_dma_alignment(struct request_queue *q) | |||
1093 | return q ? q->dma_alignment : 511; | 1050 | return q ? q->dma_alignment : 511; |
1094 | } | 1051 | } |
1095 | 1052 | ||
1096 | static inline int blk_rq_aligned(struct request_queue *q, void *addr, | 1053 | static inline int blk_rq_aligned(struct request_queue *q, unsigned long addr, |
1097 | unsigned int len) | 1054 | unsigned int len) |
1098 | { | 1055 | { |
1099 | unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask; | 1056 | unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask; |
1100 | return !((unsigned long)addr & alignment) && !(len & alignment); | 1057 | return !(addr & alignment) && !(len & alignment); |
1101 | } | 1058 | } |
1102 | 1059 | ||
1103 | /* assumes size > 256 */ | 1060 | /* assumes size > 256 */ |
@@ -1127,6 +1084,7 @@ static inline void put_dev_sector(Sector p) | |||
1127 | 1084 | ||
1128 | struct work_struct; | 1085 | struct work_struct; |
1129 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); | 1086 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); |
1087 | int kblockd_schedule_delayed_work(struct request_queue *q, struct delayed_work *dwork, unsigned long delay); | ||
1130 | 1088 | ||
1131 | #ifdef CONFIG_BLK_CGROUP | 1089 | #ifdef CONFIG_BLK_CGROUP |
1132 | /* | 1090 | /* |
@@ -1170,6 +1128,24 @@ static inline uint64_t rq_io_start_time_ns(struct request *req) | |||
1170 | } | 1128 | } |
1171 | #endif | 1129 | #endif |
1172 | 1130 | ||
1131 | #ifdef CONFIG_BLK_DEV_THROTTLING | ||
1132 | extern int blk_throtl_init(struct request_queue *q); | ||
1133 | extern void blk_throtl_exit(struct request_queue *q); | ||
1134 | extern int blk_throtl_bio(struct request_queue *q, struct bio **bio); | ||
1135 | extern void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay); | ||
1136 | extern void throtl_shutdown_timer_wq(struct request_queue *q); | ||
1137 | #else /* CONFIG_BLK_DEV_THROTTLING */ | ||
1138 | static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) | ||
1139 | { | ||
1140 | return 0; | ||
1141 | } | ||
1142 | |||
1143 | static inline int blk_throtl_init(struct request_queue *q) { return 0; } | ||
1144 | static inline int blk_throtl_exit(struct request_queue *q) { return 0; } | ||
1145 | static inline void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) {} | ||
1146 | static inline void throtl_shutdown_timer_wq(struct request_queue *q) {} | ||
1147 | #endif /* CONFIG_BLK_DEV_THROTTLING */ | ||
1148 | |||
1173 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ | 1149 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ |
1174 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) | 1150 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) |
1175 | #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ | 1151 | #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ |
@@ -1213,8 +1189,13 @@ struct blk_integrity { | |||
1213 | extern int blk_integrity_register(struct gendisk *, struct blk_integrity *); | 1189 | extern int blk_integrity_register(struct gendisk *, struct blk_integrity *); |
1214 | extern void blk_integrity_unregister(struct gendisk *); | 1190 | extern void blk_integrity_unregister(struct gendisk *); |
1215 | extern int blk_integrity_compare(struct gendisk *, struct gendisk *); | 1191 | extern int blk_integrity_compare(struct gendisk *, struct gendisk *); |
1216 | extern int blk_rq_map_integrity_sg(struct request *, struct scatterlist *); | 1192 | extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *, |
1217 | extern int blk_rq_count_integrity_sg(struct request *); | 1193 | struct scatterlist *); |
1194 | extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *); | ||
1195 | extern int blk_integrity_merge_rq(struct request_queue *, struct request *, | ||
1196 | struct request *); | ||
1197 | extern int blk_integrity_merge_bio(struct request_queue *, struct request *, | ||
1198 | struct bio *); | ||
1218 | 1199 | ||
1219 | static inline | 1200 | static inline |
1220 | struct blk_integrity *bdev_get_integrity(struct block_device *bdev) | 1201 | struct blk_integrity *bdev_get_integrity(struct block_device *bdev) |
@@ -1235,16 +1216,32 @@ static inline int blk_integrity_rq(struct request *rq) | |||
1235 | return bio_integrity(rq->bio); | 1216 | return bio_integrity(rq->bio); |
1236 | } | 1217 | } |
1237 | 1218 | ||
1219 | static inline void blk_queue_max_integrity_segments(struct request_queue *q, | ||
1220 | unsigned int segs) | ||
1221 | { | ||
1222 | q->limits.max_integrity_segments = segs; | ||
1223 | } | ||
1224 | |||
1225 | static inline unsigned short | ||
1226 | queue_max_integrity_segments(struct request_queue *q) | ||
1227 | { | ||
1228 | return q->limits.max_integrity_segments; | ||
1229 | } | ||
1230 | |||
1238 | #else /* CONFIG_BLK_DEV_INTEGRITY */ | 1231 | #else /* CONFIG_BLK_DEV_INTEGRITY */ |
1239 | 1232 | ||
1240 | #define blk_integrity_rq(rq) (0) | 1233 | #define blk_integrity_rq(rq) (0) |
1241 | #define blk_rq_count_integrity_sg(a) (0) | 1234 | #define blk_rq_count_integrity_sg(a, b) (0) |
1242 | #define blk_rq_map_integrity_sg(a, b) (0) | 1235 | #define blk_rq_map_integrity_sg(a, b, c) (0) |
1243 | #define bdev_get_integrity(a) (0) | 1236 | #define bdev_get_integrity(a) (0) |
1244 | #define blk_get_integrity(a) (0) | 1237 | #define blk_get_integrity(a) (0) |
1245 | #define blk_integrity_compare(a, b) (0) | 1238 | #define blk_integrity_compare(a, b) (0) |
1246 | #define blk_integrity_register(a, b) (0) | 1239 | #define blk_integrity_register(a, b) (0) |
1247 | #define blk_integrity_unregister(a) do { } while (0); | 1240 | #define blk_integrity_unregister(a) do { } while (0); |
1241 | #define blk_queue_max_integrity_segments(a, b) do { } while (0); | ||
1242 | #define queue_max_integrity_segments(a) (0) | ||
1243 | #define blk_integrity_merge_rq(a, b, c) (0) | ||
1244 | #define blk_integrity_merge_bio(a, b, c) (0) | ||
1248 | 1245 | ||
1249 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 1246 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
1250 | 1247 | ||
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index ec94c12f21da..68d1fe7b877c 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
@@ -32,7 +32,6 @@ enum bh_state_bits { | |||
32 | BH_Delay, /* Buffer is not yet allocated on disk */ | 32 | BH_Delay, /* Buffer is not yet allocated on disk */ |
33 | BH_Boundary, /* Block is followed by a discontiguity */ | 33 | BH_Boundary, /* Block is followed by a discontiguity */ |
34 | BH_Write_EIO, /* I/O error on write */ | 34 | BH_Write_EIO, /* I/O error on write */ |
35 | BH_Eopnotsupp, /* operation not supported (barrier) */ | ||
36 | BH_Unwritten, /* Buffer is allocated on disk but not written */ | 35 | BH_Unwritten, /* Buffer is allocated on disk but not written */ |
37 | BH_Quiet, /* Buffer Error Prinks to be quiet */ | 36 | BH_Quiet, /* Buffer Error Prinks to be quiet */ |
38 | 37 | ||
@@ -124,7 +123,6 @@ BUFFER_FNS(Async_Write, async_write) | |||
124 | BUFFER_FNS(Delay, delay) | 123 | BUFFER_FNS(Delay, delay) |
125 | BUFFER_FNS(Boundary, boundary) | 124 | BUFFER_FNS(Boundary, boundary) |
126 | BUFFER_FNS(Write_EIO, write_io_error) | 125 | BUFFER_FNS(Write_EIO, write_io_error) |
127 | BUFFER_FNS(Eopnotsupp, eopnotsupp) | ||
128 | BUFFER_FNS(Unwritten, unwritten) | 126 | BUFFER_FNS(Unwritten, unwritten) |
129 | 127 | ||
130 | #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) | 128 | #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) |
@@ -214,7 +212,6 @@ int generic_write_end(struct file *, struct address_space *, | |||
214 | loff_t, unsigned, unsigned, | 212 | loff_t, unsigned, unsigned, |
215 | struct page *, void *); | 213 | struct page *, void *); |
216 | void page_zero_new_buffers(struct page *page, unsigned from, unsigned to); | 214 | void page_zero_new_buffers(struct page *page, unsigned from, unsigned to); |
217 | int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); | ||
218 | int cont_write_begin(struct file *, struct address_space *, loff_t, | 215 | int cont_write_begin(struct file *, struct address_space *, loff_t, |
219 | unsigned, unsigned, struct page **, void **, | 216 | unsigned, unsigned, struct page **, void **, |
220 | get_block_t *, loff_t *); | 217 | get_block_t *, loff_t *); |
diff --git a/include/linux/can/platform/mcp251x.h b/include/linux/can/platform/mcp251x.h index dba28268e651..8e20540043f5 100644 --- a/include/linux/can/platform/mcp251x.h +++ b/include/linux/can/platform/mcp251x.h | |||
@@ -12,7 +12,6 @@ | |||
12 | /** | 12 | /** |
13 | * struct mcp251x_platform_data - MCP251X SPI CAN controller platform data | 13 | * struct mcp251x_platform_data - MCP251X SPI CAN controller platform data |
14 | * @oscillator_frequency: - oscillator frequency in Hz | 14 | * @oscillator_frequency: - oscillator frequency in Hz |
15 | * @model: - actual type of chip | ||
16 | * @board_specific_setup: - called before probing the chip (power,reset) | 15 | * @board_specific_setup: - called before probing the chip (power,reset) |
17 | * @transceiver_enable: - called to power on/off the transceiver | 16 | * @transceiver_enable: - called to power on/off the transceiver |
18 | * @power_enable: - called to power on/off the mcp *and* the | 17 | * @power_enable: - called to power on/off the mcp *and* the |
@@ -25,9 +24,6 @@ | |||
25 | 24 | ||
26 | struct mcp251x_platform_data { | 25 | struct mcp251x_platform_data { |
27 | unsigned long oscillator_frequency; | 26 | unsigned long oscillator_frequency; |
28 | int model; | ||
29 | #define CAN_MCP251X_MCP2510 0x2510 | ||
30 | #define CAN_MCP251X_MCP2515 0x2515 | ||
31 | int (*board_specific_setup)(struct spi_device *spi); | 27 | int (*board_specific_setup)(struct spi_device *spi); |
32 | int (*transceiver_enable)(int enable); | 28 | int (*transceiver_enable)(int enable); |
33 | int (*power_enable) (int enable); | 29 | int (*power_enable) (int enable); |
diff --git a/include/linux/ceph/auth.h b/include/linux/ceph/auth.h new file mode 100644 index 000000000000..7fff521d7eb5 --- /dev/null +++ b/include/linux/ceph/auth.h | |||
@@ -0,0 +1,92 @@ | |||
1 | #ifndef _FS_CEPH_AUTH_H | ||
2 | #define _FS_CEPH_AUTH_H | ||
3 | |||
4 | #include <linux/ceph/types.h> | ||
5 | #include <linux/ceph/buffer.h> | ||
6 | |||
7 | /* | ||
8 | * Abstract interface for communicating with the authenticate module. | ||
9 | * There is some handshake that takes place between us and the monitor | ||
10 | * to acquire the necessary keys. These are used to generate an | ||
11 | * 'authorizer' that we use when connecting to a service (mds, osd). | ||
12 | */ | ||
13 | |||
14 | struct ceph_auth_client; | ||
15 | struct ceph_authorizer; | ||
16 | |||
17 | struct ceph_auth_client_ops { | ||
18 | const char *name; | ||
19 | |||
20 | /* | ||
21 | * true if we are authenticated and can connect to | ||
22 | * services. | ||
23 | */ | ||
24 | int (*is_authenticated)(struct ceph_auth_client *ac); | ||
25 | |||
26 | /* | ||
27 | * true if we should (re)authenticate, e.g., when our tickets | ||
28 | * are getting old and crusty. | ||
29 | */ | ||
30 | int (*should_authenticate)(struct ceph_auth_client *ac); | ||
31 | |||
32 | /* | ||
33 | * build requests and process replies during monitor | ||
34 | * handshake. if handle_reply returns -EAGAIN, we build | ||
35 | * another request. | ||
36 | */ | ||
37 | int (*build_request)(struct ceph_auth_client *ac, void *buf, void *end); | ||
38 | int (*handle_reply)(struct ceph_auth_client *ac, int result, | ||
39 | void *buf, void *end); | ||
40 | |||
41 | /* | ||
42 | * Create authorizer for connecting to a service, and verify | ||
43 | * the response to authenticate the service. | ||
44 | */ | ||
45 | int (*create_authorizer)(struct ceph_auth_client *ac, int peer_type, | ||
46 | struct ceph_authorizer **a, | ||
47 | void **buf, size_t *len, | ||
48 | void **reply_buf, size_t *reply_len); | ||
49 | int (*verify_authorizer_reply)(struct ceph_auth_client *ac, | ||
50 | struct ceph_authorizer *a, size_t len); | ||
51 | void (*destroy_authorizer)(struct ceph_auth_client *ac, | ||
52 | struct ceph_authorizer *a); | ||
53 | void (*invalidate_authorizer)(struct ceph_auth_client *ac, | ||
54 | int peer_type); | ||
55 | |||
56 | /* reset when we (re)connect to a monitor */ | ||
57 | void (*reset)(struct ceph_auth_client *ac); | ||
58 | |||
59 | void (*destroy)(struct ceph_auth_client *ac); | ||
60 | }; | ||
61 | |||
62 | struct ceph_auth_client { | ||
63 | u32 protocol; /* CEPH_AUTH_* */ | ||
64 | void *private; /* for use by protocol implementation */ | ||
65 | const struct ceph_auth_client_ops *ops; /* null iff protocol==0 */ | ||
66 | |||
67 | bool negotiating; /* true if negotiating protocol */ | ||
68 | const char *name; /* entity name */ | ||
69 | u64 global_id; /* our unique id in system */ | ||
70 | const char *secret; /* our secret key */ | ||
71 | unsigned want_keys; /* which services we want */ | ||
72 | }; | ||
73 | |||
74 | extern struct ceph_auth_client *ceph_auth_init(const char *name, | ||
75 | const char *secret); | ||
76 | extern void ceph_auth_destroy(struct ceph_auth_client *ac); | ||
77 | |||
78 | extern void ceph_auth_reset(struct ceph_auth_client *ac); | ||
79 | |||
80 | extern int ceph_auth_build_hello(struct ceph_auth_client *ac, | ||
81 | void *buf, size_t len); | ||
82 | extern int ceph_handle_auth_reply(struct ceph_auth_client *ac, | ||
83 | void *buf, size_t len, | ||
84 | void *reply_buf, size_t reply_len); | ||
85 | extern int ceph_entity_name_encode(const char *name, void **p, void *end); | ||
86 | |||
87 | extern int ceph_build_auth(struct ceph_auth_client *ac, | ||
88 | void *msg_buf, size_t msg_len); | ||
89 | |||
90 | extern int ceph_auth_is_authenticated(struct ceph_auth_client *ac); | ||
91 | |||
92 | #endif | ||
diff --git a/include/linux/ceph/buffer.h b/include/linux/ceph/buffer.h new file mode 100644 index 000000000000..58d19014068f --- /dev/null +++ b/include/linux/ceph/buffer.h | |||
@@ -0,0 +1,39 @@ | |||
1 | #ifndef __FS_CEPH_BUFFER_H | ||
2 | #define __FS_CEPH_BUFFER_H | ||
3 | |||
4 | #include <linux/kref.h> | ||
5 | #include <linux/mm.h> | ||
6 | #include <linux/vmalloc.h> | ||
7 | #include <linux/types.h> | ||
8 | #include <linux/uio.h> | ||
9 | |||
10 | /* | ||
11 | * a simple reference counted buffer. | ||
12 | * | ||
13 | * use kmalloc for small sizes (<= one page), vmalloc for larger | ||
14 | * sizes. | ||
15 | */ | ||
16 | struct ceph_buffer { | ||
17 | struct kref kref; | ||
18 | struct kvec vec; | ||
19 | size_t alloc_len; | ||
20 | bool is_vmalloc; | ||
21 | }; | ||
22 | |||
23 | extern struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp); | ||
24 | extern void ceph_buffer_release(struct kref *kref); | ||
25 | |||
26 | static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b) | ||
27 | { | ||
28 | kref_get(&b->kref); | ||
29 | return b; | ||
30 | } | ||
31 | |||
32 | static inline void ceph_buffer_put(struct ceph_buffer *b) | ||
33 | { | ||
34 | kref_put(&b->kref, ceph_buffer_release); | ||
35 | } | ||
36 | |||
37 | extern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end); | ||
38 | |||
39 | #endif | ||
diff --git a/include/linux/ceph/ceph_debug.h b/include/linux/ceph/ceph_debug.h new file mode 100644 index 000000000000..aa2e19182d99 --- /dev/null +++ b/include/linux/ceph/ceph_debug.h | |||
@@ -0,0 +1,38 @@ | |||
1 | #ifndef _FS_CEPH_DEBUG_H | ||
2 | #define _FS_CEPH_DEBUG_H | ||
3 | |||
4 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
5 | |||
6 | #ifdef CONFIG_CEPH_LIB_PRETTYDEBUG | ||
7 | |||
8 | /* | ||
9 | * wrap pr_debug to include a filename:lineno prefix on each line. | ||
10 | * this incurs some overhead (kernel size and execution time) due to | ||
11 | * the extra function call at each call site. | ||
12 | */ | ||
13 | |||
14 | # if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) | ||
15 | extern const char *ceph_file_part(const char *s, int len); | ||
16 | # define dout(fmt, ...) \ | ||
17 | pr_debug("%.*s %12.12s:%-4d : " fmt, \ | ||
18 | 8 - (int)sizeof(KBUILD_MODNAME), " ", \ | ||
19 | ceph_file_part(__FILE__, sizeof(__FILE__)), \ | ||
20 | __LINE__, ##__VA_ARGS__) | ||
21 | # else | ||
22 | /* faux printk call just to see any compiler warnings. */ | ||
23 | # define dout(fmt, ...) do { \ | ||
24 | if (0) \ | ||
25 | printk(KERN_DEBUG fmt, ##__VA_ARGS__); \ | ||
26 | } while (0) | ||
27 | # endif | ||
28 | |||
29 | #else | ||
30 | |||
31 | /* | ||
32 | * or, just wrap pr_debug | ||
33 | */ | ||
34 | # define dout(fmt, ...) pr_debug(" " fmt, ##__VA_ARGS__) | ||
35 | |||
36 | #endif | ||
37 | |||
38 | #endif | ||
diff --git a/include/linux/ceph/ceph_frag.h b/include/linux/ceph/ceph_frag.h new file mode 100644 index 000000000000..5babb8e95352 --- /dev/null +++ b/include/linux/ceph/ceph_frag.h | |||
@@ -0,0 +1,109 @@ | |||
1 | #ifndef FS_CEPH_FRAG_H | ||
2 | #define FS_CEPH_FRAG_H | ||
3 | |||
4 | /* | ||
5 | * "Frags" are a way to describe a subset of a 32-bit number space, | ||
6 | * using a mask and a value to match against that mask. Any given frag | ||
7 | * (subset of the number space) can be partitioned into 2^n sub-frags. | ||
8 | * | ||
9 | * Frags are encoded into a 32-bit word: | ||
10 | * 8 upper bits = "bits" | ||
11 | * 24 lower bits = "value" | ||
12 | * (We could go to 5+27 bits, but who cares.) | ||
13 | * | ||
14 | * We use the _most_ significant bits of the 24 bit value. This makes | ||
15 | * values logically sort. | ||
16 | * | ||
17 | * Unfortunately, because the "bits" field is still in the high bits, we | ||
18 | * can't sort encoded frags numerically. However, it does allow you | ||
19 | * to feed encoded frags as values into frag_contains_value. | ||
20 | */ | ||
21 | static inline __u32 ceph_frag_make(__u32 b, __u32 v) | ||
22 | { | ||
23 | return (b << 24) | | ||
24 | (v & (0xffffffu << (24-b)) & 0xffffffu); | ||
25 | } | ||
26 | static inline __u32 ceph_frag_bits(__u32 f) | ||
27 | { | ||
28 | return f >> 24; | ||
29 | } | ||
30 | static inline __u32 ceph_frag_value(__u32 f) | ||
31 | { | ||
32 | return f & 0xffffffu; | ||
33 | } | ||
34 | static inline __u32 ceph_frag_mask(__u32 f) | ||
35 | { | ||
36 | return (0xffffffu << (24-ceph_frag_bits(f))) & 0xffffffu; | ||
37 | } | ||
38 | static inline __u32 ceph_frag_mask_shift(__u32 f) | ||
39 | { | ||
40 | return 24 - ceph_frag_bits(f); | ||
41 | } | ||
42 | |||
43 | static inline int ceph_frag_contains_value(__u32 f, __u32 v) | ||
44 | { | ||
45 | return (v & ceph_frag_mask(f)) == ceph_frag_value(f); | ||
46 | } | ||
47 | static inline int ceph_frag_contains_frag(__u32 f, __u32 sub) | ||
48 | { | ||
49 | /* is sub as specific as us, and contained by us? */ | ||
50 | return ceph_frag_bits(sub) >= ceph_frag_bits(f) && | ||
51 | (ceph_frag_value(sub) & ceph_frag_mask(f)) == ceph_frag_value(f); | ||
52 | } | ||
53 | |||
54 | static inline __u32 ceph_frag_parent(__u32 f) | ||
55 | { | ||
56 | return ceph_frag_make(ceph_frag_bits(f) - 1, | ||
57 | ceph_frag_value(f) & (ceph_frag_mask(f) << 1)); | ||
58 | } | ||
59 | static inline int ceph_frag_is_left_child(__u32 f) | ||
60 | { | ||
61 | return ceph_frag_bits(f) > 0 && | ||
62 | (ceph_frag_value(f) & (0x1000000 >> ceph_frag_bits(f))) == 0; | ||
63 | } | ||
64 | static inline int ceph_frag_is_right_child(__u32 f) | ||
65 | { | ||
66 | return ceph_frag_bits(f) > 0 && | ||
67 | (ceph_frag_value(f) & (0x1000000 >> ceph_frag_bits(f))) == 1; | ||
68 | } | ||
69 | static inline __u32 ceph_frag_sibling(__u32 f) | ||
70 | { | ||
71 | return ceph_frag_make(ceph_frag_bits(f), | ||
72 | ceph_frag_value(f) ^ (0x1000000 >> ceph_frag_bits(f))); | ||
73 | } | ||
74 | static inline __u32 ceph_frag_left_child(__u32 f) | ||
75 | { | ||
76 | return ceph_frag_make(ceph_frag_bits(f)+1, ceph_frag_value(f)); | ||
77 | } | ||
78 | static inline __u32 ceph_frag_right_child(__u32 f) | ||
79 | { | ||
80 | return ceph_frag_make(ceph_frag_bits(f)+1, | ||
81 | ceph_frag_value(f) | (0x1000000 >> (1+ceph_frag_bits(f)))); | ||
82 | } | ||
83 | static inline __u32 ceph_frag_make_child(__u32 f, int by, int i) | ||
84 | { | ||
85 | int newbits = ceph_frag_bits(f) + by; | ||
86 | return ceph_frag_make(newbits, | ||
87 | ceph_frag_value(f) | (i << (24 - newbits))); | ||
88 | } | ||
89 | static inline int ceph_frag_is_leftmost(__u32 f) | ||
90 | { | ||
91 | return ceph_frag_value(f) == 0; | ||
92 | } | ||
93 | static inline int ceph_frag_is_rightmost(__u32 f) | ||
94 | { | ||
95 | return ceph_frag_value(f) == ceph_frag_mask(f); | ||
96 | } | ||
97 | static inline __u32 ceph_frag_next(__u32 f) | ||
98 | { | ||
99 | return ceph_frag_make(ceph_frag_bits(f), | ||
100 | ceph_frag_value(f) + (0x1000000 >> ceph_frag_bits(f))); | ||
101 | } | ||
102 | |||
103 | /* | ||
104 | * comparator to sort frags logically, as when traversing the | ||
105 | * number space in ascending order... | ||
106 | */ | ||
107 | int ceph_frag_compare(__u32 a, __u32 b); | ||
108 | |||
109 | #endif | ||
diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h new file mode 100644 index 000000000000..c3c74aef289d --- /dev/null +++ b/include/linux/ceph/ceph_fs.h | |||
@@ -0,0 +1,729 @@ | |||
1 | /* | ||
2 | * ceph_fs.h - Ceph constants and data types to share between kernel and | ||
3 | * user space. | ||
4 | * | ||
5 | * Most types in this file are defined as little-endian, and are | ||
6 | * primarily intended to describe data structures that pass over the | ||
7 | * wire or that are stored on disk. | ||
8 | * | ||
9 | * LGPL2 | ||
10 | */ | ||
11 | |||
12 | #ifndef CEPH_FS_H | ||
13 | #define CEPH_FS_H | ||
14 | |||
15 | #include "msgr.h" | ||
16 | #include "rados.h" | ||
17 | |||
18 | /* | ||
19 | * subprotocol versions. when specific messages types or high-level | ||
20 | * protocols change, bump the affected components. we keep rev | ||
21 | * internal cluster protocols separately from the public, | ||
22 | * client-facing protocol. | ||
23 | */ | ||
24 | #define CEPH_OSD_PROTOCOL 8 /* cluster internal */ | ||
25 | #define CEPH_MDS_PROTOCOL 12 /* cluster internal */ | ||
26 | #define CEPH_MON_PROTOCOL 5 /* cluster internal */ | ||
27 | #define CEPH_OSDC_PROTOCOL 24 /* server/client */ | ||
28 | #define CEPH_MDSC_PROTOCOL 32 /* server/client */ | ||
29 | #define CEPH_MONC_PROTOCOL 15 /* server/client */ | ||
30 | |||
31 | |||
32 | #define CEPH_INO_ROOT 1 | ||
33 | #define CEPH_INO_CEPH 2 /* hidden .ceph dir */ | ||
34 | |||
35 | /* arbitrary limit on max # of monitors (cluster of 3 is typical) */ | ||
36 | #define CEPH_MAX_MON 31 | ||
37 | |||
38 | |||
39 | /* | ||
40 | * feature bits | ||
41 | */ | ||
42 | #define CEPH_FEATURE_UID (1<<0) | ||
43 | #define CEPH_FEATURE_NOSRCADDR (1<<1) | ||
44 | #define CEPH_FEATURE_MONCLOCKCHECK (1<<2) | ||
45 | #define CEPH_FEATURE_FLOCK (1<<3) | ||
46 | |||
47 | |||
48 | /* | ||
49 | * ceph_file_layout - describe data layout for a file/inode | ||
50 | */ | ||
51 | struct ceph_file_layout { | ||
52 | /* file -> object mapping */ | ||
53 | __le32 fl_stripe_unit; /* stripe unit, in bytes. must be multiple | ||
54 | of page size. */ | ||
55 | __le32 fl_stripe_count; /* over this many objects */ | ||
56 | __le32 fl_object_size; /* until objects are this big, then move to | ||
57 | new objects */ | ||
58 | __le32 fl_cas_hash; /* 0 = none; 1 = sha256 */ | ||
59 | |||
60 | /* pg -> disk layout */ | ||
61 | __le32 fl_object_stripe_unit; /* for per-object parity, if any */ | ||
62 | |||
63 | /* object -> pg layout */ | ||
64 | __le32 fl_pg_preferred; /* preferred primary for pg (-1 for none) */ | ||
65 | __le32 fl_pg_pool; /* namespace, crush ruleset, rep level */ | ||
66 | } __attribute__ ((packed)); | ||
67 | |||
68 | #define CEPH_MIN_STRIPE_UNIT 65536 | ||
69 | |||
70 | int ceph_file_layout_is_valid(const struct ceph_file_layout *layout); | ||
71 | |||
72 | |||
73 | /* crypto algorithms */ | ||
74 | #define CEPH_CRYPTO_NONE 0x0 | ||
75 | #define CEPH_CRYPTO_AES 0x1 | ||
76 | |||
77 | #define CEPH_AES_IV "cephsageyudagreg" | ||
78 | |||
79 | /* security/authentication protocols */ | ||
80 | #define CEPH_AUTH_UNKNOWN 0x0 | ||
81 | #define CEPH_AUTH_NONE 0x1 | ||
82 | #define CEPH_AUTH_CEPHX 0x2 | ||
83 | |||
84 | #define CEPH_AUTH_UID_DEFAULT ((__u64) -1) | ||
85 | |||
86 | |||
87 | /********************************************* | ||
88 | * message layer | ||
89 | */ | ||
90 | |||
91 | /* | ||
92 | * message types | ||
93 | */ | ||
94 | |||
95 | /* misc */ | ||
96 | #define CEPH_MSG_SHUTDOWN 1 | ||
97 | #define CEPH_MSG_PING 2 | ||
98 | |||
99 | /* client <-> monitor */ | ||
100 | #define CEPH_MSG_MON_MAP 4 | ||
101 | #define CEPH_MSG_MON_GET_MAP 5 | ||
102 | #define CEPH_MSG_STATFS 13 | ||
103 | #define CEPH_MSG_STATFS_REPLY 14 | ||
104 | #define CEPH_MSG_MON_SUBSCRIBE 15 | ||
105 | #define CEPH_MSG_MON_SUBSCRIBE_ACK 16 | ||
106 | #define CEPH_MSG_AUTH 17 | ||
107 | #define CEPH_MSG_AUTH_REPLY 18 | ||
108 | |||
109 | /* client <-> mds */ | ||
110 | #define CEPH_MSG_MDS_MAP 21 | ||
111 | |||
112 | #define CEPH_MSG_CLIENT_SESSION 22 | ||
113 | #define CEPH_MSG_CLIENT_RECONNECT 23 | ||
114 | |||
115 | #define CEPH_MSG_CLIENT_REQUEST 24 | ||
116 | #define CEPH_MSG_CLIENT_REQUEST_FORWARD 25 | ||
117 | #define CEPH_MSG_CLIENT_REPLY 26 | ||
118 | #define CEPH_MSG_CLIENT_CAPS 0x310 | ||
119 | #define CEPH_MSG_CLIENT_LEASE 0x311 | ||
120 | #define CEPH_MSG_CLIENT_SNAP 0x312 | ||
121 | #define CEPH_MSG_CLIENT_CAPRELEASE 0x313 | ||
122 | |||
123 | /* pool ops */ | ||
124 | #define CEPH_MSG_POOLOP_REPLY 48 | ||
125 | #define CEPH_MSG_POOLOP 49 | ||
126 | |||
127 | |||
128 | /* osd */ | ||
129 | #define CEPH_MSG_OSD_MAP 41 | ||
130 | #define CEPH_MSG_OSD_OP 42 | ||
131 | #define CEPH_MSG_OSD_OPREPLY 43 | ||
132 | |||
133 | /* pool operations */ | ||
134 | enum { | ||
135 | POOL_OP_CREATE = 0x01, | ||
136 | POOL_OP_DELETE = 0x02, | ||
137 | POOL_OP_AUID_CHANGE = 0x03, | ||
138 | POOL_OP_CREATE_SNAP = 0x11, | ||
139 | POOL_OP_DELETE_SNAP = 0x12, | ||
140 | POOL_OP_CREATE_UNMANAGED_SNAP = 0x21, | ||
141 | POOL_OP_DELETE_UNMANAGED_SNAP = 0x22, | ||
142 | }; | ||
143 | |||
144 | struct ceph_mon_request_header { | ||
145 | __le64 have_version; | ||
146 | __le16 session_mon; | ||
147 | __le64 session_mon_tid; | ||
148 | } __attribute__ ((packed)); | ||
149 | |||
150 | struct ceph_mon_statfs { | ||
151 | struct ceph_mon_request_header monhdr; | ||
152 | struct ceph_fsid fsid; | ||
153 | } __attribute__ ((packed)); | ||
154 | |||
155 | struct ceph_statfs { | ||
156 | __le64 kb, kb_used, kb_avail; | ||
157 | __le64 num_objects; | ||
158 | } __attribute__ ((packed)); | ||
159 | |||
160 | struct ceph_mon_statfs_reply { | ||
161 | struct ceph_fsid fsid; | ||
162 | __le64 version; | ||
163 | struct ceph_statfs st; | ||
164 | } __attribute__ ((packed)); | ||
165 | |||
166 | const char *ceph_pool_op_name(int op); | ||
167 | |||
168 | struct ceph_mon_poolop { | ||
169 | struct ceph_mon_request_header monhdr; | ||
170 | struct ceph_fsid fsid; | ||
171 | __le32 pool; | ||
172 | __le32 op; | ||
173 | __le64 auid; | ||
174 | __le64 snapid; | ||
175 | __le32 name_len; | ||
176 | } __attribute__ ((packed)); | ||
177 | |||
178 | struct ceph_mon_poolop_reply { | ||
179 | struct ceph_mon_request_header monhdr; | ||
180 | struct ceph_fsid fsid; | ||
181 | __le32 reply_code; | ||
182 | __le32 epoch; | ||
183 | char has_data; | ||
184 | char data[0]; | ||
185 | } __attribute__ ((packed)); | ||
186 | |||
187 | struct ceph_mon_unmanaged_snap { | ||
188 | __le64 snapid; | ||
189 | } __attribute__ ((packed)); | ||
190 | |||
191 | struct ceph_osd_getmap { | ||
192 | struct ceph_mon_request_header monhdr; | ||
193 | struct ceph_fsid fsid; | ||
194 | __le32 start; | ||
195 | } __attribute__ ((packed)); | ||
196 | |||
197 | struct ceph_mds_getmap { | ||
198 | struct ceph_mon_request_header monhdr; | ||
199 | struct ceph_fsid fsid; | ||
200 | } __attribute__ ((packed)); | ||
201 | |||
202 | struct ceph_client_mount { | ||
203 | struct ceph_mon_request_header monhdr; | ||
204 | } __attribute__ ((packed)); | ||
205 | |||
206 | struct ceph_mon_subscribe_item { | ||
207 | __le64 have_version; __le64 have; | ||
208 | __u8 onetime; | ||
209 | } __attribute__ ((packed)); | ||
210 | |||
211 | struct ceph_mon_subscribe_ack { | ||
212 | __le32 duration; /* seconds */ | ||
213 | struct ceph_fsid fsid; | ||
214 | } __attribute__ ((packed)); | ||
215 | |||
216 | /* | ||
217 | * mds states | ||
218 | * > 0 -> in | ||
219 | * <= 0 -> out | ||
220 | */ | ||
221 | #define CEPH_MDS_STATE_DNE 0 /* down, does not exist. */ | ||
222 | #define CEPH_MDS_STATE_STOPPED -1 /* down, once existed, but no subtrees. | ||
223 | empty log. */ | ||
224 | #define CEPH_MDS_STATE_BOOT -4 /* up, boot announcement. */ | ||
225 | #define CEPH_MDS_STATE_STANDBY -5 /* up, idle. waiting for assignment. */ | ||
226 | #define CEPH_MDS_STATE_CREATING -6 /* up, creating MDS instance. */ | ||
227 | #define CEPH_MDS_STATE_STARTING -7 /* up, starting previously stopped mds */ | ||
228 | #define CEPH_MDS_STATE_STANDBY_REPLAY -8 /* up, tailing active node's journal */ | ||
229 | |||
230 | #define CEPH_MDS_STATE_REPLAY 8 /* up, replaying journal. */ | ||
231 | #define CEPH_MDS_STATE_RESOLVE 9 /* up, disambiguating distributed | ||
232 | operations (import, rename, etc.) */ | ||
233 | #define CEPH_MDS_STATE_RECONNECT 10 /* up, reconnect to clients */ | ||
234 | #define CEPH_MDS_STATE_REJOIN 11 /* up, rejoining distributed cache */ | ||
235 | #define CEPH_MDS_STATE_CLIENTREPLAY 12 /* up, replaying client operations */ | ||
236 | #define CEPH_MDS_STATE_ACTIVE 13 /* up, active */ | ||
237 | #define CEPH_MDS_STATE_STOPPING 14 /* up, but exporting metadata */ | ||
238 | |||
239 | extern const char *ceph_mds_state_name(int s); | ||
240 | |||
241 | |||
242 | /* | ||
243 | * metadata lock types. | ||
244 | * - these are bitmasks.. we can compose them | ||
245 | * - they also define the lock ordering by the MDS | ||
246 | * - a few of these are internal to the mds | ||
247 | */ | ||
248 | #define CEPH_LOCK_DVERSION 1 | ||
249 | #define CEPH_LOCK_DN 2 | ||
250 | #define CEPH_LOCK_ISNAP 16 | ||
251 | #define CEPH_LOCK_IVERSION 32 /* mds internal */ | ||
252 | #define CEPH_LOCK_IFILE 64 | ||
253 | #define CEPH_LOCK_IAUTH 128 | ||
254 | #define CEPH_LOCK_ILINK 256 | ||
255 | #define CEPH_LOCK_IDFT 512 /* dir frag tree */ | ||
256 | #define CEPH_LOCK_INEST 1024 /* mds internal */ | ||
257 | #define CEPH_LOCK_IXATTR 2048 | ||
258 | #define CEPH_LOCK_IFLOCK 4096 /* advisory file locks */ | ||
259 | #define CEPH_LOCK_INO 8192 /* immutable inode bits; not a lock */ | ||
260 | |||
261 | /* client_session ops */ | ||
262 | enum { | ||
263 | CEPH_SESSION_REQUEST_OPEN, | ||
264 | CEPH_SESSION_OPEN, | ||
265 | CEPH_SESSION_REQUEST_CLOSE, | ||
266 | CEPH_SESSION_CLOSE, | ||
267 | CEPH_SESSION_REQUEST_RENEWCAPS, | ||
268 | CEPH_SESSION_RENEWCAPS, | ||
269 | CEPH_SESSION_STALE, | ||
270 | CEPH_SESSION_RECALL_STATE, | ||
271 | }; | ||
272 | |||
273 | extern const char *ceph_session_op_name(int op); | ||
274 | |||
275 | struct ceph_mds_session_head { | ||
276 | __le32 op; | ||
277 | __le64 seq; | ||
278 | struct ceph_timespec stamp; | ||
279 | __le32 max_caps, max_leases; | ||
280 | } __attribute__ ((packed)); | ||
281 | |||
282 | /* client_request */ | ||
283 | /* | ||
284 | * metadata ops. | ||
285 | * & 0x001000 -> write op | ||
286 | * & 0x010000 -> follow symlink (e.g. stat(), not lstat()). | ||
287 | & & 0x100000 -> use weird ino/path trace | ||
288 | */ | ||
289 | #define CEPH_MDS_OP_WRITE 0x001000 | ||
290 | enum { | ||
291 | CEPH_MDS_OP_LOOKUP = 0x00100, | ||
292 | CEPH_MDS_OP_GETATTR = 0x00101, | ||
293 | CEPH_MDS_OP_LOOKUPHASH = 0x00102, | ||
294 | CEPH_MDS_OP_LOOKUPPARENT = 0x00103, | ||
295 | |||
296 | CEPH_MDS_OP_SETXATTR = 0x01105, | ||
297 | CEPH_MDS_OP_RMXATTR = 0x01106, | ||
298 | CEPH_MDS_OP_SETLAYOUT = 0x01107, | ||
299 | CEPH_MDS_OP_SETATTR = 0x01108, | ||
300 | CEPH_MDS_OP_SETFILELOCK= 0x01109, | ||
301 | CEPH_MDS_OP_GETFILELOCK= 0x00110, | ||
302 | CEPH_MDS_OP_SETDIRLAYOUT=0x0110a, | ||
303 | |||
304 | CEPH_MDS_OP_MKNOD = 0x01201, | ||
305 | CEPH_MDS_OP_LINK = 0x01202, | ||
306 | CEPH_MDS_OP_UNLINK = 0x01203, | ||
307 | CEPH_MDS_OP_RENAME = 0x01204, | ||
308 | CEPH_MDS_OP_MKDIR = 0x01220, | ||
309 | CEPH_MDS_OP_RMDIR = 0x01221, | ||
310 | CEPH_MDS_OP_SYMLINK = 0x01222, | ||
311 | |||
312 | CEPH_MDS_OP_CREATE = 0x01301, | ||
313 | CEPH_MDS_OP_OPEN = 0x00302, | ||
314 | CEPH_MDS_OP_READDIR = 0x00305, | ||
315 | |||
316 | CEPH_MDS_OP_LOOKUPSNAP = 0x00400, | ||
317 | CEPH_MDS_OP_MKSNAP = 0x01400, | ||
318 | CEPH_MDS_OP_RMSNAP = 0x01401, | ||
319 | CEPH_MDS_OP_LSSNAP = 0x00402, | ||
320 | }; | ||
321 | |||
322 | extern const char *ceph_mds_op_name(int op); | ||
323 | |||
324 | |||
325 | #define CEPH_SETATTR_MODE 1 | ||
326 | #define CEPH_SETATTR_UID 2 | ||
327 | #define CEPH_SETATTR_GID 4 | ||
328 | #define CEPH_SETATTR_MTIME 8 | ||
329 | #define CEPH_SETATTR_ATIME 16 | ||
330 | #define CEPH_SETATTR_SIZE 32 | ||
331 | #define CEPH_SETATTR_CTIME 64 | ||
332 | |||
333 | union ceph_mds_request_args { | ||
334 | struct { | ||
335 | __le32 mask; /* CEPH_CAP_* */ | ||
336 | } __attribute__ ((packed)) getattr; | ||
337 | struct { | ||
338 | __le32 mode; | ||
339 | __le32 uid; | ||
340 | __le32 gid; | ||
341 | struct ceph_timespec mtime; | ||
342 | struct ceph_timespec atime; | ||
343 | __le64 size, old_size; /* old_size needed by truncate */ | ||
344 | __le32 mask; /* CEPH_SETATTR_* */ | ||
345 | } __attribute__ ((packed)) setattr; | ||
346 | struct { | ||
347 | __le32 frag; /* which dir fragment */ | ||
348 | __le32 max_entries; /* how many dentries to grab */ | ||
349 | __le32 max_bytes; | ||
350 | } __attribute__ ((packed)) readdir; | ||
351 | struct { | ||
352 | __le32 mode; | ||
353 | __le32 rdev; | ||
354 | } __attribute__ ((packed)) mknod; | ||
355 | struct { | ||
356 | __le32 mode; | ||
357 | } __attribute__ ((packed)) mkdir; | ||
358 | struct { | ||
359 | __le32 flags; | ||
360 | __le32 mode; | ||
361 | __le32 stripe_unit; /* layout for newly created file */ | ||
362 | __le32 stripe_count; /* ... */ | ||
363 | __le32 object_size; | ||
364 | __le32 file_replication; | ||
365 | __le32 preferred; | ||
366 | } __attribute__ ((packed)) open; | ||
367 | struct { | ||
368 | __le32 flags; | ||
369 | } __attribute__ ((packed)) setxattr; | ||
370 | struct { | ||
371 | struct ceph_file_layout layout; | ||
372 | } __attribute__ ((packed)) setlayout; | ||
373 | struct { | ||
374 | __u8 rule; /* currently fcntl or flock */ | ||
375 | __u8 type; /* shared, exclusive, remove*/ | ||
376 | __le64 pid; /* process id requesting the lock */ | ||
377 | __le64 pid_namespace; | ||
378 | __le64 start; /* initial location to lock */ | ||
379 | __le64 length; /* num bytes to lock from start */ | ||
380 | __u8 wait; /* will caller wait for lock to become available? */ | ||
381 | } __attribute__ ((packed)) filelock_change; | ||
382 | } __attribute__ ((packed)); | ||
383 | |||
384 | #define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */ | ||
385 | #define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */ | ||
386 | |||
387 | struct ceph_mds_request_head { | ||
388 | __le64 oldest_client_tid; | ||
389 | __le32 mdsmap_epoch; /* on client */ | ||
390 | __le32 flags; /* CEPH_MDS_FLAG_* */ | ||
391 | __u8 num_retry, num_fwd; /* count retry, fwd attempts */ | ||
392 | __le16 num_releases; /* # include cap/lease release records */ | ||
393 | __le32 op; /* mds op code */ | ||
394 | __le32 caller_uid, caller_gid; | ||
395 | __le64 ino; /* use this ino for openc, mkdir, mknod, | ||
396 | etc. (if replaying) */ | ||
397 | union ceph_mds_request_args args; | ||
398 | } __attribute__ ((packed)); | ||
399 | |||
400 | /* cap/lease release record */ | ||
401 | struct ceph_mds_request_release { | ||
402 | __le64 ino, cap_id; /* ino and unique cap id */ | ||
403 | __le32 caps, wanted; /* new issued, wanted */ | ||
404 | __le32 seq, issue_seq, mseq; | ||
405 | __le32 dname_seq; /* if releasing a dentry lease, a */ | ||
406 | __le32 dname_len; /* string follows. */ | ||
407 | } __attribute__ ((packed)); | ||
408 | |||
409 | /* client reply */ | ||
410 | struct ceph_mds_reply_head { | ||
411 | __le32 op; | ||
412 | __le32 result; | ||
413 | __le32 mdsmap_epoch; | ||
414 | __u8 safe; /* true if committed to disk */ | ||
415 | __u8 is_dentry, is_target; /* true if dentry, target inode records | ||
416 | are included with reply */ | ||
417 | } __attribute__ ((packed)); | ||
418 | |||
419 | /* one for each node split */ | ||
420 | struct ceph_frag_tree_split { | ||
421 | __le32 frag; /* this frag splits... */ | ||
422 | __le32 by; /* ...by this many bits */ | ||
423 | } __attribute__ ((packed)); | ||
424 | |||
425 | struct ceph_frag_tree_head { | ||
426 | __le32 nsplits; /* num ceph_frag_tree_split records */ | ||
427 | struct ceph_frag_tree_split splits[]; | ||
428 | } __attribute__ ((packed)); | ||
429 | |||
430 | /* capability issue, for bundling with mds reply */ | ||
431 | struct ceph_mds_reply_cap { | ||
432 | __le32 caps, wanted; /* caps issued, wanted */ | ||
433 | __le64 cap_id; | ||
434 | __le32 seq, mseq; | ||
435 | __le64 realm; /* snap realm */ | ||
436 | __u8 flags; /* CEPH_CAP_FLAG_* */ | ||
437 | } __attribute__ ((packed)); | ||
438 | |||
439 | #define CEPH_CAP_FLAG_AUTH 1 /* cap is issued by auth mds */ | ||
440 | |||
441 | /* inode record, for bundling with mds reply */ | ||
442 | struct ceph_mds_reply_inode { | ||
443 | __le64 ino; | ||
444 | __le64 snapid; | ||
445 | __le32 rdev; | ||
446 | __le64 version; /* inode version */ | ||
447 | __le64 xattr_version; /* version for xattr blob */ | ||
448 | struct ceph_mds_reply_cap cap; /* caps issued for this inode */ | ||
449 | struct ceph_file_layout layout; | ||
450 | struct ceph_timespec ctime, mtime, atime; | ||
451 | __le32 time_warp_seq; | ||
452 | __le64 size, max_size, truncate_size; | ||
453 | __le32 truncate_seq; | ||
454 | __le32 mode, uid, gid; | ||
455 | __le32 nlink; | ||
456 | __le64 files, subdirs, rbytes, rfiles, rsubdirs; /* dir stats */ | ||
457 | struct ceph_timespec rctime; | ||
458 | struct ceph_frag_tree_head fragtree; /* (must be at end of struct) */ | ||
459 | } __attribute__ ((packed)); | ||
460 | /* followed by frag array, then symlink string, then xattr blob */ | ||
461 | |||
462 | /* reply_lease follows dname, and reply_inode */ | ||
463 | struct ceph_mds_reply_lease { | ||
464 | __le16 mask; /* lease type(s) */ | ||
465 | __le32 duration_ms; /* lease duration */ | ||
466 | __le32 seq; | ||
467 | } __attribute__ ((packed)); | ||
468 | |||
469 | struct ceph_mds_reply_dirfrag { | ||
470 | __le32 frag; /* fragment */ | ||
471 | __le32 auth; /* auth mds, if this is a delegation point */ | ||
472 | __le32 ndist; /* number of mds' this is replicated on */ | ||
473 | __le32 dist[]; | ||
474 | } __attribute__ ((packed)); | ||
475 | |||
476 | #define CEPH_LOCK_FCNTL 1 | ||
477 | #define CEPH_LOCK_FLOCK 2 | ||
478 | |||
479 | #define CEPH_LOCK_SHARED 1 | ||
480 | #define CEPH_LOCK_EXCL 2 | ||
481 | #define CEPH_LOCK_UNLOCK 4 | ||
482 | |||
483 | struct ceph_filelock { | ||
484 | __le64 start;/* file offset to start lock at */ | ||
485 | __le64 length; /* num bytes to lock; 0 for all following start */ | ||
486 | __le64 client; /* which client holds the lock */ | ||
487 | __le64 pid; /* process id holding the lock on the client */ | ||
488 | __le64 pid_namespace; | ||
489 | __u8 type; /* shared lock, exclusive lock, or unlock */ | ||
490 | } __attribute__ ((packed)); | ||
491 | |||
492 | |||
493 | /* file access modes */ | ||
494 | #define CEPH_FILE_MODE_PIN 0 | ||
495 | #define CEPH_FILE_MODE_RD 1 | ||
496 | #define CEPH_FILE_MODE_WR 2 | ||
497 | #define CEPH_FILE_MODE_RDWR 3 /* RD | WR */ | ||
498 | #define CEPH_FILE_MODE_LAZY 4 /* lazy io */ | ||
499 | #define CEPH_FILE_MODE_NUM 8 /* bc these are bit fields.. mostly */ | ||
500 | |||
501 | int ceph_flags_to_mode(int flags); | ||
502 | |||
503 | |||
504 | /* capability bits */ | ||
505 | #define CEPH_CAP_PIN 1 /* no specific capabilities beyond the pin */ | ||
506 | |||
507 | /* generic cap bits */ | ||
508 | #define CEPH_CAP_GSHARED 1 /* client can reads */ | ||
509 | #define CEPH_CAP_GEXCL 2 /* client can read and update */ | ||
510 | #define CEPH_CAP_GCACHE 4 /* (file) client can cache reads */ | ||
511 | #define CEPH_CAP_GRD 8 /* (file) client can read */ | ||
512 | #define CEPH_CAP_GWR 16 /* (file) client can write */ | ||
513 | #define CEPH_CAP_GBUFFER 32 /* (file) client can buffer writes */ | ||
514 | #define CEPH_CAP_GWREXTEND 64 /* (file) client can extend EOF */ | ||
515 | #define CEPH_CAP_GLAZYIO 128 /* (file) client can perform lazy io */ | ||
516 | |||
517 | /* per-lock shift */ | ||
518 | #define CEPH_CAP_SAUTH 2 | ||
519 | #define CEPH_CAP_SLINK 4 | ||
520 | #define CEPH_CAP_SXATTR 6 | ||
521 | #define CEPH_CAP_SFILE 8 | ||
522 | #define CEPH_CAP_SFLOCK 20 | ||
523 | |||
524 | #define CEPH_CAP_BITS 22 | ||
525 | |||
526 | /* composed values */ | ||
527 | #define CEPH_CAP_AUTH_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SAUTH) | ||
528 | #define CEPH_CAP_AUTH_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SAUTH) | ||
529 | #define CEPH_CAP_LINK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SLINK) | ||
530 | #define CEPH_CAP_LINK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SLINK) | ||
531 | #define CEPH_CAP_XATTR_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SXATTR) | ||
532 | #define CEPH_CAP_XATTR_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SXATTR) | ||
533 | #define CEPH_CAP_FILE(x) (x << CEPH_CAP_SFILE) | ||
534 | #define CEPH_CAP_FILE_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFILE) | ||
535 | #define CEPH_CAP_FILE_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFILE) | ||
536 | #define CEPH_CAP_FILE_CACHE (CEPH_CAP_GCACHE << CEPH_CAP_SFILE) | ||
537 | #define CEPH_CAP_FILE_RD (CEPH_CAP_GRD << CEPH_CAP_SFILE) | ||
538 | #define CEPH_CAP_FILE_WR (CEPH_CAP_GWR << CEPH_CAP_SFILE) | ||
539 | #define CEPH_CAP_FILE_BUFFER (CEPH_CAP_GBUFFER << CEPH_CAP_SFILE) | ||
540 | #define CEPH_CAP_FILE_WREXTEND (CEPH_CAP_GWREXTEND << CEPH_CAP_SFILE) | ||
541 | #define CEPH_CAP_FILE_LAZYIO (CEPH_CAP_GLAZYIO << CEPH_CAP_SFILE) | ||
542 | #define CEPH_CAP_FLOCK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFLOCK) | ||
543 | #define CEPH_CAP_FLOCK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFLOCK) | ||
544 | |||
545 | |||
546 | /* cap masks (for getattr) */ | ||
547 | #define CEPH_STAT_CAP_INODE CEPH_CAP_PIN | ||
548 | #define CEPH_STAT_CAP_TYPE CEPH_CAP_PIN /* mode >> 12 */ | ||
549 | #define CEPH_STAT_CAP_SYMLINK CEPH_CAP_PIN | ||
550 | #define CEPH_STAT_CAP_UID CEPH_CAP_AUTH_SHARED | ||
551 | #define CEPH_STAT_CAP_GID CEPH_CAP_AUTH_SHARED | ||
552 | #define CEPH_STAT_CAP_MODE CEPH_CAP_AUTH_SHARED | ||
553 | #define CEPH_STAT_CAP_NLINK CEPH_CAP_LINK_SHARED | ||
554 | #define CEPH_STAT_CAP_LAYOUT CEPH_CAP_FILE_SHARED | ||
555 | #define CEPH_STAT_CAP_MTIME CEPH_CAP_FILE_SHARED | ||
556 | #define CEPH_STAT_CAP_SIZE CEPH_CAP_FILE_SHARED | ||
557 | #define CEPH_STAT_CAP_ATIME CEPH_CAP_FILE_SHARED /* fixme */ | ||
558 | #define CEPH_STAT_CAP_XATTR CEPH_CAP_XATTR_SHARED | ||
559 | #define CEPH_STAT_CAP_INODE_ALL (CEPH_CAP_PIN | \ | ||
560 | CEPH_CAP_AUTH_SHARED | \ | ||
561 | CEPH_CAP_LINK_SHARED | \ | ||
562 | CEPH_CAP_FILE_SHARED | \ | ||
563 | CEPH_CAP_XATTR_SHARED) | ||
564 | |||
565 | #define CEPH_CAP_ANY_SHARED (CEPH_CAP_AUTH_SHARED | \ | ||
566 | CEPH_CAP_LINK_SHARED | \ | ||
567 | CEPH_CAP_XATTR_SHARED | \ | ||
568 | CEPH_CAP_FILE_SHARED) | ||
569 | #define CEPH_CAP_ANY_RD (CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_RD | \ | ||
570 | CEPH_CAP_FILE_CACHE) | ||
571 | |||
572 | #define CEPH_CAP_ANY_EXCL (CEPH_CAP_AUTH_EXCL | \ | ||
573 | CEPH_CAP_LINK_EXCL | \ | ||
574 | CEPH_CAP_XATTR_EXCL | \ | ||
575 | CEPH_CAP_FILE_EXCL) | ||
576 | #define CEPH_CAP_ANY_FILE_WR (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | \ | ||
577 | CEPH_CAP_FILE_EXCL) | ||
578 | #define CEPH_CAP_ANY_WR (CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_FILE_WR) | ||
579 | #define CEPH_CAP_ANY (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \ | ||
580 | CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \ | ||
581 | CEPH_CAP_PIN) | ||
582 | |||
583 | #define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \ | ||
584 | CEPH_LOCK_IXATTR) | ||
585 | |||
586 | int ceph_caps_for_mode(int mode); | ||
587 | |||
588 | enum { | ||
589 | CEPH_CAP_OP_GRANT, /* mds->client grant */ | ||
590 | CEPH_CAP_OP_REVOKE, /* mds->client revoke */ | ||
591 | CEPH_CAP_OP_TRUNC, /* mds->client trunc notify */ | ||
592 | CEPH_CAP_OP_EXPORT, /* mds has exported the cap */ | ||
593 | CEPH_CAP_OP_IMPORT, /* mds has imported the cap */ | ||
594 | CEPH_CAP_OP_UPDATE, /* client->mds update */ | ||
595 | CEPH_CAP_OP_DROP, /* client->mds drop cap bits */ | ||
596 | CEPH_CAP_OP_FLUSH, /* client->mds cap writeback */ | ||
597 | CEPH_CAP_OP_FLUSH_ACK, /* mds->client flushed */ | ||
598 | CEPH_CAP_OP_FLUSHSNAP, /* client->mds flush snapped metadata */ | ||
599 | CEPH_CAP_OP_FLUSHSNAP_ACK, /* mds->client flushed snapped metadata */ | ||
600 | CEPH_CAP_OP_RELEASE, /* client->mds release (clean) cap */ | ||
601 | CEPH_CAP_OP_RENEW, /* client->mds renewal request */ | ||
602 | }; | ||
603 | |||
604 | extern const char *ceph_cap_op_name(int op); | ||
605 | |||
606 | /* | ||
607 | * caps message, used for capability callbacks, acks, requests, etc. | ||
608 | */ | ||
609 | struct ceph_mds_caps { | ||
610 | __le32 op; /* CEPH_CAP_OP_* */ | ||
611 | __le64 ino, realm; | ||
612 | __le64 cap_id; | ||
613 | __le32 seq, issue_seq; | ||
614 | __le32 caps, wanted, dirty; /* latest issued/wanted/dirty */ | ||
615 | __le32 migrate_seq; | ||
616 | __le64 snap_follows; | ||
617 | __le32 snap_trace_len; | ||
618 | |||
619 | /* authlock */ | ||
620 | __le32 uid, gid, mode; | ||
621 | |||
622 | /* linklock */ | ||
623 | __le32 nlink; | ||
624 | |||
625 | /* xattrlock */ | ||
626 | __le32 xattr_len; | ||
627 | __le64 xattr_version; | ||
628 | |||
629 | /* filelock */ | ||
630 | __le64 size, max_size, truncate_size; | ||
631 | __le32 truncate_seq; | ||
632 | struct ceph_timespec mtime, atime, ctime; | ||
633 | struct ceph_file_layout layout; | ||
634 | __le32 time_warp_seq; | ||
635 | } __attribute__ ((packed)); | ||
636 | |||
637 | /* cap release msg head */ | ||
638 | struct ceph_mds_cap_release { | ||
639 | __le32 num; /* number of cap_items that follow */ | ||
640 | } __attribute__ ((packed)); | ||
641 | |||
642 | struct ceph_mds_cap_item { | ||
643 | __le64 ino; | ||
644 | __le64 cap_id; | ||
645 | __le32 migrate_seq, seq; | ||
646 | } __attribute__ ((packed)); | ||
647 | |||
648 | #define CEPH_MDS_LEASE_REVOKE 1 /* mds -> client */ | ||
649 | #define CEPH_MDS_LEASE_RELEASE 2 /* client -> mds */ | ||
650 | #define CEPH_MDS_LEASE_RENEW 3 /* client <-> mds */ | ||
651 | #define CEPH_MDS_LEASE_REVOKE_ACK 4 /* client -> mds */ | ||
652 | |||
653 | extern const char *ceph_lease_op_name(int o); | ||
654 | |||
655 | /* lease msg header */ | ||
656 | struct ceph_mds_lease { | ||
657 | __u8 action; /* CEPH_MDS_LEASE_* */ | ||
658 | __le16 mask; /* which lease */ | ||
659 | __le64 ino; | ||
660 | __le64 first, last; /* snap range */ | ||
661 | __le32 seq; | ||
662 | __le32 duration_ms; /* duration of renewal */ | ||
663 | } __attribute__ ((packed)); | ||
664 | /* followed by a __le32+string for dname */ | ||
665 | |||
666 | /* client reconnect */ | ||
667 | struct ceph_mds_cap_reconnect { | ||
668 | __le64 cap_id; | ||
669 | __le32 wanted; | ||
670 | __le32 issued; | ||
671 | __le64 snaprealm; | ||
672 | __le64 pathbase; /* base ino for our path to this ino */ | ||
673 | __le32 flock_len; /* size of flock state blob, if any */ | ||
674 | } __attribute__ ((packed)); | ||
675 | /* followed by flock blob */ | ||
676 | |||
677 | struct ceph_mds_cap_reconnect_v1 { | ||
678 | __le64 cap_id; | ||
679 | __le32 wanted; | ||
680 | __le32 issued; | ||
681 | __le64 size; | ||
682 | struct ceph_timespec mtime, atime; | ||
683 | __le64 snaprealm; | ||
684 | __le64 pathbase; /* base ino for our path to this ino */ | ||
685 | } __attribute__ ((packed)); | ||
686 | |||
687 | struct ceph_mds_snaprealm_reconnect { | ||
688 | __le64 ino; /* snap realm base */ | ||
689 | __le64 seq; /* snap seq for this snap realm */ | ||
690 | __le64 parent; /* parent realm */ | ||
691 | } __attribute__ ((packed)); | ||
692 | |||
693 | /* | ||
694 | * snaps | ||
695 | */ | ||
696 | enum { | ||
697 | CEPH_SNAP_OP_UPDATE, /* CREATE or DESTROY */ | ||
698 | CEPH_SNAP_OP_CREATE, | ||
699 | CEPH_SNAP_OP_DESTROY, | ||
700 | CEPH_SNAP_OP_SPLIT, | ||
701 | }; | ||
702 | |||
703 | extern const char *ceph_snap_op_name(int o); | ||
704 | |||
705 | /* snap msg header */ | ||
706 | struct ceph_mds_snap_head { | ||
707 | __le32 op; /* CEPH_SNAP_OP_* */ | ||
708 | __le64 split; /* ino to split off, if any */ | ||
709 | __le32 num_split_inos; /* # inos belonging to new child realm */ | ||
710 | __le32 num_split_realms; /* # child realms udner new child realm */ | ||
711 | __le32 trace_len; /* size of snap trace blob */ | ||
712 | } __attribute__ ((packed)); | ||
713 | /* followed by split ino list, then split realms, then the trace blob */ | ||
714 | |||
715 | /* | ||
716 | * encode info about a snaprealm, as viewed by a client | ||
717 | */ | ||
718 | struct ceph_mds_snap_realm { | ||
719 | __le64 ino; /* ino */ | ||
720 | __le64 created; /* snap: when created */ | ||
721 | __le64 parent; /* ino: parent realm */ | ||
722 | __le64 parent_since; /* snap: same parent since */ | ||
723 | __le64 seq; /* snap: version */ | ||
724 | __le32 num_snaps; | ||
725 | __le32 num_prior_parent_snaps; | ||
726 | } __attribute__ ((packed)); | ||
727 | /* followed by my snap list, then prior parent snap list */ | ||
728 | |||
729 | #endif | ||
diff --git a/include/linux/ceph/ceph_hash.h b/include/linux/ceph/ceph_hash.h new file mode 100644 index 000000000000..d099c3f90236 --- /dev/null +++ b/include/linux/ceph/ceph_hash.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef FS_CEPH_HASH_H | ||
2 | #define FS_CEPH_HASH_H | ||
3 | |||
4 | #define CEPH_STR_HASH_LINUX 0x1 /* linux dcache hash */ | ||
5 | #define CEPH_STR_HASH_RJENKINS 0x2 /* robert jenkins' */ | ||
6 | |||
7 | extern unsigned ceph_str_hash_linux(const char *s, unsigned len); | ||
8 | extern unsigned ceph_str_hash_rjenkins(const char *s, unsigned len); | ||
9 | |||
10 | extern unsigned ceph_str_hash(int type, const char *s, unsigned len); | ||
11 | extern const char *ceph_str_hash_name(int type); | ||
12 | |||
13 | #endif | ||
diff --git a/include/linux/ceph/debugfs.h b/include/linux/ceph/debugfs.h new file mode 100644 index 000000000000..2a79702e092b --- /dev/null +++ b/include/linux/ceph/debugfs.h | |||
@@ -0,0 +1,33 @@ | |||
1 | #ifndef _FS_CEPH_DEBUGFS_H | ||
2 | #define _FS_CEPH_DEBUGFS_H | ||
3 | |||
4 | #include "ceph_debug.h" | ||
5 | #include "types.h" | ||
6 | |||
7 | #define CEPH_DEFINE_SHOW_FUNC(name) \ | ||
8 | static int name##_open(struct inode *inode, struct file *file) \ | ||
9 | { \ | ||
10 | struct seq_file *sf; \ | ||
11 | int ret; \ | ||
12 | \ | ||
13 | ret = single_open(file, name, NULL); \ | ||
14 | sf = file->private_data; \ | ||
15 | sf->private = inode->i_private; \ | ||
16 | return ret; \ | ||
17 | } \ | ||
18 | \ | ||
19 | static const struct file_operations name##_fops = { \ | ||
20 | .open = name##_open, \ | ||
21 | .read = seq_read, \ | ||
22 | .llseek = seq_lseek, \ | ||
23 | .release = single_release, \ | ||
24 | }; | ||
25 | |||
26 | /* debugfs.c */ | ||
27 | extern int ceph_debugfs_init(void); | ||
28 | extern void ceph_debugfs_cleanup(void); | ||
29 | extern int ceph_debugfs_client_init(struct ceph_client *client); | ||
30 | extern void ceph_debugfs_client_cleanup(struct ceph_client *client); | ||
31 | |||
32 | #endif | ||
33 | |||
diff --git a/include/linux/ceph/decode.h b/include/linux/ceph/decode.h new file mode 100644 index 000000000000..c5b6939fb32a --- /dev/null +++ b/include/linux/ceph/decode.h | |||
@@ -0,0 +1,201 @@ | |||
1 | #ifndef __CEPH_DECODE_H | ||
2 | #define __CEPH_DECODE_H | ||
3 | |||
4 | #include <asm/unaligned.h> | ||
5 | #include <linux/time.h> | ||
6 | |||
7 | #include "types.h" | ||
8 | |||
9 | /* | ||
10 | * in all cases, | ||
11 | * void **p pointer to position pointer | ||
12 | * void *end pointer to end of buffer (last byte + 1) | ||
13 | */ | ||
14 | |||
15 | static inline u64 ceph_decode_64(void **p) | ||
16 | { | ||
17 | u64 v = get_unaligned_le64(*p); | ||
18 | *p += sizeof(u64); | ||
19 | return v; | ||
20 | } | ||
21 | static inline u32 ceph_decode_32(void **p) | ||
22 | { | ||
23 | u32 v = get_unaligned_le32(*p); | ||
24 | *p += sizeof(u32); | ||
25 | return v; | ||
26 | } | ||
27 | static inline u16 ceph_decode_16(void **p) | ||
28 | { | ||
29 | u16 v = get_unaligned_le16(*p); | ||
30 | *p += sizeof(u16); | ||
31 | return v; | ||
32 | } | ||
33 | static inline u8 ceph_decode_8(void **p) | ||
34 | { | ||
35 | u8 v = *(u8 *)*p; | ||
36 | (*p)++; | ||
37 | return v; | ||
38 | } | ||
39 | static inline void ceph_decode_copy(void **p, void *pv, size_t n) | ||
40 | { | ||
41 | memcpy(pv, *p, n); | ||
42 | *p += n; | ||
43 | } | ||
44 | |||
45 | /* | ||
46 | * bounds check input. | ||
47 | */ | ||
48 | #define ceph_decode_need(p, end, n, bad) \ | ||
49 | do { \ | ||
50 | if (unlikely(*(p) + (n) > (end))) \ | ||
51 | goto bad; \ | ||
52 | } while (0) | ||
53 | |||
54 | #define ceph_decode_64_safe(p, end, v, bad) \ | ||
55 | do { \ | ||
56 | ceph_decode_need(p, end, sizeof(u64), bad); \ | ||
57 | v = ceph_decode_64(p); \ | ||
58 | } while (0) | ||
59 | #define ceph_decode_32_safe(p, end, v, bad) \ | ||
60 | do { \ | ||
61 | ceph_decode_need(p, end, sizeof(u32), bad); \ | ||
62 | v = ceph_decode_32(p); \ | ||
63 | } while (0) | ||
64 | #define ceph_decode_16_safe(p, end, v, bad) \ | ||
65 | do { \ | ||
66 | ceph_decode_need(p, end, sizeof(u16), bad); \ | ||
67 | v = ceph_decode_16(p); \ | ||
68 | } while (0) | ||
69 | #define ceph_decode_8_safe(p, end, v, bad) \ | ||
70 | do { \ | ||
71 | ceph_decode_need(p, end, sizeof(u8), bad); \ | ||
72 | v = ceph_decode_8(p); \ | ||
73 | } while (0) | ||
74 | |||
75 | #define ceph_decode_copy_safe(p, end, pv, n, bad) \ | ||
76 | do { \ | ||
77 | ceph_decode_need(p, end, n, bad); \ | ||
78 | ceph_decode_copy(p, pv, n); \ | ||
79 | } while (0) | ||
80 | |||
81 | /* | ||
82 | * struct ceph_timespec <-> struct timespec | ||
83 | */ | ||
84 | static inline void ceph_decode_timespec(struct timespec *ts, | ||
85 | const struct ceph_timespec *tv) | ||
86 | { | ||
87 | ts->tv_sec = le32_to_cpu(tv->tv_sec); | ||
88 | ts->tv_nsec = le32_to_cpu(tv->tv_nsec); | ||
89 | } | ||
90 | static inline void ceph_encode_timespec(struct ceph_timespec *tv, | ||
91 | const struct timespec *ts) | ||
92 | { | ||
93 | tv->tv_sec = cpu_to_le32(ts->tv_sec); | ||
94 | tv->tv_nsec = cpu_to_le32(ts->tv_nsec); | ||
95 | } | ||
96 | |||
97 | /* | ||
98 | * sockaddr_storage <-> ceph_sockaddr | ||
99 | */ | ||
100 | static inline void ceph_encode_addr(struct ceph_entity_addr *a) | ||
101 | { | ||
102 | __be16 ss_family = htons(a->in_addr.ss_family); | ||
103 | a->in_addr.ss_family = *(__u16 *)&ss_family; | ||
104 | } | ||
105 | static inline void ceph_decode_addr(struct ceph_entity_addr *a) | ||
106 | { | ||
107 | __be16 ss_family = *(__be16 *)&a->in_addr.ss_family; | ||
108 | a->in_addr.ss_family = ntohs(ss_family); | ||
109 | WARN_ON(a->in_addr.ss_family == 512); | ||
110 | } | ||
111 | |||
112 | /* | ||
113 | * encoders | ||
114 | */ | ||
115 | static inline void ceph_encode_64(void **p, u64 v) | ||
116 | { | ||
117 | put_unaligned_le64(v, (__le64 *)*p); | ||
118 | *p += sizeof(u64); | ||
119 | } | ||
120 | static inline void ceph_encode_32(void **p, u32 v) | ||
121 | { | ||
122 | put_unaligned_le32(v, (__le32 *)*p); | ||
123 | *p += sizeof(u32); | ||
124 | } | ||
125 | static inline void ceph_encode_16(void **p, u16 v) | ||
126 | { | ||
127 | put_unaligned_le16(v, (__le16 *)*p); | ||
128 | *p += sizeof(u16); | ||
129 | } | ||
130 | static inline void ceph_encode_8(void **p, u8 v) | ||
131 | { | ||
132 | *(u8 *)*p = v; | ||
133 | (*p)++; | ||
134 | } | ||
135 | static inline void ceph_encode_copy(void **p, const void *s, int len) | ||
136 | { | ||
137 | memcpy(*p, s, len); | ||
138 | *p += len; | ||
139 | } | ||
140 | |||
141 | /* | ||
142 | * filepath, string encoders | ||
143 | */ | ||
144 | static inline void ceph_encode_filepath(void **p, void *end, | ||
145 | u64 ino, const char *path) | ||
146 | { | ||
147 | u32 len = path ? strlen(path) : 0; | ||
148 | BUG_ON(*p + sizeof(ino) + sizeof(len) + len > end); | ||
149 | ceph_encode_8(p, 1); | ||
150 | ceph_encode_64(p, ino); | ||
151 | ceph_encode_32(p, len); | ||
152 | if (len) | ||
153 | memcpy(*p, path, len); | ||
154 | *p += len; | ||
155 | } | ||
156 | |||
157 | static inline void ceph_encode_string(void **p, void *end, | ||
158 | const char *s, u32 len) | ||
159 | { | ||
160 | BUG_ON(*p + sizeof(len) + len > end); | ||
161 | ceph_encode_32(p, len); | ||
162 | if (len) | ||
163 | memcpy(*p, s, len); | ||
164 | *p += len; | ||
165 | } | ||
166 | |||
167 | #define ceph_encode_need(p, end, n, bad) \ | ||
168 | do { \ | ||
169 | if (unlikely(*(p) + (n) > (end))) \ | ||
170 | goto bad; \ | ||
171 | } while (0) | ||
172 | |||
173 | #define ceph_encode_64_safe(p, end, v, bad) \ | ||
174 | do { \ | ||
175 | ceph_encode_need(p, end, sizeof(u64), bad); \ | ||
176 | ceph_encode_64(p, v); \ | ||
177 | } while (0) | ||
178 | #define ceph_encode_32_safe(p, end, v, bad) \ | ||
179 | do { \ | ||
180 | ceph_encode_need(p, end, sizeof(u32), bad); \ | ||
181 | ceph_encode_32(p, v); \ | ||
182 | } while (0) | ||
183 | #define ceph_encode_16_safe(p, end, v, bad) \ | ||
184 | do { \ | ||
185 | ceph_encode_need(p, end, sizeof(u16), bad); \ | ||
186 | ceph_encode_16(p, v); \ | ||
187 | } while (0) | ||
188 | |||
189 | #define ceph_encode_copy_safe(p, end, pv, n, bad) \ | ||
190 | do { \ | ||
191 | ceph_encode_need(p, end, n, bad); \ | ||
192 | ceph_encode_copy(p, pv, n); \ | ||
193 | } while (0) | ||
194 | #define ceph_encode_string_safe(p, end, s, n, bad) \ | ||
195 | do { \ | ||
196 | ceph_encode_need(p, end, n, bad); \ | ||
197 | ceph_encode_string(p, end, s, n); \ | ||
198 | } while (0) | ||
199 | |||
200 | |||
201 | #endif | ||
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h new file mode 100644 index 000000000000..f22b2e941686 --- /dev/null +++ b/include/linux/ceph/libceph.h | |||
@@ -0,0 +1,249 @@ | |||
1 | #ifndef _FS_CEPH_LIBCEPH_H | ||
2 | #define _FS_CEPH_LIBCEPH_H | ||
3 | |||
4 | #include "ceph_debug.h" | ||
5 | |||
6 | #include <asm/unaligned.h> | ||
7 | #include <linux/backing-dev.h> | ||
8 | #include <linux/completion.h> | ||
9 | #include <linux/exportfs.h> | ||
10 | #include <linux/fs.h> | ||
11 | #include <linux/mempool.h> | ||
12 | #include <linux/pagemap.h> | ||
13 | #include <linux/wait.h> | ||
14 | #include <linux/writeback.h> | ||
15 | #include <linux/slab.h> | ||
16 | |||
17 | #include "types.h" | ||
18 | #include "messenger.h" | ||
19 | #include "msgpool.h" | ||
20 | #include "mon_client.h" | ||
21 | #include "osd_client.h" | ||
22 | #include "ceph_fs.h" | ||
23 | |||
24 | /* | ||
25 | * Supported features | ||
26 | */ | ||
27 | #define CEPH_FEATURE_SUPPORTED_DEFAULT CEPH_FEATURE_NOSRCADDR | ||
28 | #define CEPH_FEATURE_REQUIRED_DEFAULT CEPH_FEATURE_NOSRCADDR | ||
29 | |||
30 | /* | ||
31 | * mount options | ||
32 | */ | ||
33 | #define CEPH_OPT_FSID (1<<0) | ||
34 | #define CEPH_OPT_NOSHARE (1<<1) /* don't share client with other sbs */ | ||
35 | #define CEPH_OPT_MYIP (1<<2) /* specified my ip */ | ||
36 | #define CEPH_OPT_NOCRC (1<<3) /* no data crc on writes */ | ||
37 | |||
38 | #define CEPH_OPT_DEFAULT (0); | ||
39 | |||
40 | #define ceph_set_opt(client, opt) \ | ||
41 | (client)->options->flags |= CEPH_OPT_##opt; | ||
42 | #define ceph_test_opt(client, opt) \ | ||
43 | (!!((client)->options->flags & CEPH_OPT_##opt)) | ||
44 | |||
45 | struct ceph_options { | ||
46 | int flags; | ||
47 | struct ceph_fsid fsid; | ||
48 | struct ceph_entity_addr my_addr; | ||
49 | int mount_timeout; | ||
50 | int osd_idle_ttl; | ||
51 | int osd_timeout; | ||
52 | int osd_keepalive_timeout; | ||
53 | |||
54 | /* | ||
55 | * any type that can't be simply compared or doesn't need need | ||
56 | * to be compared should go beyond this point, | ||
57 | * ceph_compare_options() should be updated accordingly | ||
58 | */ | ||
59 | |||
60 | struct ceph_entity_addr *mon_addr; /* should be the first | ||
61 | pointer type of args */ | ||
62 | int num_mon; | ||
63 | char *name; | ||
64 | char *secret; | ||
65 | }; | ||
66 | |||
67 | /* | ||
68 | * defaults | ||
69 | */ | ||
70 | #define CEPH_MOUNT_TIMEOUT_DEFAULT 60 | ||
71 | #define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */ | ||
72 | #define CEPH_OSD_KEEPALIVE_DEFAULT 5 | ||
73 | #define CEPH_OSD_IDLE_TTL_DEFAULT 60 | ||
74 | #define CEPH_MOUNT_RSIZE_DEFAULT (512*1024) /* readahead */ | ||
75 | |||
76 | #define CEPH_MSG_MAX_FRONT_LEN (16*1024*1024) | ||
77 | #define CEPH_MSG_MAX_DATA_LEN (16*1024*1024) | ||
78 | |||
79 | #define CEPH_AUTH_NAME_DEFAULT "guest" | ||
80 | |||
81 | /* | ||
82 | * Delay telling the MDS we no longer want caps, in case we reopen | ||
83 | * the file. Delay a minimum amount of time, even if we send a cap | ||
84 | * message for some other reason. Otherwise, take the oppotunity to | ||
85 | * update the mds to avoid sending another message later. | ||
86 | */ | ||
87 | #define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */ | ||
88 | #define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */ | ||
89 | |||
90 | #define CEPH_CAP_RELEASE_SAFETY_DEFAULT (CEPH_CAPS_PER_RELEASE * 4) | ||
91 | |||
92 | /* mount state */ | ||
93 | enum { | ||
94 | CEPH_MOUNT_MOUNTING, | ||
95 | CEPH_MOUNT_MOUNTED, | ||
96 | CEPH_MOUNT_UNMOUNTING, | ||
97 | CEPH_MOUNT_UNMOUNTED, | ||
98 | CEPH_MOUNT_SHUTDOWN, | ||
99 | }; | ||
100 | |||
101 | /* | ||
102 | * subtract jiffies | ||
103 | */ | ||
104 | static inline unsigned long time_sub(unsigned long a, unsigned long b) | ||
105 | { | ||
106 | BUG_ON(time_after(b, a)); | ||
107 | return (long)a - (long)b; | ||
108 | } | ||
109 | |||
110 | struct ceph_mds_client; | ||
111 | |||
112 | /* | ||
113 | * per client state | ||
114 | * | ||
115 | * possibly shared by multiple mount points, if they are | ||
116 | * mounting the same ceph filesystem/cluster. | ||
117 | */ | ||
118 | struct ceph_client { | ||
119 | struct ceph_fsid fsid; | ||
120 | bool have_fsid; | ||
121 | |||
122 | void *private; | ||
123 | |||
124 | struct ceph_options *options; | ||
125 | |||
126 | struct mutex mount_mutex; /* serialize mount attempts */ | ||
127 | wait_queue_head_t auth_wq; | ||
128 | int auth_err; | ||
129 | |||
130 | int (*extra_mon_dispatch)(struct ceph_client *, struct ceph_msg *); | ||
131 | |||
132 | u32 supported_features; | ||
133 | u32 required_features; | ||
134 | |||
135 | struct ceph_messenger *msgr; /* messenger instance */ | ||
136 | struct ceph_mon_client monc; | ||
137 | struct ceph_osd_client osdc; | ||
138 | |||
139 | #ifdef CONFIG_DEBUG_FS | ||
140 | struct dentry *debugfs_dir; | ||
141 | struct dentry *debugfs_monmap; | ||
142 | struct dentry *debugfs_osdmap; | ||
143 | #endif | ||
144 | }; | ||
145 | |||
146 | |||
147 | |||
148 | /* | ||
149 | * snapshots | ||
150 | */ | ||
151 | |||
152 | /* | ||
153 | * A "snap context" is the set of existing snapshots when we | ||
154 | * write data. It is used by the OSD to guide its COW behavior. | ||
155 | * | ||
156 | * The ceph_snap_context is refcounted, and attached to each dirty | ||
157 | * page, indicating which context the dirty data belonged when it was | ||
158 | * dirtied. | ||
159 | */ | ||
160 | struct ceph_snap_context { | ||
161 | atomic_t nref; | ||
162 | u64 seq; | ||
163 | int num_snaps; | ||
164 | u64 snaps[]; | ||
165 | }; | ||
166 | |||
167 | static inline struct ceph_snap_context * | ||
168 | ceph_get_snap_context(struct ceph_snap_context *sc) | ||
169 | { | ||
170 | /* | ||
171 | printk("get_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref), | ||
172 | atomic_read(&sc->nref)+1); | ||
173 | */ | ||
174 | if (sc) | ||
175 | atomic_inc(&sc->nref); | ||
176 | return sc; | ||
177 | } | ||
178 | |||
179 | static inline void ceph_put_snap_context(struct ceph_snap_context *sc) | ||
180 | { | ||
181 | if (!sc) | ||
182 | return; | ||
183 | /* | ||
184 | printk("put_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref), | ||
185 | atomic_read(&sc->nref)-1); | ||
186 | */ | ||
187 | if (atomic_dec_and_test(&sc->nref)) { | ||
188 | /*printk(" deleting snap_context %p\n", sc);*/ | ||
189 | kfree(sc); | ||
190 | } | ||
191 | } | ||
192 | |||
193 | /* | ||
194 | * calculate the number of pages a given length and offset map onto, | ||
195 | * if we align the data. | ||
196 | */ | ||
197 | static inline int calc_pages_for(u64 off, u64 len) | ||
198 | { | ||
199 | return ((off+len+PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT) - | ||
200 | (off >> PAGE_CACHE_SHIFT); | ||
201 | } | ||
202 | |||
203 | /* ceph_common.c */ | ||
204 | extern const char *ceph_msg_type_name(int type); | ||
205 | extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid); | ||
206 | extern struct kmem_cache *ceph_inode_cachep; | ||
207 | extern struct kmem_cache *ceph_cap_cachep; | ||
208 | extern struct kmem_cache *ceph_dentry_cachep; | ||
209 | extern struct kmem_cache *ceph_file_cachep; | ||
210 | |||
211 | extern int ceph_parse_options(struct ceph_options **popt, char *options, | ||
212 | const char *dev_name, const char *dev_name_end, | ||
213 | int (*parse_extra_token)(char *c, void *private), | ||
214 | void *private); | ||
215 | extern void ceph_destroy_options(struct ceph_options *opt); | ||
216 | extern int ceph_compare_options(struct ceph_options *new_opt, | ||
217 | struct ceph_client *client); | ||
218 | extern struct ceph_client *ceph_create_client(struct ceph_options *opt, | ||
219 | void *private); | ||
220 | extern u64 ceph_client_id(struct ceph_client *client); | ||
221 | extern void ceph_destroy_client(struct ceph_client *client); | ||
222 | extern int __ceph_open_session(struct ceph_client *client, | ||
223 | unsigned long started); | ||
224 | extern int ceph_open_session(struct ceph_client *client); | ||
225 | |||
226 | /* pagevec.c */ | ||
227 | extern void ceph_release_page_vector(struct page **pages, int num_pages); | ||
228 | |||
229 | extern struct page **ceph_get_direct_page_vector(const char __user *data, | ||
230 | int num_pages, | ||
231 | loff_t off, size_t len); | ||
232 | extern void ceph_put_page_vector(struct page **pages, int num_pages); | ||
233 | extern void ceph_release_page_vector(struct page **pages, int num_pages); | ||
234 | extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags); | ||
235 | extern int ceph_copy_user_to_page_vector(struct page **pages, | ||
236 | const char __user *data, | ||
237 | loff_t off, size_t len); | ||
238 | extern int ceph_copy_to_page_vector(struct page **pages, | ||
239 | const char *data, | ||
240 | loff_t off, size_t len); | ||
241 | extern int ceph_copy_from_page_vector(struct page **pages, | ||
242 | char *data, | ||
243 | loff_t off, size_t len); | ||
244 | extern int ceph_copy_page_vector_to_user(struct page **pages, char __user *data, | ||
245 | loff_t off, size_t len); | ||
246 | extern void ceph_zero_page_vector_range(int off, int len, struct page **pages); | ||
247 | |||
248 | |||
249 | #endif /* _FS_CEPH_SUPER_H */ | ||
diff --git a/include/linux/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h new file mode 100644 index 000000000000..4c5cb0880bba --- /dev/null +++ b/include/linux/ceph/mdsmap.h | |||
@@ -0,0 +1,62 @@ | |||
1 | #ifndef _FS_CEPH_MDSMAP_H | ||
2 | #define _FS_CEPH_MDSMAP_H | ||
3 | |||
4 | #include "types.h" | ||
5 | |||
6 | /* | ||
7 | * mds map - describe servers in the mds cluster. | ||
8 | * | ||
9 | * we limit fields to those the client actually xcares about | ||
10 | */ | ||
11 | struct ceph_mds_info { | ||
12 | u64 global_id; | ||
13 | struct ceph_entity_addr addr; | ||
14 | s32 state; | ||
15 | int num_export_targets; | ||
16 | bool laggy; | ||
17 | u32 *export_targets; | ||
18 | }; | ||
19 | |||
20 | struct ceph_mdsmap { | ||
21 | u32 m_epoch, m_client_epoch, m_last_failure; | ||
22 | u32 m_root; | ||
23 | u32 m_session_timeout; /* seconds */ | ||
24 | u32 m_session_autoclose; /* seconds */ | ||
25 | u64 m_max_file_size; | ||
26 | u32 m_max_mds; /* size of m_addr, m_state arrays */ | ||
27 | struct ceph_mds_info *m_info; | ||
28 | |||
29 | /* which object pools file data can be stored in */ | ||
30 | int m_num_data_pg_pools; | ||
31 | u32 *m_data_pg_pools; | ||
32 | u32 m_cas_pg_pool; | ||
33 | }; | ||
34 | |||
35 | static inline struct ceph_entity_addr * | ||
36 | ceph_mdsmap_get_addr(struct ceph_mdsmap *m, int w) | ||
37 | { | ||
38 | if (w >= m->m_max_mds) | ||
39 | return NULL; | ||
40 | return &m->m_info[w].addr; | ||
41 | } | ||
42 | |||
43 | static inline int ceph_mdsmap_get_state(struct ceph_mdsmap *m, int w) | ||
44 | { | ||
45 | BUG_ON(w < 0); | ||
46 | if (w >= m->m_max_mds) | ||
47 | return CEPH_MDS_STATE_DNE; | ||
48 | return m->m_info[w].state; | ||
49 | } | ||
50 | |||
51 | static inline bool ceph_mdsmap_is_laggy(struct ceph_mdsmap *m, int w) | ||
52 | { | ||
53 | if (w >= 0 && w < m->m_max_mds) | ||
54 | return m->m_info[w].laggy; | ||
55 | return false; | ||
56 | } | ||
57 | |||
58 | extern int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m); | ||
59 | extern struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end); | ||
60 | extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m); | ||
61 | |||
62 | #endif | ||
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h new file mode 100644 index 000000000000..5956d62c3057 --- /dev/null +++ b/include/linux/ceph/messenger.h | |||
@@ -0,0 +1,261 @@ | |||
1 | #ifndef __FS_CEPH_MESSENGER_H | ||
2 | #define __FS_CEPH_MESSENGER_H | ||
3 | |||
4 | #include <linux/kref.h> | ||
5 | #include <linux/mutex.h> | ||
6 | #include <linux/net.h> | ||
7 | #include <linux/radix-tree.h> | ||
8 | #include <linux/uio.h> | ||
9 | #include <linux/version.h> | ||
10 | #include <linux/workqueue.h> | ||
11 | |||
12 | #include "types.h" | ||
13 | #include "buffer.h" | ||
14 | |||
15 | struct ceph_msg; | ||
16 | struct ceph_connection; | ||
17 | |||
18 | extern struct workqueue_struct *ceph_msgr_wq; /* receive work queue */ | ||
19 | |||
20 | /* | ||
21 | * Ceph defines these callbacks for handling connection events. | ||
22 | */ | ||
23 | struct ceph_connection_operations { | ||
24 | struct ceph_connection *(*get)(struct ceph_connection *); | ||
25 | void (*put)(struct ceph_connection *); | ||
26 | |||
27 | /* handle an incoming message. */ | ||
28 | void (*dispatch) (struct ceph_connection *con, struct ceph_msg *m); | ||
29 | |||
30 | /* authorize an outgoing connection */ | ||
31 | int (*get_authorizer) (struct ceph_connection *con, | ||
32 | void **buf, int *len, int *proto, | ||
33 | void **reply_buf, int *reply_len, int force_new); | ||
34 | int (*verify_authorizer_reply) (struct ceph_connection *con, int len); | ||
35 | int (*invalidate_authorizer)(struct ceph_connection *con); | ||
36 | |||
37 | /* protocol version mismatch */ | ||
38 | void (*bad_proto) (struct ceph_connection *con); | ||
39 | |||
40 | /* there was some error on the socket (disconnect, whatever) */ | ||
41 | void (*fault) (struct ceph_connection *con); | ||
42 | |||
43 | /* a remote host as terminated a message exchange session, and messages | ||
44 | * we sent (or they tried to send us) may be lost. */ | ||
45 | void (*peer_reset) (struct ceph_connection *con); | ||
46 | |||
47 | struct ceph_msg * (*alloc_msg) (struct ceph_connection *con, | ||
48 | struct ceph_msg_header *hdr, | ||
49 | int *skip); | ||
50 | }; | ||
51 | |||
52 | /* use format string %s%d */ | ||
53 | #define ENTITY_NAME(n) ceph_entity_type_name((n).type), le64_to_cpu((n).num) | ||
54 | |||
55 | struct ceph_messenger { | ||
56 | struct ceph_entity_inst inst; /* my name+address */ | ||
57 | struct ceph_entity_addr my_enc_addr; | ||
58 | struct page *zero_page; /* used in certain error cases */ | ||
59 | |||
60 | bool nocrc; | ||
61 | |||
62 | /* | ||
63 | * the global_seq counts connections i (attempt to) initiate | ||
64 | * in order to disambiguate certain connect race conditions. | ||
65 | */ | ||
66 | u32 global_seq; | ||
67 | spinlock_t global_seq_lock; | ||
68 | |||
69 | u32 supported_features; | ||
70 | u32 required_features; | ||
71 | }; | ||
72 | |||
73 | /* | ||
74 | * a single message. it contains a header (src, dest, message type, etc.), | ||
75 | * footer (crc values, mainly), a "front" message body, and possibly a | ||
76 | * data payload (stored in some number of pages). | ||
77 | */ | ||
78 | struct ceph_msg { | ||
79 | struct ceph_msg_header hdr; /* header */ | ||
80 | struct ceph_msg_footer footer; /* footer */ | ||
81 | struct kvec front; /* unaligned blobs of message */ | ||
82 | struct ceph_buffer *middle; | ||
83 | struct page **pages; /* data payload. NOT OWNER. */ | ||
84 | unsigned nr_pages; /* size of page array */ | ||
85 | struct ceph_pagelist *pagelist; /* instead of pages */ | ||
86 | struct list_head list_head; | ||
87 | struct kref kref; | ||
88 | struct bio *bio; /* instead of pages/pagelist */ | ||
89 | struct bio *bio_iter; /* bio iterator */ | ||
90 | int bio_seg; /* current bio segment */ | ||
91 | struct ceph_pagelist *trail; /* the trailing part of the data */ | ||
92 | bool front_is_vmalloc; | ||
93 | bool more_to_follow; | ||
94 | bool needs_out_seq; | ||
95 | int front_max; | ||
96 | |||
97 | struct ceph_msgpool *pool; | ||
98 | }; | ||
99 | |||
100 | struct ceph_msg_pos { | ||
101 | int page, page_pos; /* which page; offset in page */ | ||
102 | int data_pos; /* offset in data payload */ | ||
103 | int did_page_crc; /* true if we've calculated crc for current page */ | ||
104 | }; | ||
105 | |||
106 | /* ceph connection fault delay defaults, for exponential backoff */ | ||
107 | #define BASE_DELAY_INTERVAL (HZ/2) | ||
108 | #define MAX_DELAY_INTERVAL (5 * 60 * HZ) | ||
109 | |||
110 | /* | ||
111 | * ceph_connection state bit flags | ||
112 | * | ||
113 | * QUEUED and BUSY are used together to ensure that only a single | ||
114 | * thread is currently opening, reading or writing data to the socket. | ||
115 | */ | ||
116 | #define LOSSYTX 0 /* we can close channel or drop messages on errors */ | ||
117 | #define CONNECTING 1 | ||
118 | #define NEGOTIATING 2 | ||
119 | #define KEEPALIVE_PENDING 3 | ||
120 | #define WRITE_PENDING 4 /* we have data ready to send */ | ||
121 | #define QUEUED 5 /* there is work queued on this connection */ | ||
122 | #define BUSY 6 /* work is being done */ | ||
123 | #define STANDBY 8 /* no outgoing messages, socket closed. we keep | ||
124 | * the ceph_connection around to maintain shared | ||
125 | * state with the peer. */ | ||
126 | #define CLOSED 10 /* we've closed the connection */ | ||
127 | #define SOCK_CLOSED 11 /* socket state changed to closed */ | ||
128 | #define OPENING 13 /* open connection w/ (possibly new) peer */ | ||
129 | #define DEAD 14 /* dead, about to kfree */ | ||
130 | |||
131 | /* | ||
132 | * A single connection with another host. | ||
133 | * | ||
134 | * We maintain a queue of outgoing messages, and some session state to | ||
135 | * ensure that we can preserve the lossless, ordered delivery of | ||
136 | * messages in the case of a TCP disconnect. | ||
137 | */ | ||
138 | struct ceph_connection { | ||
139 | void *private; | ||
140 | atomic_t nref; | ||
141 | |||
142 | const struct ceph_connection_operations *ops; | ||
143 | |||
144 | struct ceph_messenger *msgr; | ||
145 | struct socket *sock; | ||
146 | unsigned long state; /* connection state (see flags above) */ | ||
147 | const char *error_msg; /* error message, if any */ | ||
148 | |||
149 | struct ceph_entity_addr peer_addr; /* peer address */ | ||
150 | struct ceph_entity_name peer_name; /* peer name */ | ||
151 | struct ceph_entity_addr peer_addr_for_me; | ||
152 | unsigned peer_features; | ||
153 | u32 connect_seq; /* identify the most recent connection | ||
154 | attempt for this connection, client */ | ||
155 | u32 peer_global_seq; /* peer's global seq for this connection */ | ||
156 | |||
157 | int auth_retry; /* true if we need a newer authorizer */ | ||
158 | void *auth_reply_buf; /* where to put the authorizer reply */ | ||
159 | int auth_reply_buf_len; | ||
160 | |||
161 | struct mutex mutex; | ||
162 | |||
163 | /* out queue */ | ||
164 | struct list_head out_queue; | ||
165 | struct list_head out_sent; /* sending or sent but unacked */ | ||
166 | u64 out_seq; /* last message queued for send */ | ||
167 | bool out_keepalive_pending; | ||
168 | |||
169 | u64 in_seq, in_seq_acked; /* last message received, acked */ | ||
170 | |||
171 | /* connection negotiation temps */ | ||
172 | char in_banner[CEPH_BANNER_MAX_LEN]; | ||
173 | union { | ||
174 | struct { /* outgoing connection */ | ||
175 | struct ceph_msg_connect out_connect; | ||
176 | struct ceph_msg_connect_reply in_reply; | ||
177 | }; | ||
178 | struct { /* incoming */ | ||
179 | struct ceph_msg_connect in_connect; | ||
180 | struct ceph_msg_connect_reply out_reply; | ||
181 | }; | ||
182 | }; | ||
183 | struct ceph_entity_addr actual_peer_addr; | ||
184 | |||
185 | /* message out temps */ | ||
186 | struct ceph_msg *out_msg; /* sending message (== tail of | ||
187 | out_sent) */ | ||
188 | bool out_msg_done; | ||
189 | struct ceph_msg_pos out_msg_pos; | ||
190 | |||
191 | struct kvec out_kvec[8], /* sending header/footer data */ | ||
192 | *out_kvec_cur; | ||
193 | int out_kvec_left; /* kvec's left in out_kvec */ | ||
194 | int out_skip; /* skip this many bytes */ | ||
195 | int out_kvec_bytes; /* total bytes left */ | ||
196 | bool out_kvec_is_msg; /* kvec refers to out_msg */ | ||
197 | int out_more; /* there is more data after the kvecs */ | ||
198 | __le64 out_temp_ack; /* for writing an ack */ | ||
199 | |||
200 | /* message in temps */ | ||
201 | struct ceph_msg_header in_hdr; | ||
202 | struct ceph_msg *in_msg; | ||
203 | struct ceph_msg_pos in_msg_pos; | ||
204 | u32 in_front_crc, in_middle_crc, in_data_crc; /* calculated crc */ | ||
205 | |||
206 | char in_tag; /* protocol control byte */ | ||
207 | int in_base_pos; /* bytes read */ | ||
208 | __le64 in_temp_ack; /* for reading an ack */ | ||
209 | |||
210 | struct delayed_work work; /* send|recv work */ | ||
211 | unsigned long delay; /* current delay interval */ | ||
212 | }; | ||
213 | |||
214 | |||
215 | extern const char *ceph_pr_addr(const struct sockaddr_storage *ss); | ||
216 | extern int ceph_parse_ips(const char *c, const char *end, | ||
217 | struct ceph_entity_addr *addr, | ||
218 | int max_count, int *count); | ||
219 | |||
220 | |||
221 | extern int ceph_msgr_init(void); | ||
222 | extern void ceph_msgr_exit(void); | ||
223 | extern void ceph_msgr_flush(void); | ||
224 | |||
225 | extern struct ceph_messenger *ceph_messenger_create( | ||
226 | struct ceph_entity_addr *myaddr, | ||
227 | u32 features, u32 required); | ||
228 | extern void ceph_messenger_destroy(struct ceph_messenger *); | ||
229 | |||
230 | extern void ceph_con_init(struct ceph_messenger *msgr, | ||
231 | struct ceph_connection *con); | ||
232 | extern void ceph_con_open(struct ceph_connection *con, | ||
233 | struct ceph_entity_addr *addr); | ||
234 | extern bool ceph_con_opened(struct ceph_connection *con); | ||
235 | extern void ceph_con_close(struct ceph_connection *con); | ||
236 | extern void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg); | ||
237 | extern void ceph_con_revoke(struct ceph_connection *con, struct ceph_msg *msg); | ||
238 | extern void ceph_con_revoke_message(struct ceph_connection *con, | ||
239 | struct ceph_msg *msg); | ||
240 | extern void ceph_con_keepalive(struct ceph_connection *con); | ||
241 | extern struct ceph_connection *ceph_con_get(struct ceph_connection *con); | ||
242 | extern void ceph_con_put(struct ceph_connection *con); | ||
243 | |||
244 | extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags); | ||
245 | extern void ceph_msg_kfree(struct ceph_msg *m); | ||
246 | |||
247 | |||
248 | static inline struct ceph_msg *ceph_msg_get(struct ceph_msg *msg) | ||
249 | { | ||
250 | kref_get(&msg->kref); | ||
251 | return msg; | ||
252 | } | ||
253 | extern void ceph_msg_last_put(struct kref *kref); | ||
254 | static inline void ceph_msg_put(struct ceph_msg *msg) | ||
255 | { | ||
256 | kref_put(&msg->kref, ceph_msg_last_put); | ||
257 | } | ||
258 | |||
259 | extern void ceph_msg_dump(struct ceph_msg *msg); | ||
260 | |||
261 | #endif | ||
diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h new file mode 100644 index 000000000000..545f85917780 --- /dev/null +++ b/include/linux/ceph/mon_client.h | |||
@@ -0,0 +1,122 @@ | |||
1 | #ifndef _FS_CEPH_MON_CLIENT_H | ||
2 | #define _FS_CEPH_MON_CLIENT_H | ||
3 | |||
4 | #include <linux/completion.h> | ||
5 | #include <linux/kref.h> | ||
6 | #include <linux/rbtree.h> | ||
7 | |||
8 | #include "messenger.h" | ||
9 | |||
10 | struct ceph_client; | ||
11 | struct ceph_mount_args; | ||
12 | struct ceph_auth_client; | ||
13 | |||
14 | /* | ||
15 | * The monitor map enumerates the set of all monitors. | ||
16 | */ | ||
17 | struct ceph_monmap { | ||
18 | struct ceph_fsid fsid; | ||
19 | u32 epoch; | ||
20 | u32 num_mon; | ||
21 | struct ceph_entity_inst mon_inst[0]; | ||
22 | }; | ||
23 | |||
24 | struct ceph_mon_client; | ||
25 | struct ceph_mon_generic_request; | ||
26 | |||
27 | |||
28 | /* | ||
29 | * Generic mechanism for resending monitor requests. | ||
30 | */ | ||
31 | typedef void (*ceph_monc_request_func_t)(struct ceph_mon_client *monc, | ||
32 | int newmon); | ||
33 | |||
34 | /* a pending monitor request */ | ||
35 | struct ceph_mon_request { | ||
36 | struct ceph_mon_client *monc; | ||
37 | struct delayed_work delayed_work; | ||
38 | unsigned long delay; | ||
39 | ceph_monc_request_func_t do_request; | ||
40 | }; | ||
41 | |||
42 | /* | ||
43 | * ceph_mon_generic_request is being used for the statfs and poolop requests | ||
44 | * which are bening done a bit differently because we need to get data back | ||
45 | * to the caller | ||
46 | */ | ||
47 | struct ceph_mon_generic_request { | ||
48 | struct kref kref; | ||
49 | u64 tid; | ||
50 | struct rb_node node; | ||
51 | int result; | ||
52 | void *buf; | ||
53 | int buf_len; | ||
54 | struct completion completion; | ||
55 | struct ceph_msg *request; /* original request */ | ||
56 | struct ceph_msg *reply; /* and reply */ | ||
57 | }; | ||
58 | |||
59 | struct ceph_mon_client { | ||
60 | struct ceph_client *client; | ||
61 | struct ceph_monmap *monmap; | ||
62 | |||
63 | struct mutex mutex; | ||
64 | struct delayed_work delayed_work; | ||
65 | |||
66 | struct ceph_auth_client *auth; | ||
67 | struct ceph_msg *m_auth, *m_auth_reply, *m_subscribe, *m_subscribe_ack; | ||
68 | int pending_auth; | ||
69 | |||
70 | bool hunting; | ||
71 | int cur_mon; /* last monitor i contacted */ | ||
72 | unsigned long sub_sent, sub_renew_after; | ||
73 | struct ceph_connection *con; | ||
74 | bool have_fsid; | ||
75 | |||
76 | /* pending generic requests */ | ||
77 | struct rb_root generic_request_tree; | ||
78 | int num_generic_requests; | ||
79 | u64 last_tid; | ||
80 | |||
81 | /* mds/osd map */ | ||
82 | int want_mdsmap; | ||
83 | int want_next_osdmap; /* 1 = want, 2 = want+asked */ | ||
84 | u32 have_osdmap, have_mdsmap; | ||
85 | |||
86 | #ifdef CONFIG_DEBUG_FS | ||
87 | struct dentry *debugfs_file; | ||
88 | #endif | ||
89 | }; | ||
90 | |||
91 | extern struct ceph_monmap *ceph_monmap_decode(void *p, void *end); | ||
92 | extern int ceph_monmap_contains(struct ceph_monmap *m, | ||
93 | struct ceph_entity_addr *addr); | ||
94 | |||
95 | extern int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl); | ||
96 | extern void ceph_monc_stop(struct ceph_mon_client *monc); | ||
97 | |||
98 | /* | ||
99 | * The model here is to indicate that we need a new map of at least | ||
100 | * epoch @want, and also call in when we receive a map. We will | ||
101 | * periodically rerequest the map from the monitor cluster until we | ||
102 | * get what we want. | ||
103 | */ | ||
104 | extern int ceph_monc_got_mdsmap(struct ceph_mon_client *monc, u32 have); | ||
105 | extern int ceph_monc_got_osdmap(struct ceph_mon_client *monc, u32 have); | ||
106 | |||
107 | extern void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc); | ||
108 | |||
109 | extern int ceph_monc_do_statfs(struct ceph_mon_client *monc, | ||
110 | struct ceph_statfs *buf); | ||
111 | |||
112 | extern int ceph_monc_open_session(struct ceph_mon_client *monc); | ||
113 | |||
114 | extern int ceph_monc_validate_auth(struct ceph_mon_client *monc); | ||
115 | |||
116 | extern int ceph_monc_create_snapid(struct ceph_mon_client *monc, | ||
117 | u32 pool, u64 *snapid); | ||
118 | |||
119 | extern int ceph_monc_delete_snapid(struct ceph_mon_client *monc, | ||
120 | u32 pool, u64 snapid); | ||
121 | |||
122 | #endif | ||
diff --git a/include/linux/ceph/msgpool.h b/include/linux/ceph/msgpool.h new file mode 100644 index 000000000000..a362605f9368 --- /dev/null +++ b/include/linux/ceph/msgpool.h | |||
@@ -0,0 +1,25 @@ | |||
1 | #ifndef _FS_CEPH_MSGPOOL | ||
2 | #define _FS_CEPH_MSGPOOL | ||
3 | |||
4 | #include <linux/mempool.h> | ||
5 | #include "messenger.h" | ||
6 | |||
7 | /* | ||
8 | * we use memory pools for preallocating messages we may receive, to | ||
9 | * avoid unexpected OOM conditions. | ||
10 | */ | ||
11 | struct ceph_msgpool { | ||
12 | const char *name; | ||
13 | mempool_t *pool; | ||
14 | int front_len; /* preallocated payload size */ | ||
15 | }; | ||
16 | |||
17 | extern int ceph_msgpool_init(struct ceph_msgpool *pool, | ||
18 | int front_len, int size, bool blocking, | ||
19 | const char *name); | ||
20 | extern void ceph_msgpool_destroy(struct ceph_msgpool *pool); | ||
21 | extern struct ceph_msg *ceph_msgpool_get(struct ceph_msgpool *, | ||
22 | int front_len); | ||
23 | extern void ceph_msgpool_put(struct ceph_msgpool *, struct ceph_msg *); | ||
24 | |||
25 | #endif | ||
diff --git a/include/linux/ceph/msgr.h b/include/linux/ceph/msgr.h new file mode 100644 index 000000000000..680d3d648cac --- /dev/null +++ b/include/linux/ceph/msgr.h | |||
@@ -0,0 +1,175 @@ | |||
1 | #ifndef CEPH_MSGR_H | ||
2 | #define CEPH_MSGR_H | ||
3 | |||
4 | /* | ||
5 | * Data types for message passing layer used by Ceph. | ||
6 | */ | ||
7 | |||
8 | #define CEPH_MON_PORT 6789 /* default monitor port */ | ||
9 | |||
10 | /* | ||
11 | * client-side processes will try to bind to ports in this | ||
12 | * range, simply for the benefit of tools like nmap or wireshark | ||
13 | * that would like to identify the protocol. | ||
14 | */ | ||
15 | #define CEPH_PORT_FIRST 6789 | ||
16 | #define CEPH_PORT_START 6800 /* non-monitors start here */ | ||
17 | #define CEPH_PORT_LAST 6900 | ||
18 | |||
19 | /* | ||
20 | * tcp connection banner. include a protocol version. and adjust | ||
21 | * whenever the wire protocol changes. try to keep this string length | ||
22 | * constant. | ||
23 | */ | ||
24 | #define CEPH_BANNER "ceph v027" | ||
25 | #define CEPH_BANNER_MAX_LEN 30 | ||
26 | |||
27 | |||
28 | /* | ||
29 | * Rollover-safe type and comparator for 32-bit sequence numbers. | ||
30 | * Comparator returns -1, 0, or 1. | ||
31 | */ | ||
32 | typedef __u32 ceph_seq_t; | ||
33 | |||
34 | static inline __s32 ceph_seq_cmp(__u32 a, __u32 b) | ||
35 | { | ||
36 | return (__s32)a - (__s32)b; | ||
37 | } | ||
38 | |||
39 | |||
40 | /* | ||
41 | * entity_name -- logical name for a process participating in the | ||
42 | * network, e.g. 'mds0' or 'osd3'. | ||
43 | */ | ||
44 | struct ceph_entity_name { | ||
45 | __u8 type; /* CEPH_ENTITY_TYPE_* */ | ||
46 | __le64 num; | ||
47 | } __attribute__ ((packed)); | ||
48 | |||
49 | #define CEPH_ENTITY_TYPE_MON 0x01 | ||
50 | #define CEPH_ENTITY_TYPE_MDS 0x02 | ||
51 | #define CEPH_ENTITY_TYPE_OSD 0x04 | ||
52 | #define CEPH_ENTITY_TYPE_CLIENT 0x08 | ||
53 | #define CEPH_ENTITY_TYPE_AUTH 0x20 | ||
54 | |||
55 | #define CEPH_ENTITY_TYPE_ANY 0xFF | ||
56 | |||
57 | extern const char *ceph_entity_type_name(int type); | ||
58 | |||
59 | /* | ||
60 | * entity_addr -- network address | ||
61 | */ | ||
62 | struct ceph_entity_addr { | ||
63 | __le32 type; | ||
64 | __le32 nonce; /* unique id for process (e.g. pid) */ | ||
65 | struct sockaddr_storage in_addr; | ||
66 | } __attribute__ ((packed)); | ||
67 | |||
68 | struct ceph_entity_inst { | ||
69 | struct ceph_entity_name name; | ||
70 | struct ceph_entity_addr addr; | ||
71 | } __attribute__ ((packed)); | ||
72 | |||
73 | |||
74 | /* used by message exchange protocol */ | ||
75 | #define CEPH_MSGR_TAG_READY 1 /* server->client: ready for messages */ | ||
76 | #define CEPH_MSGR_TAG_RESETSESSION 2 /* server->client: reset, try again */ | ||
77 | #define CEPH_MSGR_TAG_WAIT 3 /* server->client: wait for racing | ||
78 | incoming connection */ | ||
79 | #define CEPH_MSGR_TAG_RETRY_SESSION 4 /* server->client + cseq: try again | ||
80 | with higher cseq */ | ||
81 | #define CEPH_MSGR_TAG_RETRY_GLOBAL 5 /* server->client + gseq: try again | ||
82 | with higher gseq */ | ||
83 | #define CEPH_MSGR_TAG_CLOSE 6 /* closing pipe */ | ||
84 | #define CEPH_MSGR_TAG_MSG 7 /* message */ | ||
85 | #define CEPH_MSGR_TAG_ACK 8 /* message ack */ | ||
86 | #define CEPH_MSGR_TAG_KEEPALIVE 9 /* just a keepalive byte! */ | ||
87 | #define CEPH_MSGR_TAG_BADPROTOVER 10 /* bad protocol version */ | ||
88 | #define CEPH_MSGR_TAG_BADAUTHORIZER 11 /* bad authorizer */ | ||
89 | #define CEPH_MSGR_TAG_FEATURES 12 /* insufficient features */ | ||
90 | |||
91 | |||
92 | /* | ||
93 | * connection negotiation | ||
94 | */ | ||
95 | struct ceph_msg_connect { | ||
96 | __le64 features; /* supported feature bits */ | ||
97 | __le32 host_type; /* CEPH_ENTITY_TYPE_* */ | ||
98 | __le32 global_seq; /* count connections initiated by this host */ | ||
99 | __le32 connect_seq; /* count connections initiated in this session */ | ||
100 | __le32 protocol_version; | ||
101 | __le32 authorizer_protocol; | ||
102 | __le32 authorizer_len; | ||
103 | __u8 flags; /* CEPH_MSG_CONNECT_* */ | ||
104 | } __attribute__ ((packed)); | ||
105 | |||
106 | struct ceph_msg_connect_reply { | ||
107 | __u8 tag; | ||
108 | __le64 features; /* feature bits for this session */ | ||
109 | __le32 global_seq; | ||
110 | __le32 connect_seq; | ||
111 | __le32 protocol_version; | ||
112 | __le32 authorizer_len; | ||
113 | __u8 flags; | ||
114 | } __attribute__ ((packed)); | ||
115 | |||
116 | #define CEPH_MSG_CONNECT_LOSSY 1 /* messages i send may be safely dropped */ | ||
117 | |||
118 | |||
119 | /* | ||
120 | * message header | ||
121 | */ | ||
122 | struct ceph_msg_header_old { | ||
123 | __le64 seq; /* message seq# for this session */ | ||
124 | __le64 tid; /* transaction id */ | ||
125 | __le16 type; /* message type */ | ||
126 | __le16 priority; /* priority. higher value == higher priority */ | ||
127 | __le16 version; /* version of message encoding */ | ||
128 | |||
129 | __le32 front_len; /* bytes in main payload */ | ||
130 | __le32 middle_len;/* bytes in middle payload */ | ||
131 | __le32 data_len; /* bytes of data payload */ | ||
132 | __le16 data_off; /* sender: include full offset; | ||
133 | receiver: mask against ~PAGE_MASK */ | ||
134 | |||
135 | struct ceph_entity_inst src, orig_src; | ||
136 | __le32 reserved; | ||
137 | __le32 crc; /* header crc32c */ | ||
138 | } __attribute__ ((packed)); | ||
139 | |||
140 | struct ceph_msg_header { | ||
141 | __le64 seq; /* message seq# for this session */ | ||
142 | __le64 tid; /* transaction id */ | ||
143 | __le16 type; /* message type */ | ||
144 | __le16 priority; /* priority. higher value == higher priority */ | ||
145 | __le16 version; /* version of message encoding */ | ||
146 | |||
147 | __le32 front_len; /* bytes in main payload */ | ||
148 | __le32 middle_len;/* bytes in middle payload */ | ||
149 | __le32 data_len; /* bytes of data payload */ | ||
150 | __le16 data_off; /* sender: include full offset; | ||
151 | receiver: mask against ~PAGE_MASK */ | ||
152 | |||
153 | struct ceph_entity_name src; | ||
154 | __le32 reserved; | ||
155 | __le32 crc; /* header crc32c */ | ||
156 | } __attribute__ ((packed)); | ||
157 | |||
158 | #define CEPH_MSG_PRIO_LOW 64 | ||
159 | #define CEPH_MSG_PRIO_DEFAULT 127 | ||
160 | #define CEPH_MSG_PRIO_HIGH 196 | ||
161 | #define CEPH_MSG_PRIO_HIGHEST 255 | ||
162 | |||
163 | /* | ||
164 | * follows data payload | ||
165 | */ | ||
166 | struct ceph_msg_footer { | ||
167 | __le32 front_crc, middle_crc, data_crc; | ||
168 | __u8 flags; | ||
169 | } __attribute__ ((packed)); | ||
170 | |||
171 | #define CEPH_MSG_FOOTER_COMPLETE (1<<0) /* msg wasn't aborted */ | ||
172 | #define CEPH_MSG_FOOTER_NOCRC (1<<1) /* no data crc */ | ||
173 | |||
174 | |||
175 | #endif | ||
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h new file mode 100644 index 000000000000..6c91fb032c39 --- /dev/null +++ b/include/linux/ceph/osd_client.h | |||
@@ -0,0 +1,234 @@ | |||
1 | #ifndef _FS_CEPH_OSD_CLIENT_H | ||
2 | #define _FS_CEPH_OSD_CLIENT_H | ||
3 | |||
4 | #include <linux/completion.h> | ||
5 | #include <linux/kref.h> | ||
6 | #include <linux/mempool.h> | ||
7 | #include <linux/rbtree.h> | ||
8 | |||
9 | #include "types.h" | ||
10 | #include "osdmap.h" | ||
11 | #include "messenger.h" | ||
12 | |||
13 | struct ceph_msg; | ||
14 | struct ceph_snap_context; | ||
15 | struct ceph_osd_request; | ||
16 | struct ceph_osd_client; | ||
17 | struct ceph_authorizer; | ||
18 | struct ceph_pagelist; | ||
19 | |||
20 | /* | ||
21 | * completion callback for async writepages | ||
22 | */ | ||
23 | typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *, | ||
24 | struct ceph_msg *); | ||
25 | |||
26 | /* a given osd we're communicating with */ | ||
27 | struct ceph_osd { | ||
28 | atomic_t o_ref; | ||
29 | struct ceph_osd_client *o_osdc; | ||
30 | int o_osd; | ||
31 | int o_incarnation; | ||
32 | struct rb_node o_node; | ||
33 | struct ceph_connection o_con; | ||
34 | struct list_head o_requests; | ||
35 | struct list_head o_osd_lru; | ||
36 | struct ceph_authorizer *o_authorizer; | ||
37 | void *o_authorizer_buf, *o_authorizer_reply_buf; | ||
38 | size_t o_authorizer_buf_len, o_authorizer_reply_buf_len; | ||
39 | unsigned long lru_ttl; | ||
40 | int o_marked_for_keepalive; | ||
41 | struct list_head o_keepalive_item; | ||
42 | }; | ||
43 | |||
44 | /* an in-flight request */ | ||
45 | struct ceph_osd_request { | ||
46 | u64 r_tid; /* unique for this client */ | ||
47 | struct rb_node r_node; | ||
48 | struct list_head r_req_lru_item; | ||
49 | struct list_head r_osd_item; | ||
50 | struct ceph_osd *r_osd; | ||
51 | struct ceph_pg r_pgid; | ||
52 | int r_pg_osds[CEPH_PG_MAX_SIZE]; | ||
53 | int r_num_pg_osds; | ||
54 | |||
55 | struct ceph_connection *r_con_filling_msg; | ||
56 | |||
57 | struct ceph_msg *r_request, *r_reply; | ||
58 | int r_result; | ||
59 | int r_flags; /* any additional flags for the osd */ | ||
60 | u32 r_sent; /* >0 if r_request is sending/sent */ | ||
61 | int r_got_reply; | ||
62 | |||
63 | struct ceph_osd_client *r_osdc; | ||
64 | struct kref r_kref; | ||
65 | bool r_mempool; | ||
66 | struct completion r_completion, r_safe_completion; | ||
67 | ceph_osdc_callback_t r_callback, r_safe_callback; | ||
68 | struct ceph_eversion r_reassert_version; | ||
69 | struct list_head r_unsafe_item; | ||
70 | |||
71 | struct inode *r_inode; /* for use by callbacks */ | ||
72 | void *r_priv; /* ditto */ | ||
73 | |||
74 | char r_oid[40]; /* object name */ | ||
75 | int r_oid_len; | ||
76 | unsigned long r_stamp; /* send OR check time */ | ||
77 | bool r_resend; /* msg send failed, needs retry */ | ||
78 | |||
79 | struct ceph_file_layout r_file_layout; | ||
80 | struct ceph_snap_context *r_snapc; /* snap context for writes */ | ||
81 | unsigned r_num_pages; /* size of page array (follows) */ | ||
82 | struct page **r_pages; /* pages for data payload */ | ||
83 | int r_pages_from_pool; | ||
84 | int r_own_pages; /* if true, i own page list */ | ||
85 | #ifdef CONFIG_BLOCK | ||
86 | struct bio *r_bio; /* instead of pages */ | ||
87 | #endif | ||
88 | |||
89 | struct ceph_pagelist *r_trail; /* trailing part of the data */ | ||
90 | }; | ||
91 | |||
92 | struct ceph_osd_client { | ||
93 | struct ceph_client *client; | ||
94 | |||
95 | struct ceph_osdmap *osdmap; /* current map */ | ||
96 | struct rw_semaphore map_sem; | ||
97 | struct completion map_waiters; | ||
98 | u64 last_requested_map; | ||
99 | |||
100 | struct mutex request_mutex; | ||
101 | struct rb_root osds; /* osds */ | ||
102 | struct list_head osd_lru; /* idle osds */ | ||
103 | u64 timeout_tid; /* tid of timeout triggering rq */ | ||
104 | u64 last_tid; /* tid of last request */ | ||
105 | struct rb_root requests; /* pending requests */ | ||
106 | struct list_head req_lru; /* pending requests lru */ | ||
107 | int num_requests; | ||
108 | struct delayed_work timeout_work; | ||
109 | struct delayed_work osds_timeout_work; | ||
110 | #ifdef CONFIG_DEBUG_FS | ||
111 | struct dentry *debugfs_file; | ||
112 | #endif | ||
113 | |||
114 | mempool_t *req_mempool; | ||
115 | |||
116 | struct ceph_msgpool msgpool_op; | ||
117 | struct ceph_msgpool msgpool_op_reply; | ||
118 | }; | ||
119 | |||
120 | struct ceph_osd_req_op { | ||
121 | u16 op; /* CEPH_OSD_OP_* */ | ||
122 | u32 flags; /* CEPH_OSD_FLAG_* */ | ||
123 | union { | ||
124 | struct { | ||
125 | u64 offset, length; | ||
126 | u64 truncate_size; | ||
127 | u32 truncate_seq; | ||
128 | } extent; | ||
129 | struct { | ||
130 | const char *name; | ||
131 | u32 name_len; | ||
132 | const char *val; | ||
133 | u32 value_len; | ||
134 | __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ | ||
135 | __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ | ||
136 | } xattr; | ||
137 | struct { | ||
138 | const char *class_name; | ||
139 | __u8 class_len; | ||
140 | const char *method_name; | ||
141 | __u8 method_len; | ||
142 | __u8 argc; | ||
143 | const char *indata; | ||
144 | u32 indata_len; | ||
145 | } cls; | ||
146 | struct { | ||
147 | u64 cookie, count; | ||
148 | } pgls; | ||
149 | struct { | ||
150 | u64 snapid; | ||
151 | } snap; | ||
152 | }; | ||
153 | u32 payload_len; | ||
154 | }; | ||
155 | |||
156 | extern int ceph_osdc_init(struct ceph_osd_client *osdc, | ||
157 | struct ceph_client *client); | ||
158 | extern void ceph_osdc_stop(struct ceph_osd_client *osdc); | ||
159 | |||
160 | extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc, | ||
161 | struct ceph_msg *msg); | ||
162 | extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc, | ||
163 | struct ceph_msg *msg); | ||
164 | |||
165 | extern void ceph_calc_raw_layout(struct ceph_osd_client *osdc, | ||
166 | struct ceph_file_layout *layout, | ||
167 | u64 snapid, | ||
168 | u64 off, u64 *plen, u64 *bno, | ||
169 | struct ceph_osd_request *req, | ||
170 | struct ceph_osd_req_op *op); | ||
171 | |||
172 | extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | ||
173 | int flags, | ||
174 | struct ceph_snap_context *snapc, | ||
175 | struct ceph_osd_req_op *ops, | ||
176 | bool use_mempool, | ||
177 | gfp_t gfp_flags, | ||
178 | struct page **pages, | ||
179 | struct bio *bio); | ||
180 | |||
181 | extern void ceph_osdc_build_request(struct ceph_osd_request *req, | ||
182 | u64 off, u64 *plen, | ||
183 | struct ceph_osd_req_op *src_ops, | ||
184 | struct ceph_snap_context *snapc, | ||
185 | struct timespec *mtime, | ||
186 | const char *oid, | ||
187 | int oid_len); | ||
188 | |||
189 | extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, | ||
190 | struct ceph_file_layout *layout, | ||
191 | struct ceph_vino vino, | ||
192 | u64 offset, u64 *len, int op, int flags, | ||
193 | struct ceph_snap_context *snapc, | ||
194 | int do_sync, u32 truncate_seq, | ||
195 | u64 truncate_size, | ||
196 | struct timespec *mtime, | ||
197 | bool use_mempool, int num_reply); | ||
198 | |||
199 | static inline void ceph_osdc_get_request(struct ceph_osd_request *req) | ||
200 | { | ||
201 | kref_get(&req->r_kref); | ||
202 | } | ||
203 | extern void ceph_osdc_release_request(struct kref *kref); | ||
204 | static inline void ceph_osdc_put_request(struct ceph_osd_request *req) | ||
205 | { | ||
206 | kref_put(&req->r_kref, ceph_osdc_release_request); | ||
207 | } | ||
208 | |||
209 | extern int ceph_osdc_start_request(struct ceph_osd_client *osdc, | ||
210 | struct ceph_osd_request *req, | ||
211 | bool nofail); | ||
212 | extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc, | ||
213 | struct ceph_osd_request *req); | ||
214 | extern void ceph_osdc_sync(struct ceph_osd_client *osdc); | ||
215 | |||
216 | extern int ceph_osdc_readpages(struct ceph_osd_client *osdc, | ||
217 | struct ceph_vino vino, | ||
218 | struct ceph_file_layout *layout, | ||
219 | u64 off, u64 *plen, | ||
220 | u32 truncate_seq, u64 truncate_size, | ||
221 | struct page **pages, int nr_pages); | ||
222 | |||
223 | extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, | ||
224 | struct ceph_vino vino, | ||
225 | struct ceph_file_layout *layout, | ||
226 | struct ceph_snap_context *sc, | ||
227 | u64 off, u64 len, | ||
228 | u32 truncate_seq, u64 truncate_size, | ||
229 | struct timespec *mtime, | ||
230 | struct page **pages, int nr_pages, | ||
231 | int flags, int do_sync, bool nofail); | ||
232 | |||
233 | #endif | ||
234 | |||
diff --git a/include/linux/ceph/osdmap.h b/include/linux/ceph/osdmap.h new file mode 100644 index 000000000000..ba4c205cbb01 --- /dev/null +++ b/include/linux/ceph/osdmap.h | |||
@@ -0,0 +1,130 @@ | |||
1 | #ifndef _FS_CEPH_OSDMAP_H | ||
2 | #define _FS_CEPH_OSDMAP_H | ||
3 | |||
4 | #include <linux/rbtree.h> | ||
5 | #include "types.h" | ||
6 | #include "ceph_fs.h" | ||
7 | #include <linux/crush/crush.h> | ||
8 | |||
9 | /* | ||
10 | * The osd map describes the current membership of the osd cluster and | ||
11 | * specifies the mapping of objects to placement groups and placement | ||
12 | * groups to (sets of) osds. That is, it completely specifies the | ||
13 | * (desired) distribution of all data objects in the system at some | ||
14 | * point in time. | ||
15 | * | ||
16 | * Each map version is identified by an epoch, which increases monotonically. | ||
17 | * | ||
18 | * The map can be updated either via an incremental map (diff) describing | ||
19 | * the change between two successive epochs, or as a fully encoded map. | ||
20 | */ | ||
21 | struct ceph_pg_pool_info { | ||
22 | struct rb_node node; | ||
23 | int id; | ||
24 | struct ceph_pg_pool v; | ||
25 | int pg_num_mask, pgp_num_mask, lpg_num_mask, lpgp_num_mask; | ||
26 | char *name; | ||
27 | }; | ||
28 | |||
29 | struct ceph_pg_mapping { | ||
30 | struct rb_node node; | ||
31 | struct ceph_pg pgid; | ||
32 | int len; | ||
33 | int osds[]; | ||
34 | }; | ||
35 | |||
36 | struct ceph_osdmap { | ||
37 | struct ceph_fsid fsid; | ||
38 | u32 epoch; | ||
39 | u32 mkfs_epoch; | ||
40 | struct ceph_timespec created, modified; | ||
41 | |||
42 | u32 flags; /* CEPH_OSDMAP_* */ | ||
43 | |||
44 | u32 max_osd; /* size of osd_state, _offload, _addr arrays */ | ||
45 | u8 *osd_state; /* CEPH_OSD_* */ | ||
46 | u32 *osd_weight; /* 0 = failed, 0x10000 = 100% normal */ | ||
47 | struct ceph_entity_addr *osd_addr; | ||
48 | |||
49 | struct rb_root pg_temp; | ||
50 | struct rb_root pg_pools; | ||
51 | u32 pool_max; | ||
52 | |||
53 | /* the CRUSH map specifies the mapping of placement groups to | ||
54 | * the list of osds that store+replicate them. */ | ||
55 | struct crush_map *crush; | ||
56 | }; | ||
57 | |||
58 | /* | ||
59 | * file layout helpers | ||
60 | */ | ||
61 | #define ceph_file_layout_su(l) ((__s32)le32_to_cpu((l).fl_stripe_unit)) | ||
62 | #define ceph_file_layout_stripe_count(l) \ | ||
63 | ((__s32)le32_to_cpu((l).fl_stripe_count)) | ||
64 | #define ceph_file_layout_object_size(l) ((__s32)le32_to_cpu((l).fl_object_size)) | ||
65 | #define ceph_file_layout_cas_hash(l) ((__s32)le32_to_cpu((l).fl_cas_hash)) | ||
66 | #define ceph_file_layout_object_su(l) \ | ||
67 | ((__s32)le32_to_cpu((l).fl_object_stripe_unit)) | ||
68 | #define ceph_file_layout_pg_preferred(l) \ | ||
69 | ((__s32)le32_to_cpu((l).fl_pg_preferred)) | ||
70 | #define ceph_file_layout_pg_pool(l) \ | ||
71 | ((__s32)le32_to_cpu((l).fl_pg_pool)) | ||
72 | |||
73 | static inline unsigned ceph_file_layout_stripe_width(struct ceph_file_layout *l) | ||
74 | { | ||
75 | return le32_to_cpu(l->fl_stripe_unit) * | ||
76 | le32_to_cpu(l->fl_stripe_count); | ||
77 | } | ||
78 | |||
79 | /* "period" == bytes before i start on a new set of objects */ | ||
80 | static inline unsigned ceph_file_layout_period(struct ceph_file_layout *l) | ||
81 | { | ||
82 | return le32_to_cpu(l->fl_object_size) * | ||
83 | le32_to_cpu(l->fl_stripe_count); | ||
84 | } | ||
85 | |||
86 | |||
87 | static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd) | ||
88 | { | ||
89 | return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP); | ||
90 | } | ||
91 | |||
92 | static inline bool ceph_osdmap_flag(struct ceph_osdmap *map, int flag) | ||
93 | { | ||
94 | return map && (map->flags & flag); | ||
95 | } | ||
96 | |||
97 | extern char *ceph_osdmap_state_str(char *str, int len, int state); | ||
98 | |||
99 | static inline struct ceph_entity_addr *ceph_osd_addr(struct ceph_osdmap *map, | ||
100 | int osd) | ||
101 | { | ||
102 | if (osd >= map->max_osd) | ||
103 | return NULL; | ||
104 | return &map->osd_addr[osd]; | ||
105 | } | ||
106 | |||
107 | extern struct ceph_osdmap *osdmap_decode(void **p, void *end); | ||
108 | extern struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
109 | struct ceph_osdmap *map, | ||
110 | struct ceph_messenger *msgr); | ||
111 | extern void ceph_osdmap_destroy(struct ceph_osdmap *map); | ||
112 | |||
113 | /* calculate mapping of a file extent to an object */ | ||
114 | extern void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, | ||
115 | u64 off, u64 *plen, | ||
116 | u64 *bno, u64 *oxoff, u64 *oxlen); | ||
117 | |||
118 | /* calculate mapping of object to a placement group */ | ||
119 | extern int ceph_calc_object_layout(struct ceph_object_layout *ol, | ||
120 | const char *oid, | ||
121 | struct ceph_file_layout *fl, | ||
122 | struct ceph_osdmap *osdmap); | ||
123 | extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | ||
124 | int *acting); | ||
125 | extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, | ||
126 | struct ceph_pg pgid); | ||
127 | |||
128 | extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name); | ||
129 | |||
130 | #endif | ||
diff --git a/include/linux/ceph/pagelist.h b/include/linux/ceph/pagelist.h new file mode 100644 index 000000000000..9660d6b0a35d --- /dev/null +++ b/include/linux/ceph/pagelist.h | |||
@@ -0,0 +1,75 @@ | |||
1 | #ifndef __FS_CEPH_PAGELIST_H | ||
2 | #define __FS_CEPH_PAGELIST_H | ||
3 | |||
4 | #include <linux/list.h> | ||
5 | |||
6 | struct ceph_pagelist { | ||
7 | struct list_head head; | ||
8 | void *mapped_tail; | ||
9 | size_t length; | ||
10 | size_t room; | ||
11 | struct list_head free_list; | ||
12 | size_t num_pages_free; | ||
13 | }; | ||
14 | |||
15 | struct ceph_pagelist_cursor { | ||
16 | struct ceph_pagelist *pl; /* pagelist, for error checking */ | ||
17 | struct list_head *page_lru; /* page in list */ | ||
18 | size_t room; /* room remaining to reset to */ | ||
19 | }; | ||
20 | |||
21 | static inline void ceph_pagelist_init(struct ceph_pagelist *pl) | ||
22 | { | ||
23 | INIT_LIST_HEAD(&pl->head); | ||
24 | pl->mapped_tail = NULL; | ||
25 | pl->length = 0; | ||
26 | pl->room = 0; | ||
27 | INIT_LIST_HEAD(&pl->free_list); | ||
28 | pl->num_pages_free = 0; | ||
29 | } | ||
30 | |||
31 | extern int ceph_pagelist_release(struct ceph_pagelist *pl); | ||
32 | |||
33 | extern int ceph_pagelist_append(struct ceph_pagelist *pl, const void *d, size_t l); | ||
34 | |||
35 | extern int ceph_pagelist_reserve(struct ceph_pagelist *pl, size_t space); | ||
36 | |||
37 | extern int ceph_pagelist_free_reserve(struct ceph_pagelist *pl); | ||
38 | |||
39 | extern void ceph_pagelist_set_cursor(struct ceph_pagelist *pl, | ||
40 | struct ceph_pagelist_cursor *c); | ||
41 | |||
42 | extern int ceph_pagelist_truncate(struct ceph_pagelist *pl, | ||
43 | struct ceph_pagelist_cursor *c); | ||
44 | |||
45 | static inline int ceph_pagelist_encode_64(struct ceph_pagelist *pl, u64 v) | ||
46 | { | ||
47 | __le64 ev = cpu_to_le64(v); | ||
48 | return ceph_pagelist_append(pl, &ev, sizeof(ev)); | ||
49 | } | ||
50 | static inline int ceph_pagelist_encode_32(struct ceph_pagelist *pl, u32 v) | ||
51 | { | ||
52 | __le32 ev = cpu_to_le32(v); | ||
53 | return ceph_pagelist_append(pl, &ev, sizeof(ev)); | ||
54 | } | ||
55 | static inline int ceph_pagelist_encode_16(struct ceph_pagelist *pl, u16 v) | ||
56 | { | ||
57 | __le16 ev = cpu_to_le16(v); | ||
58 | return ceph_pagelist_append(pl, &ev, sizeof(ev)); | ||
59 | } | ||
60 | static inline int ceph_pagelist_encode_8(struct ceph_pagelist *pl, u8 v) | ||
61 | { | ||
62 | return ceph_pagelist_append(pl, &v, 1); | ||
63 | } | ||
64 | static inline int ceph_pagelist_encode_string(struct ceph_pagelist *pl, | ||
65 | char *s, size_t len) | ||
66 | { | ||
67 | int ret = ceph_pagelist_encode_32(pl, len); | ||
68 | if (ret) | ||
69 | return ret; | ||
70 | if (len) | ||
71 | return ceph_pagelist_append(pl, s, len); | ||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | #endif | ||
diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h new file mode 100644 index 000000000000..6d5247f2e81b --- /dev/null +++ b/include/linux/ceph/rados.h | |||
@@ -0,0 +1,405 @@ | |||
1 | #ifndef CEPH_RADOS_H | ||
2 | #define CEPH_RADOS_H | ||
3 | |||
4 | /* | ||
5 | * Data types for the Ceph distributed object storage layer RADOS | ||
6 | * (Reliable Autonomic Distributed Object Store). | ||
7 | */ | ||
8 | |||
9 | #include "msgr.h" | ||
10 | |||
11 | /* | ||
12 | * osdmap encoding versions | ||
13 | */ | ||
14 | #define CEPH_OSDMAP_INC_VERSION 5 | ||
15 | #define CEPH_OSDMAP_INC_VERSION_EXT 5 | ||
16 | #define CEPH_OSDMAP_VERSION 5 | ||
17 | #define CEPH_OSDMAP_VERSION_EXT 5 | ||
18 | |||
19 | /* | ||
20 | * fs id | ||
21 | */ | ||
22 | struct ceph_fsid { | ||
23 | unsigned char fsid[16]; | ||
24 | }; | ||
25 | |||
26 | static inline int ceph_fsid_compare(const struct ceph_fsid *a, | ||
27 | const struct ceph_fsid *b) | ||
28 | { | ||
29 | return memcmp(a, b, sizeof(*a)); | ||
30 | } | ||
31 | |||
32 | /* | ||
33 | * ino, object, etc. | ||
34 | */ | ||
35 | typedef __le64 ceph_snapid_t; | ||
36 | #define CEPH_SNAPDIR ((__u64)(-1)) /* reserved for hidden .snap dir */ | ||
37 | #define CEPH_NOSNAP ((__u64)(-2)) /* "head", "live" revision */ | ||
38 | #define CEPH_MAXSNAP ((__u64)(-3)) /* largest valid snapid */ | ||
39 | |||
40 | struct ceph_timespec { | ||
41 | __le32 tv_sec; | ||
42 | __le32 tv_nsec; | ||
43 | } __attribute__ ((packed)); | ||
44 | |||
45 | |||
46 | /* | ||
47 | * object layout - how objects are mapped into PGs | ||
48 | */ | ||
49 | #define CEPH_OBJECT_LAYOUT_HASH 1 | ||
50 | #define CEPH_OBJECT_LAYOUT_LINEAR 2 | ||
51 | #define CEPH_OBJECT_LAYOUT_HASHINO 3 | ||
52 | |||
53 | /* | ||
54 | * pg layout -- how PGs are mapped onto (sets of) OSDs | ||
55 | */ | ||
56 | #define CEPH_PG_LAYOUT_CRUSH 0 | ||
57 | #define CEPH_PG_LAYOUT_HASH 1 | ||
58 | #define CEPH_PG_LAYOUT_LINEAR 2 | ||
59 | #define CEPH_PG_LAYOUT_HYBRID 3 | ||
60 | |||
61 | #define CEPH_PG_MAX_SIZE 16 /* max # osds in a single pg */ | ||
62 | |||
63 | /* | ||
64 | * placement group. | ||
65 | * we encode this into one __le64. | ||
66 | */ | ||
67 | struct ceph_pg { | ||
68 | __le16 preferred; /* preferred primary osd */ | ||
69 | __le16 ps; /* placement seed */ | ||
70 | __le32 pool; /* object pool */ | ||
71 | } __attribute__ ((packed)); | ||
72 | |||
73 | /* | ||
74 | * pg_pool is a set of pgs storing a pool of objects | ||
75 | * | ||
76 | * pg_num -- base number of pseudorandomly placed pgs | ||
77 | * | ||
78 | * pgp_num -- effective number when calculating pg placement. this | ||
79 | * is used for pg_num increases. new pgs result in data being "split" | ||
80 | * into new pgs. for this to proceed smoothly, new pgs are intiially | ||
81 | * colocated with their parents; that is, pgp_num doesn't increase | ||
82 | * until the new pgs have successfully split. only _then_ are the new | ||
83 | * pgs placed independently. | ||
84 | * | ||
85 | * lpg_num -- localized pg count (per device). replicas are randomly | ||
86 | * selected. | ||
87 | * | ||
88 | * lpgp_num -- as above. | ||
89 | */ | ||
90 | #define CEPH_PG_TYPE_REP 1 | ||
91 | #define CEPH_PG_TYPE_RAID4 2 | ||
92 | #define CEPH_PG_POOL_VERSION 2 | ||
93 | struct ceph_pg_pool { | ||
94 | __u8 type; /* CEPH_PG_TYPE_* */ | ||
95 | __u8 size; /* number of osds in each pg */ | ||
96 | __u8 crush_ruleset; /* crush placement rule */ | ||
97 | __u8 object_hash; /* hash mapping object name to ps */ | ||
98 | __le32 pg_num, pgp_num; /* number of pg's */ | ||
99 | __le32 lpg_num, lpgp_num; /* number of localized pg's */ | ||
100 | __le32 last_change; /* most recent epoch changed */ | ||
101 | __le64 snap_seq; /* seq for per-pool snapshot */ | ||
102 | __le32 snap_epoch; /* epoch of last snap */ | ||
103 | __le32 num_snaps; | ||
104 | __le32 num_removed_snap_intervals; /* if non-empty, NO per-pool snaps */ | ||
105 | __le64 auid; /* who owns the pg */ | ||
106 | } __attribute__ ((packed)); | ||
107 | |||
108 | /* | ||
109 | * stable_mod func is used to control number of placement groups. | ||
110 | * similar to straight-up modulo, but produces a stable mapping as b | ||
111 | * increases over time. b is the number of bins, and bmask is the | ||
112 | * containing power of 2 minus 1. | ||
113 | * | ||
114 | * b <= bmask and bmask=(2**n)-1 | ||
115 | * e.g., b=12 -> bmask=15, b=123 -> bmask=127 | ||
116 | */ | ||
117 | static inline int ceph_stable_mod(int x, int b, int bmask) | ||
118 | { | ||
119 | if ((x & bmask) < b) | ||
120 | return x & bmask; | ||
121 | else | ||
122 | return x & (bmask >> 1); | ||
123 | } | ||
124 | |||
125 | /* | ||
126 | * object layout - how a given object should be stored. | ||
127 | */ | ||
128 | struct ceph_object_layout { | ||
129 | struct ceph_pg ol_pgid; /* raw pg, with _full_ ps precision. */ | ||
130 | __le32 ol_stripe_unit; /* for per-object parity, if any */ | ||
131 | } __attribute__ ((packed)); | ||
132 | |||
133 | /* | ||
134 | * compound epoch+version, used by storage layer to serialize mutations | ||
135 | */ | ||
136 | struct ceph_eversion { | ||
137 | __le32 epoch; | ||
138 | __le64 version; | ||
139 | } __attribute__ ((packed)); | ||
140 | |||
141 | /* | ||
142 | * osd map bits | ||
143 | */ | ||
144 | |||
145 | /* status bits */ | ||
146 | #define CEPH_OSD_EXISTS 1 | ||
147 | #define CEPH_OSD_UP 2 | ||
148 | |||
149 | /* osd weights. fixed point value: 0x10000 == 1.0 ("in"), 0 == "out" */ | ||
150 | #define CEPH_OSD_IN 0x10000 | ||
151 | #define CEPH_OSD_OUT 0 | ||
152 | |||
153 | |||
154 | /* | ||
155 | * osd map flag bits | ||
156 | */ | ||
157 | #define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC) */ | ||
158 | #define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC) */ | ||
159 | #define CEPH_OSDMAP_PAUSERD (1<<2) /* pause all reads */ | ||
160 | #define CEPH_OSDMAP_PAUSEWR (1<<3) /* pause all writes */ | ||
161 | #define CEPH_OSDMAP_PAUSEREC (1<<4) /* pause recovery */ | ||
162 | |||
163 | /* | ||
164 | * osd ops | ||
165 | */ | ||
166 | #define CEPH_OSD_OP_MODE 0xf000 | ||
167 | #define CEPH_OSD_OP_MODE_RD 0x1000 | ||
168 | #define CEPH_OSD_OP_MODE_WR 0x2000 | ||
169 | #define CEPH_OSD_OP_MODE_RMW 0x3000 | ||
170 | #define CEPH_OSD_OP_MODE_SUB 0x4000 | ||
171 | |||
172 | #define CEPH_OSD_OP_TYPE 0x0f00 | ||
173 | #define CEPH_OSD_OP_TYPE_LOCK 0x0100 | ||
174 | #define CEPH_OSD_OP_TYPE_DATA 0x0200 | ||
175 | #define CEPH_OSD_OP_TYPE_ATTR 0x0300 | ||
176 | #define CEPH_OSD_OP_TYPE_EXEC 0x0400 | ||
177 | #define CEPH_OSD_OP_TYPE_PG 0x0500 | ||
178 | |||
179 | enum { | ||
180 | /** data **/ | ||
181 | /* read */ | ||
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, | ||
184 | |||
185 | /* fancy read */ | ||
186 | CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4, | ||
187 | |||
188 | /* write */ | ||
189 | CEPH_OSD_OP_WRITE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1, | ||
190 | CEPH_OSD_OP_WRITEFULL = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 2, | ||
191 | CEPH_OSD_OP_TRUNCATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 3, | ||
192 | CEPH_OSD_OP_ZERO = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 4, | ||
193 | CEPH_OSD_OP_DELETE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 5, | ||
194 | |||
195 | /* fancy write */ | ||
196 | CEPH_OSD_OP_APPEND = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 6, | ||
197 | CEPH_OSD_OP_STARTSYNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 7, | ||
198 | CEPH_OSD_OP_SETTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 8, | ||
199 | CEPH_OSD_OP_TRIMTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 9, | ||
200 | |||
201 | CEPH_OSD_OP_TMAPUP = CEPH_OSD_OP_MODE_RMW | CEPH_OSD_OP_TYPE_DATA | 10, | ||
202 | CEPH_OSD_OP_TMAPPUT = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 11, | ||
203 | CEPH_OSD_OP_TMAPGET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 12, | ||
204 | |||
205 | 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, | ||
207 | |||
208 | /** attrs **/ | ||
209 | /* read */ | ||
210 | CEPH_OSD_OP_GETXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1, | ||
211 | CEPH_OSD_OP_GETXATTRS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 2, | ||
212 | CEPH_OSD_OP_CMPXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 3, | ||
213 | |||
214 | /* write */ | ||
215 | CEPH_OSD_OP_SETXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 1, | ||
216 | CEPH_OSD_OP_SETXATTRS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 2, | ||
217 | CEPH_OSD_OP_RESETXATTRS = CEPH_OSD_OP_MODE_WR|CEPH_OSD_OP_TYPE_ATTR | 3, | ||
218 | CEPH_OSD_OP_RMXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4, | ||
219 | |||
220 | /** subop **/ | ||
221 | CEPH_OSD_OP_PULL = CEPH_OSD_OP_MODE_SUB | 1, | ||
222 | CEPH_OSD_OP_PUSH = CEPH_OSD_OP_MODE_SUB | 2, | ||
223 | CEPH_OSD_OP_BALANCEREADS = CEPH_OSD_OP_MODE_SUB | 3, | ||
224 | CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4, | ||
225 | CEPH_OSD_OP_SCRUB = CEPH_OSD_OP_MODE_SUB | 5, | ||
226 | |||
227 | /** lock **/ | ||
228 | CEPH_OSD_OP_WRLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1, | ||
229 | CEPH_OSD_OP_WRUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 2, | ||
230 | CEPH_OSD_OP_RDLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 3, | ||
231 | CEPH_OSD_OP_RDUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 4, | ||
232 | CEPH_OSD_OP_UPLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 5, | ||
233 | CEPH_OSD_OP_DNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 6, | ||
234 | |||
235 | /** exec **/ | ||
236 | CEPH_OSD_OP_CALL = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_EXEC | 1, | ||
237 | |||
238 | /** pg **/ | ||
239 | CEPH_OSD_OP_PGLS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 1, | ||
240 | }; | ||
241 | |||
242 | static inline int ceph_osd_op_type_lock(int op) | ||
243 | { | ||
244 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_LOCK; | ||
245 | } | ||
246 | static inline int ceph_osd_op_type_data(int op) | ||
247 | { | ||
248 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_DATA; | ||
249 | } | ||
250 | static inline int ceph_osd_op_type_attr(int op) | ||
251 | { | ||
252 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_ATTR; | ||
253 | } | ||
254 | static inline int ceph_osd_op_type_exec(int op) | ||
255 | { | ||
256 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_EXEC; | ||
257 | } | ||
258 | static inline int ceph_osd_op_type_pg(int op) | ||
259 | { | ||
260 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_PG; | ||
261 | } | ||
262 | |||
263 | static inline int ceph_osd_op_mode_subop(int op) | ||
264 | { | ||
265 | return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_SUB; | ||
266 | } | ||
267 | static inline int ceph_osd_op_mode_read(int op) | ||
268 | { | ||
269 | return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_RD; | ||
270 | } | ||
271 | static inline int ceph_osd_op_mode_modify(int op) | ||
272 | { | ||
273 | return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_WR; | ||
274 | } | ||
275 | |||
276 | /* | ||
277 | * note that the following tmap stuff is also defined in the ceph librados.h | ||
278 | * any modification here needs to be updated there | ||
279 | */ | ||
280 | #define CEPH_OSD_TMAP_HDR 'h' | ||
281 | #define CEPH_OSD_TMAP_SET 's' | ||
282 | #define CEPH_OSD_TMAP_RM 'r' | ||
283 | |||
284 | extern const char *ceph_osd_op_name(int op); | ||
285 | |||
286 | |||
287 | /* | ||
288 | * osd op flags | ||
289 | * | ||
290 | * An op may be READ, WRITE, or READ|WRITE. | ||
291 | */ | ||
292 | enum { | ||
293 | CEPH_OSD_FLAG_ACK = 1, /* want (or is) "ack" ack */ | ||
294 | CEPH_OSD_FLAG_ONNVRAM = 2, /* want (or is) "onnvram" ack */ | ||
295 | CEPH_OSD_FLAG_ONDISK = 4, /* want (or is) "ondisk" ack */ | ||
296 | CEPH_OSD_FLAG_RETRY = 8, /* resend attempt */ | ||
297 | CEPH_OSD_FLAG_READ = 16, /* op may read */ | ||
298 | CEPH_OSD_FLAG_WRITE = 32, /* op may write */ | ||
299 | CEPH_OSD_FLAG_ORDERSNAP = 64, /* EOLDSNAP if snapc is out of order */ | ||
300 | CEPH_OSD_FLAG_PEERSTAT = 128, /* msg includes osd_peer_stat */ | ||
301 | CEPH_OSD_FLAG_BALANCE_READS = 256, | ||
302 | CEPH_OSD_FLAG_PARALLELEXEC = 512, /* execute op in parallel */ | ||
303 | CEPH_OSD_FLAG_PGOP = 1024, /* pg op, no object */ | ||
304 | CEPH_OSD_FLAG_EXEC = 2048, /* op may exec */ | ||
305 | CEPH_OSD_FLAG_EXEC_PUBLIC = 4096, /* op may exec (public) */ | ||
306 | }; | ||
307 | |||
308 | enum { | ||
309 | CEPH_OSD_OP_FLAG_EXCL = 1, /* EXCL object create */ | ||
310 | }; | ||
311 | |||
312 | #define EOLDSNAPC ERESTART /* ORDERSNAP flag set; writer has old snapc*/ | ||
313 | #define EBLACKLISTED ESHUTDOWN /* blacklisted */ | ||
314 | |||
315 | /* xattr comparison */ | ||
316 | enum { | ||
317 | CEPH_OSD_CMPXATTR_OP_NOP = 0, | ||
318 | CEPH_OSD_CMPXATTR_OP_EQ = 1, | ||
319 | CEPH_OSD_CMPXATTR_OP_NE = 2, | ||
320 | CEPH_OSD_CMPXATTR_OP_GT = 3, | ||
321 | CEPH_OSD_CMPXATTR_OP_GTE = 4, | ||
322 | CEPH_OSD_CMPXATTR_OP_LT = 5, | ||
323 | CEPH_OSD_CMPXATTR_OP_LTE = 6 | ||
324 | }; | ||
325 | |||
326 | enum { | ||
327 | CEPH_OSD_CMPXATTR_MODE_STRING = 1, | ||
328 | CEPH_OSD_CMPXATTR_MODE_U64 = 2 | ||
329 | }; | ||
330 | |||
331 | /* | ||
332 | * an individual object operation. each may be accompanied by some data | ||
333 | * payload | ||
334 | */ | ||
335 | struct ceph_osd_op { | ||
336 | __le16 op; /* CEPH_OSD_OP_* */ | ||
337 | __le32 flags; /* CEPH_OSD_FLAG_* */ | ||
338 | union { | ||
339 | struct { | ||
340 | __le64 offset, length; | ||
341 | __le64 truncate_size; | ||
342 | __le32 truncate_seq; | ||
343 | } __attribute__ ((packed)) extent; | ||
344 | struct { | ||
345 | __le32 name_len; | ||
346 | __le32 value_len; | ||
347 | __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ | ||
348 | __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ | ||
349 | } __attribute__ ((packed)) xattr; | ||
350 | struct { | ||
351 | __u8 class_len; | ||
352 | __u8 method_len; | ||
353 | __u8 argc; | ||
354 | __le32 indata_len; | ||
355 | } __attribute__ ((packed)) cls; | ||
356 | struct { | ||
357 | __le64 cookie, count; | ||
358 | } __attribute__ ((packed)) pgls; | ||
359 | struct { | ||
360 | __le64 snapid; | ||
361 | } __attribute__ ((packed)) snap; | ||
362 | }; | ||
363 | __le32 payload_len; | ||
364 | } __attribute__ ((packed)); | ||
365 | |||
366 | /* | ||
367 | * osd request message header. each request may include multiple | ||
368 | * ceph_osd_op object operations. | ||
369 | */ | ||
370 | struct ceph_osd_request_head { | ||
371 | __le32 client_inc; /* client incarnation */ | ||
372 | struct ceph_object_layout layout; /* pgid */ | ||
373 | __le32 osdmap_epoch; /* client's osdmap epoch */ | ||
374 | |||
375 | __le32 flags; | ||
376 | |||
377 | struct ceph_timespec mtime; /* for mutations only */ | ||
378 | struct ceph_eversion reassert_version; /* if we are replaying op */ | ||
379 | |||
380 | __le32 object_len; /* length of object name */ | ||
381 | |||
382 | __le64 snapid; /* snapid to read */ | ||
383 | __le64 snap_seq; /* writer's snap context */ | ||
384 | __le32 num_snaps; | ||
385 | |||
386 | __le16 num_ops; | ||
387 | struct ceph_osd_op ops[]; /* followed by ops[], obj, ticket, snaps */ | ||
388 | } __attribute__ ((packed)); | ||
389 | |||
390 | struct ceph_osd_reply_head { | ||
391 | __le32 client_inc; /* client incarnation */ | ||
392 | __le32 flags; | ||
393 | struct ceph_object_layout layout; | ||
394 | __le32 osdmap_epoch; | ||
395 | struct ceph_eversion reassert_version; /* for replaying uncommitted */ | ||
396 | |||
397 | __le32 result; /* result code */ | ||
398 | |||
399 | __le32 object_len; /* length of object name */ | ||
400 | __le32 num_ops; | ||
401 | struct ceph_osd_op ops[0]; /* ops[], object */ | ||
402 | } __attribute__ ((packed)); | ||
403 | |||
404 | |||
405 | #endif | ||
diff --git a/include/linux/ceph/types.h b/include/linux/ceph/types.h new file mode 100644 index 000000000000..28b35a005ec2 --- /dev/null +++ b/include/linux/ceph/types.h | |||
@@ -0,0 +1,29 @@ | |||
1 | #ifndef _FS_CEPH_TYPES_H | ||
2 | #define _FS_CEPH_TYPES_H | ||
3 | |||
4 | /* needed before including ceph_fs.h */ | ||
5 | #include <linux/in.h> | ||
6 | #include <linux/types.h> | ||
7 | #include <linux/fcntl.h> | ||
8 | #include <linux/string.h> | ||
9 | |||
10 | #include "ceph_fs.h" | ||
11 | #include "ceph_frag.h" | ||
12 | #include "ceph_hash.h" | ||
13 | |||
14 | /* | ||
15 | * Identify inodes by both their ino AND snapshot id (a u64). | ||
16 | */ | ||
17 | struct ceph_vino { | ||
18 | u64 ino; | ||
19 | u64 snap; | ||
20 | }; | ||
21 | |||
22 | |||
23 | /* context for the caps reservation mechanism */ | ||
24 | struct ceph_cap_reservation { | ||
25 | int count; | ||
26 | }; | ||
27 | |||
28 | |||
29 | #endif | ||
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 0c991023ee47..ed4ba111bc8d 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -75,7 +75,7 @@ struct cgroup_subsys_state { | |||
75 | 75 | ||
76 | unsigned long flags; | 76 | unsigned long flags; |
77 | /* ID for this css, if possible */ | 77 | /* ID for this css, if possible */ |
78 | struct css_id *id; | 78 | struct css_id __rcu *id; |
79 | }; | 79 | }; |
80 | 80 | ||
81 | /* bits in struct cgroup_subsys_state flags field */ | 81 | /* bits in struct cgroup_subsys_state flags field */ |
@@ -154,6 +154,10 @@ enum { | |||
154 | * A thread in rmdir() is wating for this cgroup. | 154 | * A thread in rmdir() is wating for this cgroup. |
155 | */ | 155 | */ |
156 | CGRP_WAIT_ON_RMDIR, | 156 | CGRP_WAIT_ON_RMDIR, |
157 | /* | ||
158 | * Clone cgroup values when creating a new child cgroup | ||
159 | */ | ||
160 | CGRP_CLONE_CHILDREN, | ||
157 | }; | 161 | }; |
158 | 162 | ||
159 | /* which pidlist file are we talking about? */ | 163 | /* which pidlist file are we talking about? */ |
@@ -205,7 +209,7 @@ struct cgroup { | |||
205 | struct list_head children; /* my children */ | 209 | struct list_head children; /* my children */ |
206 | 210 | ||
207 | struct cgroup *parent; /* my parent */ | 211 | struct cgroup *parent; /* my parent */ |
208 | struct dentry *dentry; /* cgroup fs entry, RCU protected */ | 212 | struct dentry __rcu *dentry; /* cgroup fs entry, RCU protected */ |
209 | 213 | ||
210 | /* Private pointers for each registered subsystem */ | 214 | /* Private pointers for each registered subsystem */ |
211 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; | 215 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; |
diff --git a/include/linux/coda_fs_i.h b/include/linux/coda_fs_i.h index b3ef0c461578..e35071b1de0e 100644 --- a/include/linux/coda_fs_i.h +++ b/include/linux/coda_fs_i.h | |||
@@ -10,19 +10,24 @@ | |||
10 | 10 | ||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | #include <linux/list.h> | 12 | #include <linux/list.h> |
13 | #include <linux/spinlock.h> | ||
13 | #include <linux/coda.h> | 14 | #include <linux/coda.h> |
14 | 15 | ||
15 | /* | 16 | /* |
16 | * coda fs inode data | 17 | * coda fs inode data |
18 | * c_lock protects accesses to c_flags, c_mapcount, c_cached_epoch, c_uid and | ||
19 | * c_cached_perm. | ||
20 | * vfs_inode is set only when the inode is created and never changes. | ||
21 | * c_fid is set when the inode is created and should be considered immutable. | ||
17 | */ | 22 | */ |
18 | struct coda_inode_info { | 23 | struct coda_inode_info { |
19 | struct CodaFid c_fid; /* Coda identifier */ | 24 | struct CodaFid c_fid; /* Coda identifier */ |
20 | u_short c_flags; /* flags (see below) */ | 25 | u_short c_flags; /* flags (see below) */ |
21 | struct list_head c_cilist; /* list of all coda inodes */ | ||
22 | unsigned int c_mapcount; /* nr of times this inode is mapped */ | 26 | unsigned int c_mapcount; /* nr of times this inode is mapped */ |
23 | unsigned int c_cached_epoch; /* epoch for cached permissions */ | 27 | unsigned int c_cached_epoch; /* epoch for cached permissions */ |
24 | vuid_t c_uid; /* fsuid for cached permissions */ | 28 | vuid_t c_uid; /* fsuid for cached permissions */ |
25 | unsigned int c_cached_perm; /* cached access permissions */ | 29 | unsigned int c_cached_perm; /* cached access permissions */ |
30 | spinlock_t c_lock; | ||
26 | struct inode vfs_inode; | 31 | struct inode vfs_inode; |
27 | }; | 32 | }; |
28 | 33 | ||
diff --git a/include/linux/coda_linux.h b/include/linux/coda_linux.h index dcc228aa335a..2e914d0771b9 100644 --- a/include/linux/coda_linux.h +++ b/include/linux/coda_linux.h | |||
@@ -89,7 +89,11 @@ static __inline__ char *coda_i2s(struct inode *inode) | |||
89 | /* this will not zap the inode away */ | 89 | /* this will not zap the inode away */ |
90 | static __inline__ void coda_flag_inode(struct inode *inode, int flag) | 90 | static __inline__ void coda_flag_inode(struct inode *inode, int flag) |
91 | { | 91 | { |
92 | ITOC(inode)->c_flags |= flag; | 92 | struct coda_inode_info *cii = ITOC(inode); |
93 | |||
94 | spin_lock(&cii->c_lock); | ||
95 | cii->c_flags |= flag; | ||
96 | spin_unlock(&cii->c_lock); | ||
93 | } | 97 | } |
94 | 98 | ||
95 | #endif | 99 | #endif |
diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index 284b520934a0..72f2d2f0af91 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | #ifdef __KERNEL__ | 9 | #ifdef __KERNEL__ |
10 | #include <linux/backing-dev.h> | 10 | #include <linux/backing-dev.h> |
11 | #include <linux/mutex.h> | ||
11 | 12 | ||
12 | struct kstatfs; | 13 | struct kstatfs; |
13 | 14 | ||
@@ -20,6 +21,7 @@ struct venus_comm { | |||
20 | int vc_inuse; | 21 | int vc_inuse; |
21 | struct super_block *vc_sb; | 22 | struct super_block *vc_sb; |
22 | struct backing_dev_info bdi; | 23 | struct backing_dev_info bdi; |
24 | struct mutex vc_mutex; | ||
23 | }; | 25 | }; |
24 | 26 | ||
25 | 27 | ||
@@ -63,7 +65,7 @@ int venus_symlink(struct super_block *sb, struct CodaFid *fid, | |||
63 | int venus_access(struct super_block *sb, struct CodaFid *fid, int mask); | 65 | int venus_access(struct super_block *sb, struct CodaFid *fid, int mask); |
64 | int venus_pioctl(struct super_block *sb, struct CodaFid *fid, | 66 | int venus_pioctl(struct super_block *sb, struct CodaFid *fid, |
65 | unsigned int cmd, struct PioctlData *data); | 67 | unsigned int cmd, struct PioctlData *data); |
66 | int coda_downcall(int opcode, union outputArgs *out, struct super_block *sb); | 68 | int coda_downcall(struct venus_comm *vcp, int opcode, union outputArgs *out); |
67 | int venus_fsync(struct super_block *sb, struct CodaFid *fid); | 69 | int venus_fsync(struct super_block *sb, struct CodaFid *fid); |
68 | int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); | 70 | int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); |
69 | 71 | ||
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index c1a62c56a660..320d6c94ff84 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -16,7 +16,11 @@ | |||
16 | # define __release(x) __context__(x,-1) | 16 | # define __release(x) __context__(x,-1) |
17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) | 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) |
18 | # define __percpu __attribute__((noderef, address_space(3))) | 18 | # define __percpu __attribute__((noderef, address_space(3))) |
19 | #ifdef CONFIG_SPARSE_RCU_POINTER | ||
20 | # define __rcu __attribute__((noderef, address_space(4))) | ||
21 | #else | ||
19 | # define __rcu | 22 | # define __rcu |
23 | #endif | ||
20 | extern void __chk_user_ptr(const volatile void __user *); | 24 | extern void __chk_user_ptr(const volatile void __user *); |
21 | extern void __chk_io_ptr(const volatile void __iomem *); | 25 | extern void __chk_io_ptr(const volatile void __iomem *); |
22 | #else | 26 | #else |
diff --git a/include/linux/completion.h b/include/linux/completion.h index 51e3145196f6..36d57f74cd01 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h | |||
@@ -10,7 +10,7 @@ | |||
10 | 10 | ||
11 | #include <linux/wait.h> | 11 | #include <linux/wait.h> |
12 | 12 | ||
13 | /** | 13 | /* |
14 | * struct completion - structure used to maintain state for a "completion" | 14 | * struct completion - structure used to maintain state for a "completion" |
15 | * | 15 | * |
16 | * This is the opaque structure used to maintain the state for a "completion". | 16 | * This is the opaque structure used to maintain the state for a "completion". |
@@ -34,7 +34,7 @@ struct completion { | |||
34 | ({ init_completion(&work); work; }) | 34 | ({ init_completion(&work); work; }) |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * DECLARE_COMPLETION: - declare and initialize a completion structure | 37 | * DECLARE_COMPLETION - declare and initialize a completion structure |
38 | * @work: identifier for the completion structure | 38 | * @work: identifier for the completion structure |
39 | * | 39 | * |
40 | * This macro declares and initializes a completion structure. Generally used | 40 | * This macro declares and initializes a completion structure. Generally used |
@@ -50,7 +50,7 @@ struct completion { | |||
50 | * are on the kernel stack: | 50 | * are on the kernel stack: |
51 | */ | 51 | */ |
52 | /** | 52 | /** |
53 | * DECLARE_COMPLETION_ONSTACK: - declare and initialize a completion structure | 53 | * DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure |
54 | * @work: identifier for the completion structure | 54 | * @work: identifier for the completion structure |
55 | * | 55 | * |
56 | * This macro declares and initializes a completion structure on the kernel | 56 | * This macro declares and initializes a completion structure on the kernel |
@@ -64,7 +64,7 @@ struct completion { | |||
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | /** | 66 | /** |
67 | * init_completion: - Initialize a dynamically allocated completion | 67 | * init_completion - Initialize a dynamically allocated completion |
68 | * @x: completion structure that is to be initialized | 68 | * @x: completion structure that is to be initialized |
69 | * | 69 | * |
70 | * This inline function will initialize a dynamically created completion | 70 | * This inline function will initialize a dynamically created completion |
@@ -92,7 +92,7 @@ extern void complete(struct completion *); | |||
92 | extern void complete_all(struct completion *); | 92 | extern void complete_all(struct completion *); |
93 | 93 | ||
94 | /** | 94 | /** |
95 | * INIT_COMPLETION: - reinitialize a completion structure | 95 | * INIT_COMPLETION - reinitialize a completion structure |
96 | * @x: completion structure to be reinitialized | 96 | * @x: completion structure to be reinitialized |
97 | * | 97 | * |
98 | * This macro should be used to reinitialize a completion structure so it can | 98 | * This macro should be used to reinitialize a completion structure so it can |
diff --git a/include/linux/connector.h b/include/linux/connector.h index 3a779ffba60b..7e8ca75d2dad 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h | |||
@@ -88,12 +88,6 @@ struct cn_queue_dev { | |||
88 | unsigned char name[CN_CBQ_NAMELEN]; | 88 | unsigned char name[CN_CBQ_NAMELEN]; |
89 | 89 | ||
90 | struct workqueue_struct *cn_queue; | 90 | struct workqueue_struct *cn_queue; |
91 | /* Sent to kevent to create cn_queue only when needed */ | ||
92 | struct work_struct wq_creation; | ||
93 | /* Tell if the wq_creation job is pending/completed */ | ||
94 | atomic_t wq_requested; | ||
95 | /* Wait for cn_queue to be created */ | ||
96 | wait_queue_head_t wq_created; | ||
97 | 91 | ||
98 | struct list_head queue_list; | 92 | struct list_head queue_list; |
99 | spinlock_t queue_lock; | 93 | spinlock_t queue_lock; |
@@ -141,8 +135,6 @@ int cn_netlink_send(struct cn_msg *, u32, gfp_t); | |||
141 | 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 *)); | 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 *)); |
142 | void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); | 136 | void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); |
143 | 137 | ||
144 | int queue_cn_work(struct cn_callback_entry *cbq, struct work_struct *work); | ||
145 | |||
146 | struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); | 138 | struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); |
147 | void cn_queue_free_dev(struct cn_queue_dev *dev); | 139 | void cn_queue_free_dev(struct cn_queue_dev *dev); |
148 | 140 | ||
diff --git a/include/linux/cred.h b/include/linux/cred.h index 4d2c39573f36..4aaeab376446 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
@@ -84,7 +84,7 @@ struct thread_group_cred { | |||
84 | atomic_t usage; | 84 | atomic_t usage; |
85 | pid_t tgid; /* thread group process ID */ | 85 | pid_t tgid; /* thread group process ID */ |
86 | spinlock_t lock; | 86 | spinlock_t lock; |
87 | struct key *session_keyring; /* keyring inherited over fork */ | 87 | struct key __rcu *session_keyring; /* keyring inherited over fork */ |
88 | struct key *process_keyring; /* keyring private to this process */ | 88 | struct key *process_keyring; /* keyring private to this process */ |
89 | struct rcu_head rcu; /* RCU deletion hook */ | 89 | struct rcu_head rcu; /* RCU deletion hook */ |
90 | }; | 90 | }; |
diff --git a/include/linux/crush/crush.h b/include/linux/crush/crush.h new file mode 100644 index 000000000000..97e435b191f4 --- /dev/null +++ b/include/linux/crush/crush.h | |||
@@ -0,0 +1,180 @@ | |||
1 | #ifndef CEPH_CRUSH_CRUSH_H | ||
2 | #define CEPH_CRUSH_CRUSH_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | /* | ||
7 | * CRUSH is a pseudo-random data distribution algorithm that | ||
8 | * efficiently distributes input values (typically, data objects) | ||
9 | * across a heterogeneous, structured storage cluster. | ||
10 | * | ||
11 | * The algorithm was originally described in detail in this paper | ||
12 | * (although the algorithm has evolved somewhat since then): | ||
13 | * | ||
14 | * http://www.ssrc.ucsc.edu/Papers/weil-sc06.pdf | ||
15 | * | ||
16 | * LGPL2 | ||
17 | */ | ||
18 | |||
19 | |||
20 | #define CRUSH_MAGIC 0x00010000ul /* for detecting algorithm revisions */ | ||
21 | |||
22 | |||
23 | #define CRUSH_MAX_DEPTH 10 /* max crush hierarchy depth */ | ||
24 | #define CRUSH_MAX_SET 10 /* max size of a mapping result */ | ||
25 | |||
26 | |||
27 | /* | ||
28 | * CRUSH uses user-defined "rules" to describe how inputs should be | ||
29 | * mapped to devices. A rule consists of sequence of steps to perform | ||
30 | * to generate the set of output devices. | ||
31 | */ | ||
32 | struct crush_rule_step { | ||
33 | __u32 op; | ||
34 | __s32 arg1; | ||
35 | __s32 arg2; | ||
36 | }; | ||
37 | |||
38 | /* step op codes */ | ||
39 | enum { | ||
40 | CRUSH_RULE_NOOP = 0, | ||
41 | CRUSH_RULE_TAKE = 1, /* arg1 = value to start with */ | ||
42 | CRUSH_RULE_CHOOSE_FIRSTN = 2, /* arg1 = num items to pick */ | ||
43 | /* arg2 = type */ | ||
44 | CRUSH_RULE_CHOOSE_INDEP = 3, /* same */ | ||
45 | CRUSH_RULE_EMIT = 4, /* no args */ | ||
46 | CRUSH_RULE_CHOOSE_LEAF_FIRSTN = 6, | ||
47 | CRUSH_RULE_CHOOSE_LEAF_INDEP = 7, | ||
48 | }; | ||
49 | |||
50 | /* | ||
51 | * for specifying choose num (arg1) relative to the max parameter | ||
52 | * passed to do_rule | ||
53 | */ | ||
54 | #define CRUSH_CHOOSE_N 0 | ||
55 | #define CRUSH_CHOOSE_N_MINUS(x) (-(x)) | ||
56 | |||
57 | /* | ||
58 | * The rule mask is used to describe what the rule is intended for. | ||
59 | * Given a ruleset and size of output set, we search through the | ||
60 | * rule list for a matching rule_mask. | ||
61 | */ | ||
62 | struct crush_rule_mask { | ||
63 | __u8 ruleset; | ||
64 | __u8 type; | ||
65 | __u8 min_size; | ||
66 | __u8 max_size; | ||
67 | }; | ||
68 | |||
69 | struct crush_rule { | ||
70 | __u32 len; | ||
71 | struct crush_rule_mask mask; | ||
72 | struct crush_rule_step steps[0]; | ||
73 | }; | ||
74 | |||
75 | #define crush_rule_size(len) (sizeof(struct crush_rule) + \ | ||
76 | (len)*sizeof(struct crush_rule_step)) | ||
77 | |||
78 | |||
79 | |||
80 | /* | ||
81 | * A bucket is a named container of other items (either devices or | ||
82 | * other buckets). Items within a bucket are chosen using one of a | ||
83 | * few different algorithms. The table summarizes how the speed of | ||
84 | * each option measures up against mapping stability when items are | ||
85 | * added or removed. | ||
86 | * | ||
87 | * Bucket Alg Speed Additions Removals | ||
88 | * ------------------------------------------------ | ||
89 | * uniform O(1) poor poor | ||
90 | * list O(n) optimal poor | ||
91 | * tree O(log n) good good | ||
92 | * straw O(n) optimal optimal | ||
93 | */ | ||
94 | enum { | ||
95 | CRUSH_BUCKET_UNIFORM = 1, | ||
96 | CRUSH_BUCKET_LIST = 2, | ||
97 | CRUSH_BUCKET_TREE = 3, | ||
98 | CRUSH_BUCKET_STRAW = 4 | ||
99 | }; | ||
100 | extern const char *crush_bucket_alg_name(int alg); | ||
101 | |||
102 | struct crush_bucket { | ||
103 | __s32 id; /* this'll be negative */ | ||
104 | __u16 type; /* non-zero; type=0 is reserved for devices */ | ||
105 | __u8 alg; /* one of CRUSH_BUCKET_* */ | ||
106 | __u8 hash; /* which hash function to use, CRUSH_HASH_* */ | ||
107 | __u32 weight; /* 16-bit fixed point */ | ||
108 | __u32 size; /* num items */ | ||
109 | __s32 *items; | ||
110 | |||
111 | /* | ||
112 | * cached random permutation: used for uniform bucket and for | ||
113 | * the linear search fallback for the other bucket types. | ||
114 | */ | ||
115 | __u32 perm_x; /* @x for which *perm is defined */ | ||
116 | __u32 perm_n; /* num elements of *perm that are permuted/defined */ | ||
117 | __u32 *perm; | ||
118 | }; | ||
119 | |||
120 | struct crush_bucket_uniform { | ||
121 | struct crush_bucket h; | ||
122 | __u32 item_weight; /* 16-bit fixed point; all items equally weighted */ | ||
123 | }; | ||
124 | |||
125 | struct crush_bucket_list { | ||
126 | struct crush_bucket h; | ||
127 | __u32 *item_weights; /* 16-bit fixed point */ | ||
128 | __u32 *sum_weights; /* 16-bit fixed point. element i is sum | ||
129 | of weights 0..i, inclusive */ | ||
130 | }; | ||
131 | |||
132 | struct crush_bucket_tree { | ||
133 | struct crush_bucket h; /* note: h.size is _tree_ size, not number of | ||
134 | actual items */ | ||
135 | __u8 num_nodes; | ||
136 | __u32 *node_weights; | ||
137 | }; | ||
138 | |||
139 | struct crush_bucket_straw { | ||
140 | struct crush_bucket h; | ||
141 | __u32 *item_weights; /* 16-bit fixed point */ | ||
142 | __u32 *straws; /* 16-bit fixed point */ | ||
143 | }; | ||
144 | |||
145 | |||
146 | |||
147 | /* | ||
148 | * CRUSH map includes all buckets, rules, etc. | ||
149 | */ | ||
150 | struct crush_map { | ||
151 | struct crush_bucket **buckets; | ||
152 | struct crush_rule **rules; | ||
153 | |||
154 | /* | ||
155 | * Parent pointers to identify the parent bucket a device or | ||
156 | * bucket in the hierarchy. If an item appears more than | ||
157 | * once, this is the _last_ time it appeared (where buckets | ||
158 | * are processed in bucket id order, from -1 on down to | ||
159 | * -max_buckets. | ||
160 | */ | ||
161 | __u32 *bucket_parents; | ||
162 | __u32 *device_parents; | ||
163 | |||
164 | __s32 max_buckets; | ||
165 | __u32 max_rules; | ||
166 | __s32 max_devices; | ||
167 | }; | ||
168 | |||
169 | |||
170 | /* crush.c */ | ||
171 | extern int crush_get_bucket_item_weight(struct crush_bucket *b, int pos); | ||
172 | extern void crush_calc_parents(struct crush_map *map); | ||
173 | extern void crush_destroy_bucket_uniform(struct crush_bucket_uniform *b); | ||
174 | extern void crush_destroy_bucket_list(struct crush_bucket_list *b); | ||
175 | extern void crush_destroy_bucket_tree(struct crush_bucket_tree *b); | ||
176 | extern void crush_destroy_bucket_straw(struct crush_bucket_straw *b); | ||
177 | extern void crush_destroy_bucket(struct crush_bucket *b); | ||
178 | extern void crush_destroy(struct crush_map *map); | ||
179 | |||
180 | #endif | ||
diff --git a/include/linux/crush/hash.h b/include/linux/crush/hash.h new file mode 100644 index 000000000000..91e884230d5d --- /dev/null +++ b/include/linux/crush/hash.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef CEPH_CRUSH_HASH_H | ||
2 | #define CEPH_CRUSH_HASH_H | ||
3 | |||
4 | #define CRUSH_HASH_RJENKINS1 0 | ||
5 | |||
6 | #define CRUSH_HASH_DEFAULT CRUSH_HASH_RJENKINS1 | ||
7 | |||
8 | extern const char *crush_hash_name(int type); | ||
9 | |||
10 | extern __u32 crush_hash32(int type, __u32 a); | ||
11 | extern __u32 crush_hash32_2(int type, __u32 a, __u32 b); | ||
12 | extern __u32 crush_hash32_3(int type, __u32 a, __u32 b, __u32 c); | ||
13 | extern __u32 crush_hash32_4(int type, __u32 a, __u32 b, __u32 c, __u32 d); | ||
14 | extern __u32 crush_hash32_5(int type, __u32 a, __u32 b, __u32 c, __u32 d, | ||
15 | __u32 e); | ||
16 | |||
17 | #endif | ||
diff --git a/include/linux/crush/mapper.h b/include/linux/crush/mapper.h new file mode 100644 index 000000000000..c46b99c18bb0 --- /dev/null +++ b/include/linux/crush/mapper.h | |||
@@ -0,0 +1,20 @@ | |||
1 | #ifndef CEPH_CRUSH_MAPPER_H | ||
2 | #define CEPH_CRUSH_MAPPER_H | ||
3 | |||
4 | /* | ||
5 | * CRUSH functions for find rules and then mapping an input to an | ||
6 | * output set. | ||
7 | * | ||
8 | * LGPL2 | ||
9 | */ | ||
10 | |||
11 | #include "crush.h" | ||
12 | |||
13 | extern int crush_find_rule(struct crush_map *map, int pool, int type, int size); | ||
14 | extern int crush_do_rule(struct crush_map *map, | ||
15 | int ruleno, | ||
16 | int x, int *result, int result_max, | ||
17 | int forcefeed, /* -1 for none */ | ||
18 | __u32 *weights); | ||
19 | |||
20 | #endif | ||
diff --git a/include/linux/davinci_emac.h b/include/linux/davinci_emac.h index 7c930dba477c..5dd428532f79 100644 --- a/include/linux/davinci_emac.h +++ b/include/linux/davinci_emac.h | |||
@@ -14,16 +14,26 @@ | |||
14 | #include <linux/if_ether.h> | 14 | #include <linux/if_ether.h> |
15 | #include <linux/memory.h> | 15 | #include <linux/memory.h> |
16 | 16 | ||
17 | struct mdio_platform_data { | ||
18 | unsigned long bus_freq; | ||
19 | }; | ||
20 | |||
17 | struct emac_platform_data { | 21 | struct emac_platform_data { |
18 | char mac_addr[ETH_ALEN]; | 22 | char mac_addr[ETH_ALEN]; |
19 | u32 ctrl_reg_offset; | 23 | u32 ctrl_reg_offset; |
20 | u32 ctrl_mod_reg_offset; | 24 | u32 ctrl_mod_reg_offset; |
21 | u32 ctrl_ram_offset; | 25 | u32 ctrl_ram_offset; |
22 | u32 hw_ram_addr; | 26 | u32 hw_ram_addr; |
23 | u32 mdio_reg_offset; | ||
24 | u32 ctrl_ram_size; | 27 | u32 ctrl_ram_size; |
25 | u32 phy_mask; | 28 | |
26 | u32 mdio_max_freq; | 29 | /* |
30 | * phy_id can be one of the following: | ||
31 | * - NULL : use the first phy on the bus, | ||
32 | * - "" : force to 100/full, no mdio control | ||
33 | * - "<bus>:<addr>" : use the specified bus and phy | ||
34 | */ | ||
35 | const char *phy_id; | ||
36 | |||
27 | u8 rmii_en; | 37 | u8 rmii_en; |
28 | u8 version; | 38 | u8 version; |
29 | void (*interrupt_enable) (void); | 39 | void (*interrupt_enable) (void); |
diff --git a/include/linux/dccp.h b/include/linux/dccp.h index 7434a8353e23..749f01ccd26e 100644 --- a/include/linux/dccp.h +++ b/include/linux/dccp.h | |||
@@ -165,8 +165,10 @@ enum { | |||
165 | DCCPO_TIMESTAMP_ECHO = 42, | 165 | DCCPO_TIMESTAMP_ECHO = 42, |
166 | DCCPO_ELAPSED_TIME = 43, | 166 | DCCPO_ELAPSED_TIME = 43, |
167 | DCCPO_MAX = 45, | 167 | DCCPO_MAX = 45, |
168 | DCCPO_MIN_CCID_SPECIFIC = 128, | 168 | DCCPO_MIN_RX_CCID_SPECIFIC = 128, /* from sender to receiver */ |
169 | DCCPO_MAX_CCID_SPECIFIC = 255, | 169 | DCCPO_MAX_RX_CCID_SPECIFIC = 191, |
170 | DCCPO_MIN_TX_CCID_SPECIFIC = 192, /* from receiver to sender */ | ||
171 | DCCPO_MAX_TX_CCID_SPECIFIC = 255, | ||
170 | }; | 172 | }; |
171 | /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ | 173 | /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ |
172 | #define DCCP_SINGLE_OPT_MAXLEN 253 | 174 | #define DCCP_SINGLE_OPT_MAXLEN 253 |
@@ -460,7 +462,8 @@ struct dccp_ackvec; | |||
460 | * @dccps_hc_rx_insert_options - receiver wants to add options when acking | 462 | * @dccps_hc_rx_insert_options - receiver wants to add options when acking |
461 | * @dccps_hc_tx_insert_options - sender wants to add options when sending | 463 | * @dccps_hc_tx_insert_options - sender wants to add options when sending |
462 | * @dccps_server_timewait - server holds timewait state on close (RFC 4340, 8.3) | 464 | * @dccps_server_timewait - server holds timewait state on close (RFC 4340, 8.3) |
463 | * @dccps_xmit_timer - timer for when CCID is not ready to send | 465 | * @dccps_xmitlet - tasklet scheduled by the TX CCID to dequeue data packets |
466 | * @dccps_xmit_timer - used by the TX CCID to delay sending (rate-based pacing) | ||
464 | * @dccps_syn_rtt - RTT sample from Request/Response exchange (in usecs) | 467 | * @dccps_syn_rtt - RTT sample from Request/Response exchange (in usecs) |
465 | */ | 468 | */ |
466 | struct dccp_sock { | 469 | struct dccp_sock { |
@@ -500,6 +503,7 @@ struct dccp_sock { | |||
500 | __u8 dccps_hc_rx_insert_options:1; | 503 | __u8 dccps_hc_rx_insert_options:1; |
501 | __u8 dccps_hc_tx_insert_options:1; | 504 | __u8 dccps_hc_tx_insert_options:1; |
502 | __u8 dccps_server_timewait:1; | 505 | __u8 dccps_server_timewait:1; |
506 | struct tasklet_struct dccps_xmitlet; | ||
503 | struct timer_list dccps_xmit_timer; | 507 | struct timer_list dccps_xmit_timer; |
504 | }; | 508 | }; |
505 | 509 | ||
diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index 29b3ce3f2a1d..2833452ea01c 100644 --- a/include/linux/debug_locks.h +++ b/include/linux/debug_locks.h | |||
@@ -49,7 +49,6 @@ struct task_struct; | |||
49 | 49 | ||
50 | #ifdef CONFIG_LOCKDEP | 50 | #ifdef CONFIG_LOCKDEP |
51 | extern void debug_show_all_locks(void); | 51 | extern void debug_show_all_locks(void); |
52 | extern void __debug_show_held_locks(struct task_struct *task); | ||
53 | extern void debug_show_held_locks(struct task_struct *task); | 52 | extern void debug_show_held_locks(struct task_struct *task); |
54 | extern void debug_check_no_locks_freed(const void *from, unsigned long len); | 53 | extern void debug_check_no_locks_freed(const void *from, unsigned long len); |
55 | extern void debug_check_no_locks_held(struct task_struct *task); | 54 | extern void debug_check_no_locks_held(struct task_struct *task); |
@@ -58,10 +57,6 @@ static inline void debug_show_all_locks(void) | |||
58 | { | 57 | { |
59 | } | 58 | } |
60 | 59 | ||
61 | static inline void __debug_show_held_locks(struct task_struct *task) | ||
62 | { | ||
63 | } | ||
64 | |||
65 | static inline void debug_show_held_locks(struct task_struct *task) | 60 | static inline void debug_show_held_locks(struct task_struct *task) |
66 | { | 61 | { |
67 | } | 62 | } |
diff --git a/include/linux/device.h b/include/linux/device.h index 516fecacf27b..dd4895313468 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -751,4 +751,11 @@ do { \ | |||
751 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) | 751 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) |
752 | #define MODULE_ALIAS_CHARDEV_MAJOR(major) \ | 752 | #define MODULE_ALIAS_CHARDEV_MAJOR(major) \ |
753 | MODULE_ALIAS("char-major-" __stringify(major) "-*") | 753 | MODULE_ALIAS("char-major-" __stringify(major) "-*") |
754 | |||
755 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
756 | extern long sysfs_deprecated; | ||
757 | #else | ||
758 | #define sysfs_deprecated 0 | ||
759 | #endif | ||
760 | |||
754 | #endif /* _DEVICE_H_ */ | 761 | #endif /* _DEVICE_H_ */ |
diff --git a/include/linux/dlm.h b/include/linux/dlm.h index 0b3518c42356..d4e02f5353a0 100644 --- a/include/linux/dlm.h +++ b/include/linux/dlm.h | |||
@@ -48,10 +48,10 @@ typedef void dlm_lockspace_t; | |||
48 | * | 48 | * |
49 | * 0 if lock request was successful | 49 | * 0 if lock request was successful |
50 | * -EAGAIN if request would block and is flagged DLM_LKF_NOQUEUE | 50 | * -EAGAIN if request would block and is flagged DLM_LKF_NOQUEUE |
51 | * -ENOMEM if there is no memory to process request | ||
52 | * -EINVAL if there are invalid parameters | ||
53 | * -DLM_EUNLOCK if unlock request was successful | 51 | * -DLM_EUNLOCK if unlock request was successful |
54 | * -DLM_ECANCEL if a cancel completed successfully | 52 | * -DLM_ECANCEL if a cancel completed successfully |
53 | * -EDEADLK if a deadlock was detected | ||
54 | * -ETIMEDOUT if the lock request was canceled due to a timeout | ||
55 | */ | 55 | */ |
56 | 56 | ||
57 | #define DLM_SBF_DEMOTED 0x01 | 57 | #define DLM_SBF_DEMOTED 0x01 |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index e2106495cc11..9d8688b92d8b 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
@@ -64,13 +64,15 @@ enum dma_transaction_type { | |||
64 | DMA_PQ_VAL, | 64 | DMA_PQ_VAL, |
65 | DMA_MEMSET, | 65 | DMA_MEMSET, |
66 | DMA_INTERRUPT, | 66 | DMA_INTERRUPT, |
67 | DMA_SG, | ||
67 | DMA_PRIVATE, | 68 | DMA_PRIVATE, |
68 | DMA_ASYNC_TX, | 69 | DMA_ASYNC_TX, |
69 | DMA_SLAVE, | 70 | DMA_SLAVE, |
71 | DMA_CYCLIC, | ||
70 | }; | 72 | }; |
71 | 73 | ||
72 | /* last transaction type for creation of the capabilities mask */ | 74 | /* last transaction type for creation of the capabilities mask */ |
73 | #define DMA_TX_TYPE_END (DMA_SLAVE + 1) | 75 | #define DMA_TX_TYPE_END (DMA_CYCLIC + 1) |
74 | 76 | ||
75 | 77 | ||
76 | /** | 78 | /** |
@@ -119,12 +121,15 @@ enum dma_ctrl_flags { | |||
119 | * configuration data in statically from the platform). An additional | 121 | * configuration data in statically from the platform). An additional |
120 | * argument of struct dma_slave_config must be passed in with this | 122 | * argument of struct dma_slave_config must be passed in with this |
121 | * command. | 123 | * command. |
124 | * @FSLDMA_EXTERNAL_START: this command will put the Freescale DMA controller | ||
125 | * into external start mode. | ||
122 | */ | 126 | */ |
123 | enum dma_ctrl_cmd { | 127 | enum dma_ctrl_cmd { |
124 | DMA_TERMINATE_ALL, | 128 | DMA_TERMINATE_ALL, |
125 | DMA_PAUSE, | 129 | DMA_PAUSE, |
126 | DMA_RESUME, | 130 | DMA_RESUME, |
127 | DMA_SLAVE_CONFIG, | 131 | DMA_SLAVE_CONFIG, |
132 | FSLDMA_EXTERNAL_START, | ||
128 | }; | 133 | }; |
129 | 134 | ||
130 | /** | 135 | /** |
@@ -316,14 +321,14 @@ struct dma_async_tx_descriptor { | |||
316 | dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx); | 321 | dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx); |
317 | dma_async_tx_callback callback; | 322 | dma_async_tx_callback callback; |
318 | void *callback_param; | 323 | void *callback_param; |
319 | #ifndef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH | 324 | #ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH |
320 | struct dma_async_tx_descriptor *next; | 325 | struct dma_async_tx_descriptor *next; |
321 | struct dma_async_tx_descriptor *parent; | 326 | struct dma_async_tx_descriptor *parent; |
322 | spinlock_t lock; | 327 | spinlock_t lock; |
323 | #endif | 328 | #endif |
324 | }; | 329 | }; |
325 | 330 | ||
326 | #ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH | 331 | #ifndef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH |
327 | static inline void txd_lock(struct dma_async_tx_descriptor *txd) | 332 | static inline void txd_lock(struct dma_async_tx_descriptor *txd) |
328 | { | 333 | { |
329 | } | 334 | } |
@@ -422,6 +427,9 @@ struct dma_tx_state { | |||
422 | * @device_prep_dma_memset: prepares a memset operation | 427 | * @device_prep_dma_memset: prepares a memset operation |
423 | * @device_prep_dma_interrupt: prepares an end of chain interrupt operation | 428 | * @device_prep_dma_interrupt: prepares an end of chain interrupt operation |
424 | * @device_prep_slave_sg: prepares a slave dma operation | 429 | * @device_prep_slave_sg: prepares a slave dma operation |
430 | * @device_prep_dma_cyclic: prepare a cyclic dma operation suitable for audio. | ||
431 | * The function takes a buffer of size buf_len. The callback function will | ||
432 | * be called after period_len bytes have been transferred. | ||
425 | * @device_control: manipulate all pending operations on a channel, returns | 433 | * @device_control: manipulate all pending operations on a channel, returns |
426 | * zero or error code | 434 | * zero or error code |
427 | * @device_tx_status: poll for transaction completion, the optional | 435 | * @device_tx_status: poll for transaction completion, the optional |
@@ -473,11 +481,19 @@ struct dma_device { | |||
473 | unsigned long flags); | 481 | unsigned long flags); |
474 | struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)( | 482 | struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)( |
475 | struct dma_chan *chan, unsigned long flags); | 483 | struct dma_chan *chan, unsigned long flags); |
484 | struct dma_async_tx_descriptor *(*device_prep_dma_sg)( | ||
485 | struct dma_chan *chan, | ||
486 | struct scatterlist *dst_sg, unsigned int dst_nents, | ||
487 | struct scatterlist *src_sg, unsigned int src_nents, | ||
488 | unsigned long flags); | ||
476 | 489 | ||
477 | struct dma_async_tx_descriptor *(*device_prep_slave_sg)( | 490 | struct dma_async_tx_descriptor *(*device_prep_slave_sg)( |
478 | struct dma_chan *chan, struct scatterlist *sgl, | 491 | struct dma_chan *chan, struct scatterlist *sgl, |
479 | unsigned int sg_len, enum dma_data_direction direction, | 492 | unsigned int sg_len, enum dma_data_direction direction, |
480 | unsigned long flags); | 493 | unsigned long flags); |
494 | struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)( | ||
495 | struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, | ||
496 | size_t period_len, enum dma_data_direction direction); | ||
481 | int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 497 | int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd, |
482 | unsigned long arg); | 498 | unsigned long arg); |
483 | 499 | ||
@@ -487,6 +503,40 @@ struct dma_device { | |||
487 | void (*device_issue_pending)(struct dma_chan *chan); | 503 | void (*device_issue_pending)(struct dma_chan *chan); |
488 | }; | 504 | }; |
489 | 505 | ||
506 | static inline int dmaengine_device_control(struct dma_chan *chan, | ||
507 | enum dma_ctrl_cmd cmd, | ||
508 | unsigned long arg) | ||
509 | { | ||
510 | return chan->device->device_control(chan, cmd, arg); | ||
511 | } | ||
512 | |||
513 | static inline int dmaengine_slave_config(struct dma_chan *chan, | ||
514 | struct dma_slave_config *config) | ||
515 | { | ||
516 | return dmaengine_device_control(chan, DMA_SLAVE_CONFIG, | ||
517 | (unsigned long)config); | ||
518 | } | ||
519 | |||
520 | static inline int dmaengine_terminate_all(struct dma_chan *chan) | ||
521 | { | ||
522 | return dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); | ||
523 | } | ||
524 | |||
525 | static inline int dmaengine_pause(struct dma_chan *chan) | ||
526 | { | ||
527 | return dmaengine_device_control(chan, DMA_PAUSE, 0); | ||
528 | } | ||
529 | |||
530 | static inline int dmaengine_resume(struct dma_chan *chan) | ||
531 | { | ||
532 | return dmaengine_device_control(chan, DMA_RESUME, 0); | ||
533 | } | ||
534 | |||
535 | static inline int dmaengine_submit(struct dma_async_tx_descriptor *desc) | ||
536 | { | ||
537 | return desc->tx_submit(desc); | ||
538 | } | ||
539 | |||
490 | static inline bool dmaengine_check_align(u8 align, size_t off1, size_t off2, size_t len) | 540 | static inline bool dmaengine_check_align(u8 align, size_t off1, size_t off2, size_t len) |
491 | { | 541 | { |
492 | size_t mask; | 542 | size_t mask; |
@@ -606,11 +656,11 @@ static inline void net_dmaengine_put(void) | |||
606 | #ifdef CONFIG_ASYNC_TX_DMA | 656 | #ifdef CONFIG_ASYNC_TX_DMA |
607 | #define async_dmaengine_get() dmaengine_get() | 657 | #define async_dmaengine_get() dmaengine_get() |
608 | #define async_dmaengine_put() dmaengine_put() | 658 | #define async_dmaengine_put() dmaengine_put() |
609 | #ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH | 659 | #ifndef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH |
610 | #define async_dma_find_channel(type) dma_find_channel(DMA_ASYNC_TX) | 660 | #define async_dma_find_channel(type) dma_find_channel(DMA_ASYNC_TX) |
611 | #else | 661 | #else |
612 | #define async_dma_find_channel(type) dma_find_channel(type) | 662 | #define async_dma_find_channel(type) dma_find_channel(type) |
613 | #endif /* CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH */ | 663 | #endif /* CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH */ |
614 | #else | 664 | #else |
615 | static inline void async_dmaengine_get(void) | 665 | static inline void async_dmaengine_get(void) |
616 | { | 666 | { |
diff --git a/include/linux/dmar.h b/include/linux/dmar.h index d7cecc90ed34..a7d9dc21391d 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h | |||
@@ -57,15 +57,15 @@ extern int dmar_table_init(void); | |||
57 | extern int dmar_dev_scope_init(void); | 57 | extern int dmar_dev_scope_init(void); |
58 | 58 | ||
59 | /* Intel IOMMU detection */ | 59 | /* Intel IOMMU detection */ |
60 | extern void detect_intel_iommu(void); | 60 | extern int detect_intel_iommu(void); |
61 | extern int enable_drhd_fault_handling(void); | 61 | extern int enable_drhd_fault_handling(void); |
62 | 62 | ||
63 | extern int parse_ioapics_under_ir(void); | 63 | extern int parse_ioapics_under_ir(void); |
64 | extern int alloc_iommu(struct dmar_drhd_unit *); | 64 | extern int alloc_iommu(struct dmar_drhd_unit *); |
65 | #else | 65 | #else |
66 | static inline void detect_intel_iommu(void) | 66 | static inline int detect_intel_iommu(void) |
67 | { | 67 | { |
68 | return; | 68 | return -ENODEV; |
69 | } | 69 | } |
70 | 70 | ||
71 | static inline int dmar_table_init(void) | 71 | static inline int dmar_table_init(void) |
@@ -106,6 +106,7 @@ struct irte { | |||
106 | __u64 high; | 106 | __u64 high; |
107 | }; | 107 | }; |
108 | }; | 108 | }; |
109 | |||
109 | #ifdef CONFIG_INTR_REMAP | 110 | #ifdef CONFIG_INTR_REMAP |
110 | extern int intr_remapping_enabled; | 111 | extern int intr_remapping_enabled; |
111 | extern int intr_remapping_supported(void); | 112 | extern int intr_remapping_supported(void); |
@@ -119,11 +120,8 @@ extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count); | |||
119 | extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index, | 120 | extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index, |
120 | u16 sub_handle); | 121 | u16 sub_handle); |
121 | extern int map_irq_to_irte_handle(int irq, u16 *sub_handle); | 122 | extern int map_irq_to_irte_handle(int irq, u16 *sub_handle); |
122 | extern int clear_irte_irq(int irq, struct intel_iommu *iommu, u16 index); | ||
123 | extern int flush_irte(int irq); | ||
124 | extern int free_irte(int irq); | 123 | extern int free_irte(int irq); |
125 | 124 | ||
126 | extern int irq_remapped(int irq); | ||
127 | extern struct intel_iommu *map_dev_to_ir(struct pci_dev *dev); | 125 | extern struct intel_iommu *map_dev_to_ir(struct pci_dev *dev); |
128 | extern struct intel_iommu *map_ioapic_to_ir(int apic); | 126 | extern struct intel_iommu *map_ioapic_to_ir(int apic); |
129 | extern struct intel_iommu *map_hpet_to_ir(u8 id); | 127 | extern struct intel_iommu *map_hpet_to_ir(u8 id); |
@@ -177,7 +175,6 @@ static inline int set_msi_sid(struct irte *irte, struct pci_dev *dev) | |||
177 | return 0; | 175 | return 0; |
178 | } | 176 | } |
179 | 177 | ||
180 | #define irq_remapped(irq) (0) | ||
181 | #define enable_intr_remapping(mode) (-1) | 178 | #define enable_intr_remapping(mode) (-1) |
182 | #define disable_intr_remapping() (0) | 179 | #define disable_intr_remapping() (0) |
183 | #define reenable_intr_remapping(mode) (0) | 180 | #define reenable_intr_remapping(mode) (0) |
@@ -187,8 +184,9 @@ static inline int set_msi_sid(struct irte *irte, struct pci_dev *dev) | |||
187 | /* Can't use the common MSI interrupt functions | 184 | /* Can't use the common MSI interrupt functions |
188 | * since DMAR is not a pci device | 185 | * since DMAR is not a pci device |
189 | */ | 186 | */ |
190 | extern void dmar_msi_unmask(unsigned int irq); | 187 | struct irq_data; |
191 | extern void dmar_msi_mask(unsigned int irq); | 188 | extern void dmar_msi_unmask(struct irq_data *data); |
189 | extern void dmar_msi_mask(struct irq_data *data); | ||
192 | extern void dmar_msi_read(int irq, struct msi_msg *msg); | 190 | extern void dmar_msi_read(int irq, struct msi_msg *msg); |
193 | extern void dmar_msi_write(int irq, struct msi_msg *msg); | 191 | extern void dmar_msi_write(int irq, struct msi_msg *msg); |
194 | extern int dmar_set_interrupt(struct intel_iommu *iommu); | 192 | extern int dmar_set_interrupt(struct intel_iommu *iommu); |
diff --git a/include/linux/drbd.h b/include/linux/drbd.h index 479ee3a1d901..ef44c7a0638c 100644 --- a/include/linux/drbd.h +++ b/include/linux/drbd.h | |||
@@ -53,10 +53,10 @@ | |||
53 | 53 | ||
54 | 54 | ||
55 | extern const char *drbd_buildtag(void); | 55 | extern const char *drbd_buildtag(void); |
56 | #define REL_VERSION "8.3.8.1" | 56 | #define REL_VERSION "8.3.9" |
57 | #define API_VERSION 88 | 57 | #define API_VERSION 88 |
58 | #define PRO_VERSION_MIN 86 | 58 | #define PRO_VERSION_MIN 86 |
59 | #define PRO_VERSION_MAX 94 | 59 | #define PRO_VERSION_MAX 95 |
60 | 60 | ||
61 | 61 | ||
62 | enum drbd_io_error_p { | 62 | enum drbd_io_error_p { |
@@ -91,6 +91,11 @@ enum drbd_after_sb_p { | |||
91 | ASB_VIOLENTLY | 91 | ASB_VIOLENTLY |
92 | }; | 92 | }; |
93 | 93 | ||
94 | enum drbd_on_no_data { | ||
95 | OND_IO_ERROR, | ||
96 | OND_SUSPEND_IO | ||
97 | }; | ||
98 | |||
94 | /* KEEP the order, do not delete or insert. Only append. */ | 99 | /* KEEP the order, do not delete or insert. Only append. */ |
95 | enum drbd_ret_codes { | 100 | enum drbd_ret_codes { |
96 | ERR_CODE_BASE = 100, | 101 | ERR_CODE_BASE = 100, |
@@ -140,6 +145,7 @@ enum drbd_ret_codes { | |||
140 | ERR_CONNECTED = 151, /* DRBD 8.3 only */ | 145 | ERR_CONNECTED = 151, /* DRBD 8.3 only */ |
141 | ERR_PERM = 152, | 146 | ERR_PERM = 152, |
142 | ERR_NEED_APV_93 = 153, | 147 | ERR_NEED_APV_93 = 153, |
148 | ERR_STONITH_AND_PROT_A = 154, | ||
143 | 149 | ||
144 | /* insert new ones above this line */ | 150 | /* insert new ones above this line */ |
145 | AFTER_LAST_ERR_CODE | 151 | AFTER_LAST_ERR_CODE |
@@ -226,13 +232,17 @@ union drbd_state { | |||
226 | unsigned conn:5 ; /* 17/32 cstates */ | 232 | unsigned conn:5 ; /* 17/32 cstates */ |
227 | unsigned disk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ | 233 | unsigned disk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ |
228 | unsigned pdsk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ | 234 | unsigned pdsk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ |
229 | unsigned susp:1 ; /* 2/2 IO suspended no/yes */ | 235 | unsigned susp:1 ; /* 2/2 IO suspended no/yes (by user) */ |
230 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ | 236 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ |
231 | unsigned peer_isp:1 ; | 237 | unsigned peer_isp:1 ; |
232 | unsigned user_isp:1 ; | 238 | unsigned user_isp:1 ; |
233 | unsigned _pad:11; /* 0 unused */ | 239 | unsigned susp_nod:1 ; /* IO suspended because no data */ |
240 | unsigned susp_fen:1 ; /* IO suspended because fence peer handler runs*/ | ||
241 | unsigned _pad:9; /* 0 unused */ | ||
234 | #elif defined(__BIG_ENDIAN_BITFIELD) | 242 | #elif defined(__BIG_ENDIAN_BITFIELD) |
235 | unsigned _pad:11; /* 0 unused */ | 243 | unsigned _pad:9; |
244 | unsigned susp_fen:1 ; | ||
245 | unsigned susp_nod:1 ; | ||
236 | unsigned user_isp:1 ; | 246 | unsigned user_isp:1 ; |
237 | unsigned peer_isp:1 ; | 247 | unsigned peer_isp:1 ; |
238 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ | 248 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ |
@@ -312,6 +322,8 @@ enum drbd_timeout_flag { | |||
312 | 322 | ||
313 | #define DRBD_MAGIC 0x83740267 | 323 | #define DRBD_MAGIC 0x83740267 |
314 | #define BE_DRBD_MAGIC __constant_cpu_to_be32(DRBD_MAGIC) | 324 | #define BE_DRBD_MAGIC __constant_cpu_to_be32(DRBD_MAGIC) |
325 | #define DRBD_MAGIC_BIG 0x835a | ||
326 | #define BE_DRBD_MAGIC_BIG __constant_cpu_to_be16(DRBD_MAGIC_BIG) | ||
315 | 327 | ||
316 | /* these are of type "int" */ | 328 | /* these are of type "int" */ |
317 | #define DRBD_MD_INDEX_INTERNAL -1 | 329 | #define DRBD_MD_INDEX_INTERNAL -1 |
diff --git a/include/linux/drbd_limits.h b/include/linux/drbd_limits.h index 440b42e38e89..4ac33f34b77e 100644 --- a/include/linux/drbd_limits.h +++ b/include/linux/drbd_limits.h | |||
@@ -128,26 +128,31 @@ | |||
128 | #define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT | 128 | #define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT |
129 | #define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT | 129 | #define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT |
130 | #define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT | 130 | #define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT |
131 | #define DRBD_ON_NO_DATA_DEF OND_IO_ERROR | ||
131 | 132 | ||
132 | #define DRBD_MAX_BIO_BVECS_MIN 0 | 133 | #define DRBD_MAX_BIO_BVECS_MIN 0 |
133 | #define DRBD_MAX_BIO_BVECS_MAX 128 | 134 | #define DRBD_MAX_BIO_BVECS_MAX 128 |
134 | #define DRBD_MAX_BIO_BVECS_DEF 0 | 135 | #define DRBD_MAX_BIO_BVECS_DEF 0 |
135 | 136 | ||
136 | #define DRBD_DP_VOLUME_MIN 4 | 137 | #define DRBD_C_PLAN_AHEAD_MIN 0 |
137 | #define DRBD_DP_VOLUME_MAX 1048576 | 138 | #define DRBD_C_PLAN_AHEAD_MAX 300 |
138 | #define DRBD_DP_VOLUME_DEF 16384 | 139 | #define DRBD_C_PLAN_AHEAD_DEF 0 /* RS rate controller disabled by default */ |
139 | 140 | ||
140 | #define DRBD_DP_INTERVAL_MIN 1 | 141 | #define DRBD_C_DELAY_TARGET_MIN 1 |
141 | #define DRBD_DP_INTERVAL_MAX 600 | 142 | #define DRBD_C_DELAY_TARGET_MAX 100 |
142 | #define DRBD_DP_INTERVAL_DEF 5 | 143 | #define DRBD_C_DELAY_TARGET_DEF 10 |
143 | 144 | ||
144 | #define DRBD_RS_THROTTLE_TH_MIN 1 | 145 | #define DRBD_C_FILL_TARGET_MIN 0 |
145 | #define DRBD_RS_THROTTLE_TH_MAX 600 | 146 | #define DRBD_C_FILL_TARGET_MAX (1<<20) /* 500MByte in sec */ |
146 | #define DRBD_RS_THROTTLE_TH_DEF 20 | 147 | #define DRBD_C_FILL_TARGET_DEF 0 /* By default disabled -> controlled by delay_target */ |
147 | 148 | ||
148 | #define DRBD_RS_HOLD_OFF_TH_MIN 1 | 149 | #define DRBD_C_MAX_RATE_MIN 250 /* kByte/sec */ |
149 | #define DRBD_RS_HOLD_OFF_TH_MAX 6000 | 150 | #define DRBD_C_MAX_RATE_MAX (4 << 20) |
150 | #define DRBD_RS_HOLD_OFF_TH_DEF 100 | 151 | #define DRBD_C_MAX_RATE_DEF 102400 |
152 | |||
153 | #define DRBD_C_MIN_RATE_MIN 0 /* kByte/sec */ | ||
154 | #define DRBD_C_MIN_RATE_MAX (4 << 20) | ||
155 | #define DRBD_C_MIN_RATE_DEF 4096 | ||
151 | 156 | ||
152 | #undef RANGE | 157 | #undef RANGE |
153 | #endif | 158 | #endif |
diff --git a/include/linux/drbd_nl.h b/include/linux/drbd_nl.h index 5f042810a56c..ade91107c9a5 100644 --- a/include/linux/drbd_nl.h +++ b/include/linux/drbd_nl.h | |||
@@ -87,6 +87,12 @@ NL_PACKET(syncer_conf, 8, | |||
87 | NL_STRING( 51, T_MAY_IGNORE, cpu_mask, 32) | 87 | NL_STRING( 51, T_MAY_IGNORE, cpu_mask, 32) |
88 | NL_STRING( 64, T_MAY_IGNORE, csums_alg, SHARED_SECRET_MAX) | 88 | NL_STRING( 64, T_MAY_IGNORE, csums_alg, SHARED_SECRET_MAX) |
89 | NL_BIT( 65, T_MAY_IGNORE, use_rle) | 89 | NL_BIT( 65, T_MAY_IGNORE, use_rle) |
90 | NL_INTEGER( 75, T_MAY_IGNORE, on_no_data) | ||
91 | NL_INTEGER( 76, T_MAY_IGNORE, c_plan_ahead) | ||
92 | NL_INTEGER( 77, T_MAY_IGNORE, c_delay_target) | ||
93 | NL_INTEGER( 78, T_MAY_IGNORE, c_fill_target) | ||
94 | NL_INTEGER( 79, T_MAY_IGNORE, c_max_rate) | ||
95 | NL_INTEGER( 80, T_MAY_IGNORE, c_min_rate) | ||
90 | ) | 96 | ) |
91 | 97 | ||
92 | NL_PACKET(invalidate, 9, ) | 98 | NL_PACKET(invalidate, 9, ) |
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 52c0da4bdd18..a90b3892074a 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _DYNAMIC_DEBUG_H | 1 | #ifndef _DYNAMIC_DEBUG_H |
2 | #define _DYNAMIC_DEBUG_H | 2 | #define _DYNAMIC_DEBUG_H |
3 | 3 | ||
4 | #include <linux/jump_label.h> | ||
5 | |||
4 | /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which | 6 | /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which |
5 | * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They | 7 | * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They |
6 | * use independent hash functions, to reduce the chance of false positives. | 8 | * use independent hash functions, to reduce the chance of false positives. |
@@ -22,8 +24,6 @@ struct _ddebug { | |||
22 | const char *function; | 24 | const char *function; |
23 | const char *filename; | 25 | const char *filename; |
24 | const char *format; | 26 | const char *format; |
25 | char primary_hash; | ||
26 | char secondary_hash; | ||
27 | unsigned int lineno:24; | 27 | unsigned int lineno:24; |
28 | /* | 28 | /* |
29 | * The flags field controls the behaviour at the callsite. | 29 | * The flags field controls the behaviour at the callsite. |
@@ -33,6 +33,7 @@ struct _ddebug { | |||
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_DEFAULT 0 | 34 | #define _DPRINTK_FLAGS_DEFAULT 0 |
35 | unsigned int flags:8; | 35 | unsigned int flags:8; |
36 | char enabled; | ||
36 | } __attribute__((aligned(8))); | 37 | } __attribute__((aligned(8))); |
37 | 38 | ||
38 | 39 | ||
@@ -42,33 +43,35 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n, | |||
42 | #if defined(CONFIG_DYNAMIC_DEBUG) | 43 | #if defined(CONFIG_DYNAMIC_DEBUG) |
43 | extern int ddebug_remove_module(const char *mod_name); | 44 | extern int ddebug_remove_module(const char *mod_name); |
44 | 45 | ||
45 | #define __dynamic_dbg_enabled(dd) ({ \ | ||
46 | int __ret = 0; \ | ||
47 | if (unlikely((dynamic_debug_enabled & (1LL << DEBUG_HASH)) && \ | ||
48 | (dynamic_debug_enabled2 & (1LL << DEBUG_HASH2)))) \ | ||
49 | if (unlikely(dd.flags)) \ | ||
50 | __ret = 1; \ | ||
51 | __ret; }) | ||
52 | |||
53 | #define dynamic_pr_debug(fmt, ...) do { \ | 46 | #define dynamic_pr_debug(fmt, ...) do { \ |
47 | __label__ do_printk; \ | ||
48 | __label__ out; \ | ||
54 | static struct _ddebug descriptor \ | 49 | static struct _ddebug descriptor \ |
55 | __used \ | 50 | __used \ |
56 | __attribute__((section("__verbose"), aligned(8))) = \ | 51 | __attribute__((section("__verbose"), aligned(8))) = \ |
57 | { KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \ | 52 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
58 | DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \ | 53 | _DPRINTK_FLAGS_DEFAULT }; \ |
59 | if (__dynamic_dbg_enabled(descriptor)) \ | 54 | JUMP_LABEL(&descriptor.enabled, do_printk); \ |
60 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ | 55 | goto out; \ |
56 | do_printk: \ | ||
57 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ | ||
58 | out: ; \ | ||
61 | } while (0) | 59 | } while (0) |
62 | 60 | ||
63 | 61 | ||
64 | #define dynamic_dev_dbg(dev, fmt, ...) do { \ | 62 | #define dynamic_dev_dbg(dev, fmt, ...) do { \ |
63 | __label__ do_printk; \ | ||
64 | __label__ out; \ | ||
65 | static struct _ddebug descriptor \ | 65 | static struct _ddebug descriptor \ |
66 | __used \ | 66 | __used \ |
67 | __attribute__((section("__verbose"), aligned(8))) = \ | 67 | __attribute__((section("__verbose"), aligned(8))) = \ |
68 | { KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \ | 68 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
69 | DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \ | 69 | _DPRINTK_FLAGS_DEFAULT }; \ |
70 | if (__dynamic_dbg_enabled(descriptor)) \ | 70 | JUMP_LABEL(&descriptor.enabled, do_printk); \ |
71 | dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ | 71 | goto out; \ |
72 | do_printk: \ | ||
73 | dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ | ||
74 | out: ; \ | ||
72 | } while (0) | 75 | } while (0) |
73 | 76 | ||
74 | #else | 77 | #else |
@@ -80,7 +83,7 @@ static inline int ddebug_remove_module(const char *mod) | |||
80 | 83 | ||
81 | #define dynamic_pr_debug(fmt, ...) \ | 84 | #define dynamic_pr_debug(fmt, ...) \ |
82 | do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) | 85 | do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) |
83 | #define dynamic_dev_dbg(dev, format, ...) \ | 86 | #define dynamic_dev_dbg(dev, fmt, ...) \ |
84 | do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) | 87 | do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) |
85 | #endif | 88 | #endif |
86 | 89 | ||
diff --git a/include/linux/early_res.h b/include/linux/early_res.h deleted file mode 100644 index 29c09f57a13c..000000000000 --- a/include/linux/early_res.h +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | #ifndef _LINUX_EARLY_RES_H | ||
2 | #define _LINUX_EARLY_RES_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | extern void reserve_early(u64 start, u64 end, char *name); | ||
6 | extern void reserve_early_overlap_ok(u64 start, u64 end, char *name); | ||
7 | extern void free_early(u64 start, u64 end); | ||
8 | void free_early_partial(u64 start, u64 end); | ||
9 | extern void early_res_to_bootmem(u64 start, u64 end); | ||
10 | |||
11 | void reserve_early_without_check(u64 start, u64 end, char *name); | ||
12 | u64 find_early_area(u64 ei_start, u64 ei_last, u64 start, u64 end, | ||
13 | u64 size, u64 align); | ||
14 | u64 find_early_area_size(u64 ei_start, u64 ei_last, u64 start, | ||
15 | u64 *sizep, u64 align); | ||
16 | u64 find_fw_memmap_area(u64 start, u64 end, u64 size, u64 align); | ||
17 | u64 get_max_mapped(void); | ||
18 | #include <linux/range.h> | ||
19 | int get_free_all_memory_range(struct range **rangep, int nodeid); | ||
20 | |||
21 | #endif /* __KERNEL__ */ | ||
22 | |||
23 | #endif /* _LINUX_EARLY_RES_H */ | ||
diff --git a/include/linux/edac.h b/include/linux/edac.h index 7cf92e8a4196..36c66443bdfd 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define _LINUX_EDAC_H_ | 13 | #define _LINUX_EDAC_H_ |
14 | 14 | ||
15 | #include <asm/atomic.h> | 15 | #include <asm/atomic.h> |
16 | #include <linux/sysdev.h> | ||
16 | 17 | ||
17 | #define EDAC_OPSTATE_INVAL -1 | 18 | #define EDAC_OPSTATE_INVAL -1 |
18 | #define EDAC_OPSTATE_POLL 0 | 19 | #define EDAC_OPSTATE_POLL 0 |
@@ -22,9 +23,12 @@ | |||
22 | extern int edac_op_state; | 23 | extern int edac_op_state; |
23 | extern int edac_err_assert; | 24 | extern int edac_err_assert; |
24 | extern atomic_t edac_handlers; | 25 | extern atomic_t edac_handlers; |
26 | extern struct sysdev_class edac_class; | ||
25 | 27 | ||
26 | extern int edac_handler_set(void); | 28 | extern int edac_handler_set(void); |
27 | extern void edac_atomic_assert_error(void); | 29 | extern void edac_atomic_assert_error(void); |
30 | extern struct sysdev_class *edac_get_sysfs_class(void); | ||
31 | extern void edac_put_sysfs_class(void); | ||
28 | 32 | ||
29 | static inline void opstate_init(void) | 33 | static inline void opstate_init(void) |
30 | { | 34 | { |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 2308fbb4523a..f16a01081e15 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
@@ -71,7 +71,7 @@ static inline int is_zero_ether_addr(const u8 *addr) | |||
71 | */ | 71 | */ |
72 | static inline int is_multicast_ether_addr(const u8 *addr) | 72 | static inline int is_multicast_ether_addr(const u8 *addr) |
73 | { | 73 | { |
74 | return (0x01 & addr[0]); | 74 | return 0x01 & addr[0]; |
75 | } | 75 | } |
76 | 76 | ||
77 | /** | 77 | /** |
@@ -82,7 +82,7 @@ static inline int is_multicast_ether_addr(const u8 *addr) | |||
82 | */ | 82 | */ |
83 | static inline int is_local_ether_addr(const u8 *addr) | 83 | static inline int is_local_ether_addr(const u8 *addr) |
84 | { | 84 | { |
85 | return (0x02 & addr[0]); | 85 | return 0x02 & addr[0]; |
86 | } | 86 | } |
87 | 87 | ||
88 | /** | 88 | /** |
@@ -237,13 +237,29 @@ static inline bool is_etherdev_addr(const struct net_device *dev, | |||
237 | * entry points. | 237 | * entry points. |
238 | */ | 238 | */ |
239 | 239 | ||
240 | static inline int compare_ether_header(const void *a, const void *b) | 240 | static inline unsigned long compare_ether_header(const void *a, const void *b) |
241 | { | 241 | { |
242 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 | ||
243 | unsigned long fold; | ||
244 | |||
245 | /* | ||
246 | * We want to compare 14 bytes: | ||
247 | * [a0 ... a13] ^ [b0 ... b13] | ||
248 | * Use two long XOR, ORed together, with an overlap of two bytes. | ||
249 | * [a0 a1 a2 a3 a4 a5 a6 a7 ] ^ [b0 b1 b2 b3 b4 b5 b6 b7 ] | | ||
250 | * [a6 a7 a8 a9 a10 a11 a12 a13] ^ [b6 b7 b8 b9 b10 b11 b12 b13] | ||
251 | * This means the [a6 a7] ^ [b6 b7] part is done two times. | ||
252 | */ | ||
253 | fold = *(unsigned long *)a ^ *(unsigned long *)b; | ||
254 | fold |= *(unsigned long *)(a + 6) ^ *(unsigned long *)(b + 6); | ||
255 | return fold; | ||
256 | #else | ||
242 | u32 *a32 = (u32 *)((u8 *)a + 2); | 257 | u32 *a32 = (u32 *)((u8 *)a + 2); |
243 | u32 *b32 = (u32 *)((u8 *)b + 2); | 258 | u32 *b32 = (u32 *)((u8 *)b + 2); |
244 | 259 | ||
245 | return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) | | 260 | return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) | |
246 | (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]); | 261 | (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]); |
262 | #endif | ||
247 | } | 263 | } |
248 | 264 | ||
249 | #endif /* _LINUX_ETHERDEVICE_H */ | 265 | #endif /* _LINUX_ETHERDEVICE_H */ |
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index 991269e5b152..6628a507fd3b 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #define _LINUX_ETHTOOL_H | 14 | #define _LINUX_ETHTOOL_H |
15 | 15 | ||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/if_ether.h> | ||
17 | 18 | ||
18 | /* This should work for both 32 and 64 bit userland. */ | 19 | /* This should work for both 32 and 64 bit userland. */ |
19 | struct ethtool_cmd { | 20 | struct ethtool_cmd { |
@@ -308,15 +309,28 @@ struct ethtool_perm_addr { | |||
308 | * flag differs from the read-only value. | 309 | * flag differs from the read-only value. |
309 | */ | 310 | */ |
310 | enum ethtool_flags { | 311 | enum ethtool_flags { |
312 | ETH_FLAG_TXVLAN = (1 << 7), /* TX VLAN offload enabled */ | ||
313 | ETH_FLAG_RXVLAN = (1 << 8), /* RX VLAN offload enabled */ | ||
311 | ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ | 314 | ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ |
312 | ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ | 315 | ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ |
313 | ETH_FLAG_RXHASH = (1 << 28), | 316 | ETH_FLAG_RXHASH = (1 << 28), |
314 | }; | 317 | }; |
315 | 318 | ||
316 | /* The following structures are for supporting RX network flow | 319 | /* The following structures are for supporting RX network flow |
317 | * classification configuration. Note, all multibyte fields, e.g., | 320 | * classification and RX n-tuple configuration. Note, all multibyte |
318 | * ip4src, ip4dst, psrc, pdst, spi, etc. are expected to be in network | 321 | * fields, e.g., ip4src, ip4dst, psrc, pdst, spi, etc. are expected to |
319 | * byte order. | 322 | * be in network byte order. |
323 | */ | ||
324 | |||
325 | /** | ||
326 | * struct ethtool_tcpip4_spec - flow specification for TCP/IPv4 etc. | ||
327 | * @ip4src: Source host | ||
328 | * @ip4dst: Destination host | ||
329 | * @psrc: Source port | ||
330 | * @pdst: Destination port | ||
331 | * @tos: Type-of-service | ||
332 | * | ||
333 | * This can be used to specify a TCP/IPv4, UDP/IPv4 or SCTP/IPv4 flow. | ||
320 | */ | 334 | */ |
321 | struct ethtool_tcpip4_spec { | 335 | struct ethtool_tcpip4_spec { |
322 | __be32 ip4src; | 336 | __be32 ip4src; |
@@ -326,6 +340,15 @@ struct ethtool_tcpip4_spec { | |||
326 | __u8 tos; | 340 | __u8 tos; |
327 | }; | 341 | }; |
328 | 342 | ||
343 | /** | ||
344 | * struct ethtool_ah_espip4_spec - flow specification for IPsec/IPv4 | ||
345 | * @ip4src: Source host | ||
346 | * @ip4dst: Destination host | ||
347 | * @spi: Security parameters index | ||
348 | * @tos: Type-of-service | ||
349 | * | ||
350 | * This can be used to specify an IPsec transport or tunnel over IPv4. | ||
351 | */ | ||
329 | struct ethtool_ah_espip4_spec { | 352 | struct ethtool_ah_espip4_spec { |
330 | __be32 ip4src; | 353 | __be32 ip4src; |
331 | __be32 ip4dst; | 354 | __be32 ip4dst; |
@@ -333,21 +356,17 @@ struct ethtool_ah_espip4_spec { | |||
333 | __u8 tos; | 356 | __u8 tos; |
334 | }; | 357 | }; |
335 | 358 | ||
336 | struct ethtool_rawip4_spec { | ||
337 | __be32 ip4src; | ||
338 | __be32 ip4dst; | ||
339 | __u8 hdata[64]; | ||
340 | }; | ||
341 | |||
342 | struct ethtool_ether_spec { | ||
343 | __be16 ether_type; | ||
344 | __u8 frame_size; | ||
345 | __u8 eframe[16]; | ||
346 | }; | ||
347 | |||
348 | #define ETH_RX_NFC_IP4 1 | 359 | #define ETH_RX_NFC_IP4 1 |
349 | #define ETH_RX_NFC_IP6 2 | ||
350 | 360 | ||
361 | /** | ||
362 | * struct ethtool_usrip4_spec - general flow specification for IPv4 | ||
363 | * @ip4src: Source host | ||
364 | * @ip4dst: Destination host | ||
365 | * @l4_4_bytes: First 4 bytes of transport (layer 4) header | ||
366 | * @tos: Type-of-service | ||
367 | * @ip_ver: Value must be %ETH_RX_NFC_IP4; mask must be 0 | ||
368 | * @proto: Transport protocol number; mask must be 0 | ||
369 | */ | ||
351 | struct ethtool_usrip4_spec { | 370 | struct ethtool_usrip4_spec { |
352 | __be32 ip4src; | 371 | __be32 ip4src; |
353 | __be32 ip4dst; | 372 | __be32 ip4dst; |
@@ -357,6 +376,15 @@ struct ethtool_usrip4_spec { | |||
357 | __u8 proto; | 376 | __u8 proto; |
358 | }; | 377 | }; |
359 | 378 | ||
379 | /** | ||
380 | * struct ethtool_rx_flow_spec - specification for RX flow filter | ||
381 | * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW | ||
382 | * @h_u: Flow fields to match (dependent on @flow_type) | ||
383 | * @m_u: Masks for flow field bits to be ignored | ||
384 | * @ring_cookie: RX ring/queue index to deliver to, or %RX_CLS_FLOW_DISC | ||
385 | * if packets should be discarded | ||
386 | * @location: Index of filter in hardware table | ||
387 | */ | ||
360 | struct ethtool_rx_flow_spec { | 388 | struct ethtool_rx_flow_spec { |
361 | __u32 flow_type; | 389 | __u32 flow_type; |
362 | union { | 390 | union { |
@@ -365,36 +393,91 @@ struct ethtool_rx_flow_spec { | |||
365 | struct ethtool_tcpip4_spec sctp_ip4_spec; | 393 | struct ethtool_tcpip4_spec sctp_ip4_spec; |
366 | struct ethtool_ah_espip4_spec ah_ip4_spec; | 394 | struct ethtool_ah_espip4_spec ah_ip4_spec; |
367 | struct ethtool_ah_espip4_spec esp_ip4_spec; | 395 | struct ethtool_ah_espip4_spec esp_ip4_spec; |
368 | struct ethtool_rawip4_spec raw_ip4_spec; | ||
369 | struct ethtool_ether_spec ether_spec; | ||
370 | struct ethtool_usrip4_spec usr_ip4_spec; | 396 | struct ethtool_usrip4_spec usr_ip4_spec; |
371 | __u8 hdata[64]; | 397 | struct ethhdr ether_spec; |
372 | } h_u, m_u; /* entry, mask */ | 398 | __u8 hdata[72]; |
399 | } h_u, m_u; | ||
373 | __u64 ring_cookie; | 400 | __u64 ring_cookie; |
374 | __u32 location; | 401 | __u32 location; |
375 | }; | 402 | }; |
376 | 403 | ||
404 | /** | ||
405 | * struct ethtool_rxnfc - command to get or set RX flow classification rules | ||
406 | * @cmd: Specific command number - %ETHTOOL_GRXFH, %ETHTOOL_SRXFH, | ||
407 | * %ETHTOOL_GRXRINGS, %ETHTOOL_GRXCLSRLCNT, %ETHTOOL_GRXCLSRULE, | ||
408 | * %ETHTOOL_GRXCLSRLALL, %ETHTOOL_SRXCLSRLDEL or %ETHTOOL_SRXCLSRLINS | ||
409 | * @flow_type: Type of flow to be affected, e.g. %TCP_V4_FLOW | ||
410 | * @data: Command-dependent value | ||
411 | * @fs: Flow filter specification | ||
412 | * @rule_cnt: Number of rules to be affected | ||
413 | * @rule_locs: Array of valid rule indices | ||
414 | * | ||
415 | * For %ETHTOOL_GRXFH and %ETHTOOL_SRXFH, @data is a bitmask indicating | ||
416 | * the fields included in the flow hash, e.g. %RXH_IP_SRC. The following | ||
417 | * structure fields must not be used. | ||
418 | * | ||
419 | * For %ETHTOOL_GRXRINGS, @data is set to the number of RX rings/queues | ||
420 | * on return. | ||
421 | * | ||
422 | * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined | ||
423 | * rules on return. | ||
424 | * | ||
425 | * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the index of an | ||
426 | * existing filter rule on entry and @fs contains the rule on return. | ||
427 | * | ||
428 | * For %ETHTOOL_GRXCLSRLALL, @rule_cnt specifies the array size of the | ||
429 | * user buffer for @rule_locs on entry. On return, @data is the size | ||
430 | * of the filter table and @rule_locs contains the indices of the | ||
431 | * defined rules. | ||
432 | * | ||
433 | * For %ETHTOOL_SRXCLSRLINS, @fs specifies the filter rule to add or | ||
434 | * update. @fs.@location specifies the index to use and must not be | ||
435 | * ignored. | ||
436 | * | ||
437 | * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the index of an | ||
438 | * existing filter rule on entry. | ||
439 | * | ||
440 | * Implementation of indexed classification rules generally requires a | ||
441 | * TCAM. | ||
442 | */ | ||
377 | struct ethtool_rxnfc { | 443 | struct ethtool_rxnfc { |
378 | __u32 cmd; | 444 | __u32 cmd; |
379 | __u32 flow_type; | 445 | __u32 flow_type; |
380 | /* The rx flow hash value or the rule DB size */ | ||
381 | __u64 data; | 446 | __u64 data; |
382 | /* The following fields are not valid and must not be used for | ||
383 | * the ETHTOOL_{G,X}RXFH commands. */ | ||
384 | struct ethtool_rx_flow_spec fs; | 447 | struct ethtool_rx_flow_spec fs; |
385 | __u32 rule_cnt; | 448 | __u32 rule_cnt; |
386 | __u32 rule_locs[0]; | 449 | __u32 rule_locs[0]; |
387 | }; | 450 | }; |
388 | 451 | ||
452 | /** | ||
453 | * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection | ||
454 | * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR | ||
455 | * @size: On entry, the array size of the user buffer. On return from | ||
456 | * %ETHTOOL_GRXFHINDIR, the array size of the hardware indirection table. | ||
457 | * @ring_index: RX ring/queue index for each hash value | ||
458 | */ | ||
389 | struct ethtool_rxfh_indir { | 459 | struct ethtool_rxfh_indir { |
390 | __u32 cmd; | 460 | __u32 cmd; |
391 | /* On entry, this is the array size of the user buffer. On | ||
392 | * return from ETHTOOL_GRXFHINDIR, this is the array size of | ||
393 | * the hardware indirection table. */ | ||
394 | __u32 size; | 461 | __u32 size; |
395 | __u32 ring_index[0]; /* ring/queue index for each hash value */ | 462 | __u32 ring_index[0]; |
396 | }; | 463 | }; |
397 | 464 | ||
465 | /** | ||
466 | * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter | ||
467 | * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW | ||
468 | * @h_u: Flow field values to match (dependent on @flow_type) | ||
469 | * @m_u: Masks for flow field value bits to be ignored | ||
470 | * @vlan_tag: VLAN tag to match | ||
471 | * @vlan_tag_mask: Mask for VLAN tag bits to be ignored | ||
472 | * @data: Driver-dependent data to match | ||
473 | * @data_mask: Mask for driver-dependent data bits to be ignored | ||
474 | * @action: RX ring/queue index to deliver to (non-negative) or other action | ||
475 | * (negative, e.g. %ETHTOOL_RXNTUPLE_ACTION_DROP) | ||
476 | * | ||
477 | * For flow types %TCP_V4_FLOW, %UDP_V4_FLOW and %SCTP_V4_FLOW, where | ||
478 | * a field value and mask are both zero this is treated as if all mask | ||
479 | * bits are set i.e. the field is ignored. | ||
480 | */ | ||
398 | struct ethtool_rx_ntuple_flow_spec { | 481 | struct ethtool_rx_ntuple_flow_spec { |
399 | __u32 flow_type; | 482 | __u32 flow_type; |
400 | union { | 483 | union { |
@@ -403,22 +486,26 @@ struct ethtool_rx_ntuple_flow_spec { | |||
403 | struct ethtool_tcpip4_spec sctp_ip4_spec; | 486 | struct ethtool_tcpip4_spec sctp_ip4_spec; |
404 | struct ethtool_ah_espip4_spec ah_ip4_spec; | 487 | struct ethtool_ah_espip4_spec ah_ip4_spec; |
405 | struct ethtool_ah_espip4_spec esp_ip4_spec; | 488 | struct ethtool_ah_espip4_spec esp_ip4_spec; |
406 | struct ethtool_rawip4_spec raw_ip4_spec; | ||
407 | struct ethtool_ether_spec ether_spec; | ||
408 | struct ethtool_usrip4_spec usr_ip4_spec; | 489 | struct ethtool_usrip4_spec usr_ip4_spec; |
409 | __u8 hdata[64]; | 490 | struct ethhdr ether_spec; |
410 | } h_u, m_u; /* entry, mask */ | 491 | __u8 hdata[72]; |
492 | } h_u, m_u; | ||
411 | 493 | ||
412 | __u16 vlan_tag; | 494 | __u16 vlan_tag; |
413 | __u16 vlan_tag_mask; | 495 | __u16 vlan_tag_mask; |
414 | __u64 data; /* user-defined flow spec data */ | 496 | __u64 data; |
415 | __u64 data_mask; /* user-defined flow spec mask */ | 497 | __u64 data_mask; |
416 | 498 | ||
417 | /* signed to distinguish between queue and actions (DROP) */ | ||
418 | __s32 action; | 499 | __s32 action; |
419 | #define ETHTOOL_RXNTUPLE_ACTION_DROP -1 | 500 | #define ETHTOOL_RXNTUPLE_ACTION_DROP (-1) /* drop packet */ |
501 | #define ETHTOOL_RXNTUPLE_ACTION_CLEAR (-2) /* clear filter */ | ||
420 | }; | 502 | }; |
421 | 503 | ||
504 | /** | ||
505 | * struct ethtool_rx_ntuple - command to set or clear RX flow filter | ||
506 | * @cmd: Command number - %ETHTOOL_SRXNTUPLE | ||
507 | * @fs: Flow filter specification | ||
508 | */ | ||
422 | struct ethtool_rx_ntuple { | 509 | struct ethtool_rx_ntuple { |
423 | __u32 cmd; | 510 | __u32 cmd; |
424 | struct ethtool_rx_ntuple_flow_spec fs; | 511 | struct ethtool_rx_ntuple_flow_spec fs; |
@@ -759,22 +846,23 @@ struct ethtool_ops { | |||
759 | #define WAKE_MAGIC (1 << 5) | 846 | #define WAKE_MAGIC (1 << 5) |
760 | #define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ | 847 | #define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ |
761 | 848 | ||
762 | /* L3-L4 network traffic flow types */ | 849 | /* L2-L4 network traffic flow types */ |
763 | #define TCP_V4_FLOW 0x01 | 850 | #define TCP_V4_FLOW 0x01 /* hash or spec (tcp_ip4_spec) */ |
764 | #define UDP_V4_FLOW 0x02 | 851 | #define UDP_V4_FLOW 0x02 /* hash or spec (udp_ip4_spec) */ |
765 | #define SCTP_V4_FLOW 0x03 | 852 | #define SCTP_V4_FLOW 0x03 /* hash or spec (sctp_ip4_spec) */ |
766 | #define AH_ESP_V4_FLOW 0x04 | 853 | #define AH_ESP_V4_FLOW 0x04 /* hash only */ |
767 | #define TCP_V6_FLOW 0x05 | 854 | #define TCP_V6_FLOW 0x05 /* hash only */ |
768 | #define UDP_V6_FLOW 0x06 | 855 | #define UDP_V6_FLOW 0x06 /* hash only */ |
769 | #define SCTP_V6_FLOW 0x07 | 856 | #define SCTP_V6_FLOW 0x07 /* hash only */ |
770 | #define AH_ESP_V6_FLOW 0x08 | 857 | #define AH_ESP_V6_FLOW 0x08 /* hash only */ |
771 | #define AH_V4_FLOW 0x09 | 858 | #define AH_V4_FLOW 0x09 /* hash or spec (ah_ip4_spec) */ |
772 | #define ESP_V4_FLOW 0x0a | 859 | #define ESP_V4_FLOW 0x0a /* hash or spec (esp_ip4_spec) */ |
773 | #define AH_V6_FLOW 0x0b | 860 | #define AH_V6_FLOW 0x0b /* hash only */ |
774 | #define ESP_V6_FLOW 0x0c | 861 | #define ESP_V6_FLOW 0x0c /* hash only */ |
775 | #define IP_USER_FLOW 0x0d | 862 | #define IP_USER_FLOW 0x0d /* spec only (usr_ip4_spec) */ |
776 | #define IPV4_FLOW 0x10 | 863 | #define IPV4_FLOW 0x10 /* hash only */ |
777 | #define IPV6_FLOW 0x11 | 864 | #define IPV6_FLOW 0x11 /* hash only */ |
865 | #define ETHER_FLOW 0x12 /* spec only (ether_spec) */ | ||
778 | 866 | ||
779 | /* L3-L4 network traffic flow hash options */ | 867 | /* L3-L4 network traffic flow hash options */ |
780 | #define RXH_L2DA (1 << 1) | 868 | #define RXH_L2DA (1 << 1) |
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index a9cd507f8cd2..28028988c862 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h | |||
@@ -67,6 +67,19 @@ enum fid_type { | |||
67 | * 32 bit parent block number, 32 bit parent generation number | 67 | * 32 bit parent block number, 32 bit parent generation number |
68 | */ | 68 | */ |
69 | FILEID_UDF_WITH_PARENT = 0x52, | 69 | FILEID_UDF_WITH_PARENT = 0x52, |
70 | |||
71 | /* | ||
72 | * 64 bit checkpoint number, 64 bit inode number, | ||
73 | * 32 bit generation number. | ||
74 | */ | ||
75 | FILEID_NILFS_WITHOUT_PARENT = 0x61, | ||
76 | |||
77 | /* | ||
78 | * 64 bit checkpoint number, 64 bit inode number, | ||
79 | * 32 bit generation number, 32 bit parent generation. | ||
80 | * 64 bit parent inode number. | ||
81 | */ | ||
82 | FILEID_NILFS_WITH_PARENT = 0x62, | ||
70 | }; | 83 | }; |
71 | 84 | ||
72 | struct fid { | 85 | struct fid { |
diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h index 63531a6b4d2a..0f0121467fc4 100644 --- a/include/linux/fanotify.h +++ b/include/linux/fanotify.h | |||
@@ -6,18 +6,19 @@ | |||
6 | /* the following events that user-space can register for */ | 6 | /* the following events that user-space can register for */ |
7 | #define FAN_ACCESS 0x00000001 /* File was accessed */ | 7 | #define FAN_ACCESS 0x00000001 /* File was accessed */ |
8 | #define FAN_MODIFY 0x00000002 /* File was modified */ | 8 | #define FAN_MODIFY 0x00000002 /* File was modified */ |
9 | #define FAN_CLOSE_WRITE 0x00000008 /* Unwrittable file closed */ | 9 | #define FAN_CLOSE_WRITE 0x00000008 /* Writtable file closed */ |
10 | #define FAN_CLOSE_NOWRITE 0x00000010 /* Writtable file closed */ | 10 | #define FAN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed */ |
11 | #define FAN_OPEN 0x00000020 /* File was opened */ | 11 | #define FAN_OPEN 0x00000020 /* File was opened */ |
12 | 12 | ||
13 | #define FAN_EVENT_ON_CHILD 0x08000000 /* interested in child events */ | ||
14 | |||
15 | /* FIXME currently Q's have no limit.... */ | ||
16 | #define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ | 13 | #define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ |
17 | 14 | ||
18 | #define FAN_OPEN_PERM 0x00010000 /* File open in perm check */ | 15 | #define FAN_OPEN_PERM 0x00010000 /* File open in perm check */ |
19 | #define FAN_ACCESS_PERM 0x00020000 /* File accessed in perm check */ | 16 | #define FAN_ACCESS_PERM 0x00020000 /* File accessed in perm check */ |
20 | 17 | ||
18 | #define FAN_ONDIR 0x40000000 /* event occurred against dir */ | ||
19 | |||
20 | #define FAN_EVENT_ON_CHILD 0x08000000 /* interested in child events */ | ||
21 | |||
21 | /* helper events */ | 22 | /* helper events */ |
22 | #define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE) /* close */ | 23 | #define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE) /* close */ |
23 | 24 | ||
@@ -25,7 +26,19 @@ | |||
25 | #define FAN_CLOEXEC 0x00000001 | 26 | #define FAN_CLOEXEC 0x00000001 |
26 | #define FAN_NONBLOCK 0x00000002 | 27 | #define FAN_NONBLOCK 0x00000002 |
27 | 28 | ||
28 | #define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK) | 29 | /* These are NOT bitwise flags. Both bits are used togther. */ |
30 | #define FAN_CLASS_NOTIF 0x00000000 | ||
31 | #define FAN_CLASS_CONTENT 0x00000004 | ||
32 | #define FAN_CLASS_PRE_CONTENT 0x00000008 | ||
33 | #define FAN_ALL_CLASS_BITS (FAN_CLASS_NOTIF | FAN_CLASS_CONTENT | \ | ||
34 | FAN_CLASS_PRE_CONTENT) | ||
35 | |||
36 | #define FAN_UNLIMITED_QUEUE 0x00000010 | ||
37 | #define FAN_UNLIMITED_MARKS 0x00000020 | ||
38 | |||
39 | #define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | \ | ||
40 | FAN_ALL_CLASS_BITS | FAN_UNLIMITED_QUEUE |\ | ||
41 | FAN_UNLIMITED_MARKS) | ||
29 | 42 | ||
30 | /* flags used for fanotify_modify_mark() */ | 43 | /* flags used for fanotify_modify_mark() */ |
31 | #define FAN_MARK_ADD 0x00000001 | 44 | #define FAN_MARK_ADD 0x00000001 |
@@ -36,6 +49,10 @@ | |||
36 | #define FAN_MARK_IGNORED_MASK 0x00000020 | 49 | #define FAN_MARK_IGNORED_MASK 0x00000020 |
37 | #define FAN_MARK_IGNORED_SURV_MODIFY 0x00000040 | 50 | #define FAN_MARK_IGNORED_SURV_MODIFY 0x00000040 |
38 | #define FAN_MARK_FLUSH 0x00000080 | 51 | #define FAN_MARK_FLUSH 0x00000080 |
52 | #ifdef __KERNEL__ | ||
53 | /* not valid from userspace, only kernel internal */ | ||
54 | #define FAN_MARK_ONDIR 0x00000100 | ||
55 | #endif | ||
39 | 56 | ||
40 | #define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD |\ | 57 | #define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD |\ |
41 | FAN_MARK_REMOVE |\ | 58 | FAN_MARK_REMOVE |\ |
@@ -43,7 +60,8 @@ | |||
43 | FAN_MARK_ONLYDIR |\ | 60 | FAN_MARK_ONLYDIR |\ |
44 | FAN_MARK_MOUNT |\ | 61 | FAN_MARK_MOUNT |\ |
45 | FAN_MARK_IGNORED_MASK |\ | 62 | FAN_MARK_IGNORED_MASK |\ |
46 | FAN_MARK_IGNORED_SURV_MODIFY) | 63 | FAN_MARK_IGNORED_SURV_MODIFY |\ |
64 | FAN_MARK_FLUSH) | ||
47 | 65 | ||
48 | /* | 66 | /* |
49 | * All of the events - we build the list by hand so that we can add flags in | 67 | * All of the events - we build the list by hand so that we can add flags in |
@@ -70,10 +88,10 @@ | |||
70 | struct fanotify_event_metadata { | 88 | struct fanotify_event_metadata { |
71 | __u32 event_len; | 89 | __u32 event_len; |
72 | __u32 vers; | 90 | __u32 vers; |
73 | __u64 mask; | 91 | __aligned_u64 mask; |
74 | __s32 fd; | 92 | __s32 fd; |
75 | __s32 pid; | 93 | __s32 pid; |
76 | } __attribute__ ((packed)); | 94 | }; |
77 | 95 | ||
78 | struct fanotify_response { | 96 | struct fanotify_response { |
79 | __s32 fd; | 97 | __s32 fd; |
diff --git a/include/linux/fb.h b/include/linux/fb.h index f0268deca658..7fca3dc4e475 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
@@ -931,6 +931,8 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | |||
931 | #define fb_writel sbus_writel | 931 | #define fb_writel sbus_writel |
932 | #define fb_writeq sbus_writeq | 932 | #define fb_writeq sbus_writeq |
933 | #define fb_memset sbus_memset_io | 933 | #define fb_memset sbus_memset_io |
934 | #define fb_memcpy_fromfb sbus_memcpy_fromio | ||
935 | #define fb_memcpy_tofb sbus_memcpy_toio | ||
934 | 936 | ||
935 | #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || defined(__sh__) || defined(__powerpc__) || defined(__avr32__) || defined(__bfin__) | 937 | #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || defined(__sh__) || defined(__powerpc__) || defined(__avr32__) || defined(__bfin__) |
936 | 938 | ||
@@ -943,6 +945,8 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | |||
943 | #define fb_writel __raw_writel | 945 | #define fb_writel __raw_writel |
944 | #define fb_writeq __raw_writeq | 946 | #define fb_writeq __raw_writeq |
945 | #define fb_memset memset_io | 947 | #define fb_memset memset_io |
948 | #define fb_memcpy_fromfb memcpy_fromio | ||
949 | #define fb_memcpy_tofb memcpy_toio | ||
946 | 950 | ||
947 | #else | 951 | #else |
948 | 952 | ||
@@ -955,6 +959,8 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | |||
955 | #define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b)) | 959 | #define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b)) |
956 | #define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b)) | 960 | #define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b)) |
957 | #define fb_memset memset | 961 | #define fb_memset memset |
962 | #define fb_memcpy_fromfb memcpy | ||
963 | #define fb_memcpy_tofb memcpy | ||
958 | 964 | ||
959 | #endif | 965 | #endif |
960 | 966 | ||
diff --git a/include/linux/fdreg.h b/include/linux/fdreg.h index c2eeb63b72db..61ce64169004 100644 --- a/include/linux/fdreg.h +++ b/include/linux/fdreg.h | |||
@@ -89,7 +89,7 @@ | |||
89 | /* the following commands are new in the 82078. They are not used in the | 89 | /* the following commands are new in the 82078. They are not used in the |
90 | * floppy driver, except the first three. These commands may be useful for apps | 90 | * floppy driver, except the first three. These commands may be useful for apps |
91 | * which use the FDRAWCMD interface. For doc, get the 82078 spec sheets at | 91 | * which use the FDRAWCMD interface. For doc, get the 82078 spec sheets at |
92 | * http://www-techdoc.intel.com/docs/periph/fd_contr/datasheets/ */ | 92 | * http://www.intel.com/design/archives/periphrl/docs/29046803.htm */ |
93 | 93 | ||
94 | #define FD_PARTID 0x18 /* part id ("extended" version cmd) */ | 94 | #define FD_PARTID 0x18 /* part id ("extended" version cmd) */ |
95 | #define FD_SAVE 0x2e /* save fdc regs for later restore */ | 95 | #define FD_SAVE 0x2e /* save fdc regs for later restore */ |
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index f59ed297b661..133c0ba25e30 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h | |||
@@ -31,7 +31,7 @@ struct embedded_fd_set { | |||
31 | 31 | ||
32 | struct fdtable { | 32 | struct fdtable { |
33 | unsigned int max_fds; | 33 | unsigned int max_fds; |
34 | struct file ** fd; /* current fd array */ | 34 | struct file __rcu **fd; /* current fd array */ |
35 | fd_set *close_on_exec; | 35 | fd_set *close_on_exec; |
36 | fd_set *open_fds; | 36 | fd_set *open_fds; |
37 | struct rcu_head rcu; | 37 | struct rcu_head rcu; |
@@ -46,7 +46,7 @@ struct files_struct { | |||
46 | * read mostly part | 46 | * read mostly part |
47 | */ | 47 | */ |
48 | atomic_t count; | 48 | atomic_t count; |
49 | struct fdtable *fdt; | 49 | struct fdtable __rcu *fdt; |
50 | struct fdtable fdtab; | 50 | struct fdtable fdtab; |
51 | /* | 51 | /* |
52 | * written part on a separate cache line in SMP | 52 | * written part on a separate cache line in SMP |
@@ -55,7 +55,7 @@ struct files_struct { | |||
55 | int next_fd; | 55 | int next_fd; |
56 | struct embedded_fd_set close_on_exec_init; | 56 | struct embedded_fd_set close_on_exec_init; |
57 | struct embedded_fd_set open_fds_init; | 57 | struct embedded_fd_set open_fds_init; |
58 | struct file * fd_array[NR_OPEN_DEFAULT]; | 58 | struct file __rcu * fd_array[NR_OPEN_DEFAULT]; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | #define rcu_dereference_check_fdtable(files, fdtfd) \ | 61 | #define rcu_dereference_check_fdtable(files, fdtfd) \ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 63d069bd80b7..334d68a17108 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/limits.h> | 9 | #include <linux/limits.h> |
10 | #include <linux/ioctl.h> | 10 | #include <linux/ioctl.h> |
11 | #include <linux/blk_types.h> | 11 | #include <linux/blk_types.h> |
12 | #include <linux/types.h> | ||
12 | 13 | ||
13 | /* | 14 | /* |
14 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change | 15 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change |
@@ -32,11 +33,17 @@ | |||
32 | #define SEEK_END 2 /* seek relative to end of file */ | 33 | #define SEEK_END 2 /* seek relative to end of file */ |
33 | #define SEEK_MAX SEEK_END | 34 | #define SEEK_MAX SEEK_END |
34 | 35 | ||
36 | struct fstrim_range { | ||
37 | uint64_t start; | ||
38 | uint64_t len; | ||
39 | uint64_t minlen; | ||
40 | }; | ||
41 | |||
35 | /* And dynamically-tunable limits and defaults: */ | 42 | /* And dynamically-tunable limits and defaults: */ |
36 | struct files_stat_struct { | 43 | struct files_stat_struct { |
37 | int nr_files; /* read only */ | 44 | unsigned long nr_files; /* read only */ |
38 | int nr_free_files; /* read only */ | 45 | unsigned long nr_free_files; /* read only */ |
39 | int max_files; /* tunable */ | 46 | unsigned long max_files; /* tunable */ |
40 | }; | 47 | }; |
41 | 48 | ||
42 | struct inodes_stat_t { | 49 | struct inodes_stat_t { |
@@ -92,6 +99,9 @@ struct inodes_stat_t { | |||
92 | /* Expect random access pattern */ | 99 | /* Expect random access pattern */ |
93 | #define FMODE_RANDOM ((__force fmode_t)0x1000) | 100 | #define FMODE_RANDOM ((__force fmode_t)0x1000) |
94 | 101 | ||
102 | /* File is huge (eg. /dev/kmem): treat loff_t as unsigned */ | ||
103 | #define FMODE_UNSIGNED_OFFSET ((__force fmode_t)0x2000) | ||
104 | |||
95 | /* File was opened by fanotify and shouldn't generate fanotify events */ | 105 | /* File was opened by fanotify and shouldn't generate fanotify events */ |
96 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) | 106 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) |
97 | 107 | ||
@@ -135,12 +145,12 @@ struct inodes_stat_t { | |||
135 | * immediately after submission. The write equivalent | 145 | * immediately after submission. The write equivalent |
136 | * of READ_SYNC. | 146 | * of READ_SYNC. |
137 | * WRITE_ODIRECT_PLUG Special case write for O_DIRECT only. | 147 | * WRITE_ODIRECT_PLUG Special case write for O_DIRECT only. |
138 | * WRITE_BARRIER Like WRITE_SYNC, but tells the block layer that all | 148 | * WRITE_FLUSH Like WRITE_SYNC but with preceding cache flush. |
139 | * previously submitted writes must be safely on storage | 149 | * WRITE_FUA Like WRITE_SYNC but data is guaranteed to be on |
140 | * before this one is started. Also guarantees that when | 150 | * non-volatile media on completion. |
141 | * this write is complete, it itself is also safely on | 151 | * WRITE_FLUSH_FUA Combination of WRITE_FLUSH and FUA. The IO is preceded |
142 | * storage. Prevents reordering of writes on both sides | 152 | * by a cache flush and data is guaranteed to be on |
143 | * of this IO. | 153 | * non-volatile media on completion. |
144 | * | 154 | * |
145 | */ | 155 | */ |
146 | #define RW_MASK REQ_WRITE | 156 | #define RW_MASK REQ_WRITE |
@@ -156,16 +166,12 @@ struct inodes_stat_t { | |||
156 | #define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG) | 166 | #define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG) |
157 | #define WRITE_ODIRECT_PLUG (WRITE | REQ_SYNC) | 167 | #define WRITE_ODIRECT_PLUG (WRITE | REQ_SYNC) |
158 | #define WRITE_META (WRITE | REQ_META) | 168 | #define WRITE_META (WRITE | REQ_META) |
159 | #define WRITE_BARRIER (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ | 169 | #define WRITE_FLUSH (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ |
160 | REQ_HARDBARRIER) | 170 | REQ_FLUSH) |
161 | 171 | #define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ | |
162 | /* | 172 | REQ_FUA) |
163 | * These aren't really reads or writes, they pass down information about | 173 | #define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ |
164 | * parts of device that are now unused by the file system. | 174 | REQ_FLUSH | REQ_FUA) |
165 | */ | ||
166 | #define DISCARD_NOBARRIER (WRITE | REQ_DISCARD) | ||
167 | #define DISCARD_BARRIER (WRITE | REQ_DISCARD | REQ_HARDBARRIER) | ||
168 | #define DISCARD_SECURE (DISCARD_NOBARRIER | REQ_SECURE) | ||
169 | 175 | ||
170 | #define SEL_IN 1 | 176 | #define SEL_IN 1 |
171 | #define SEL_OUT 2 | 177 | #define SEL_OUT 2 |
@@ -235,6 +241,7 @@ struct inodes_stat_t { | |||
235 | #define S_NOCMTIME 128 /* Do not update file c/mtime */ | 241 | #define S_NOCMTIME 128 /* Do not update file c/mtime */ |
236 | #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ | 242 | #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ |
237 | #define S_PRIVATE 512 /* Inode is fs-internal */ | 243 | #define S_PRIVATE 512 /* Inode is fs-internal */ |
244 | #define S_IMA 1024 /* Inode has an associated IMA struct */ | ||
238 | 245 | ||
239 | /* | 246 | /* |
240 | * Note that nosuid etc flags are inode-specific: setting some file-system | 247 | * Note that nosuid etc flags are inode-specific: setting some file-system |
@@ -269,6 +276,7 @@ struct inodes_stat_t { | |||
269 | #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) | 276 | #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) |
270 | #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) | 277 | #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) |
271 | #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE) | 278 | #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE) |
279 | #define IS_IMA(inode) ((inode)->i_flags & S_IMA) | ||
272 | 280 | ||
273 | /* the read-only stuff doesn't really belong here, but any other place is | 281 | /* the read-only stuff doesn't really belong here, but any other place is |
274 | probably as bad and I don't want to create yet another include file. */ | 282 | probably as bad and I don't want to create yet another include file. */ |
@@ -316,6 +324,7 @@ struct inodes_stat_t { | |||
316 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ | 324 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ |
317 | #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ | 325 | #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ |
318 | #define FITHAW _IOWR('X', 120, int) /* Thaw */ | 326 | #define FITHAW _IOWR('X', 120, int) /* Thaw */ |
327 | #define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */ | ||
319 | 328 | ||
320 | #define FS_IOC_GETFLAGS _IOR('f', 1, long) | 329 | #define FS_IOC_GETFLAGS _IOR('f', 1, long) |
321 | #define FS_IOC_SETFLAGS _IOW('f', 2, long) | 330 | #define FS_IOC_SETFLAGS _IOW('f', 2, long) |
@@ -404,7 +413,7 @@ extern void __init inode_init_early(void); | |||
404 | extern void __init files_init(unsigned long); | 413 | extern void __init files_init(unsigned long); |
405 | 414 | ||
406 | extern struct files_stat_struct files_stat; | 415 | extern struct files_stat_struct files_stat; |
407 | extern int get_max_files(void); | 416 | extern unsigned long get_max_files(void); |
408 | extern int sysctl_nr_open; | 417 | extern int sysctl_nr_open; |
409 | extern struct inodes_stat_t inodes_stat; | 418 | extern struct inodes_stat_t inodes_stat; |
410 | extern int leases_enable, lease_break_time; | 419 | extern int leases_enable, lease_break_time; |
@@ -724,7 +733,8 @@ struct posix_acl; | |||
724 | 733 | ||
725 | struct inode { | 734 | struct inode { |
726 | struct hlist_node i_hash; | 735 | struct hlist_node i_hash; |
727 | struct list_head i_list; /* backing dev IO list */ | 736 | struct list_head i_wb_list; /* backing dev IO list */ |
737 | struct list_head i_lru; /* inode LRU list */ | ||
728 | struct list_head i_sb_list; | 738 | struct list_head i_sb_list; |
729 | struct list_head i_dentry; | 739 | struct list_head i_dentry; |
730 | unsigned long i_ino; | 740 | unsigned long i_ino; |
@@ -776,6 +786,10 @@ struct inode { | |||
776 | 786 | ||
777 | unsigned int i_flags; | 787 | unsigned int i_flags; |
778 | 788 | ||
789 | #ifdef CONFIG_IMA | ||
790 | /* protected by i_lock */ | ||
791 | unsigned int i_readcount; /* struct files open RO */ | ||
792 | #endif | ||
779 | atomic_t i_writecount; | 793 | atomic_t i_writecount; |
780 | #ifdef CONFIG_SECURITY | 794 | #ifdef CONFIG_SECURITY |
781 | void *i_security; | 795 | void *i_security; |
@@ -787,6 +801,11 @@ struct inode { | |||
787 | void *i_private; /* fs or device private pointer */ | 801 | void *i_private; /* fs or device private pointer */ |
788 | }; | 802 | }; |
789 | 803 | ||
804 | static inline int inode_unhashed(struct inode *inode) | ||
805 | { | ||
806 | return hlist_unhashed(&inode->i_hash); | ||
807 | } | ||
808 | |||
790 | /* | 809 | /* |
791 | * inode->i_mutex nesting subclasses for the lock validator: | 810 | * inode->i_mutex nesting subclasses for the lock validator: |
792 | * | 811 | * |
@@ -1037,7 +1056,6 @@ struct lock_manager_operations { | |||
1037 | int (*fl_compare_owner)(struct file_lock *, struct file_lock *); | 1056 | int (*fl_compare_owner)(struct file_lock *, struct file_lock *); |
1038 | void (*fl_notify)(struct file_lock *); /* unblock callback */ | 1057 | void (*fl_notify)(struct file_lock *); /* unblock callback */ |
1039 | int (*fl_grant)(struct file_lock *, struct file_lock *, int); | 1058 | int (*fl_grant)(struct file_lock *, struct file_lock *, int); |
1040 | void (*fl_copy_lock)(struct file_lock *, struct file_lock *); | ||
1041 | void (*fl_release_private)(struct file_lock *); | 1059 | void (*fl_release_private)(struct file_lock *); |
1042 | void (*fl_break)(struct file_lock *); | 1060 | void (*fl_break)(struct file_lock *); |
1043 | int (*fl_mylease)(struct file_lock *, struct file_lock *); | 1061 | int (*fl_mylease)(struct file_lock *, struct file_lock *); |
@@ -1093,10 +1111,6 @@ struct file_lock { | |||
1093 | 1111 | ||
1094 | #include <linux/fcntl.h> | 1112 | #include <linux/fcntl.h> |
1095 | 1113 | ||
1096 | /* temporary stubs for BKL removal */ | ||
1097 | #define lock_flocks() lock_kernel() | ||
1098 | #define unlock_flocks() unlock_kernel() | ||
1099 | |||
1100 | extern void send_sigio(struct fown_struct *fown, int fd, int band); | 1114 | extern void send_sigio(struct fown_struct *fown, int fd, int band); |
1101 | 1115 | ||
1102 | #ifdef CONFIG_FILE_LOCKING | 1116 | #ifdef CONFIG_FILE_LOCKING |
@@ -1114,7 +1128,9 @@ extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg); | |||
1114 | extern int fcntl_getlease(struct file *filp); | 1128 | extern int fcntl_getlease(struct file *filp); |
1115 | 1129 | ||
1116 | /* fs/locks.c */ | 1130 | /* fs/locks.c */ |
1131 | void locks_free_lock(struct file_lock *fl); | ||
1117 | extern void locks_init_lock(struct file_lock *); | 1132 | extern void locks_init_lock(struct file_lock *); |
1133 | extern struct file_lock * locks_alloc_lock(void); | ||
1118 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); | 1134 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); |
1119 | extern void __locks_copy_lock(struct file_lock *, const struct file_lock *); | 1135 | extern void __locks_copy_lock(struct file_lock *, const struct file_lock *); |
1120 | extern void locks_remove_posix(struct file *, fl_owner_t); | 1136 | extern void locks_remove_posix(struct file *, fl_owner_t); |
@@ -1135,6 +1151,8 @@ extern int vfs_setlease(struct file *, long, struct file_lock **); | |||
1135 | extern int lease_modify(struct file_lock **, int); | 1151 | extern int lease_modify(struct file_lock **, int); |
1136 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); | 1152 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); |
1137 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); | 1153 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); |
1154 | extern void lock_flocks(void); | ||
1155 | extern void unlock_flocks(void); | ||
1138 | #else /* !CONFIG_FILE_LOCKING */ | 1156 | #else /* !CONFIG_FILE_LOCKING */ |
1139 | static inline int fcntl_getlk(struct file *file, struct flock __user *user) | 1157 | static inline int fcntl_getlk(struct file *file, struct flock __user *user) |
1140 | { | 1158 | { |
@@ -1277,6 +1295,14 @@ static inline int lock_may_write(struct inode *inode, loff_t start, | |||
1277 | return 1; | 1295 | return 1; |
1278 | } | 1296 | } |
1279 | 1297 | ||
1298 | static inline void lock_flocks(void) | ||
1299 | { | ||
1300 | } | ||
1301 | |||
1302 | static inline void unlock_flocks(void) | ||
1303 | { | ||
1304 | } | ||
1305 | |||
1280 | #endif /* !CONFIG_FILE_LOCKING */ | 1306 | #endif /* !CONFIG_FILE_LOCKING */ |
1281 | 1307 | ||
1282 | 1308 | ||
@@ -1293,6 +1319,11 @@ struct fasync_struct { | |||
1293 | 1319 | ||
1294 | /* SMP safe fasync helpers: */ | 1320 | /* SMP safe fasync helpers: */ |
1295 | extern int fasync_helper(int, struct file *, int, struct fasync_struct **); | 1321 | extern int fasync_helper(int, struct file *, int, struct fasync_struct **); |
1322 | extern struct fasync_struct *fasync_insert_entry(int, struct file *, struct fasync_struct **, struct fasync_struct *); | ||
1323 | extern int fasync_remove_entry(struct file *, struct fasync_struct **); | ||
1324 | extern struct fasync_struct *fasync_alloc(void); | ||
1325 | extern void fasync_free(struct fasync_struct *); | ||
1326 | |||
1296 | /* can be called from interrupts */ | 1327 | /* can be called from interrupts */ |
1297 | extern void kill_fasync(struct fasync_struct **, int, int); | 1328 | extern void kill_fasync(struct fasync_struct **, int, int); |
1298 | 1329 | ||
@@ -1384,7 +1415,7 @@ struct super_block { | |||
1384 | * Saved mount options for lazy filesystems using | 1415 | * Saved mount options for lazy filesystems using |
1385 | * generic_show_options() | 1416 | * generic_show_options() |
1386 | */ | 1417 | */ |
1387 | char *s_options; | 1418 | char __rcu *s_options; |
1388 | }; | 1419 | }; |
1389 | 1420 | ||
1390 | extern struct timespec current_fs_time(struct super_block *sb); | 1421 | extern struct timespec current_fs_time(struct super_block *sb); |
@@ -1581,6 +1612,7 @@ struct super_operations { | |||
1581 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 1612 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
1582 | #endif | 1613 | #endif |
1583 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); | 1614 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); |
1615 | int (*trim_fs) (struct super_block *, struct fstrim_range *); | ||
1584 | }; | 1616 | }; |
1585 | 1617 | ||
1586 | /* | 1618 | /* |
@@ -1631,16 +1663,17 @@ struct super_operations { | |||
1631 | * | 1663 | * |
1632 | * Q: What is the difference between I_WILL_FREE and I_FREEING? | 1664 | * Q: What is the difference between I_WILL_FREE and I_FREEING? |
1633 | */ | 1665 | */ |
1634 | #define I_DIRTY_SYNC 1 | 1666 | #define I_DIRTY_SYNC (1 << 0) |
1635 | #define I_DIRTY_DATASYNC 2 | 1667 | #define I_DIRTY_DATASYNC (1 << 1) |
1636 | #define I_DIRTY_PAGES 4 | 1668 | #define I_DIRTY_PAGES (1 << 2) |
1637 | #define __I_NEW 3 | 1669 | #define __I_NEW 3 |
1638 | #define I_NEW (1 << __I_NEW) | 1670 | #define I_NEW (1 << __I_NEW) |
1639 | #define I_WILL_FREE 16 | 1671 | #define I_WILL_FREE (1 << 4) |
1640 | #define I_FREEING 32 | 1672 | #define I_FREEING (1 << 5) |
1641 | #define I_CLEAR 64 | 1673 | #define I_CLEAR (1 << 6) |
1642 | #define __I_SYNC 7 | 1674 | #define __I_SYNC 7 |
1643 | #define I_SYNC (1 << __I_SYNC) | 1675 | #define I_SYNC (1 << __I_SYNC) |
1676 | #define I_REFERENCED (1 << 8) | ||
1644 | 1677 | ||
1645 | #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) | 1678 | #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) |
1646 | 1679 | ||
@@ -1732,12 +1765,15 @@ static inline void file_accessed(struct file *file) | |||
1732 | } | 1765 | } |
1733 | 1766 | ||
1734 | int sync_inode(struct inode *inode, struct writeback_control *wbc); | 1767 | int sync_inode(struct inode *inode, struct writeback_control *wbc); |
1768 | int sync_inode_metadata(struct inode *inode, int wait); | ||
1735 | 1769 | ||
1736 | struct file_system_type { | 1770 | struct file_system_type { |
1737 | const char *name; | 1771 | const char *name; |
1738 | int fs_flags; | 1772 | int fs_flags; |
1739 | int (*get_sb) (struct file_system_type *, int, | 1773 | int (*get_sb) (struct file_system_type *, int, |
1740 | const char *, void *, struct vfsmount *); | 1774 | const char *, void *, struct vfsmount *); |
1775 | struct dentry *(*mount) (struct file_system_type *, int, | ||
1776 | const char *, void *); | ||
1741 | void (*kill_sb) (struct super_block *); | 1777 | void (*kill_sb) (struct super_block *); |
1742 | struct module *owner; | 1778 | struct module *owner; |
1743 | struct file_system_type * next; | 1779 | struct file_system_type * next; |
@@ -1753,17 +1789,25 @@ struct file_system_type { | |||
1753 | struct lock_class_key i_alloc_sem_key; | 1789 | struct lock_class_key i_alloc_sem_key; |
1754 | }; | 1790 | }; |
1755 | 1791 | ||
1756 | extern int get_sb_ns(struct file_system_type *fs_type, int flags, void *data, | 1792 | extern struct dentry *mount_ns(struct file_system_type *fs_type, int flags, |
1757 | int (*fill_super)(struct super_block *, void *, int), | 1793 | void *data, int (*fill_super)(struct super_block *, void *, int)); |
1758 | struct vfsmount *mnt); | 1794 | extern struct dentry *mount_bdev(struct file_system_type *fs_type, |
1795 | int flags, const char *dev_name, void *data, | ||
1796 | int (*fill_super)(struct super_block *, void *, int)); | ||
1759 | extern int get_sb_bdev(struct file_system_type *fs_type, | 1797 | extern int get_sb_bdev(struct file_system_type *fs_type, |
1760 | int flags, const char *dev_name, void *data, | 1798 | int flags, const char *dev_name, void *data, |
1761 | int (*fill_super)(struct super_block *, void *, int), | 1799 | int (*fill_super)(struct super_block *, void *, int), |
1762 | struct vfsmount *mnt); | 1800 | struct vfsmount *mnt); |
1801 | extern struct dentry *mount_single(struct file_system_type *fs_type, | ||
1802 | int flags, void *data, | ||
1803 | int (*fill_super)(struct super_block *, void *, int)); | ||
1763 | extern int get_sb_single(struct file_system_type *fs_type, | 1804 | extern int get_sb_single(struct file_system_type *fs_type, |
1764 | int flags, void *data, | 1805 | int flags, void *data, |
1765 | int (*fill_super)(struct super_block *, void *, int), | 1806 | int (*fill_super)(struct super_block *, void *, int), |
1766 | struct vfsmount *mnt); | 1807 | struct vfsmount *mnt); |
1808 | extern struct dentry *mount_nodev(struct file_system_type *fs_type, | ||
1809 | int flags, void *data, | ||
1810 | int (*fill_super)(struct super_block *, void *, int)); | ||
1767 | extern int get_sb_nodev(struct file_system_type *fs_type, | 1811 | extern int get_sb_nodev(struct file_system_type *fs_type, |
1768 | int flags, void *data, | 1812 | int flags, void *data, |
1769 | int (*fill_super)(struct super_block *, void *, int), | 1813 | int (*fill_super)(struct super_block *, void *, int), |
@@ -1779,9 +1823,8 @@ struct super_block *sget(struct file_system_type *type, | |||
1779 | int (*test)(struct super_block *,void *), | 1823 | int (*test)(struct super_block *,void *), |
1780 | int (*set)(struct super_block *,void *), | 1824 | int (*set)(struct super_block *,void *), |
1781 | void *data); | 1825 | void *data); |
1782 | extern int get_sb_pseudo(struct file_system_type *, char *, | 1826 | extern struct dentry *mount_pseudo(struct file_system_type *, char *, |
1783 | const struct super_operations *ops, unsigned long, | 1827 | const struct super_operations *ops, unsigned long); |
1784 | struct vfsmount *mnt); | ||
1785 | extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); | 1828 | extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); |
1786 | 1829 | ||
1787 | static inline void sb_mark_dirty(struct super_block *sb) | 1830 | static inline void sb_mark_dirty(struct super_block *sb) |
@@ -1824,6 +1867,7 @@ extern int current_umask(void); | |||
1824 | /* /sys/fs */ | 1867 | /* /sys/fs */ |
1825 | extern struct kobject *fs_kobj; | 1868 | extern struct kobject *fs_kobj; |
1826 | 1869 | ||
1870 | #define MAX_RW_COUNT (INT_MAX & PAGE_CACHE_MASK) | ||
1827 | extern int rw_verify_area(int, struct file *, loff_t *, size_t); | 1871 | extern int rw_verify_area(int, struct file *, loff_t *, size_t); |
1828 | 1872 | ||
1829 | #define FLOCK_VERIFY_READ 1 | 1873 | #define FLOCK_VERIFY_READ 1 |
@@ -2076,7 +2120,6 @@ extern int check_disk_change(struct block_device *); | |||
2076 | extern int __invalidate_device(struct block_device *); | 2120 | extern int __invalidate_device(struct block_device *); |
2077 | extern int invalidate_partition(struct gendisk *, int); | 2121 | extern int invalidate_partition(struct gendisk *, int); |
2078 | #endif | 2122 | #endif |
2079 | extern int invalidate_inodes(struct super_block *); | ||
2080 | unsigned long invalidate_mapping_pages(struct address_space *mapping, | 2123 | unsigned long invalidate_mapping_pages(struct address_space *mapping, |
2081 | pgoff_t start, pgoff_t end); | 2124 | pgoff_t start, pgoff_t end); |
2082 | 2125 | ||
@@ -2160,7 +2203,7 @@ extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); | |||
2160 | 2203 | ||
2161 | extern int inode_init_always(struct super_block *, struct inode *); | 2204 | extern int inode_init_always(struct super_block *, struct inode *); |
2162 | extern void inode_init_once(struct inode *); | 2205 | extern void inode_init_once(struct inode *); |
2163 | extern void inode_add_to_lists(struct super_block *, struct inode *); | 2206 | extern void ihold(struct inode * inode); |
2164 | extern void iput(struct inode *); | 2207 | extern void iput(struct inode *); |
2165 | extern struct inode * igrab(struct inode *); | 2208 | extern struct inode * igrab(struct inode *); |
2166 | extern ino_t iunique(struct super_block *, ino_t); | 2209 | extern ino_t iunique(struct super_block *, ino_t); |
@@ -2180,11 +2223,11 @@ extern struct inode * iget_locked(struct super_block *, unsigned long); | |||
2180 | extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); | 2223 | extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); |
2181 | extern int insert_inode_locked(struct inode *); | 2224 | extern int insert_inode_locked(struct inode *); |
2182 | extern void unlock_new_inode(struct inode *); | 2225 | extern void unlock_new_inode(struct inode *); |
2226 | extern unsigned int get_next_ino(void); | ||
2183 | 2227 | ||
2184 | extern void __iget(struct inode * inode); | 2228 | extern void __iget(struct inode * inode); |
2185 | extern void iget_failed(struct inode *); | 2229 | extern void iget_failed(struct inode *); |
2186 | extern void end_writeback(struct inode *); | 2230 | extern void end_writeback(struct inode *); |
2187 | extern void destroy_inode(struct inode *); | ||
2188 | extern void __destroy_inode(struct inode *); | 2231 | extern void __destroy_inode(struct inode *); |
2189 | extern struct inode *new_inode(struct super_block *); | 2232 | extern struct inode *new_inode(struct super_block *); |
2190 | extern int should_remove_suid(struct dentry *); | 2233 | extern int should_remove_suid(struct dentry *); |
@@ -2192,9 +2235,11 @@ extern int file_remove_suid(struct file *); | |||
2192 | 2235 | ||
2193 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); | 2236 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); |
2194 | extern void remove_inode_hash(struct inode *); | 2237 | extern void remove_inode_hash(struct inode *); |
2195 | static inline void insert_inode_hash(struct inode *inode) { | 2238 | static inline void insert_inode_hash(struct inode *inode) |
2239 | { | ||
2196 | __insert_inode_hash(inode, inode->i_ino); | 2240 | __insert_inode_hash(inode, inode->i_ino); |
2197 | } | 2241 | } |
2242 | extern void inode_sb_list_add(struct inode *inode); | ||
2198 | 2243 | ||
2199 | #ifdef CONFIG_BLOCK | 2244 | #ifdef CONFIG_BLOCK |
2200 | extern void submit_bio(int, struct bio *); | 2245 | extern void submit_bio(int, struct bio *); |
@@ -2378,6 +2423,8 @@ extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos, | |||
2378 | 2423 | ||
2379 | extern int generic_file_fsync(struct file *, int); | 2424 | extern int generic_file_fsync(struct file *, int); |
2380 | 2425 | ||
2426 | extern int generic_check_addressable(unsigned, u64); | ||
2427 | |||
2381 | #ifdef CONFIG_MIGRATION | 2428 | #ifdef CONFIG_MIGRATION |
2382 | extern int buffer_migrate_page(struct address_space *, | 2429 | extern int buffer_migrate_page(struct address_space *, |
2383 | struct page *, struct page *); | 2430 | struct page *, struct page *); |
@@ -2454,6 +2501,7 @@ static const struct file_operations __fops = { \ | |||
2454 | .release = simple_attr_release, \ | 2501 | .release = simple_attr_release, \ |
2455 | .read = simple_attr_read, \ | 2502 | .read = simple_attr_read, \ |
2456 | .write = simple_attr_write, \ | 2503 | .write = simple_attr_write, \ |
2504 | .llseek = generic_file_llseek, \ | ||
2457 | }; | 2505 | }; |
2458 | 2506 | ||
2459 | static inline void __attribute__((format(printf, 1, 2))) | 2507 | static inline void __attribute__((format(printf, 1, 2))) |
@@ -2474,7 +2522,10 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf, | |||
2474 | struct ctl_table; | 2522 | struct ctl_table; |
2475 | int proc_nr_files(struct ctl_table *table, int write, | 2523 | int proc_nr_files(struct ctl_table *table, int write, |
2476 | void __user *buffer, size_t *lenp, loff_t *ppos); | 2524 | void __user *buffer, size_t *lenp, loff_t *ppos); |
2477 | 2525 | int proc_nr_dentry(struct ctl_table *table, int write, | |
2526 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
2527 | int proc_nr_inodes(struct ctl_table *table, int write, | ||
2528 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
2478 | int __init get_filesystem_list(char *buf); | 2529 | int __init get_filesystem_list(char *buf); |
2479 | 2530 | ||
2480 | #define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) | 2531 | #define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) |
diff --git a/include/linux/fsl-diu-fb.h b/include/linux/fsl-diu-fb.h index fc295d7ea463..781d4671415f 100644 --- a/include/linux/fsl-diu-fb.h +++ b/include/linux/fsl-diu-fb.h | |||
@@ -54,7 +54,6 @@ struct aoi_display_offset { | |||
54 | }; | 54 | }; |
55 | 55 | ||
56 | #define MFB_SET_CHROMA_KEY _IOW('M', 1, struct mfb_chroma_key) | 56 | #define MFB_SET_CHROMA_KEY _IOW('M', 1, struct mfb_chroma_key) |
57 | #define MFB_WAIT_FOR_VSYNC _IOW('F', 0x20, u_int32_t) | ||
58 | #define MFB_SET_BRIGHTNESS _IOW('M', 3, __u8) | 57 | #define MFB_SET_BRIGHTNESS _IOW('M', 3, __u8) |
59 | 58 | ||
60 | #define MFB_SET_ALPHA 0x80014d00 | 59 | #define MFB_SET_ALPHA 0x80014d00 |
diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 28e33fea5107..4eb56ed75fbc 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h | |||
@@ -58,17 +58,35 @@ enum fsl_usb2_phy_modes { | |||
58 | FSL_USB2_PHY_SERIAL, | 58 | FSL_USB2_PHY_SERIAL, |
59 | }; | 59 | }; |
60 | 60 | ||
61 | struct clk; | ||
62 | struct platform_device; | ||
63 | |||
61 | struct fsl_usb2_platform_data { | 64 | struct fsl_usb2_platform_data { |
62 | /* board specific information */ | 65 | /* board specific information */ |
63 | enum fsl_usb2_operating_modes operating_mode; | 66 | enum fsl_usb2_operating_modes operating_mode; |
64 | enum fsl_usb2_phy_modes phy_mode; | 67 | enum fsl_usb2_phy_modes phy_mode; |
65 | unsigned int port_enables; | 68 | unsigned int port_enables; |
69 | unsigned int workaround; | ||
70 | |||
71 | int (*init)(struct platform_device *); | ||
72 | void (*exit)(struct platform_device *); | ||
73 | void __iomem *regs; /* ioremap'd register base */ | ||
74 | struct clk *clk; | ||
75 | unsigned big_endian_mmio:1; | ||
76 | unsigned big_endian_desc:1; | ||
77 | unsigned es:1; /* need USBMODE:ES */ | ||
78 | unsigned le_setup_buf:1; | ||
79 | unsigned have_sysif_regs:1; | ||
80 | unsigned invert_drvvbus:1; | ||
81 | unsigned invert_pwr_fault:1; | ||
66 | }; | 82 | }; |
67 | 83 | ||
68 | /* Flags in fsl_usb2_mph_platform_data */ | 84 | /* Flags in fsl_usb2_mph_platform_data */ |
69 | #define FSL_USB2_PORT0_ENABLED 0x00000001 | 85 | #define FSL_USB2_PORT0_ENABLED 0x00000001 |
70 | #define FSL_USB2_PORT1_ENABLED 0x00000002 | 86 | #define FSL_USB2_PORT1_ENABLED 0x00000002 |
71 | 87 | ||
88 | #define FLS_USB2_WORKAROUND_ENGCM09152 (1 << 0) | ||
89 | |||
72 | struct spi_device; | 90 | struct spi_device; |
73 | 91 | ||
74 | struct fsl_spi_platform_data { | 92 | struct fsl_spi_platform_data { |
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 59d0df43ff9d..5c185fa27089 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
@@ -26,12 +26,12 @@ static inline void fsnotify_d_instantiate(struct dentry *dentry, | |||
26 | } | 26 | } |
27 | 27 | ||
28 | /* Notify this dentry's parent about a child's events. */ | 28 | /* Notify this dentry's parent about a child's events. */ |
29 | static inline void fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) | 29 | static inline int fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) |
30 | { | 30 | { |
31 | if (!dentry) | 31 | if (!dentry) |
32 | dentry = path->dentry; | 32 | dentry = path->dentry; |
33 | 33 | ||
34 | __fsnotify_parent(path, dentry, mask); | 34 | return __fsnotify_parent(path, dentry, mask); |
35 | } | 35 | } |
36 | 36 | ||
37 | /* simple call site for access decisions */ | 37 | /* simple call site for access decisions */ |
@@ -40,6 +40,7 @@ static inline int fsnotify_perm(struct file *file, int mask) | |||
40 | struct path *path = &file->f_path; | 40 | struct path *path = &file->f_path; |
41 | struct inode *inode = path->dentry->d_inode; | 41 | struct inode *inode = path->dentry->d_inode; |
42 | __u32 fsnotify_mask = 0; | 42 | __u32 fsnotify_mask = 0; |
43 | int ret; | ||
43 | 44 | ||
44 | if (file->f_mode & FMODE_NONOTIFY) | 45 | if (file->f_mode & FMODE_NONOTIFY) |
45 | return 0; | 46 | return 0; |
@@ -52,6 +53,10 @@ static inline int fsnotify_perm(struct file *file, int mask) | |||
52 | else | 53 | else |
53 | BUG(); | 54 | BUG(); |
54 | 55 | ||
56 | ret = fsnotify_parent(path, NULL, fsnotify_mask); | ||
57 | if (ret) | ||
58 | return ret; | ||
59 | |||
55 | return fsnotify(inode, fsnotify_mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); | 60 | return fsnotify(inode, fsnotify_mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); |
56 | } | 61 | } |
57 | 62 | ||
@@ -93,8 +98,8 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
93 | old_dir_mask |= FS_DN_RENAME; | 98 | old_dir_mask |= FS_DN_RENAME; |
94 | 99 | ||
95 | if (isdir) { | 100 | if (isdir) { |
96 | old_dir_mask |= FS_IN_ISDIR; | 101 | old_dir_mask |= FS_ISDIR; |
97 | new_dir_mask |= FS_IN_ISDIR; | 102 | new_dir_mask |= FS_ISDIR; |
98 | } | 103 | } |
99 | 104 | ||
100 | fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name, fs_cookie); | 105 | fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name, fs_cookie); |
@@ -132,7 +137,7 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) | |||
132 | __u32 mask = FS_DELETE; | 137 | __u32 mask = FS_DELETE; |
133 | 138 | ||
134 | if (isdir) | 139 | if (isdir) |
135 | mask |= FS_IN_ISDIR; | 140 | mask |= FS_ISDIR; |
136 | 141 | ||
137 | fsnotify_parent(NULL, dentry, mask); | 142 | fsnotify_parent(NULL, dentry, mask); |
138 | } | 143 | } |
@@ -174,7 +179,7 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct | |||
174 | */ | 179 | */ |
175 | static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) | 180 | static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) |
176 | { | 181 | { |
177 | __u32 mask = (FS_CREATE | FS_IN_ISDIR); | 182 | __u32 mask = (FS_CREATE | FS_ISDIR); |
178 | struct inode *d_inode = dentry->d_inode; | 183 | struct inode *d_inode = dentry->d_inode; |
179 | 184 | ||
180 | audit_inode_child(dentry, inode); | 185 | audit_inode_child(dentry, inode); |
@@ -192,7 +197,7 @@ static inline void fsnotify_access(struct file *file) | |||
192 | __u32 mask = FS_ACCESS; | 197 | __u32 mask = FS_ACCESS; |
193 | 198 | ||
194 | if (S_ISDIR(inode->i_mode)) | 199 | if (S_ISDIR(inode->i_mode)) |
195 | mask |= FS_IN_ISDIR; | 200 | mask |= FS_ISDIR; |
196 | 201 | ||
197 | if (!(file->f_mode & FMODE_NONOTIFY)) { | 202 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
198 | fsnotify_parent(path, NULL, mask); | 203 | fsnotify_parent(path, NULL, mask); |
@@ -210,7 +215,7 @@ static inline void fsnotify_modify(struct file *file) | |||
210 | __u32 mask = FS_MODIFY; | 215 | __u32 mask = FS_MODIFY; |
211 | 216 | ||
212 | if (S_ISDIR(inode->i_mode)) | 217 | if (S_ISDIR(inode->i_mode)) |
213 | mask |= FS_IN_ISDIR; | 218 | mask |= FS_ISDIR; |
214 | 219 | ||
215 | if (!(file->f_mode & FMODE_NONOTIFY)) { | 220 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
216 | fsnotify_parent(path, NULL, mask); | 221 | fsnotify_parent(path, NULL, mask); |
@@ -228,12 +233,13 @@ static inline void fsnotify_open(struct file *file) | |||
228 | __u32 mask = FS_OPEN; | 233 | __u32 mask = FS_OPEN; |
229 | 234 | ||
230 | if (S_ISDIR(inode->i_mode)) | 235 | if (S_ISDIR(inode->i_mode)) |
231 | mask |= FS_IN_ISDIR; | 236 | mask |= FS_ISDIR; |
232 | 237 | ||
233 | if (!(file->f_mode & FMODE_NONOTIFY)) { | 238 | /* FMODE_NONOTIFY must never be set from user */ |
234 | fsnotify_parent(path, NULL, mask); | 239 | file->f_mode &= ~FMODE_NONOTIFY; |
235 | fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); | 240 | |
236 | } | 241 | fsnotify_parent(path, NULL, mask); |
242 | fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); | ||
237 | } | 243 | } |
238 | 244 | ||
239 | /* | 245 | /* |
@@ -247,7 +253,7 @@ static inline void fsnotify_close(struct file *file) | |||
247 | __u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE; | 253 | __u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE; |
248 | 254 | ||
249 | if (S_ISDIR(inode->i_mode)) | 255 | if (S_ISDIR(inode->i_mode)) |
250 | mask |= FS_IN_ISDIR; | 256 | mask |= FS_ISDIR; |
251 | 257 | ||
252 | if (!(file->f_mode & FMODE_NONOTIFY)) { | 258 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
253 | fsnotify_parent(path, NULL, mask); | 259 | fsnotify_parent(path, NULL, mask); |
@@ -264,7 +270,7 @@ static inline void fsnotify_xattr(struct dentry *dentry) | |||
264 | __u32 mask = FS_ATTRIB; | 270 | __u32 mask = FS_ATTRIB; |
265 | 271 | ||
266 | if (S_ISDIR(inode->i_mode)) | 272 | if (S_ISDIR(inode->i_mode)) |
267 | mask |= FS_IN_ISDIR; | 273 | mask |= FS_ISDIR; |
268 | 274 | ||
269 | fsnotify_parent(NULL, dentry, mask); | 275 | fsnotify_parent(NULL, dentry, mask); |
270 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 276 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
@@ -299,7 +305,7 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid) | |||
299 | 305 | ||
300 | if (mask) { | 306 | if (mask) { |
301 | if (S_ISDIR(inode->i_mode)) | 307 | if (S_ISDIR(inode->i_mode)) |
302 | mask |= FS_IN_ISDIR; | 308 | mask |= FS_ISDIR; |
303 | 309 | ||
304 | fsnotify_parent(NULL, dentry, mask); | 310 | fsnotify_parent(NULL, dentry, mask); |
305 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 311 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index e40190d16878..0a68f924f06f 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
@@ -45,7 +45,7 @@ | |||
45 | #define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */ | 45 | #define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */ |
46 | 46 | ||
47 | #define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */ | 47 | #define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */ |
48 | #define FS_IN_ISDIR 0x40000000 /* event occurred against dir */ | 48 | #define FS_ISDIR 0x40000000 /* event occurred against dir */ |
49 | #define FS_IN_ONESHOT 0x80000000 /* only send event once */ | 49 | #define FS_IN_ONESHOT 0x80000000 /* only send event once */ |
50 | 50 | ||
51 | #define FS_DN_RENAME 0x10000000 /* file renamed */ | 51 | #define FS_DN_RENAME 0x10000000 /* file renamed */ |
@@ -64,13 +64,15 @@ | |||
64 | 64 | ||
65 | #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) | 65 | #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) |
66 | 66 | ||
67 | #define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM) | ||
68 | |||
67 | #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ | 69 | #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ |
68 | FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \ | 70 | FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \ |
69 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ | 71 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ |
70 | FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ | 72 | FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ |
71 | FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ | 73 | FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ |
72 | FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \ | 74 | FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \ |
73 | FS_IN_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \ | 75 | FS_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \ |
74 | FS_DN_MULTISHOT | FS_EVENT_ON_CHILD) | 76 | FS_DN_MULTISHOT | FS_EVENT_ON_CHILD) |
75 | 77 | ||
76 | struct fsnotify_group; | 78 | struct fsnotify_group; |
@@ -129,6 +131,14 @@ struct fsnotify_group { | |||
129 | wait_queue_head_t notification_waitq; /* read() on the notification file blocks on this waitq */ | 131 | wait_queue_head_t notification_waitq; /* read() on the notification file blocks on this waitq */ |
130 | unsigned int q_len; /* events on the queue */ | 132 | unsigned int q_len; /* events on the queue */ |
131 | unsigned int max_events; /* maximum events allowed on the list */ | 133 | unsigned int max_events; /* maximum events allowed on the list */ |
134 | /* | ||
135 | * Valid fsnotify group priorities. Events are send in order from highest | ||
136 | * priority to lowest priority. We default to the lowest priority. | ||
137 | */ | ||
138 | #define FS_PRIO_0 0 /* normal notifiers, no permissions */ | ||
139 | #define FS_PRIO_1 1 /* fanotify content based access control */ | ||
140 | #define FS_PRIO_2 2 /* fanotify pre-content access */ | ||
141 | unsigned int priority; | ||
132 | 142 | ||
133 | /* stores all fastpath marks assoc with this group so they can be cleaned on unregister */ | 143 | /* stores all fastpath marks assoc with this group so they can be cleaned on unregister */ |
134 | spinlock_t mark_lock; /* protect marks_list */ | 144 | spinlock_t mark_lock; /* protect marks_list */ |
@@ -159,6 +169,8 @@ struct fsnotify_group { | |||
159 | bool bypass_perm; /* protected by access_mutex */ | 169 | bool bypass_perm; /* protected by access_mutex */ |
160 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | 170 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ |
161 | int f_flags; | 171 | int f_flags; |
172 | unsigned int max_marks; | ||
173 | struct user_struct *user; | ||
162 | } fanotify_data; | 174 | } fanotify_data; |
163 | #endif /* CONFIG_FANOTIFY */ | 175 | #endif /* CONFIG_FANOTIFY */ |
164 | }; | 176 | }; |
@@ -275,8 +287,8 @@ struct fsnotify_mark { | |||
275 | struct fsnotify_inode_mark i; | 287 | struct fsnotify_inode_mark i; |
276 | struct fsnotify_vfsmount_mark m; | 288 | struct fsnotify_vfsmount_mark m; |
277 | }; | 289 | }; |
278 | __u32 ignored_mask; /* events types to ignore */ | ||
279 | struct list_head free_g_list; /* tmp list used when freeing this mark */ | 290 | struct list_head free_g_list; /* tmp list used when freeing this mark */ |
291 | __u32 ignored_mask; /* events types to ignore */ | ||
280 | #define FSNOTIFY_MARK_FLAG_INODE 0x01 | 292 | #define FSNOTIFY_MARK_FLAG_INODE 0x01 |
281 | #define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02 | 293 | #define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02 |
282 | #define FSNOTIFY_MARK_FLAG_OBJECT_PINNED 0x04 | 294 | #define FSNOTIFY_MARK_FLAG_OBJECT_PINNED 0x04 |
@@ -294,7 +306,7 @@ struct fsnotify_mark { | |||
294 | /* main fsnotify call to send events */ | 306 | /* main fsnotify call to send events */ |
295 | extern int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, | 307 | extern int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
296 | const unsigned char *name, u32 cookie); | 308 | const unsigned char *name, u32 cookie); |
297 | extern void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask); | 309 | extern int __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask); |
298 | extern void __fsnotify_inode_delete(struct inode *inode); | 310 | extern void __fsnotify_inode_delete(struct inode *inode); |
299 | extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt); | 311 | extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt); |
300 | extern u32 fsnotify_get_cookie(void); | 312 | extern u32 fsnotify_get_cookie(void); |
@@ -423,8 +435,10 @@ static inline int fsnotify(struct inode *to_tell, __u32 mask, void *data, int da | |||
423 | return 0; | 435 | return 0; |
424 | } | 436 | } |
425 | 437 | ||
426 | static inline void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) | 438 | static inline int __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) |
427 | {} | 439 | { |
440 | return 0; | ||
441 | } | ||
428 | 442 | ||
429 | static inline void __fsnotify_inode_delete(struct inode *inode) | 443 | static inline void __fsnotify_inode_delete(struct inode *inode) |
430 | {} | 444 | {} |
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 02b8b24f8f51..8beabb958f61 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
@@ -191,8 +191,8 @@ struct ftrace_event_call { | |||
191 | unsigned int flags; | 191 | unsigned int flags; |
192 | 192 | ||
193 | #ifdef CONFIG_PERF_EVENTS | 193 | #ifdef CONFIG_PERF_EVENTS |
194 | int perf_refcount; | 194 | int perf_refcount; |
195 | struct hlist_head *perf_events; | 195 | struct hlist_head __percpu *perf_events; |
196 | #endif | 196 | #endif |
197 | }; | 197 | }; |
198 | 198 | ||
@@ -252,8 +252,8 @@ DECLARE_PER_CPU(struct pt_regs, perf_trace_regs); | |||
252 | 252 | ||
253 | extern int perf_trace_init(struct perf_event *event); | 253 | extern int perf_trace_init(struct perf_event *event); |
254 | extern void perf_trace_destroy(struct perf_event *event); | 254 | extern void perf_trace_destroy(struct perf_event *event); |
255 | extern int perf_trace_enable(struct perf_event *event); | 255 | extern int perf_trace_add(struct perf_event *event, int flags); |
256 | extern void perf_trace_disable(struct perf_event *event); | 256 | extern void perf_trace_del(struct perf_event *event, int flags); |
257 | extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, | 257 | extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, |
258 | char *filter_str); | 258 | char *filter_str); |
259 | extern void ftrace_profile_free_filter(struct perf_event *event); | 259 | extern void ftrace_profile_free_filter(struct perf_event *event); |
diff --git a/include/linux/gameport.h b/include/linux/gameport.h index 361d1cc288d0..b65a6f472775 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h | |||
@@ -53,9 +53,7 @@ struct gameport { | |||
53 | #define to_gameport_port(d) container_of(d, struct gameport, dev) | 53 | #define to_gameport_port(d) container_of(d, struct gameport, dev) |
54 | 54 | ||
55 | struct gameport_driver { | 55 | struct gameport_driver { |
56 | 56 | const char *description; | |
57 | void *private; | ||
58 | char *description; | ||
59 | 57 | ||
60 | int (*connect)(struct gameport *, struct gameport_driver *drv); | 58 | int (*connect)(struct gameport *, struct gameport_driver *drv); |
61 | int (*reconnect)(struct gameport *); | 59 | int (*reconnect)(struct gameport *); |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 5f2f4c4d8fb0..7a7b9c1644e4 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/kdev_t.h> | 13 | #include <linux/kdev_t.h> |
14 | #include <linux/rcupdate.h> | 14 | #include <linux/rcupdate.h> |
15 | #include <linux/slab.h> | ||
15 | 16 | ||
16 | #ifdef CONFIG_BLOCK | 17 | #ifdef CONFIG_BLOCK |
17 | 18 | ||
@@ -86,7 +87,15 @@ struct disk_stats { | |||
86 | unsigned long io_ticks; | 87 | unsigned long io_ticks; |
87 | unsigned long time_in_queue; | 88 | unsigned long time_in_queue; |
88 | }; | 89 | }; |
89 | 90 | ||
91 | #define PARTITION_META_INFO_VOLNAMELTH 64 | ||
92 | #define PARTITION_META_INFO_UUIDLTH 16 | ||
93 | |||
94 | struct partition_meta_info { | ||
95 | u8 uuid[PARTITION_META_INFO_UUIDLTH]; /* always big endian */ | ||
96 | u8 volname[PARTITION_META_INFO_VOLNAMELTH]; | ||
97 | }; | ||
98 | |||
90 | struct hd_struct { | 99 | struct hd_struct { |
91 | sector_t start_sect; | 100 | sector_t start_sect; |
92 | sector_t nr_sects; | 101 | sector_t nr_sects; |
@@ -95,6 +104,7 @@ struct hd_struct { | |||
95 | struct device __dev; | 104 | struct device __dev; |
96 | struct kobject *holder_dir; | 105 | struct kobject *holder_dir; |
97 | int policy, partno; | 106 | int policy, partno; |
107 | struct partition_meta_info *info; | ||
98 | #ifdef CONFIG_FAIL_MAKE_REQUEST | 108 | #ifdef CONFIG_FAIL_MAKE_REQUEST |
99 | int make_it_fail; | 109 | int make_it_fail; |
100 | #endif | 110 | #endif |
@@ -129,8 +139,8 @@ struct blk_scsi_cmd_filter { | |||
129 | struct disk_part_tbl { | 139 | struct disk_part_tbl { |
130 | struct rcu_head rcu_head; | 140 | struct rcu_head rcu_head; |
131 | int len; | 141 | int len; |
132 | struct hd_struct *last_lookup; | 142 | struct hd_struct __rcu *last_lookup; |
133 | struct hd_struct *part[]; | 143 | struct hd_struct __rcu *part[]; |
134 | }; | 144 | }; |
135 | 145 | ||
136 | struct gendisk { | 146 | struct gendisk { |
@@ -149,7 +159,7 @@ struct gendisk { | |||
149 | * non-critical accesses use RCU. Always access through | 159 | * non-critical accesses use RCU. Always access through |
150 | * helpers. | 160 | * helpers. |
151 | */ | 161 | */ |
152 | struct disk_part_tbl *part_tbl; | 162 | struct disk_part_tbl __rcu *part_tbl; |
153 | struct hd_struct part0; | 163 | struct hd_struct part0; |
154 | 164 | ||
155 | const struct block_device_operations *fops; | 165 | const struct block_device_operations *fops; |
@@ -181,6 +191,30 @@ static inline struct gendisk *part_to_disk(struct hd_struct *part) | |||
181 | return NULL; | 191 | return NULL; |
182 | } | 192 | } |
183 | 193 | ||
194 | static inline void part_pack_uuid(const u8 *uuid_str, u8 *to) | ||
195 | { | ||
196 | int i; | ||
197 | for (i = 0; i < 16; ++i) { | ||
198 | *to++ = (hex_to_bin(*uuid_str) << 4) | | ||
199 | (hex_to_bin(*(uuid_str + 1))); | ||
200 | uuid_str += 2; | ||
201 | switch (i) { | ||
202 | case 3: | ||
203 | case 5: | ||
204 | case 7: | ||
205 | case 9: | ||
206 | uuid_str++; | ||
207 | continue; | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | static inline char *part_unpack_uuid(const u8 *uuid, char *out) | ||
213 | { | ||
214 | sprintf(out, "%pU", uuid); | ||
215 | return out; | ||
216 | } | ||
217 | |||
184 | static inline int disk_max_parts(struct gendisk *disk) | 218 | static inline int disk_max_parts(struct gendisk *disk) |
185 | { | 219 | { |
186 | if (disk->flags & GENHD_FL_EXT_DEVT) | 220 | if (disk->flags & GENHD_FL_EXT_DEVT) |
@@ -342,6 +376,19 @@ static inline int part_in_flight(struct hd_struct *part) | |||
342 | return part->in_flight[0] + part->in_flight[1]; | 376 | return part->in_flight[0] + part->in_flight[1]; |
343 | } | 377 | } |
344 | 378 | ||
379 | static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk) | ||
380 | { | ||
381 | if (disk) | ||
382 | return kzalloc_node(sizeof(struct partition_meta_info), | ||
383 | GFP_KERNEL, disk->node_id); | ||
384 | return kzalloc(sizeof(struct partition_meta_info), GFP_KERNEL); | ||
385 | } | ||
386 | |||
387 | static inline void free_part_info(struct hd_struct *part) | ||
388 | { | ||
389 | kfree(part->info); | ||
390 | } | ||
391 | |||
345 | /* block/blk-core.c */ | 392 | /* block/blk-core.c */ |
346 | extern void part_round_stats(int cpu, struct hd_struct *part); | 393 | extern void part_round_stats(int cpu, struct hd_struct *part); |
347 | 394 | ||
@@ -533,7 +580,9 @@ extern int disk_expand_part_tbl(struct gendisk *disk, int target); | |||
533 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); | 580 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); |
534 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, | 581 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, |
535 | int partno, sector_t start, | 582 | int partno, sector_t start, |
536 | sector_t len, int flags); | 583 | sector_t len, int flags, |
584 | struct partition_meta_info | ||
585 | *info); | ||
537 | extern void delete_partition(struct gendisk *, int); | 586 | extern void delete_partition(struct gendisk *, int); |
538 | extern void printk_all_partitions(void); | 587 | extern void printk_all_partitions(void); |
539 | 588 | ||
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 975609cb8548..e8713d55360a 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
@@ -9,6 +9,32 @@ | |||
9 | 9 | ||
10 | struct vm_area_struct; | 10 | struct vm_area_struct; |
11 | 11 | ||
12 | /* Plain integer GFP bitmasks. Do not use this directly. */ | ||
13 | #define ___GFP_DMA 0x01u | ||
14 | #define ___GFP_HIGHMEM 0x02u | ||
15 | #define ___GFP_DMA32 0x04u | ||
16 | #define ___GFP_MOVABLE 0x08u | ||
17 | #define ___GFP_WAIT 0x10u | ||
18 | #define ___GFP_HIGH 0x20u | ||
19 | #define ___GFP_IO 0x40u | ||
20 | #define ___GFP_FS 0x80u | ||
21 | #define ___GFP_COLD 0x100u | ||
22 | #define ___GFP_NOWARN 0x200u | ||
23 | #define ___GFP_REPEAT 0x400u | ||
24 | #define ___GFP_NOFAIL 0x800u | ||
25 | #define ___GFP_NORETRY 0x1000u | ||
26 | #define ___GFP_COMP 0x4000u | ||
27 | #define ___GFP_ZERO 0x8000u | ||
28 | #define ___GFP_NOMEMALLOC 0x10000u | ||
29 | #define ___GFP_HARDWALL 0x20000u | ||
30 | #define ___GFP_THISNODE 0x40000u | ||
31 | #define ___GFP_RECLAIMABLE 0x80000u | ||
32 | #ifdef CONFIG_KMEMCHECK | ||
33 | #define ___GFP_NOTRACK 0x200000u | ||
34 | #else | ||
35 | #define ___GFP_NOTRACK 0 | ||
36 | #endif | ||
37 | |||
12 | /* | 38 | /* |
13 | * GFP bitmasks.. | 39 | * GFP bitmasks.. |
14 | * | 40 | * |
@@ -18,10 +44,10 @@ struct vm_area_struct; | |||
18 | * without the underscores and use them consistently. The definitions here may | 44 | * without the underscores and use them consistently. The definitions here may |
19 | * be used in bit comparisons. | 45 | * be used in bit comparisons. |
20 | */ | 46 | */ |
21 | #define __GFP_DMA ((__force gfp_t)0x01u) | 47 | #define __GFP_DMA ((__force gfp_t)___GFP_DMA) |
22 | #define __GFP_HIGHMEM ((__force gfp_t)0x02u) | 48 | #define __GFP_HIGHMEM ((__force gfp_t)___GFP_HIGHMEM) |
23 | #define __GFP_DMA32 ((__force gfp_t)0x04u) | 49 | #define __GFP_DMA32 ((__force gfp_t)___GFP_DMA32) |
24 | #define __GFP_MOVABLE ((__force gfp_t)0x08u) /* Page is movable */ | 50 | #define __GFP_MOVABLE ((__force gfp_t)___GFP_MOVABLE) /* Page is movable */ |
25 | #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE) | 51 | #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE) |
26 | /* | 52 | /* |
27 | * Action modifiers - doesn't change the zoning | 53 | * Action modifiers - doesn't change the zoning |
@@ -38,27 +64,22 @@ struct vm_area_struct; | |||
38 | * __GFP_MOVABLE: Flag that this page will be movable by the page migration | 64 | * __GFP_MOVABLE: Flag that this page will be movable by the page migration |
39 | * mechanism or reclaimed | 65 | * mechanism or reclaimed |
40 | */ | 66 | */ |
41 | #define __GFP_WAIT ((__force gfp_t)0x10u) /* Can wait and reschedule? */ | 67 | #define __GFP_WAIT ((__force gfp_t)___GFP_WAIT) /* Can wait and reschedule? */ |
42 | #define __GFP_HIGH ((__force gfp_t)0x20u) /* Should access emergency pools? */ | 68 | #define __GFP_HIGH ((__force gfp_t)___GFP_HIGH) /* Should access emergency pools? */ |
43 | #define __GFP_IO ((__force gfp_t)0x40u) /* Can start physical IO? */ | 69 | #define __GFP_IO ((__force gfp_t)___GFP_IO) /* Can start physical IO? */ |
44 | #define __GFP_FS ((__force gfp_t)0x80u) /* Can call down to low-level FS? */ | 70 | #define __GFP_FS ((__force gfp_t)___GFP_FS) /* Can call down to low-level FS? */ |
45 | #define __GFP_COLD ((__force gfp_t)0x100u) /* Cache-cold page required */ | 71 | #define __GFP_COLD ((__force gfp_t)___GFP_COLD) /* Cache-cold page required */ |
46 | #define __GFP_NOWARN ((__force gfp_t)0x200u) /* Suppress page allocation failure warning */ | 72 | #define __GFP_NOWARN ((__force gfp_t)___GFP_NOWARN) /* Suppress page allocation failure warning */ |
47 | #define __GFP_REPEAT ((__force gfp_t)0x400u) /* See above */ | 73 | #define __GFP_REPEAT ((__force gfp_t)___GFP_REPEAT) /* See above */ |
48 | #define __GFP_NOFAIL ((__force gfp_t)0x800u) /* See above */ | 74 | #define __GFP_NOFAIL ((__force gfp_t)___GFP_NOFAIL) /* See above */ |
49 | #define __GFP_NORETRY ((__force gfp_t)0x1000u)/* See above */ | 75 | #define __GFP_NORETRY ((__force gfp_t)___GFP_NORETRY) /* See above */ |
50 | #define __GFP_COMP ((__force gfp_t)0x4000u)/* Add compound page metadata */ | 76 | #define __GFP_COMP ((__force gfp_t)___GFP_COMP) /* Add compound page metadata */ |
51 | #define __GFP_ZERO ((__force gfp_t)0x8000u)/* Return zeroed page on success */ | 77 | #define __GFP_ZERO ((__force gfp_t)___GFP_ZERO) /* Return zeroed page on success */ |
52 | #define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */ | 78 | #define __GFP_NOMEMALLOC ((__force gfp_t)___GFP_NOMEMALLOC) /* Don't use emergency reserves */ |
53 | #define __GFP_HARDWALL ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */ | 79 | #define __GFP_HARDWALL ((__force gfp_t)___GFP_HARDWALL) /* Enforce hardwall cpuset memory allocs */ |
54 | #define __GFP_THISNODE ((__force gfp_t)0x40000u)/* No fallback, no policies */ | 80 | #define __GFP_THISNODE ((__force gfp_t)___GFP_THISNODE)/* No fallback, no policies */ |
55 | #define __GFP_RECLAIMABLE ((__force gfp_t)0x80000u) /* Page is reclaimable */ | 81 | #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) /* Page is reclaimable */ |
56 | 82 | #define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */ | |
57 | #ifdef CONFIG_KMEMCHECK | ||
58 | #define __GFP_NOTRACK ((__force gfp_t)0x200000u) /* Don't track with kmemcheck */ | ||
59 | #else | ||
60 | #define __GFP_NOTRACK ((__force gfp_t)0) | ||
61 | #endif | ||
62 | 83 | ||
63 | /* | 84 | /* |
64 | * This may seem redundant, but it's a way of annotating false positives vs. | 85 | * This may seem redundant, but it's a way of annotating false positives vs. |
@@ -186,14 +207,14 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags) | |||
186 | #endif | 207 | #endif |
187 | 208 | ||
188 | #define GFP_ZONE_TABLE ( \ | 209 | #define GFP_ZONE_TABLE ( \ |
189 | (ZONE_NORMAL << 0 * ZONES_SHIFT) \ | 210 | (ZONE_NORMAL << 0 * ZONES_SHIFT) \ |
190 | | (OPT_ZONE_DMA << __GFP_DMA * ZONES_SHIFT) \ | 211 | | (OPT_ZONE_DMA << ___GFP_DMA * ZONES_SHIFT) \ |
191 | | (OPT_ZONE_HIGHMEM << __GFP_HIGHMEM * ZONES_SHIFT) \ | 212 | | (OPT_ZONE_HIGHMEM << ___GFP_HIGHMEM * ZONES_SHIFT) \ |
192 | | (OPT_ZONE_DMA32 << __GFP_DMA32 * ZONES_SHIFT) \ | 213 | | (OPT_ZONE_DMA32 << ___GFP_DMA32 * ZONES_SHIFT) \ |
193 | | (ZONE_NORMAL << __GFP_MOVABLE * ZONES_SHIFT) \ | 214 | | (ZONE_NORMAL << ___GFP_MOVABLE * ZONES_SHIFT) \ |
194 | | (OPT_ZONE_DMA << (__GFP_MOVABLE | __GFP_DMA) * ZONES_SHIFT) \ | 215 | | (OPT_ZONE_DMA << (___GFP_MOVABLE | ___GFP_DMA) * ZONES_SHIFT) \ |
195 | | (ZONE_MOVABLE << (__GFP_MOVABLE | __GFP_HIGHMEM) * ZONES_SHIFT)\ | 216 | | (ZONE_MOVABLE << (___GFP_MOVABLE | ___GFP_HIGHMEM) * ZONES_SHIFT) \ |
196 | | (OPT_ZONE_DMA32 << (__GFP_MOVABLE | __GFP_DMA32) * ZONES_SHIFT)\ | 217 | | (OPT_ZONE_DMA32 << (___GFP_MOVABLE | ___GFP_DMA32) * ZONES_SHIFT) \ |
197 | ) | 218 | ) |
198 | 219 | ||
199 | /* | 220 | /* |
@@ -203,20 +224,20 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags) | |||
203 | * allowed. | 224 | * allowed. |
204 | */ | 225 | */ |
205 | #define GFP_ZONE_BAD ( \ | 226 | #define GFP_ZONE_BAD ( \ |
206 | 1 << (__GFP_DMA | __GFP_HIGHMEM) \ | 227 | 1 << (___GFP_DMA | ___GFP_HIGHMEM) \ |
207 | | 1 << (__GFP_DMA | __GFP_DMA32) \ | 228 | | 1 << (___GFP_DMA | ___GFP_DMA32) \ |
208 | | 1 << (__GFP_DMA32 | __GFP_HIGHMEM) \ | 229 | | 1 << (___GFP_DMA32 | ___GFP_HIGHMEM) \ |
209 | | 1 << (__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM) \ | 230 | | 1 << (___GFP_DMA | ___GFP_DMA32 | ___GFP_HIGHMEM) \ |
210 | | 1 << (__GFP_MOVABLE | __GFP_HIGHMEM | __GFP_DMA) \ | 231 | | 1 << (___GFP_MOVABLE | ___GFP_HIGHMEM | ___GFP_DMA) \ |
211 | | 1 << (__GFP_MOVABLE | __GFP_DMA32 | __GFP_DMA) \ | 232 | | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_DMA) \ |
212 | | 1 << (__GFP_MOVABLE | __GFP_DMA32 | __GFP_HIGHMEM) \ | 233 | | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_HIGHMEM) \ |
213 | | 1 << (__GFP_MOVABLE | __GFP_DMA32 | __GFP_DMA | __GFP_HIGHMEM)\ | 234 | | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_DMA | ___GFP_HIGHMEM) \ |
214 | ) | 235 | ) |
215 | 236 | ||
216 | static inline enum zone_type gfp_zone(gfp_t flags) | 237 | static inline enum zone_type gfp_zone(gfp_t flags) |
217 | { | 238 | { |
218 | enum zone_type z; | 239 | enum zone_type z; |
219 | int bit = flags & GFP_ZONEMASK; | 240 | int bit = (__force int) (flags & GFP_ZONEMASK); |
220 | 241 | ||
221 | z = (GFP_ZONE_TABLE >> (bit * ZONES_SHIFT)) & | 242 | z = (GFP_ZONE_TABLE >> (bit * ZONES_SHIFT)) & |
222 | ((1 << ZONES_SHIFT) - 1); | 243 | ((1 << ZONES_SHIFT) - 1); |
diff --git a/include/linux/gpio-fan.h b/include/linux/gpio-fan.h new file mode 100644 index 000000000000..096659169215 --- /dev/null +++ b/include/linux/gpio-fan.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * include/linux/gpio-fan.h | ||
3 | * | ||
4 | * Platform data structure for GPIO fan driver | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #ifndef __LINUX_GPIO_FAN_H | ||
12 | #define __LINUX_GPIO_FAN_H | ||
13 | |||
14 | struct gpio_fan_alarm { | ||
15 | unsigned gpio; | ||
16 | unsigned active_low; | ||
17 | }; | ||
18 | |||
19 | struct gpio_fan_speed { | ||
20 | int rpm; | ||
21 | int ctrl_val; | ||
22 | }; | ||
23 | |||
24 | struct gpio_fan_platform_data { | ||
25 | int num_ctrl; | ||
26 | unsigned *ctrl; /* fan control GPIOs. */ | ||
27 | struct gpio_fan_alarm *alarm; /* fan alarm GPIO. */ | ||
28 | /* | ||
29 | * Speed conversion array: rpm from/to GPIO bit field. | ||
30 | * This array _must_ be sorted in ascending rpm order. | ||
31 | */ | ||
32 | int num_speed; | ||
33 | struct gpio_fan_speed *speed; | ||
34 | }; | ||
35 | |||
36 | #endif /* __LINUX_GPIO_FAN_H */ | ||
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index d5b387669dab..41cb31f14ee3 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h | |||
@@ -8,7 +8,6 @@ | |||
8 | #include <linux/lockdep.h> | 8 | #include <linux/lockdep.h> |
9 | #include <linux/ftrace_irq.h> | 9 | #include <linux/ftrace_irq.h> |
10 | #include <asm/hardirq.h> | 10 | #include <asm/hardirq.h> |
11 | #include <asm/system.h> | ||
12 | 11 | ||
13 | /* | 12 | /* |
14 | * We put the hardirq and softirq counter into the preemption | 13 | * We put the hardirq and softirq counter into the preemption |
@@ -64,6 +63,8 @@ | |||
64 | #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) | 63 | #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) |
65 | #define NMI_OFFSET (1UL << NMI_SHIFT) | 64 | #define NMI_OFFSET (1UL << NMI_SHIFT) |
66 | 65 | ||
66 | #define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) | ||
67 | |||
67 | #ifndef PREEMPT_ACTIVE | 68 | #ifndef PREEMPT_ACTIVE |
68 | #define PREEMPT_ACTIVE_BITS 1 | 69 | #define PREEMPT_ACTIVE_BITS 1 |
69 | #define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS) | 70 | #define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS) |
@@ -82,21 +83,28 @@ | |||
82 | /* | 83 | /* |
83 | * Are we doing bottom half or hardware interrupt processing? | 84 | * Are we doing bottom half or hardware interrupt processing? |
84 | * Are we in a softirq context? Interrupt context? | 85 | * Are we in a softirq context? Interrupt context? |
86 | * in_softirq - Are we currently processing softirq or have bh disabled? | ||
87 | * in_serving_softirq - Are we currently processing softirq? | ||
85 | */ | 88 | */ |
86 | #define in_irq() (hardirq_count()) | 89 | #define in_irq() (hardirq_count()) |
87 | #define in_softirq() (softirq_count()) | 90 | #define in_softirq() (softirq_count()) |
88 | #define in_interrupt() (irq_count()) | 91 | #define in_interrupt() (irq_count()) |
92 | #define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) | ||
89 | 93 | ||
90 | /* | 94 | /* |
91 | * Are we in NMI context? | 95 | * Are we in NMI context? |
92 | */ | 96 | */ |
93 | #define in_nmi() (preempt_count() & NMI_MASK) | 97 | #define in_nmi() (preempt_count() & NMI_MASK) |
94 | 98 | ||
95 | #if defined(CONFIG_PREEMPT) | 99 | #if defined(CONFIG_PREEMPT) && defined(CONFIG_BKL) |
96 | # define PREEMPT_INATOMIC_BASE kernel_locked() | 100 | # define PREEMPT_INATOMIC_BASE kernel_locked() |
97 | # define PREEMPT_CHECK_OFFSET 1 | ||
98 | #else | 101 | #else |
99 | # define PREEMPT_INATOMIC_BASE 0 | 102 | # define PREEMPT_INATOMIC_BASE 0 |
103 | #endif | ||
104 | |||
105 | #if defined(CONFIG_PREEMPT) | ||
106 | # define PREEMPT_CHECK_OFFSET 1 | ||
107 | #else | ||
100 | # define PREEMPT_CHECK_OFFSET 0 | 108 | # define PREEMPT_CHECK_OFFSET 0 |
101 | #endif | 109 | #endif |
102 | 110 | ||
@@ -132,14 +140,16 @@ extern void synchronize_irq(unsigned int irq); | |||
132 | 140 | ||
133 | struct task_struct; | 141 | struct task_struct; |
134 | 142 | ||
135 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING | 143 | #if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING) |
136 | static inline void account_system_vtime(struct task_struct *tsk) | 144 | static inline void account_system_vtime(struct task_struct *tsk) |
137 | { | 145 | { |
138 | } | 146 | } |
147 | #else | ||
148 | extern void account_system_vtime(struct task_struct *tsk); | ||
139 | #endif | 149 | #endif |
140 | 150 | ||
141 | #if defined(CONFIG_NO_HZ) | 151 | #if defined(CONFIG_NO_HZ) |
142 | #if defined(CONFIG_TINY_RCU) | 152 | #if defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) |
143 | extern void rcu_enter_nohz(void); | 153 | extern void rcu_enter_nohz(void); |
144 | extern void rcu_exit_nohz(void); | 154 | extern void rcu_exit_nohz(void); |
145 | 155 | ||
diff --git a/include/linux/hid.h b/include/linux/hid.h index 42a0f1d11365..bb0f56f5c01e 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -316,6 +316,7 @@ struct hid_item { | |||
316 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 | 316 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 |
317 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 | 317 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 |
318 | #define HID_QUIRK_NO_IGNORE 0x40000000 | 318 | #define HID_QUIRK_NO_IGNORE 0x40000000 |
319 | #define HID_QUIRK_NO_INPUT_SYNC 0x80000000 | ||
319 | 320 | ||
320 | /* | 321 | /* |
321 | * This is the global environment of the parser. This information is | 322 | * This is the global environment of the parser. This information is |
@@ -626,8 +627,8 @@ struct hid_driver { | |||
626 | int (*event)(struct hid_device *hdev, struct hid_field *field, | 627 | int (*event)(struct hid_device *hdev, struct hid_field *field, |
627 | struct hid_usage *usage, __s32 value); | 628 | struct hid_usage *usage, __s32 value); |
628 | 629 | ||
629 | void (*report_fixup)(struct hid_device *hdev, __u8 *buf, | 630 | __u8 *(*report_fixup)(struct hid_device *hdev, __u8 *buf, |
630 | unsigned int size); | 631 | unsigned int *size); |
631 | 632 | ||
632 | int (*input_mapping)(struct hid_device *hdev, | 633 | int (*input_mapping)(struct hid_device *hdev, |
633 | struct hid_input *hidinput, struct hid_field *field, | 634 | struct hid_input *hidinput, struct hid_field *field, |
diff --git a/include/linux/hiddev.h b/include/linux/hiddev.h index bb6f58baf319..a3f481a3063b 100644 --- a/include/linux/hiddev.h +++ b/include/linux/hiddev.h | |||
@@ -226,8 +226,6 @@ void hiddev_disconnect(struct hid_device *); | |||
226 | void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, | 226 | void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, |
227 | struct hid_usage *usage, __s32 value); | 227 | struct hid_usage *usage, __s32 value); |
228 | void hiddev_report_event(struct hid_device *hid, struct hid_report *report); | 228 | void hiddev_report_event(struct hid_device *hid, struct hid_report *report); |
229 | int __init hiddev_init(void); | ||
230 | void hiddev_exit(void); | ||
231 | #else | 229 | #else |
232 | static inline int hiddev_connect(struct hid_device *hid, | 230 | static inline int hiddev_connect(struct hid_device *hid, |
233 | unsigned int force) | 231 | unsigned int force) |
@@ -236,8 +234,6 @@ static inline void hiddev_disconnect(struct hid_device *hid) { } | |||
236 | static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, | 234 | static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, |
237 | struct hid_usage *usage, __s32 value) { } | 235 | struct hid_usage *usage, __s32 value) { } |
238 | static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { } | 236 | static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { } |
239 | static inline int hiddev_init(void) { return 0; } | ||
240 | static inline void hiddev_exit(void) { } | ||
241 | #endif | 237 | #endif |
242 | 238 | ||
243 | #endif | 239 | #endif |
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index e3060ef85b6d..b676c585574e 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
6 | #include <linux/mm.h> | 6 | #include <linux/mm.h> |
7 | #include <linux/uaccess.h> | 7 | #include <linux/uaccess.h> |
8 | #include <linux/hardirq.h> | ||
8 | 9 | ||
9 | #include <asm/cacheflush.h> | 10 | #include <asm/cacheflush.h> |
10 | 11 | ||
@@ -28,18 +29,6 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size) | |||
28 | 29 | ||
29 | #include <asm/kmap_types.h> | 30 | #include <asm/kmap_types.h> |
30 | 31 | ||
31 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
32 | |||
33 | void debug_kmap_atomic(enum km_type type); | ||
34 | |||
35 | #else | ||
36 | |||
37 | static inline void debug_kmap_atomic(enum km_type type) | ||
38 | { | ||
39 | } | ||
40 | |||
41 | #endif | ||
42 | |||
43 | #ifdef CONFIG_HIGHMEM | 32 | #ifdef CONFIG_HIGHMEM |
44 | #include <asm/highmem.h> | 33 | #include <asm/highmem.h> |
45 | 34 | ||
@@ -66,19 +55,19 @@ static inline void kunmap(struct page *page) | |||
66 | { | 55 | { |
67 | } | 56 | } |
68 | 57 | ||
69 | static inline void *kmap_atomic(struct page *page, enum km_type idx) | 58 | static inline void *__kmap_atomic(struct page *page) |
70 | { | 59 | { |
71 | pagefault_disable(); | 60 | pagefault_disable(); |
72 | return page_address(page); | 61 | return page_address(page); |
73 | } | 62 | } |
74 | #define kmap_atomic_prot(page, idx, prot) kmap_atomic(page, idx) | 63 | #define kmap_atomic_prot(page, prot) __kmap_atomic(page) |
75 | 64 | ||
76 | static inline void kunmap_atomic_notypecheck(void *addr, enum km_type idx) | 65 | static inline void __kunmap_atomic(void *addr) |
77 | { | 66 | { |
78 | pagefault_enable(); | 67 | pagefault_enable(); |
79 | } | 68 | } |
80 | 69 | ||
81 | #define kmap_atomic_pfn(pfn, idx) kmap_atomic(pfn_to_page(pfn), (idx)) | 70 | #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) |
82 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) | 71 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) |
83 | 72 | ||
84 | #define kmap_flush_unused() do {} while(0) | 73 | #define kmap_flush_unused() do {} while(0) |
@@ -86,12 +75,50 @@ static inline void kunmap_atomic_notypecheck(void *addr, enum km_type idx) | |||
86 | 75 | ||
87 | #endif /* CONFIG_HIGHMEM */ | 76 | #endif /* CONFIG_HIGHMEM */ |
88 | 77 | ||
89 | /* Prevent people trying to call kunmap_atomic() as if it were kunmap() */ | 78 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) |
90 | /* kunmap_atomic() should get the return value of kmap_atomic, not the page. */ | 79 | |
91 | #define kunmap_atomic(addr, idx) do { \ | 80 | DECLARE_PER_CPU(int, __kmap_atomic_idx); |
92 | BUILD_BUG_ON(__same_type((addr), struct page *)); \ | 81 | |
93 | kunmap_atomic_notypecheck((addr), (idx)); \ | 82 | static inline int kmap_atomic_idx_push(void) |
94 | } while (0) | 83 | { |
84 | int idx = __get_cpu_var(__kmap_atomic_idx)++; | ||
85 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
86 | WARN_ON_ONCE(in_irq() && !irqs_disabled()); | ||
87 | BUG_ON(idx > KM_TYPE_NR); | ||
88 | #endif | ||
89 | return idx; | ||
90 | } | ||
91 | |||
92 | static inline int kmap_atomic_idx(void) | ||
93 | { | ||
94 | return __get_cpu_var(__kmap_atomic_idx) - 1; | ||
95 | } | ||
96 | |||
97 | static inline int kmap_atomic_idx_pop(void) | ||
98 | { | ||
99 | int idx = --__get_cpu_var(__kmap_atomic_idx); | ||
100 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
101 | BUG_ON(idx < 0); | ||
102 | #endif | ||
103 | return idx; | ||
104 | } | ||
105 | |||
106 | #endif | ||
107 | |||
108 | /* | ||
109 | * Make both: kmap_atomic(page, idx) and kmap_atomic(page) work. | ||
110 | */ | ||
111 | #define kmap_atomic(page, args...) __kmap_atomic(page) | ||
112 | |||
113 | /* | ||
114 | * Prevent people trying to call kunmap_atomic() as if it were kunmap() | ||
115 | * kunmap_atomic() should get the return value of kmap_atomic, not the page. | ||
116 | */ | ||
117 | #define kunmap_atomic(addr, args...) \ | ||
118 | do { \ | ||
119 | BUILD_BUG_ON(__same_type((addr), struct page *)); \ | ||
120 | __kunmap_atomic(addr); \ | ||
121 | } while (0) | ||
95 | 122 | ||
96 | /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ | 123 | /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ |
97 | #ifndef clear_user_highpage | 124 | #ifndef clear_user_highpage |
@@ -201,8 +228,8 @@ static inline void copy_user_highpage(struct page *to, struct page *from, | |||
201 | vfrom = kmap_atomic(from, KM_USER0); | 228 | vfrom = kmap_atomic(from, KM_USER0); |
202 | vto = kmap_atomic(to, KM_USER1); | 229 | vto = kmap_atomic(to, KM_USER1); |
203 | copy_user_page(vto, vfrom, vaddr, to); | 230 | copy_user_page(vto, vfrom, vaddr, to); |
204 | kunmap_atomic(vfrom, KM_USER0); | ||
205 | kunmap_atomic(vto, KM_USER1); | 231 | kunmap_atomic(vto, KM_USER1); |
232 | kunmap_atomic(vfrom, KM_USER0); | ||
206 | } | 233 | } |
207 | 234 | ||
208 | #endif | 235 | #endif |
@@ -214,8 +241,8 @@ static inline void copy_highpage(struct page *to, struct page *from) | |||
214 | vfrom = kmap_atomic(from, KM_USER0); | 241 | vfrom = kmap_atomic(from, KM_USER0); |
215 | vto = kmap_atomic(to, KM_USER1); | 242 | vto = kmap_atomic(to, KM_USER1); |
216 | copy_page(vto, vfrom); | 243 | copy_page(vto, vfrom); |
217 | kunmap_atomic(vfrom, KM_USER0); | ||
218 | kunmap_atomic(vto, KM_USER1); | 244 | kunmap_atomic(vto, KM_USER1); |
245 | kunmap_atomic(vfrom, KM_USER0); | ||
219 | } | 246 | } |
220 | 247 | ||
221 | #endif /* _LINUX_HIGHMEM_H */ | 248 | #endif /* _LINUX_HIGHMEM_H */ |
diff --git a/include/linux/htirq.h b/include/linux/htirq.h index c96ea46737d0..70a1dbbf2093 100644 --- a/include/linux/htirq.h +++ b/include/linux/htirq.h | |||
@@ -9,8 +9,9 @@ struct ht_irq_msg { | |||
9 | /* Helper functions.. */ | 9 | /* Helper functions.. */ |
10 | void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); | 10 | void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); |
11 | void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); | 11 | void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); |
12 | void mask_ht_irq(unsigned int irq); | 12 | struct irq_data; |
13 | void unmask_ht_irq(unsigned int irq); | 13 | void mask_ht_irq(struct irq_data *data); |
14 | void unmask_ht_irq(struct irq_data *data); | ||
14 | 15 | ||
15 | /* The arch hook for getting things started */ | 16 | /* The arch hook for getting things started */ |
16 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev); | 17 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev); |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index f479700df61b..943c76b3d4bb 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -43,7 +43,8 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to, | |||
43 | struct vm_area_struct *vma, | 43 | struct vm_area_struct *vma, |
44 | int acctflags); | 44 | int acctflags); |
45 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); | 45 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); |
46 | void __isolate_hwpoisoned_huge_page(struct page *page); | 46 | int dequeue_hwpoisoned_huge_page(struct page *page); |
47 | void copy_huge_page(struct page *dst, struct page *src); | ||
47 | 48 | ||
48 | extern unsigned long hugepages_treat_as_movable; | 49 | extern unsigned long hugepages_treat_as_movable; |
49 | extern const unsigned long hugetlb_zero, hugetlb_infinity; | 50 | extern const unsigned long hugetlb_zero, hugetlb_infinity; |
@@ -101,7 +102,10 @@ static inline void hugetlb_report_meminfo(struct seq_file *m) | |||
101 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) | 102 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) |
102 | #define hugetlb_fault(mm, vma, addr, flags) ({ BUG(); 0; }) | 103 | #define hugetlb_fault(mm, vma, addr, flags) ({ BUG(); 0; }) |
103 | #define huge_pte_offset(mm, address) 0 | 104 | #define huge_pte_offset(mm, address) 0 |
104 | #define __isolate_hwpoisoned_huge_page(page) 0 | 105 | #define dequeue_hwpoisoned_huge_page(page) 0 |
106 | static inline void copy_huge_page(struct page *dst, struct page *src) | ||
107 | { | ||
108 | } | ||
105 | 109 | ||
106 | #define hugetlb_change_protection(vma, address, end, newprot) | 110 | #define hugetlb_change_protection(vma, address, end, newprot) |
107 | 111 | ||
@@ -228,6 +232,8 @@ struct huge_bootmem_page { | |||
228 | struct hstate *hstate; | 232 | struct hstate *hstate; |
229 | }; | 233 | }; |
230 | 234 | ||
235 | struct page *alloc_huge_page_node(struct hstate *h, int nid); | ||
236 | |||
231 | /* arch callback */ | 237 | /* arch callback */ |
232 | int __init alloc_bootmem_huge_page(struct hstate *h); | 238 | int __init alloc_bootmem_huge_page(struct hstate *h); |
233 | 239 | ||
@@ -301,8 +307,14 @@ static inline struct hstate *page_hstate(struct page *page) | |||
301 | return size_to_hstate(PAGE_SIZE << compound_order(page)); | 307 | return size_to_hstate(PAGE_SIZE << compound_order(page)); |
302 | } | 308 | } |
303 | 309 | ||
310 | static inline unsigned hstate_index_to_shift(unsigned index) | ||
311 | { | ||
312 | return hstates[index].order + PAGE_SHIFT; | ||
313 | } | ||
314 | |||
304 | #else | 315 | #else |
305 | struct hstate {}; | 316 | struct hstate {}; |
317 | #define alloc_huge_page_node(h, nid) NULL | ||
306 | #define alloc_bootmem_huge_page(h) NULL | 318 | #define alloc_bootmem_huge_page(h) NULL |
307 | #define hstate_file(f) NULL | 319 | #define hstate_file(f) NULL |
308 | #define hstate_vma(v) NULL | 320 | #define hstate_vma(v) NULL |
@@ -317,6 +329,7 @@ static inline unsigned int pages_per_huge_page(struct hstate *h) | |||
317 | { | 329 | { |
318 | return 1; | 330 | return 1; |
319 | } | 331 | } |
332 | #define hstate_index_to_shift(index) 0 | ||
320 | #endif | 333 | #endif |
321 | 334 | ||
322 | #endif /* _LINUX_HUGETLB_H */ | 335 | #endif /* _LINUX_HUGETLB_H */ |
diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h index e844a0b18695..4bef5c557160 100644 --- a/include/linux/i2c-id.h +++ b/include/linux/i2c-id.h | |||
@@ -32,28 +32,6 @@ | |||
32 | */ | 32 | */ |
33 | 33 | ||
34 | /* --- Bit algorithm adapters */ | 34 | /* --- Bit algorithm adapters */ |
35 | #define I2C_HW_B_BT848 0x010005 /* BT848 video boards */ | ||
36 | #define I2C_HW_B_RIVA 0x010010 /* Riva based graphics cards */ | ||
37 | #define I2C_HW_B_ZR36067 0x010019 /* Zoran-36057/36067 based boards */ | ||
38 | #define I2C_HW_B_CX2388x 0x01001b /* connexant 2388x based tv cards */ | 35 | #define I2C_HW_B_CX2388x 0x01001b /* connexant 2388x based tv cards */ |
39 | #define I2C_HW_B_EM28XX 0x01001f /* em28xx video capture cards */ | ||
40 | #define I2C_HW_B_CX2341X 0x010020 /* Conexant CX2341X MPEG encoder cards */ | ||
41 | #define I2C_HW_B_CX23885 0x010022 /* conexant 23885 based tv cards (bus1) */ | ||
42 | #define I2C_HW_B_AU0828 0x010023 /* auvitek au0828 usb bridge */ | ||
43 | #define I2C_HW_B_CX231XX 0x010024 /* Conexant CX231XX USB based cards */ | ||
44 | #define I2C_HW_B_HDPVR 0x010025 /* Hauppauge HD PVR */ | ||
45 | |||
46 | /* --- SGI adapters */ | ||
47 | #define I2C_HW_SGI_VINO 0x160000 | ||
48 | |||
49 | /* --- SMBus only adapters */ | ||
50 | #define I2C_HW_SMBUS_W9968CF 0x04000d | ||
51 | #define I2C_HW_SMBUS_OV511 0x04000e /* OV511(+) USB 1.1 webcam ICs */ | ||
52 | #define I2C_HW_SMBUS_OV518 0x04000f /* OV518(+) USB 1.1 webcam ICs */ | ||
53 | #define I2C_HW_SMBUS_CAFE 0x040012 /* Marvell 88ALP01 "CAFE" cam */ | ||
54 | |||
55 | /* --- Miscellaneous adapters */ | ||
56 | #define I2C_HW_SAA7146 0x060000 /* SAA7146 video decoder bus */ | ||
57 | #define I2C_HW_SAA7134 0x090000 /* SAA7134 video decoder bus */ | ||
58 | 36 | ||
59 | #endif /* LINUX_I2C_ID_H */ | 37 | #endif /* LINUX_I2C_ID_H */ |
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 4bae0b72ed3c..56cfe23ffb39 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -353,7 +353,7 @@ struct i2c_algorithm { | |||
353 | */ | 353 | */ |
354 | struct i2c_adapter { | 354 | struct i2c_adapter { |
355 | struct module *owner; | 355 | struct module *owner; |
356 | unsigned int id; | 356 | unsigned int id __deprecated; |
357 | unsigned int class; /* classes to allow probing for */ | 357 | unsigned int class; /* classes to allow probing for */ |
358 | const struct i2c_algorithm *algo; /* the algorithm to access the bus */ | 358 | const struct i2c_algorithm *algo; /* the algorithm to access the bus */ |
359 | void *algo_data; | 359 | void *algo_data; |
@@ -384,11 +384,15 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data) | |||
384 | dev_set_drvdata(&dev->dev, data); | 384 | dev_set_drvdata(&dev->dev, data); |
385 | } | 385 | } |
386 | 386 | ||
387 | static inline int i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) | 387 | static inline struct i2c_adapter * |
388 | i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) | ||
388 | { | 389 | { |
389 | return adapter->dev.parent != NULL | 390 | struct device *parent = adapter->dev.parent; |
390 | && adapter->dev.parent->bus == &i2c_bus_type | 391 | |
391 | && adapter->dev.parent->type == &i2c_adapter_type; | 392 | if (parent != NULL && parent->type == &i2c_adapter_type) |
393 | return to_i2c_adapter(parent); | ||
394 | else | ||
395 | return NULL; | ||
392 | } | 396 | } |
393 | 397 | ||
394 | /* Adapter locking functions, exported for shared pin cases */ | 398 | /* Adapter locking functions, exported for shared pin cases */ |
@@ -403,8 +407,6 @@ void i2c_unlock_adapter(struct i2c_adapter *); | |||
403 | 407 | ||
404 | /* i2c adapter classes (bitmask) */ | 408 | /* i2c adapter classes (bitmask) */ |
405 | #define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */ | 409 | #define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */ |
406 | #define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */ | ||
407 | #define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */ | ||
408 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ | 410 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ |
409 | #define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */ | 411 | #define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */ |
410 | 412 | ||
diff --git a/include/linux/i2c/adp5588.h b/include/linux/i2c/adp5588.h index 269181b8f623..cec17cf6cac2 100644 --- a/include/linux/i2c/adp5588.h +++ b/include/linux/i2c/adp5588.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Analog Devices ADP5588 I/O Expander and QWERTY Keypad Controller | 2 | * Analog Devices ADP5588 I/O Expander and QWERTY Keypad Controller |
3 | * | 3 | * |
4 | * Copyright 2009 Analog Devices Inc. | 4 | * Copyright 2009-2010 Analog Devices Inc. |
5 | * | 5 | * |
6 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
7 | */ | 7 | */ |
@@ -74,6 +74,33 @@ | |||
74 | 74 | ||
75 | #define ADP5588_DEVICE_ID_MASK 0xF | 75 | #define ADP5588_DEVICE_ID_MASK 0xF |
76 | 76 | ||
77 | /* Configuration Register1 */ | ||
78 | #define ADP5588_AUTO_INC (1 << 7) | ||
79 | #define ADP5588_GPIEM_CFG (1 << 6) | ||
80 | #define ADP5588_OVR_FLOW_M (1 << 5) | ||
81 | #define ADP5588_INT_CFG (1 << 4) | ||
82 | #define ADP5588_OVR_FLOW_IEN (1 << 3) | ||
83 | #define ADP5588_K_LCK_IM (1 << 2) | ||
84 | #define ADP5588_GPI_IEN (1 << 1) | ||
85 | #define ADP5588_KE_IEN (1 << 0) | ||
86 | |||
87 | /* Interrupt Status Register */ | ||
88 | #define ADP5588_CMP2_INT (1 << 5) | ||
89 | #define ADP5588_CMP1_INT (1 << 4) | ||
90 | #define ADP5588_OVR_FLOW_INT (1 << 3) | ||
91 | #define ADP5588_K_LCK_INT (1 << 2) | ||
92 | #define ADP5588_GPI_INT (1 << 1) | ||
93 | #define ADP5588_KE_INT (1 << 0) | ||
94 | |||
95 | /* Key Lock and Event Counter Register */ | ||
96 | #define ADP5588_K_LCK_EN (1 << 6) | ||
97 | #define ADP5588_LCK21 0x30 | ||
98 | #define ADP5588_KEC 0xF | ||
99 | |||
100 | #define ADP5588_MAXGPIO 18 | ||
101 | #define ADP5588_BANK(offs) ((offs) >> 3) | ||
102 | #define ADP5588_BIT(offs) (1u << ((offs) & 0x7)) | ||
103 | |||
77 | /* Put one of these structures in i2c_board_info platform_data */ | 104 | /* Put one of these structures in i2c_board_info platform_data */ |
78 | 105 | ||
79 | #define ADP5588_KEYMAPSIZE 80 | 106 | #define ADP5588_KEYMAPSIZE 80 |
@@ -126,9 +153,12 @@ struct adp5588_kpad_platform_data { | |||
126 | const struct adp5588_gpio_platform_data *gpio_data; | 153 | const struct adp5588_gpio_platform_data *gpio_data; |
127 | }; | 154 | }; |
128 | 155 | ||
156 | struct i2c_client; /* forward declaration */ | ||
157 | |||
129 | struct adp5588_gpio_platform_data { | 158 | struct adp5588_gpio_platform_data { |
130 | unsigned gpio_start; /* GPIO Chip base # */ | 159 | int gpio_start; /* GPIO Chip base # */ |
131 | unsigned pullup_dis_mask; /* Pull-Up Disable Mask */ | 160 | unsigned irq_base; /* interrupt base # */ |
161 | unsigned pullup_dis_mask; /* Pull-Up Disable Mask */ | ||
132 | int (*setup)(struct i2c_client *client, | 162 | int (*setup)(struct i2c_client *client, |
133 | int gpio, unsigned ngpio, | 163 | int gpio, unsigned ngpio, |
134 | void *context); | 164 | void *context); |
diff --git a/include/linux/i2c/apds990x.h b/include/linux/i2c/apds990x.h new file mode 100644 index 000000000000..d186fcc5d257 --- /dev/null +++ b/include/linux/i2c/apds990x.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * This file is part of the APDS990x sensor driver. | ||
3 | * Chip is combined proximity and ambient light sensor. | ||
4 | * | ||
5 | * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | ||
6 | * | ||
7 | * Contact: Samu Onkalo <samu.p.onkalo@nokia.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * version 2 as published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, but | ||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * 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., 51 Franklin St, Fifth Floor, Boston, MA | ||
21 | * 02110-1301 USA | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #ifndef __APDS990X_H__ | ||
26 | #define __APDS990X_H__ | ||
27 | |||
28 | |||
29 | #define APDS_IRLED_CURR_12mA 0x3 | ||
30 | #define APDS_IRLED_CURR_25mA 0x2 | ||
31 | #define APDS_IRLED_CURR_50mA 0x1 | ||
32 | #define APDS_IRLED_CURR_100mA 0x0 | ||
33 | |||
34 | /** | ||
35 | * struct apds990x_chip_factors - defines effect of the cover window | ||
36 | * @ga: Total glass attenuation | ||
37 | * @cf1: clear channel factor 1 for raw to lux conversion | ||
38 | * @irf1: IR channel factor 1 for raw to lux conversion | ||
39 | * @cf2: clear channel factor 2 for raw to lux conversion | ||
40 | * @irf2: IR channel factor 2 for raw to lux conversion | ||
41 | * @df: device factor for conversion formulas | ||
42 | * | ||
43 | * Structure for tuning ALS calculation to match with environment. | ||
44 | * Values depend on the material above the sensor and the sensor | ||
45 | * itself. If the GA is zero, driver will use uncovered sensor default values | ||
46 | * format: decimal value * APDS_PARAM_SCALE except df which is plain integer. | ||
47 | */ | ||
48 | #define APDS_PARAM_SCALE 4096 | ||
49 | struct apds990x_chip_factors { | ||
50 | int ga; | ||
51 | int cf1; | ||
52 | int irf1; | ||
53 | int cf2; | ||
54 | int irf2; | ||
55 | int df; | ||
56 | }; | ||
57 | |||
58 | /** | ||
59 | * struct apds990x_platform_data - platform data for apsd990x.c driver | ||
60 | * @cf: chip factor data | ||
61 | * @pddrive: IR-led driving current | ||
62 | * @ppcount: number of IR pulses used for proximity estimation | ||
63 | * @setup_resources: interrupt line setup call back function | ||
64 | * @release_resources: interrupt line release call back function | ||
65 | * | ||
66 | * Proximity detection result depends heavily on correct ppcount, pdrive | ||
67 | * and cover window. | ||
68 | * | ||
69 | */ | ||
70 | |||
71 | struct apds990x_platform_data { | ||
72 | struct apds990x_chip_factors cf; | ||
73 | u8 pdrive; | ||
74 | u8 ppcount; | ||
75 | int (*setup_resources)(void); | ||
76 | int (*release_resources)(void); | ||
77 | }; | ||
78 | |||
79 | #endif | ||
diff --git a/include/linux/i2c/bh1770glc.h b/include/linux/i2c/bh1770glc.h new file mode 100644 index 000000000000..8b5e2df36c72 --- /dev/null +++ b/include/linux/i2c/bh1770glc.h | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * This file is part of the ROHM BH1770GLC / OSRAM SFH7770 sensor driver. | ||
3 | * Chip is combined proximity and ambient light sensor. | ||
4 | * | ||
5 | * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | ||
6 | * | ||
7 | * Contact: Samu Onkalo <samu.p.onkalo@nokia.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * version 2 as published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, but | ||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * 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., 51 Franklin St, Fifth Floor, Boston, MA | ||
21 | * 02110-1301 USA | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #ifndef __BH1770_H__ | ||
26 | #define __BH1770_H__ | ||
27 | |||
28 | /** | ||
29 | * struct bh1770_platform_data - platform data for bh1770glc driver | ||
30 | * @led_def_curr: IR led driving current. | ||
31 | * @glass_attenuation: Attenuation factor for covering window. | ||
32 | * @setup_resources: Call back for interrupt line setup function | ||
33 | * @release_resources: Call back for interrupte line release function | ||
34 | * | ||
35 | * Example of glass attenuation: 16384 * 385 / 100 means attenuation factor | ||
36 | * of 3.85. i.e. light_above_sensor = light_above_cover_window / 3.85 | ||
37 | */ | ||
38 | |||
39 | struct bh1770_platform_data { | ||
40 | #define BH1770_LED_5mA 0 | ||
41 | #define BH1770_LED_10mA 1 | ||
42 | #define BH1770_LED_20mA 2 | ||
43 | #define BH1770_LED_50mA 3 | ||
44 | #define BH1770_LED_100mA 4 | ||
45 | #define BH1770_LED_150mA 5 | ||
46 | #define BH1770_LED_200mA 6 | ||
47 | __u8 led_def_curr; | ||
48 | #define BH1770_NEUTRAL_GA 16384 /* 16384 / 16384 = 1 */ | ||
49 | __u32 glass_attenuation; | ||
50 | int (*setup_resources)(void); | ||
51 | int (*release_resources)(void); | ||
52 | }; | ||
53 | #endif | ||
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 6de90bfc6acd..c760991b354a 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h | |||
@@ -141,6 +141,16 @@ | |||
141 | #define TWL6030_CHARGER_CTRL_INT_MASK 0x10 | 141 | #define TWL6030_CHARGER_CTRL_INT_MASK 0x10 |
142 | #define TWL6030_CHARGER_FAULT_INT_MASK 0x60 | 142 | #define TWL6030_CHARGER_FAULT_INT_MASK 0x60 |
143 | 143 | ||
144 | #define TWL6030_MMCCTRL 0xEE | ||
145 | #define VMMC_AUTO_OFF (0x1 << 3) | ||
146 | #define SW_FC (0x1 << 2) | ||
147 | #define STS_MMC 0x1 | ||
148 | |||
149 | #define TWL6030_CFG_INPUT_PUPD3 0xF2 | ||
150 | #define MMC_PU (0x1 << 3) | ||
151 | #define MMC_PD (0x1 << 2) | ||
152 | |||
153 | |||
144 | 154 | ||
145 | #define TWL4030_CLASS_ID 0x4030 | 155 | #define TWL4030_CLASS_ID 0x4030 |
146 | #define TWL6030_CLASS_ID 0x6030 | 156 | #define TWL6030_CLASS_ID 0x6030 |
@@ -173,6 +183,27 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); | |||
173 | int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); | 183 | int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); |
174 | int twl6030_interrupt_mask(u8 bit_mask, u8 offset); | 184 | int twl6030_interrupt_mask(u8 bit_mask, u8 offset); |
175 | 185 | ||
186 | /* Card detect Configuration for MMC1 Controller on OMAP4 */ | ||
187 | #ifdef CONFIG_TWL4030_CORE | ||
188 | int twl6030_mmc_card_detect_config(void); | ||
189 | #else | ||
190 | static inline int twl6030_mmc_card_detect_config(void) | ||
191 | { | ||
192 | pr_debug("twl6030_mmc_card_detect_config not supported\n"); | ||
193 | return 0; | ||
194 | } | ||
195 | #endif | ||
196 | |||
197 | /* MMC1 Controller on OMAP4 uses Phoenix irq for Card detect */ | ||
198 | #ifdef CONFIG_TWL4030_CORE | ||
199 | int twl6030_mmc_card_detect(struct device *dev, int slot); | ||
200 | #else | ||
201 | static inline int twl6030_mmc_card_detect(struct device *dev, int slot) | ||
202 | { | ||
203 | pr_debug("Call back twl6030_mmc_card_detect not supported\n"); | ||
204 | return -EIO; | ||
205 | } | ||
206 | #endif | ||
176 | /*----------------------------------------------------------------------*/ | 207 | /*----------------------------------------------------------------------*/ |
177 | 208 | ||
178 | /* | 209 | /* |
@@ -357,6 +388,52 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset); | |||
357 | 388 | ||
358 | /*----------------------------------------------------------------------*/ | 389 | /*----------------------------------------------------------------------*/ |
359 | 390 | ||
391 | /* | ||
392 | * PM Master module register offsets (use TWL4030_MODULE_PM_MASTER) | ||
393 | */ | ||
394 | |||
395 | #define TWL4030_PM_MASTER_CFG_P1_TRANSITION 0x00 | ||
396 | #define TWL4030_PM_MASTER_CFG_P2_TRANSITION 0x01 | ||
397 | #define TWL4030_PM_MASTER_CFG_P3_TRANSITION 0x02 | ||
398 | #define TWL4030_PM_MASTER_CFG_P123_TRANSITION 0x03 | ||
399 | #define TWL4030_PM_MASTER_STS_BOOT 0x04 | ||
400 | #define TWL4030_PM_MASTER_CFG_BOOT 0x05 | ||
401 | #define TWL4030_PM_MASTER_SHUNDAN 0x06 | ||
402 | #define TWL4030_PM_MASTER_BOOT_BCI 0x07 | ||
403 | #define TWL4030_PM_MASTER_CFG_PWRANA1 0x08 | ||
404 | #define TWL4030_PM_MASTER_CFG_PWRANA2 0x09 | ||
405 | #define TWL4030_PM_MASTER_BACKUP_MISC_STS 0x0b | ||
406 | #define TWL4030_PM_MASTER_BACKUP_MISC_CFG 0x0c | ||
407 | #define TWL4030_PM_MASTER_BACKUP_MISC_TST 0x0d | ||
408 | #define TWL4030_PM_MASTER_PROTECT_KEY 0x0e | ||
409 | #define TWL4030_PM_MASTER_STS_HW_CONDITIONS 0x0f | ||
410 | #define TWL4030_PM_MASTER_P1_SW_EVENTS 0x10 | ||
411 | #define TWL4030_PM_MASTER_P2_SW_EVENTS 0x11 | ||
412 | #define TWL4030_PM_MASTER_P3_SW_EVENTS 0x12 | ||
413 | #define TWL4030_PM_MASTER_STS_P123_STATE 0x13 | ||
414 | #define TWL4030_PM_MASTER_PB_CFG 0x14 | ||
415 | #define TWL4030_PM_MASTER_PB_WORD_MSB 0x15 | ||
416 | #define TWL4030_PM_MASTER_PB_WORD_LSB 0x16 | ||
417 | #define TWL4030_PM_MASTER_SEQ_ADD_W2P 0x1c | ||
418 | #define TWL4030_PM_MASTER_SEQ_ADD_P2A 0x1d | ||
419 | #define TWL4030_PM_MASTER_SEQ_ADD_A2W 0x1e | ||
420 | #define TWL4030_PM_MASTER_SEQ_ADD_A2S 0x1f | ||
421 | #define TWL4030_PM_MASTER_SEQ_ADD_S2A12 0x20 | ||
422 | #define TWL4030_PM_MASTER_SEQ_ADD_S2A3 0x21 | ||
423 | #define TWL4030_PM_MASTER_SEQ_ADD_WARM 0x22 | ||
424 | #define TWL4030_PM_MASTER_MEMORY_ADDRESS 0x23 | ||
425 | #define TWL4030_PM_MASTER_MEMORY_DATA 0x24 | ||
426 | |||
427 | #define TWL4030_PM_MASTER_KEY_CFG1 0xc0 | ||
428 | #define TWL4030_PM_MASTER_KEY_CFG2 0x0c | ||
429 | |||
430 | #define TWL4030_PM_MASTER_KEY_TST1 0xe0 | ||
431 | #define TWL4030_PM_MASTER_KEY_TST2 0x0e | ||
432 | |||
433 | #define TWL4030_PM_MASTER_GLOBAL_TST 0xb6 | ||
434 | |||
435 | /*----------------------------------------------------------------------*/ | ||
436 | |||
360 | /* Power bus message definitions */ | 437 | /* Power bus message definitions */ |
361 | 438 | ||
362 | /* The TWL4030/5030 splits its power-management resources (the various | 439 | /* The TWL4030/5030 splits its power-management resources (the various |
@@ -553,8 +630,12 @@ extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts); | |||
553 | extern int twl4030_remove_script(u8 flags); | 630 | extern int twl4030_remove_script(u8 flags); |
554 | 631 | ||
555 | struct twl4030_codec_audio_data { | 632 | struct twl4030_codec_audio_data { |
556 | unsigned int audio_mclk; | 633 | unsigned int audio_mclk; /* not used, will be removed */ |
634 | unsigned int digimic_delay; /* in ms */ | ||
557 | unsigned int ramp_delay_value; | 635 | unsigned int ramp_delay_value; |
636 | unsigned int offset_cncl_path; | ||
637 | unsigned int check_defaults:1; | ||
638 | unsigned int reset_registers:1; | ||
558 | unsigned int hs_extmute:1; | 639 | unsigned int hs_extmute:1; |
559 | void (*set_hs_extmute)(int mute); | 640 | void (*set_hs_extmute)(int mute); |
560 | }; | 641 | }; |
diff --git a/include/linux/idr.h b/include/linux/idr.h index e968db71e33a..13a801f3d028 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h | |||
@@ -50,14 +50,14 @@ | |||
50 | 50 | ||
51 | struct idr_layer { | 51 | struct idr_layer { |
52 | unsigned long bitmap; /* A zero bit means "space here" */ | 52 | unsigned long bitmap; /* A zero bit means "space here" */ |
53 | struct idr_layer *ary[1<<IDR_BITS]; | 53 | struct idr_layer __rcu *ary[1<<IDR_BITS]; |
54 | int count; /* When zero, we can release it */ | 54 | int count; /* When zero, we can release it */ |
55 | int layer; /* distance from leaf */ | 55 | int layer; /* distance from leaf */ |
56 | struct rcu_head rcu_head; | 56 | struct rcu_head rcu_head; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | struct idr { | 59 | struct idr { |
60 | struct idr_layer *top; | 60 | struct idr_layer __rcu *top; |
61 | struct idr_layer *id_free; | 61 | struct idr_layer *id_free; |
62 | int layers; /* only valid without concurrent changes */ | 62 | int layers; /* only valid without concurrent changes */ |
63 | int id_free_cnt; | 63 | int id_free_cnt; |
@@ -81,6 +81,7 @@ struct idr { | |||
81 | #define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) | 81 | #define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) |
82 | 82 | ||
83 | /** | 83 | /** |
84 | * DOC: idr sync | ||
84 | * idr synchronization (stolen from radix-tree.h) | 85 | * idr synchronization (stolen from radix-tree.h) |
85 | * | 86 | * |
86 | * idr_find() is able to be called locklessly, using RCU. The caller must | 87 | * idr_find() is able to be called locklessly, using RCU. The caller must |
@@ -117,10 +118,13 @@ void idr_init(struct idr *idp); | |||
117 | /* | 118 | /* |
118 | * IDA - IDR based id allocator, use when translation from id to | 119 | * IDA - IDR based id allocator, use when translation from id to |
119 | * pointer isn't necessary. | 120 | * pointer isn't necessary. |
121 | * | ||
122 | * IDA_BITMAP_LONGS is calculated to be one less to accommodate | ||
123 | * ida_bitmap->nr_busy so that the whole struct fits in 128 bytes. | ||
120 | */ | 124 | */ |
121 | #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ | 125 | #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ |
122 | #define IDA_BITMAP_LONGS (128 / sizeof(long) - 1) | 126 | #define IDA_BITMAP_LONGS (IDA_CHUNK_SIZE / sizeof(long) - 1) |
123 | #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) | 127 | #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) |
124 | 128 | ||
125 | struct ida_bitmap { | 129 | struct ida_bitmap { |
126 | long nr_busy; | 130 | long nr_busy; |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 97b2eae6a22c..ed5a03cbe184 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -986,6 +986,7 @@ struct ieee80211_ht_info { | |||
986 | #define WLAN_AUTH_OPEN 0 | 986 | #define WLAN_AUTH_OPEN 0 |
987 | #define WLAN_AUTH_SHARED_KEY 1 | 987 | #define WLAN_AUTH_SHARED_KEY 1 |
988 | #define WLAN_AUTH_FT 2 | 988 | #define WLAN_AUTH_FT 2 |
989 | #define WLAN_AUTH_SAE 3 | ||
989 | #define WLAN_AUTH_LEAP 128 | 990 | #define WLAN_AUTH_LEAP 128 |
990 | 991 | ||
991 | #define WLAN_AUTH_CHALLENGE_LEN 128 | 992 | #define WLAN_AUTH_CHALLENGE_LEN 128 |
@@ -1072,6 +1073,10 @@ enum ieee80211_statuscode { | |||
1072 | WLAN_STATUS_NO_DIRECT_LINK = 48, | 1073 | WLAN_STATUS_NO_DIRECT_LINK = 48, |
1073 | WLAN_STATUS_STA_NOT_PRESENT = 49, | 1074 | WLAN_STATUS_STA_NOT_PRESENT = 49, |
1074 | WLAN_STATUS_STA_NOT_QSTA = 50, | 1075 | WLAN_STATUS_STA_NOT_QSTA = 50, |
1076 | /* 802.11s */ | ||
1077 | WLAN_STATUS_ANTI_CLOG_REQUIRED = 76, | ||
1078 | WLAN_STATUS_FCG_NOT_SUPP = 78, | ||
1079 | WLAN_STATUS_STA_NO_TBTT = 78, | ||
1075 | }; | 1080 | }; |
1076 | 1081 | ||
1077 | 1082 | ||
@@ -1112,6 +1117,22 @@ enum ieee80211_reasoncode { | |||
1112 | WLAN_REASON_QSTA_REQUIRE_SETUP = 38, | 1117 | WLAN_REASON_QSTA_REQUIRE_SETUP = 38, |
1113 | WLAN_REASON_QSTA_TIMEOUT = 39, | 1118 | WLAN_REASON_QSTA_TIMEOUT = 39, |
1114 | WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45, | 1119 | WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45, |
1120 | /* 802.11s */ | ||
1121 | WLAN_REASON_MESH_PEER_CANCELED = 52, | ||
1122 | WLAN_REASON_MESH_MAX_PEERS = 53, | ||
1123 | WLAN_REASON_MESH_CONFIG = 54, | ||
1124 | WLAN_REASON_MESH_CLOSE = 55, | ||
1125 | WLAN_REASON_MESH_MAX_RETRIES = 56, | ||
1126 | WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57, | ||
1127 | WLAN_REASON_MESH_INVALID_GTK = 58, | ||
1128 | WLAN_REASON_MESH_INCONSISTENT_PARAM = 59, | ||
1129 | WLAN_REASON_MESH_INVALID_SECURITY = 60, | ||
1130 | WLAN_REASON_MESH_PATH_ERROR = 61, | ||
1131 | WLAN_REASON_MESH_PATH_NOFORWARD = 62, | ||
1132 | WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63, | ||
1133 | WLAN_REASON_MAC_EXISTS_IN_MBSS = 64, | ||
1134 | WLAN_REASON_MESH_CHAN_REGULATORY = 65, | ||
1135 | WLAN_REASON_MESH_CHAN = 66, | ||
1115 | }; | 1136 | }; |
1116 | 1137 | ||
1117 | 1138 | ||
@@ -1139,20 +1160,33 @@ enum ieee80211_eid { | |||
1139 | WLAN_EID_TS_DELAY = 43, | 1160 | WLAN_EID_TS_DELAY = 43, |
1140 | WLAN_EID_TCLAS_PROCESSING = 44, | 1161 | WLAN_EID_TCLAS_PROCESSING = 44, |
1141 | WLAN_EID_QOS_CAPA = 46, | 1162 | WLAN_EID_QOS_CAPA = 46, |
1142 | /* 802.11s | 1163 | /* 802.11s */ |
1143 | * | 1164 | WLAN_EID_MESH_CONFIG = 113, |
1144 | * All mesh EID numbers are pending IEEE 802.11 ANA approval. | 1165 | WLAN_EID_MESH_ID = 114, |
1145 | * The numbers have been incremented from those suggested in | 1166 | WLAN_EID_LINK_METRIC_REPORT = 115, |
1146 | * 802.11s/D2.0 so that MESH_CONFIG does not conflict with | 1167 | WLAN_EID_CONGESTION_NOTIFICATION = 116, |
1147 | * EXT_SUPP_RATES. | 1168 | /* Note that the Peer Link IE has been replaced with the similar |
1169 | * Peer Management IE. We will keep the former definition until mesh | ||
1170 | * code is changed to comply with latest 802.11s drafts. | ||
1148 | */ | 1171 | */ |
1149 | WLAN_EID_MESH_CONFIG = 51, | 1172 | WLAN_EID_PEER_LINK = 55, /* no longer in 802.11s drafts */ |
1150 | WLAN_EID_MESH_ID = 52, | 1173 | WLAN_EID_PEER_MGMT = 117, |
1151 | WLAN_EID_PEER_LINK = 55, | 1174 | WLAN_EID_CHAN_SWITCH_PARAM = 118, |
1152 | WLAN_EID_PREQ = 68, | 1175 | WLAN_EID_MESH_AWAKE_WINDOW = 119, |
1153 | WLAN_EID_PREP = 69, | 1176 | WLAN_EID_BEACON_TIMING = 120, |
1154 | WLAN_EID_PERR = 70, | 1177 | WLAN_EID_MCCAOP_SETUP_REQ = 121, |
1155 | WLAN_EID_RANN = 49, /* compatible with FreeBSD */ | 1178 | WLAN_EID_MCCAOP_SETUP_RESP = 122, |
1179 | WLAN_EID_MCCAOP_ADVERT = 123, | ||
1180 | WLAN_EID_MCCAOP_TEARDOWN = 124, | ||
1181 | WLAN_EID_GANN = 125, | ||
1182 | WLAN_EID_RANN = 126, | ||
1183 | WLAN_EID_PREQ = 130, | ||
1184 | WLAN_EID_PREP = 131, | ||
1185 | WLAN_EID_PERR = 132, | ||
1186 | WLAN_EID_PXU = 137, | ||
1187 | WLAN_EID_PXUC = 138, | ||
1188 | WLAN_EID_AUTH_MESH_PEER_EXCH = 139, | ||
1189 | WLAN_EID_MIC = 140, | ||
1156 | 1190 | ||
1157 | WLAN_EID_PWR_CONSTRAINT = 32, | 1191 | WLAN_EID_PWR_CONSTRAINT = 32, |
1158 | WLAN_EID_PWR_CAPABILITY = 33, | 1192 | WLAN_EID_PWR_CAPABILITY = 33, |
@@ -1211,9 +1245,14 @@ enum ieee80211_category { | |||
1211 | WLAN_CATEGORY_HT = 7, | 1245 | WLAN_CATEGORY_HT = 7, |
1212 | WLAN_CATEGORY_SA_QUERY = 8, | 1246 | WLAN_CATEGORY_SA_QUERY = 8, |
1213 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, | 1247 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, |
1248 | WLAN_CATEGORY_MESH_ACTION = 13, | ||
1249 | WLAN_CATEGORY_MULTIHOP_ACTION = 14, | ||
1250 | WLAN_CATEGORY_SELF_PROTECTED = 15, | ||
1214 | WLAN_CATEGORY_WMM = 17, | 1251 | WLAN_CATEGORY_WMM = 17, |
1215 | WLAN_CATEGORY_MESH_PLINK = 30, /* Pending ANA approval */ | 1252 | /* TODO: remove MESH_PLINK and MESH_PATH_SEL after */ |
1216 | WLAN_CATEGORY_MESH_PATH_SEL = 32, /* Pending ANA approval */ | 1253 | /* mesh is updated to current 802.11s draft */ |
1254 | WLAN_CATEGORY_MESH_PLINK = 30, | ||
1255 | WLAN_CATEGORY_MESH_PATH_SEL = 32, | ||
1217 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, | 1256 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, |
1218 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, | 1257 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, |
1219 | }; | 1258 | }; |
@@ -1351,6 +1390,8 @@ enum ieee80211_sa_query_action { | |||
1351 | /* AKM suite selectors */ | 1390 | /* AKM suite selectors */ |
1352 | #define WLAN_AKM_SUITE_8021X 0x000FAC01 | 1391 | #define WLAN_AKM_SUITE_8021X 0x000FAC01 |
1353 | #define WLAN_AKM_SUITE_PSK 0x000FAC02 | 1392 | #define WLAN_AKM_SUITE_PSK 0x000FAC02 |
1393 | #define WLAN_AKM_SUITE_SAE 0x000FAC08 | ||
1394 | #define WLAN_AKM_SUITE_FT_OVER_SAE 0x000FAC09 | ||
1354 | 1395 | ||
1355 | #define WLAN_MAX_KEY_LEN 32 | 1396 | #define WLAN_MAX_KEY_LEN 32 |
1356 | 1397 | ||
diff --git a/include/linux/if.h b/include/linux/if.h index 53558ec59e1b..123959927745 100644 --- a/include/linux/if.h +++ b/include/linux/if.h | |||
@@ -75,6 +75,8 @@ | |||
75 | #define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ | 75 | #define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ |
76 | #define IFF_MACVLAN_PORT 0x4000 /* device used as macvlan port */ | 76 | #define IFF_MACVLAN_PORT 0x4000 /* device used as macvlan port */ |
77 | #define IFF_BRIDGE_PORT 0x8000 /* device used as bridge port */ | 77 | #define IFF_BRIDGE_PORT 0x8000 /* device used as bridge port */ |
78 | #define IFF_OVS_DATAPATH 0x10000 /* device used as Open vSwitch | ||
79 | * datapath port */ | ||
78 | 80 | ||
79 | #define IF_GET_IFACE 0x0001 /* for querying only */ | 81 | #define IF_GET_IFACE 0x0001 /* for querying only */ |
80 | #define IF_GET_PROTO 0x0002 | 82 | #define IF_GET_PROTO 0x0002 |
diff --git a/include/linux/if_bonding.h b/include/linux/if_bonding.h index 2c7994372bde..a17edda8a781 100644 --- a/include/linux/if_bonding.h +++ b/include/linux/if_bonding.h | |||
@@ -84,6 +84,9 @@ | |||
84 | #define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ | 84 | #define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ |
85 | 85 | ||
86 | #define BOND_DEFAULT_TX_QUEUES 16 /* Default number of tx queues per device */ | 86 | #define BOND_DEFAULT_TX_QUEUES 16 /* Default number of tx queues per device */ |
87 | |||
88 | #define BOND_DEFAULT_RESEND_IGMP 1 /* Default number of IGMP membership reports */ | ||
89 | |||
87 | /* hashing types */ | 90 | /* hashing types */ |
88 | #define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ | 91 | #define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ |
89 | #define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ | 92 | #define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ |
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index bed7a4682b90..f9c3df03db0f 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h | |||
@@ -137,8 +137,6 @@ extern struct ctl_table ether_table[]; | |||
137 | 137 | ||
138 | extern ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len); | 138 | extern ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len); |
139 | 139 | ||
140 | #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" | ||
141 | |||
142 | #endif | 140 | #endif |
143 | 141 | ||
144 | #endif /* _LINUX_IF_ETHER_H */ | 142 | #endif /* _LINUX_IF_ETHER_H */ |
diff --git a/include/linux/if_infiniband.h b/include/linux/if_infiniband.h index 3e659ec7dfdd..7d958475d4ac 100644 --- a/include/linux/if_infiniband.h +++ b/include/linux/if_infiniband.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * <http://www.fsf.org/copyleft/gpl.html>, or the OpenIB.org BSD | 5 | * <http://www.fsf.org/copyleft/gpl.html>, or the OpenIB.org BSD |
6 | * license, available in the LICENSE.TXT file accompanying this | 6 | * license, available in the LICENSE.TXT file accompanying this |
7 | * software. These details are also available at | 7 | * software. These details are also available at |
8 | * <http://openib.org/license.html>. | 8 | * <http://www.openfabrics.org/software_license.htm>. |
9 | * | 9 | * |
10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
11 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 11 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index 35280b302290..8a2fd66a8b5f 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h | |||
@@ -40,6 +40,12 @@ struct macvlan_rx_stats { | |||
40 | unsigned long rx_errors; | 40 | unsigned long rx_errors; |
41 | }; | 41 | }; |
42 | 42 | ||
43 | /* | ||
44 | * Maximum times a macvtap device can be opened. This can be used to | ||
45 | * configure the number of receive queue, e.g. for multiqueue virtio. | ||
46 | */ | ||
47 | #define MAX_MACVTAP_QUEUES (NR_CPUS < 16 ? NR_CPUS : 16) | ||
48 | |||
43 | struct macvlan_dev { | 49 | struct macvlan_dev { |
44 | struct net_device *dev; | 50 | struct net_device *dev; |
45 | struct list_head list; | 51 | struct list_head list; |
@@ -50,7 +56,8 @@ struct macvlan_dev { | |||
50 | enum macvlan_mode mode; | 56 | enum macvlan_mode mode; |
51 | int (*receive)(struct sk_buff *skb); | 57 | int (*receive)(struct sk_buff *skb); |
52 | int (*forward)(struct net_device *dev, struct sk_buff *skb); | 58 | int (*forward)(struct net_device *dev, struct sk_buff *skb); |
53 | struct macvtap_queue *tap; | 59 | struct macvtap_queue *taps[MAX_MACVTAP_QUEUES]; |
60 | int numvtaps; | ||
54 | }; | 61 | }; |
55 | 62 | ||
56 | static inline void macvlan_count_rx(const struct macvlan_dev *vlan, | 63 | static inline void macvlan_count_rx(const struct macvlan_dev *vlan, |
diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index 27741e05446f..397921b09ef9 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h | |||
@@ -40,25 +40,35 @@ | |||
40 | * PPPoE addressing definition | 40 | * PPPoE addressing definition |
41 | */ | 41 | */ |
42 | typedef __be16 sid_t; | 42 | typedef __be16 sid_t; |
43 | struct pppoe_addr{ | 43 | struct pppoe_addr { |
44 | sid_t sid; /* Session identifier */ | 44 | sid_t sid; /* Session identifier */ |
45 | unsigned char remote[ETH_ALEN]; /* Remote address */ | 45 | unsigned char remote[ETH_ALEN]; /* Remote address */ |
46 | char dev[IFNAMSIZ]; /* Local device to use */ | 46 | char dev[IFNAMSIZ]; /* Local device to use */ |
47 | }; | 47 | }; |
48 | 48 | ||
49 | /************************************************************************ | 49 | /************************************************************************ |
50 | * Protocols supported by AF_PPPOX | 50 | * PPTP addressing definition |
51 | */ | 51 | */ |
52 | struct pptp_addr { | ||
53 | __be16 call_id; | ||
54 | struct in_addr sin_addr; | ||
55 | }; | ||
56 | |||
57 | /************************************************************************ | ||
58 | * Protocols supported by AF_PPPOX | ||
59 | */ | ||
52 | #define PX_PROTO_OE 0 /* Currently just PPPoE */ | 60 | #define PX_PROTO_OE 0 /* Currently just PPPoE */ |
53 | #define PX_PROTO_OL2TP 1 /* Now L2TP also */ | 61 | #define PX_PROTO_OL2TP 1 /* Now L2TP also */ |
54 | #define PX_MAX_PROTO 2 | 62 | #define PX_PROTO_PPTP 2 |
55 | 63 | #define PX_MAX_PROTO 3 | |
56 | struct sockaddr_pppox { | 64 | |
57 | sa_family_t sa_family; /* address family, AF_PPPOX */ | 65 | struct sockaddr_pppox { |
58 | unsigned int sa_protocol; /* protocol identifier */ | 66 | sa_family_t sa_family; /* address family, AF_PPPOX */ |
59 | union{ | 67 | unsigned int sa_protocol; /* protocol identifier */ |
60 | struct pppoe_addr pppoe; | 68 | union { |
61 | }sa_addr; | 69 | struct pppoe_addr pppoe; |
70 | struct pptp_addr pptp; | ||
71 | } sa_addr; | ||
62 | } __attribute__((packed)); | 72 | } __attribute__((packed)); |
63 | 73 | ||
64 | /* The use of the above union isn't viable because the size of this | 74 | /* The use of the above union isn't viable because the size of this |
@@ -150,15 +160,23 @@ struct pppoe_opt { | |||
150 | relayed to (PPPoE relaying) */ | 160 | relayed to (PPPoE relaying) */ |
151 | }; | 161 | }; |
152 | 162 | ||
163 | struct pptp_opt { | ||
164 | struct pptp_addr src_addr; | ||
165 | struct pptp_addr dst_addr; | ||
166 | u32 ack_sent, ack_recv; | ||
167 | u32 seq_sent, seq_recv; | ||
168 | int ppp_flags; | ||
169 | }; | ||
153 | #include <net/sock.h> | 170 | #include <net/sock.h> |
154 | 171 | ||
155 | struct pppox_sock { | 172 | struct pppox_sock { |
156 | /* struct sock must be the first member of pppox_sock */ | 173 | /* struct sock must be the first member of pppox_sock */ |
157 | struct sock sk; | 174 | struct sock sk; |
158 | struct ppp_channel chan; | 175 | struct ppp_channel chan; |
159 | struct pppox_sock *next; /* for hash table */ | 176 | struct pppox_sock *next; /* for hash table */ |
160 | union { | 177 | union { |
161 | struct pppoe_opt pppoe; | 178 | struct pppoe_opt pppoe; |
179 | struct pptp_opt pptp; | ||
162 | } proto; | 180 | } proto; |
163 | __be16 num; | 181 | __be16 num; |
164 | }; | 182 | }; |
@@ -186,7 +204,7 @@ struct pppox_proto { | |||
186 | struct module *owner; | 204 | struct module *owner; |
187 | }; | 205 | }; |
188 | 206 | ||
189 | extern int register_pppox_proto(int proto_num, struct pppox_proto *pp); | 207 | extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); |
190 | extern void unregister_pppox_proto(int proto_num); | 208 | extern void unregister_pppox_proto(int proto_num); |
191 | extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ | 209 | extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ |
192 | extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 210 | extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 3d870fda8c4f..635e1faec412 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
17 | #include <linux/netdevice.h> | 17 | #include <linux/netdevice.h> |
18 | #include <linux/etherdevice.h> | 18 | #include <linux/etherdevice.h> |
19 | #include <linux/rtnetlink.h> | ||
19 | 20 | ||
20 | #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) | 21 | #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) |
21 | * that VLAN requires. | 22 | * that VLAN requires. |
@@ -68,6 +69,7 @@ static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb) | |||
68 | #define VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator */ | 69 | #define VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator */ |
69 | #define VLAN_TAG_PRESENT VLAN_CFI_MASK | 70 | #define VLAN_TAG_PRESENT VLAN_CFI_MASK |
70 | #define VLAN_VID_MASK 0x0fff /* VLAN Identifier */ | 71 | #define VLAN_VID_MASK 0x0fff /* VLAN Identifier */ |
72 | #define VLAN_N_VID 4096 | ||
71 | 73 | ||
72 | /* found in socket.c */ | 74 | /* found in socket.c */ |
73 | extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); | 75 | extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); |
@@ -76,9 +78,8 @@ extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); | |||
76 | * depends on completely exhausting the VLAN identifier space. Thus | 78 | * depends on completely exhausting the VLAN identifier space. Thus |
77 | * it gives constant time look-up, but in many cases it wastes memory. | 79 | * it gives constant time look-up, but in many cases it wastes memory. |
78 | */ | 80 | */ |
79 | #define VLAN_GROUP_ARRAY_LEN 4096 | ||
80 | #define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 | 81 | #define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 |
81 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS) | 82 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS) |
82 | 83 | ||
83 | struct vlan_group { | 84 | struct vlan_group { |
84 | struct net_device *real_dev; /* The ethernet(like) device | 85 | struct net_device *real_dev; /* The ethernet(like) device |
@@ -114,12 +115,24 @@ static inline void vlan_group_set_device(struct vlan_group *vg, | |||
114 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) | 115 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) |
115 | 116 | ||
116 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 117 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
118 | /* Must be invoked with rcu_read_lock or with RTNL. */ | ||
119 | static inline struct net_device *vlan_find_dev(struct net_device *real_dev, | ||
120 | u16 vlan_id) | ||
121 | { | ||
122 | struct vlan_group *grp = rcu_dereference_rtnl(real_dev->vlgrp); | ||
123 | |||
124 | if (grp) | ||
125 | return vlan_group_get_device(grp, vlan_id); | ||
126 | |||
127 | return NULL; | ||
128 | } | ||
129 | |||
117 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); | 130 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); |
118 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); | 131 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); |
119 | 132 | ||
120 | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | 133 | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
121 | u16 vlan_tci, int polling); | 134 | u16 vlan_tci, int polling); |
122 | extern int vlan_hwaccel_do_receive(struct sk_buff *skb); | 135 | extern bool vlan_hwaccel_do_receive(struct sk_buff **skb); |
123 | extern gro_result_t | 136 | extern gro_result_t |
124 | vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | 137 | vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, |
125 | unsigned int vlan_tci, struct sk_buff *skb); | 138 | unsigned int vlan_tci, struct sk_buff *skb); |
@@ -128,6 +141,12 @@ vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | |||
128 | unsigned int vlan_tci); | 141 | unsigned int vlan_tci); |
129 | 142 | ||
130 | #else | 143 | #else |
144 | static inline struct net_device *vlan_find_dev(struct net_device *real_dev, | ||
145 | u16 vlan_id) | ||
146 | { | ||
147 | return NULL; | ||
148 | } | ||
149 | |||
131 | static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) | 150 | static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) |
132 | { | 151 | { |
133 | BUG(); | 152 | BUG(); |
@@ -147,9 +166,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
147 | return NET_XMIT_SUCCESS; | 166 | return NET_XMIT_SUCCESS; |
148 | } | 167 | } |
149 | 168 | ||
150 | static inline int vlan_hwaccel_do_receive(struct sk_buff *skb) | 169 | static inline bool vlan_hwaccel_do_receive(struct sk_buff **skb) |
151 | { | 170 | { |
152 | return 0; | 171 | if ((*skb)->vlan_tci & VLAN_VID_MASK) |
172 | (*skb)->pkt_type = PACKET_OTHERHOST; | ||
173 | return false; | ||
153 | } | 174 | } |
154 | 175 | ||
155 | static inline gro_result_t | 176 | static inline gro_result_t |
@@ -318,6 +339,31 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
318 | } | 339 | } |
319 | } | 340 | } |
320 | 341 | ||
342 | /** | ||
343 | * vlan_get_protocol - get protocol EtherType. | ||
344 | * @skb: skbuff to query | ||
345 | * | ||
346 | * Returns the EtherType of the packet, regardless of whether it is | ||
347 | * vlan encapsulated (normal or hardware accelerated) or not. | ||
348 | */ | ||
349 | static inline __be16 vlan_get_protocol(const struct sk_buff *skb) | ||
350 | { | ||
351 | __be16 protocol = 0; | ||
352 | |||
353 | if (vlan_tx_tag_present(skb) || | ||
354 | skb->protocol != cpu_to_be16(ETH_P_8021Q)) | ||
355 | protocol = skb->protocol; | ||
356 | else { | ||
357 | __be16 proto, *protop; | ||
358 | protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr, | ||
359 | h_vlan_encapsulated_proto), | ||
360 | sizeof(proto), &proto); | ||
361 | if (likely(protop)) | ||
362 | protocol = *protop; | ||
363 | } | ||
364 | |||
365 | return protocol; | ||
366 | } | ||
321 | #endif /* __KERNEL__ */ | 367 | #endif /* __KERNEL__ */ |
322 | 368 | ||
323 | /* VLAN IOCTLs are found in sockios.h */ | 369 | /* VLAN IOCTLs are found in sockios.h */ |
diff --git a/include/linux/in.h b/include/linux/in.h index 41d88a4689af..beeb6dee2b49 100644 --- a/include/linux/in.h +++ b/include/linux/in.h | |||
@@ -250,6 +250,25 @@ struct sockaddr_in { | |||
250 | 250 | ||
251 | #ifdef __KERNEL__ | 251 | #ifdef __KERNEL__ |
252 | 252 | ||
253 | #include <linux/errno.h> | ||
254 | |||
255 | static inline int proto_ports_offset(int proto) | ||
256 | { | ||
257 | switch (proto) { | ||
258 | case IPPROTO_TCP: | ||
259 | case IPPROTO_UDP: | ||
260 | case IPPROTO_DCCP: | ||
261 | case IPPROTO_ESP: /* SPI */ | ||
262 | case IPPROTO_SCTP: | ||
263 | case IPPROTO_UDPLITE: | ||
264 | return 0; | ||
265 | case IPPROTO_AH: /* SPI */ | ||
266 | return 4; | ||
267 | default: | ||
268 | return -EINVAL; | ||
269 | } | ||
270 | } | ||
271 | |||
253 | static inline bool ipv4_is_loopback(__be32 addr) | 272 | static inline bool ipv4_is_loopback(__be32 addr) |
254 | { | 273 | { |
255 | return (addr & htonl(0xff000000)) == htonl(0x7f000000); | 274 | return (addr & htonl(0xff000000)) == htonl(0x7f000000); |
diff --git a/include/linux/in6.h b/include/linux/in6.h index c4bf46f764bf..097a34b55560 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
@@ -268,6 +268,10 @@ struct in6_flowlabel_req { | |||
268 | /* RFC5082: Generalized Ttl Security Mechanism */ | 268 | /* RFC5082: Generalized Ttl Security Mechanism */ |
269 | #define IPV6_MINHOPCOUNT 73 | 269 | #define IPV6_MINHOPCOUNT 73 |
270 | 270 | ||
271 | #define IPV6_ORIGDSTADDR 74 | ||
272 | #define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR | ||
273 | #define IPV6_TRANSPARENT 75 | ||
274 | |||
271 | /* | 275 | /* |
272 | * Multicast Routing: | 276 | * Multicast Routing: |
273 | * see include/linux/mroute6.h. | 277 | * see include/linux/mroute6.h. |
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index 2be1a1a2beb9..ccd5b07d678d 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/rcupdate.h> | 9 | #include <linux/rcupdate.h> |
10 | #include <linux/timer.h> | 10 | #include <linux/timer.h> |
11 | #include <linux/sysctl.h> | 11 | #include <linux/sysctl.h> |
12 | #include <linux/rtnetlink.h> | ||
12 | 13 | ||
13 | enum | 14 | enum |
14 | { | 15 | { |
@@ -158,7 +159,12 @@ struct in_ifaddr { | |||
158 | extern int register_inetaddr_notifier(struct notifier_block *nb); | 159 | extern int register_inetaddr_notifier(struct notifier_block *nb); |
159 | extern int unregister_inetaddr_notifier(struct notifier_block *nb); | 160 | extern int unregister_inetaddr_notifier(struct notifier_block *nb); |
160 | 161 | ||
161 | extern struct net_device *ip_dev_find(struct net *net, __be32 addr); | 162 | extern struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref); |
163 | static inline struct net_device *ip_dev_find(struct net *net, __be32 addr) | ||
164 | { | ||
165 | return __ip_dev_find(net, addr, true); | ||
166 | } | ||
167 | |||
162 | extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); | 168 | extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); |
163 | extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); | 169 | extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); |
164 | extern void devinet_init(void); | 170 | extern void devinet_init(void); |
@@ -198,14 +204,10 @@ static __inline__ int bad_mask(__be32 mask, __be32 addr) | |||
198 | 204 | ||
199 | static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) | 205 | static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) |
200 | { | 206 | { |
201 | struct in_device *in_dev = dev->ip_ptr; | 207 | return rcu_dereference(dev->ip_ptr); |
202 | if (in_dev) | ||
203 | in_dev = rcu_dereference(in_dev); | ||
204 | return in_dev; | ||
205 | } | 208 | } |
206 | 209 | ||
207 | static __inline__ struct in_device * | 210 | static inline struct in_device *in_dev_get(const struct net_device *dev) |
208 | in_dev_get(const struct net_device *dev) | ||
209 | { | 211 | { |
210 | struct in_device *in_dev; | 212 | struct in_device *in_dev; |
211 | 213 | ||
@@ -217,10 +219,9 @@ in_dev_get(const struct net_device *dev) | |||
217 | return in_dev; | 219 | return in_dev; |
218 | } | 220 | } |
219 | 221 | ||
220 | static __inline__ struct in_device * | 222 | static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev) |
221 | __in_dev_get_rtnl(const struct net_device *dev) | ||
222 | { | 223 | { |
223 | return (struct in_device*)dev->ip_ptr; | 224 | return rcu_dereference_check(dev->ip_ptr, lockdep_rtnl_is_held()); |
224 | } | 225 | } |
225 | 226 | ||
226 | extern void in_dev_finish_destroy(struct in_device *idev); | 227 | extern void in_dev_finish_destroy(struct in_device *idev); |
diff --git a/include/linux/init.h b/include/linux/init.h index de994304e0bb..577671c55153 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -46,16 +46,23 @@ | |||
46 | #define __exitdata __section(.exit.data) | 46 | #define __exitdata __section(.exit.data) |
47 | #define __exit_call __used __section(.exitcall.exit) | 47 | #define __exit_call __used __section(.exitcall.exit) |
48 | 48 | ||
49 | /* modpost check for section mismatches during the kernel build. | 49 | /* |
50 | * modpost check for section mismatches during the kernel build. | ||
50 | * A section mismatch happens when there are references from a | 51 | * A section mismatch happens when there are references from a |
51 | * code or data section to an init section (both code or data). | 52 | * code or data section to an init section (both code or data). |
52 | * The init sections are (for most archs) discarded by the kernel | 53 | * The init sections are (for most archs) discarded by the kernel |
53 | * when early init has completed so all such references are potential bugs. | 54 | * when early init has completed so all such references are potential bugs. |
54 | * For exit sections the same issue exists. | 55 | * For exit sections the same issue exists. |
56 | * | ||
55 | * The following markers are used for the cases where the reference to | 57 | * The following markers are used for the cases where the reference to |
56 | * the *init / *exit section (code or data) is valid and will teach | 58 | * the *init / *exit section (code or data) is valid and will teach |
57 | * modpost not to issue a warning. | 59 | * modpost not to issue a warning. Intended semantics is that a code or |
58 | * The markers follow same syntax rules as __init / __initdata. */ | 60 | * data tagged __ref* can reference code or data from init section without |
61 | * producing a warning (of course, no warning does not mean code is | ||
62 | * correct, so optimally document why the __ref is needed and why it's OK). | ||
63 | * | ||
64 | * The markers follow same syntax rules as __init / __initdata. | ||
65 | */ | ||
59 | #define __ref __section(.ref.text) noinline | 66 | #define __ref __section(.ref.text) noinline |
60 | #define __refdata __section(.ref.data) | 67 | #define __refdata __section(.ref.data) |
61 | #define __refconst __section(.ref.rodata) | 68 | #define __refconst __section(.ref.rodata) |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 1f43fa56f600..1f8c06ce0fa6 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -29,6 +29,8 @@ extern struct fs_struct init_fs; | |||
29 | .running = 0, \ | 29 | .running = 0, \ |
30 | .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \ | 30 | .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \ |
31 | }, \ | 31 | }, \ |
32 | .cred_guard_mutex = \ | ||
33 | __MUTEX_INITIALIZER(sig.cred_guard_mutex), \ | ||
32 | } | 34 | } |
33 | 35 | ||
34 | extern struct nsproxy init_nsproxy; | 36 | extern struct nsproxy init_nsproxy; |
@@ -82,11 +84,17 @@ extern struct group_info init_groups; | |||
82 | # define CAP_INIT_BSET CAP_FULL_SET | 84 | # define CAP_INIT_BSET CAP_FULL_SET |
83 | 85 | ||
84 | #ifdef CONFIG_TREE_PREEMPT_RCU | 86 | #ifdef CONFIG_TREE_PREEMPT_RCU |
87 | #define INIT_TASK_RCU_TREE_PREEMPT() \ | ||
88 | .rcu_blocked_node = NULL, | ||
89 | #else | ||
90 | #define INIT_TASK_RCU_TREE_PREEMPT(tsk) | ||
91 | #endif | ||
92 | #ifdef CONFIG_PREEMPT_RCU | ||
85 | #define INIT_TASK_RCU_PREEMPT(tsk) \ | 93 | #define INIT_TASK_RCU_PREEMPT(tsk) \ |
86 | .rcu_read_lock_nesting = 0, \ | 94 | .rcu_read_lock_nesting = 0, \ |
87 | .rcu_read_unlock_special = 0, \ | 95 | .rcu_read_unlock_special = 0, \ |
88 | .rcu_blocked_node = NULL, \ | 96 | .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \ |
89 | .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), | 97 | INIT_TASK_RCU_TREE_PREEMPT() |
90 | #else | 98 | #else |
91 | #define INIT_TASK_RCU_PREEMPT(tsk) | 99 | #define INIT_TASK_RCU_PREEMPT(tsk) |
92 | #endif | 100 | #endif |
@@ -137,10 +145,8 @@ extern struct cred init_cred; | |||
137 | .children = LIST_HEAD_INIT(tsk.children), \ | 145 | .children = LIST_HEAD_INIT(tsk.children), \ |
138 | .sibling = LIST_HEAD_INIT(tsk.sibling), \ | 146 | .sibling = LIST_HEAD_INIT(tsk.sibling), \ |
139 | .group_leader = &tsk, \ | 147 | .group_leader = &tsk, \ |
140 | .real_cred = &init_cred, \ | 148 | RCU_INIT_POINTER(.real_cred, &init_cred), \ |
141 | .cred = &init_cred, \ | 149 | RCU_INIT_POINTER(.cred, &init_cred), \ |
142 | .cred_guard_mutex = \ | ||
143 | __MUTEX_INITIALIZER(tsk.cred_guard_mutex), \ | ||
144 | .comm = "swapper", \ | 150 | .comm = "swapper", \ |
145 | .thread = INIT_THREAD, \ | 151 | .thread = INIT_THREAD, \ |
146 | .fs = &init_fs, \ | 152 | .fs = &init_fs, \ |
diff --git a/include/linux/input.h b/include/linux/input.h index 896a92227bc4..6ef44465db8d 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -34,7 +34,7 @@ struct input_event { | |||
34 | * Protocol version. | 34 | * Protocol version. |
35 | */ | 35 | */ |
36 | 36 | ||
37 | #define EV_VERSION 0x010000 | 37 | #define EV_VERSION 0x010001 |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * IOCTLs (0x00 - 0x7f) | 40 | * IOCTLs (0x00 - 0x7f) |
@@ -56,25 +56,50 @@ struct input_absinfo { | |||
56 | __s32 resolution; | 56 | __s32 resolution; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | /** | ||
60 | * struct input_keymap_entry - used by EVIOCGKEYCODE/EVIOCSKEYCODE ioctls | ||
61 | * @scancode: scancode represented in machine-endian form. | ||
62 | * @len: length of the scancode that resides in @scancode buffer. | ||
63 | * @index: index in the keymap, may be used instead of scancode | ||
64 | * @flags: allows to specify how kernel should handle the request. For | ||
65 | * example, setting INPUT_KEYMAP_BY_INDEX flag indicates that kernel | ||
66 | * should perform lookup in keymap by @index instead of @scancode | ||
67 | * @keycode: key code assigned to this scancode | ||
68 | * | ||
69 | * The structure is used to retrieve and modify keymap data. Users have | ||
70 | * option of performing lookup either by @scancode itself or by @index | ||
71 | * in keymap entry. EVIOCGKEYCODE will also return scancode or index | ||
72 | * (depending on which element was used to perform lookup). | ||
73 | */ | ||
74 | struct input_keymap_entry { | ||
75 | #define INPUT_KEYMAP_BY_INDEX (1 << 0) | ||
76 | __u8 flags; | ||
77 | __u8 len; | ||
78 | __u16 index; | ||
79 | __u32 keycode; | ||
80 | __u8 scancode[32]; | ||
81 | }; | ||
82 | |||
59 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ | 83 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ |
60 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ | 84 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ |
61 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ | 85 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ |
62 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ | 86 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ |
63 | #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ | 87 | |
64 | #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ | 88 | #define EVIOCGKEYCODE _IOR('E', 0x04, struct input_keymap_entry) /* get keycode */ |
89 | #define EVIOCSKEYCODE _IOW('E', 0x04, struct input_keymap_entry) /* set keycode */ | ||
65 | 90 | ||
66 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ | 91 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ |
67 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ | 92 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ |
68 | #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ | 93 | #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ |
69 | 94 | ||
70 | #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ | 95 | #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */ |
71 | #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ | 96 | #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ |
72 | #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ | 97 | #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ |
73 | #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ | 98 | #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ |
74 | 99 | ||
75 | #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ | 100 | #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ |
76 | #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ | 101 | #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ |
77 | #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ | 102 | #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ |
78 | 103 | ||
79 | #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ | 104 | #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ |
80 | #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ | 105 | #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ |
@@ -1088,13 +1113,13 @@ struct input_mt_slot { | |||
1088 | * @keycodemax: size of keycode table | 1113 | * @keycodemax: size of keycode table |
1089 | * @keycodesize: size of elements in keycode table | 1114 | * @keycodesize: size of elements in keycode table |
1090 | * @keycode: map of scancodes to keycodes for this device | 1115 | * @keycode: map of scancodes to keycodes for this device |
1116 | * @getkeycode: optional legacy method to retrieve current keymap. | ||
1091 | * @setkeycode: optional method to alter current keymap, used to implement | 1117 | * @setkeycode: optional method to alter current keymap, used to implement |
1092 | * sparse keymaps. If not supplied default mechanism will be used. | 1118 | * sparse keymaps. If not supplied default mechanism will be used. |
1093 | * The method is being called while holding event_lock and thus must | 1119 | * The method is being called while holding event_lock and thus must |
1094 | * not sleep | 1120 | * not sleep |
1095 | * @getkeycode: optional method to retrieve current keymap. If not supplied | 1121 | * @getkeycode_new: transition method |
1096 | * default mechanism will be used. The method is being called while | 1122 | * @setkeycode_new: transition method |
1097 | * holding event_lock and thus must not sleep | ||
1098 | * @ff: force feedback structure associated with the device if device | 1123 | * @ff: force feedback structure associated with the device if device |
1099 | * supports force feedback effects | 1124 | * supports force feedback effects |
1100 | * @repeat_key: stores key code of the last key pressed; used to implement | 1125 | * @repeat_key: stores key code of the last key pressed; used to implement |
@@ -1168,10 +1193,16 @@ struct input_dev { | |||
1168 | unsigned int keycodemax; | 1193 | unsigned int keycodemax; |
1169 | unsigned int keycodesize; | 1194 | unsigned int keycodesize; |
1170 | void *keycode; | 1195 | void *keycode; |
1196 | |||
1171 | int (*setkeycode)(struct input_dev *dev, | 1197 | int (*setkeycode)(struct input_dev *dev, |
1172 | unsigned int scancode, unsigned int keycode); | 1198 | unsigned int scancode, unsigned int keycode); |
1173 | int (*getkeycode)(struct input_dev *dev, | 1199 | int (*getkeycode)(struct input_dev *dev, |
1174 | unsigned int scancode, unsigned int *keycode); | 1200 | unsigned int scancode, unsigned int *keycode); |
1201 | int (*setkeycode_new)(struct input_dev *dev, | ||
1202 | const struct input_keymap_entry *ke, | ||
1203 | unsigned int *old_keycode); | ||
1204 | int (*getkeycode_new)(struct input_dev *dev, | ||
1205 | struct input_keymap_entry *ke); | ||
1175 | 1206 | ||
1176 | struct ff_device *ff; | 1207 | struct ff_device *ff; |
1177 | 1208 | ||
@@ -1196,7 +1227,7 @@ struct input_dev { | |||
1196 | int (*flush)(struct input_dev *dev, struct file *file); | 1227 | int (*flush)(struct input_dev *dev, struct file *file); |
1197 | int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); | 1228 | int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); |
1198 | 1229 | ||
1199 | struct input_handle *grab; | 1230 | struct input_handle __rcu *grab; |
1200 | 1231 | ||
1201 | spinlock_t event_lock; | 1232 | spinlock_t event_lock; |
1202 | struct mutex mutex; | 1233 | struct mutex mutex; |
@@ -1375,6 +1406,8 @@ static inline void input_set_drvdata(struct input_dev *dev, void *data) | |||
1375 | int __must_check input_register_device(struct input_dev *); | 1406 | int __must_check input_register_device(struct input_dev *); |
1376 | void input_unregister_device(struct input_dev *); | 1407 | void input_unregister_device(struct input_dev *); |
1377 | 1408 | ||
1409 | void input_reset_device(struct input_dev *); | ||
1410 | |||
1378 | int __must_check input_register_handler(struct input_handler *); | 1411 | int __must_check input_register_handler(struct input_handler *); |
1379 | void input_unregister_handler(struct input_handler *); | 1412 | void input_unregister_handler(struct input_handler *); |
1380 | 1413 | ||
@@ -1390,7 +1423,7 @@ void input_release_device(struct input_handle *); | |||
1390 | int input_open_device(struct input_handle *); | 1423 | int input_open_device(struct input_handle *); |
1391 | void input_close_device(struct input_handle *); | 1424 | void input_close_device(struct input_handle *); |
1392 | 1425 | ||
1393 | int input_flush_device(struct input_handle* handle, struct file* file); | 1426 | int input_flush_device(struct input_handle *handle, struct file *file); |
1394 | 1427 | ||
1395 | void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); | 1428 | void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); |
1396 | void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value); | 1429 | void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value); |
@@ -1478,10 +1511,12 @@ INPUT_GENERATE_ABS_ACCESSORS(fuzz, fuzz) | |||
1478 | INPUT_GENERATE_ABS_ACCESSORS(flat, flat) | 1511 | INPUT_GENERATE_ABS_ACCESSORS(flat, flat) |
1479 | INPUT_GENERATE_ABS_ACCESSORS(res, resolution) | 1512 | INPUT_GENERATE_ABS_ACCESSORS(res, resolution) |
1480 | 1513 | ||
1481 | int input_get_keycode(struct input_dev *dev, | 1514 | int input_scancode_to_scalar(const struct input_keymap_entry *ke, |
1482 | unsigned int scancode, unsigned int *keycode); | 1515 | unsigned int *scancode); |
1516 | |||
1517 | int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke); | ||
1483 | int input_set_keycode(struct input_dev *dev, | 1518 | int input_set_keycode(struct input_dev *dev, |
1484 | unsigned int scancode, unsigned int keycode); | 1519 | const struct input_keymap_entry *ke); |
1485 | 1520 | ||
1486 | extern struct class input_class; | 1521 | extern struct class input_class; |
1487 | 1522 | ||
diff --git a/include/linux/input/bu21013.h b/include/linux/input/bu21013.h new file mode 100644 index 000000000000..e470d387dd49 --- /dev/null +++ b/include/linux/input/bu21013.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * Copyright (C) ST-Ericsson SA 2010 | ||
3 | * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson | ||
4 | * License terms:GNU General Public License (GPL) version 2 | ||
5 | */ | ||
6 | |||
7 | #ifndef _BU21013_H | ||
8 | #define _BU21013_H | ||
9 | |||
10 | /** | ||
11 | * struct bu21013_platform_device - Handle the platform data | ||
12 | * @cs_en: pointer to the cs enable function | ||
13 | * @cs_dis: pointer to the cs disable function | ||
14 | * @irq_read_val: pointer to read the pen irq value function | ||
15 | * @x_max_res: xmax resolution | ||
16 | * @y_max_res: ymax resolution | ||
17 | * @touch_x_max: touch x max | ||
18 | * @touch_y_max: touch y max | ||
19 | * @cs_pin: chip select pin | ||
20 | * @irq: irq pin | ||
21 | * @ext_clk: external clock flag | ||
22 | * @x_flip: x flip flag | ||
23 | * @y_flip: y flip flag | ||
24 | * @wakeup: wakeup flag | ||
25 | * | ||
26 | * This is used to handle the platform data | ||
27 | */ | ||
28 | struct bu21013_platform_device { | ||
29 | int (*cs_en)(int reset_pin); | ||
30 | int (*cs_dis)(int reset_pin); | ||
31 | int (*irq_read_val)(void); | ||
32 | int x_max_res; | ||
33 | int y_max_res; | ||
34 | int touch_x_max; | ||
35 | int touch_y_max; | ||
36 | unsigned int cs_pin; | ||
37 | unsigned int irq; | ||
38 | bool ext_clk; | ||
39 | bool x_flip; | ||
40 | bool y_flip; | ||
41 | bool wakeup; | ||
42 | }; | ||
43 | |||
44 | #endif | ||
diff --git a/include/linux/intel_mid_dma.h b/include/linux/intel_mid_dma.h index d9d08b6269b6..10496bd24c5c 100644 --- a/include/linux/intel_mid_dma.h +++ b/include/linux/intel_mid_dma.h | |||
@@ -27,14 +27,7 @@ | |||
27 | 27 | ||
28 | #include <linux/dmaengine.h> | 28 | #include <linux/dmaengine.h> |
29 | 29 | ||
30 | /*DMA transaction width, src and dstn width would be same | 30 | #define DMA_PREP_CIRCULAR_LIST (1 << 10) |
31 | The DMA length must be width aligned, | ||
32 | for 32 bit width the length must be 32 bit (4bytes) aligned only*/ | ||
33 | enum intel_mid_dma_width { | ||
34 | LNW_DMA_WIDTH_8BIT = 0x0, | ||
35 | LNW_DMA_WIDTH_16BIT = 0x1, | ||
36 | LNW_DMA_WIDTH_32BIT = 0x2, | ||
37 | }; | ||
38 | 31 | ||
39 | /*DMA mode configurations*/ | 32 | /*DMA mode configurations*/ |
40 | enum intel_mid_dma_mode { | 33 | enum intel_mid_dma_mode { |
@@ -69,18 +62,15 @@ enum intel_mid_dma_msize { | |||
69 | * @cfg_mode: DMA data transfer mode (per-per/mem-per/mem-mem) | 62 | * @cfg_mode: DMA data transfer mode (per-per/mem-per/mem-mem) |
70 | * @src_msize: Source DMA burst size | 63 | * @src_msize: Source DMA burst size |
71 | * @dst_msize: Dst DMA burst size | 64 | * @dst_msize: Dst DMA burst size |
65 | * @per_addr: Periphral address | ||
72 | * @device_instance: DMA peripheral device instance, we can have multiple | 66 | * @device_instance: DMA peripheral device instance, we can have multiple |
73 | * peripheral device connected to single DMAC | 67 | * peripheral device connected to single DMAC |
74 | */ | 68 | */ |
75 | struct intel_mid_dma_slave { | 69 | struct intel_mid_dma_slave { |
76 | enum dma_data_direction dirn; | ||
77 | enum intel_mid_dma_width src_width; /*width of DMA src txn*/ | ||
78 | enum intel_mid_dma_width dst_width; /*width of DMA dst txn*/ | ||
79 | enum intel_mid_dma_hs_mode hs_mode; /*handshaking*/ | 70 | enum intel_mid_dma_hs_mode hs_mode; /*handshaking*/ |
80 | enum intel_mid_dma_mode cfg_mode; /*mode configuration*/ | 71 | enum intel_mid_dma_mode cfg_mode; /*mode configuration*/ |
81 | enum intel_mid_dma_msize src_msize; /*size if src burst*/ | ||
82 | enum intel_mid_dma_msize dst_msize; /*size of dst burst*/ | ||
83 | unsigned int device_instance; /*0, 1 for periphral instance*/ | 72 | unsigned int device_instance; /*0, 1 for periphral instance*/ |
73 | struct dma_slave_config dma_slave; | ||
84 | }; | 74 | }; |
85 | 75 | ||
86 | #endif /*__INTEL_MID_DMA_H__*/ | 76 | #endif /*__INTEL_MID_DMA_H__*/ |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a0384a4d1e6f..79d0c4f6d071 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
19 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
21 | #include <trace/events/irq.h> | ||
21 | 22 | ||
22 | /* | 23 | /* |
23 | * These correspond to the IORESOURCE_IRQ_* defines in | 24 | * These correspond to the IORESOURCE_IRQ_* defines in |
@@ -407,10 +408,14 @@ asmlinkage void do_softirq(void); | |||
407 | asmlinkage void __do_softirq(void); | 408 | asmlinkage void __do_softirq(void); |
408 | extern void open_softirq(int nr, void (*action)(struct softirq_action *)); | 409 | extern void open_softirq(int nr, void (*action)(struct softirq_action *)); |
409 | extern void softirq_init(void); | 410 | extern void softirq_init(void); |
410 | #define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0) | 411 | static inline void __raise_softirq_irqoff(unsigned int nr) |
412 | { | ||
413 | trace_softirq_raise(nr); | ||
414 | or_softirq_pending(1UL << nr); | ||
415 | } | ||
416 | |||
411 | extern void raise_softirq_irqoff(unsigned int nr); | 417 | extern void raise_softirq_irqoff(unsigned int nr); |
412 | extern void raise_softirq(unsigned int nr); | 418 | extern void raise_softirq(unsigned int nr); |
413 | extern void wakeup_softirqd(void); | ||
414 | 419 | ||
415 | /* This is the worklist that queues up per-cpu softirq work. | 420 | /* This is the worklist that queues up per-cpu softirq work. |
416 | * | 421 | * |
@@ -641,11 +646,8 @@ static inline void init_irq_proc(void) | |||
641 | struct seq_file; | 646 | struct seq_file; |
642 | int show_interrupts(struct seq_file *p, void *v); | 647 | int show_interrupts(struct seq_file *p, void *v); |
643 | 648 | ||
644 | struct irq_desc; | ||
645 | |||
646 | extern int early_irq_init(void); | 649 | extern int early_irq_init(void); |
647 | extern int arch_probe_nr_irqs(void); | 650 | extern int arch_probe_nr_irqs(void); |
648 | extern int arch_early_irq_init(void); | 651 | extern int arch_early_irq_init(void); |
649 | extern int arch_init_chip_data(struct irq_desc *desc, int node); | ||
650 | 652 | ||
651 | #endif | 653 | #endif |
diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h index 7fb592793738..8cdcc2a199ad 100644 --- a/include/linux/io-mapping.h +++ b/include/linux/io-mapping.h | |||
@@ -81,8 +81,7 @@ io_mapping_free(struct io_mapping *mapping) | |||
81 | /* Atomic map/unmap */ | 81 | /* Atomic map/unmap */ |
82 | static inline void __iomem * | 82 | static inline void __iomem * |
83 | io_mapping_map_atomic_wc(struct io_mapping *mapping, | 83 | io_mapping_map_atomic_wc(struct io_mapping *mapping, |
84 | unsigned long offset, | 84 | unsigned long offset) |
85 | int slot) | ||
86 | { | 85 | { |
87 | resource_size_t phys_addr; | 86 | resource_size_t phys_addr; |
88 | unsigned long pfn; | 87 | unsigned long pfn; |
@@ -90,13 +89,13 @@ io_mapping_map_atomic_wc(struct io_mapping *mapping, | |||
90 | BUG_ON(offset >= mapping->size); | 89 | BUG_ON(offset >= mapping->size); |
91 | phys_addr = mapping->base + offset; | 90 | phys_addr = mapping->base + offset; |
92 | pfn = (unsigned long) (phys_addr >> PAGE_SHIFT); | 91 | pfn = (unsigned long) (phys_addr >> PAGE_SHIFT); |
93 | return iomap_atomic_prot_pfn(pfn, slot, mapping->prot); | 92 | return iomap_atomic_prot_pfn(pfn, mapping->prot); |
94 | } | 93 | } |
95 | 94 | ||
96 | static inline void | 95 | static inline void |
97 | io_mapping_unmap_atomic(void __iomem *vaddr, int slot) | 96 | io_mapping_unmap_atomic(void __iomem *vaddr) |
98 | { | 97 | { |
99 | iounmap_atomic(vaddr, slot); | 98 | iounmap_atomic(vaddr); |
100 | } | 99 | } |
101 | 100 | ||
102 | static inline void __iomem * | 101 | static inline void __iomem * |
@@ -137,14 +136,13 @@ io_mapping_free(struct io_mapping *mapping) | |||
137 | /* Atomic map/unmap */ | 136 | /* Atomic map/unmap */ |
138 | static inline void __iomem * | 137 | static inline void __iomem * |
139 | io_mapping_map_atomic_wc(struct io_mapping *mapping, | 138 | io_mapping_map_atomic_wc(struct io_mapping *mapping, |
140 | unsigned long offset, | 139 | unsigned long offset) |
141 | int slot) | ||
142 | { | 140 | { |
143 | return ((char __force __iomem *) mapping) + offset; | 141 | return ((char __force __iomem *) mapping) + offset; |
144 | } | 142 | } |
145 | 143 | ||
146 | static inline void | 144 | static inline void |
147 | io_mapping_unmap_atomic(void __iomem *vaddr, int slot) | 145 | io_mapping_unmap_atomic(void __iomem *vaddr) |
148 | { | 146 | { |
149 | } | 147 | } |
150 | 148 | ||
diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h index 64d529133031..b2eee896dcbc 100644 --- a/include/linux/iocontext.h +++ b/include/linux/iocontext.h | |||
@@ -53,7 +53,7 @@ struct io_context { | |||
53 | 53 | ||
54 | struct radix_tree_root radix_root; | 54 | struct radix_tree_root radix_root; |
55 | struct hlist_head cic_list; | 55 | struct hlist_head cic_list; |
56 | void *ioc_data; | 56 | void __rcu *ioc_data; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | static inline struct io_context *ioc_task_link(struct io_context *ioc) | 59 | static inline struct io_context *ioc_task_link(struct io_context *ioc) |
@@ -76,7 +76,6 @@ int put_io_context(struct io_context *ioc); | |||
76 | void exit_io_context(struct task_struct *task); | 76 | void exit_io_context(struct task_struct *task); |
77 | struct io_context *get_io_context(gfp_t gfp_flags, int node); | 77 | struct io_context *get_io_context(gfp_t gfp_flags, int node); |
78 | struct io_context *alloc_io_context(gfp_t gfp_flags, int node); | 78 | struct io_context *alloc_io_context(gfp_t gfp_flags, int node); |
79 | void copy_io_context(struct io_context **pdst, struct io_context **psrc); | ||
80 | #else | 79 | #else |
81 | static inline void exit_io_context(struct task_struct *task) | 80 | static inline void exit_io_context(struct task_struct *task) |
82 | { | 81 | { |
diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b22790268b64..d377ea815d45 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h | |||
@@ -112,6 +112,7 @@ struct resource_list { | |||
112 | /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ | 112 | /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ |
113 | extern struct resource ioport_resource; | 113 | extern struct resource ioport_resource; |
114 | extern struct resource iomem_resource; | 114 | extern struct resource iomem_resource; |
115 | extern int resource_alloc_from_bottom; | ||
115 | 116 | ||
116 | extern struct resource *request_resource_conflict(struct resource *root, struct resource *new); | 117 | extern struct resource *request_resource_conflict(struct resource *root, struct resource *new); |
117 | extern int request_resource(struct resource *root, struct resource *new); | 118 | extern int request_resource(struct resource *root, struct resource *new); |
diff --git a/include/linux/ip_vs.h b/include/linux/ip_vs.h index 9708de265bb1..5f43a3b2e3ad 100644 --- a/include/linux/ip_vs.h +++ b/include/linux/ip_vs.h | |||
@@ -70,6 +70,7 @@ | |||
70 | 70 | ||
71 | /* | 71 | /* |
72 | * IPVS Connection Flags | 72 | * IPVS Connection Flags |
73 | * Only flags 0..15 are sent to backup server | ||
73 | */ | 74 | */ |
74 | #define IP_VS_CONN_F_FWD_MASK 0x0007 /* mask for the fwd methods */ | 75 | #define IP_VS_CONN_F_FWD_MASK 0x0007 /* mask for the fwd methods */ |
75 | #define IP_VS_CONN_F_MASQ 0x0000 /* masquerading/NAT */ | 76 | #define IP_VS_CONN_F_MASQ 0x0000 /* masquerading/NAT */ |
@@ -88,9 +89,20 @@ | |||
88 | #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ | 89 | #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ |
89 | #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 */ |
90 | 91 | ||
92 | /* Flags that are not sent to backup server start from bit 16 */ | ||
93 | #define IP_VS_CONN_F_NFCT (1 << 16) /* use netfilter conntrack */ | ||
94 | |||
95 | /* Connection flags from destination that can be changed by user space */ | ||
96 | #define IP_VS_CONN_F_DEST_MASK (IP_VS_CONN_F_FWD_MASK | \ | ||
97 | IP_VS_CONN_F_ONE_PACKET | \ | ||
98 | IP_VS_CONN_F_NFCT | \ | ||
99 | 0) | ||
100 | |||
91 | #define IP_VS_SCHEDNAME_MAXLEN 16 | 101 | #define IP_VS_SCHEDNAME_MAXLEN 16 |
102 | #define IP_VS_PENAME_MAXLEN 16 | ||
92 | #define IP_VS_IFNAME_MAXLEN 16 | 103 | #define IP_VS_IFNAME_MAXLEN 16 |
93 | 104 | ||
105 | #define IP_VS_PEDATA_MAXLEN 255 | ||
94 | 106 | ||
95 | /* | 107 | /* |
96 | * The struct ip_vs_service_user and struct ip_vs_dest_user are | 108 | * The struct ip_vs_service_user and struct ip_vs_dest_user are |
@@ -324,6 +336,9 @@ enum { | |||
324 | IPVS_SVC_ATTR_NETMASK, /* persistent netmask */ | 336 | IPVS_SVC_ATTR_NETMASK, /* persistent netmask */ |
325 | 337 | ||
326 | IPVS_SVC_ATTR_STATS, /* nested attribute for service stats */ | 338 | IPVS_SVC_ATTR_STATS, /* nested attribute for service stats */ |
339 | |||
340 | IPVS_SVC_ATTR_PE_NAME, /* name of ct retriever */ | ||
341 | |||
327 | __IPVS_SVC_ATTR_MAX, | 342 | __IPVS_SVC_ATTR_MAX, |
328 | }; | 343 | }; |
329 | 344 | ||
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index e62683ba88e6..8e429d0e0405 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -341,7 +341,9 @@ struct ipv6_pinfo { | |||
341 | odstopts:1, | 341 | odstopts:1, |
342 | rxflow:1, | 342 | rxflow:1, |
343 | rxtclass:1, | 343 | rxtclass:1, |
344 | rxpmtu:1; | 344 | rxpmtu:1, |
345 | rxorigdstaddr:1; | ||
346 | /* 2 bits hole */ | ||
345 | } bits; | 347 | } bits; |
346 | __u16 all; | 348 | __u16 all; |
347 | } rxopt; | 349 | } rxopt; |
diff --git a/include/linux/irq.h b/include/linux/irq.h index c03243ad84b4..abde2527c699 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -72,6 +72,10 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ | 72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ |
73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ | 73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ |
74 | 74 | ||
75 | #define IRQF_MODIFY_MASK \ | ||
76 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | ||
77 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL) | ||
78 | |||
75 | #ifdef CONFIG_IRQ_PER_CPU | 79 | #ifdef CONFIG_IRQ_PER_CPU |
76 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 80 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) |
77 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 81 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
@@ -80,36 +84,77 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
80 | # define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING | 84 | # define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING |
81 | #endif | 85 | #endif |
82 | 86 | ||
83 | struct proc_dir_entry; | ||
84 | struct msi_desc; | 87 | struct msi_desc; |
85 | 88 | ||
86 | /** | 89 | /** |
90 | * struct irq_data - per irq and irq chip data passed down to chip functions | ||
91 | * @irq: interrupt number | ||
92 | * @node: node index useful for balancing | ||
93 | * @chip: low level interrupt hardware access | ||
94 | * @handler_data: per-IRQ data for the irq_chip methods | ||
95 | * @chip_data: platform-specific per-chip private data for the chip | ||
96 | * methods, to allow shared chip implementations | ||
97 | * @msi_desc: MSI descriptor | ||
98 | * @affinity: IRQ affinity on SMP | ||
99 | * | ||
100 | * The fields here need to overlay the ones in irq_desc until we | ||
101 | * cleaned up the direct references and switched everything over to | ||
102 | * irq_data. | ||
103 | */ | ||
104 | struct irq_data { | ||
105 | unsigned int irq; | ||
106 | unsigned int node; | ||
107 | struct irq_chip *chip; | ||
108 | void *handler_data; | ||
109 | void *chip_data; | ||
110 | struct msi_desc *msi_desc; | ||
111 | #ifdef CONFIG_SMP | ||
112 | cpumask_var_t affinity; | ||
113 | #endif | ||
114 | }; | ||
115 | |||
116 | /** | ||
87 | * struct irq_chip - hardware interrupt chip descriptor | 117 | * struct irq_chip - hardware interrupt chip descriptor |
88 | * | 118 | * |
89 | * @name: name for /proc/interrupts | 119 | * @name: name for /proc/interrupts |
90 | * @startup: start up the interrupt (defaults to ->enable if NULL) | 120 | * @startup: deprecated, replaced by irq_startup |
91 | * @shutdown: shut down the interrupt (defaults to ->disable if NULL) | 121 | * @shutdown: deprecated, replaced by irq_shutdown |
92 | * @enable: enable the interrupt (defaults to chip->unmask if NULL) | 122 | * @enable: deprecated, replaced by irq_enable |
93 | * @disable: disable the interrupt | 123 | * @disable: deprecated, replaced by irq_disable |
94 | * @ack: start of a new interrupt | 124 | * @ack: deprecated, replaced by irq_ack |
95 | * @mask: mask an interrupt source | 125 | * @mask: deprecated, replaced by irq_mask |
96 | * @mask_ack: ack and mask an interrupt source | 126 | * @mask_ack: deprecated, replaced by irq_mask_ack |
97 | * @unmask: unmask an interrupt source | 127 | * @unmask: deprecated, replaced by irq_unmask |
98 | * @eoi: end of interrupt - chip level | 128 | * @eoi: deprecated, replaced by irq_eoi |
99 | * @end: end of interrupt - flow level | 129 | * @end: deprecated, will go away with __do_IRQ() |
100 | * @set_affinity: set the CPU affinity on SMP machines | 130 | * @set_affinity: deprecated, replaced by irq_set_affinity |
101 | * @retrigger: resend an IRQ to the CPU | 131 | * @retrigger: deprecated, replaced by irq_retrigger |
102 | * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ | 132 | * @set_type: deprecated, replaced by irq_set_type |
103 | * @set_wake: enable/disable power-management wake-on of an IRQ | 133 | * @set_wake: deprecated, replaced by irq_wake |
134 | * @bus_lock: deprecated, replaced by irq_bus_lock | ||
135 | * @bus_sync_unlock: deprecated, replaced by irq_bus_sync_unlock | ||
104 | * | 136 | * |
105 | * @bus_lock: function to lock access to slow bus (i2c) chips | 137 | * @irq_startup: start up the interrupt (defaults to ->enable if NULL) |
106 | * @bus_sync_unlock: function to sync and unlock slow bus (i2c) chips | 138 | * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL) |
139 | * @irq_enable: enable the interrupt (defaults to chip->unmask if NULL) | ||
140 | * @irq_disable: disable the interrupt | ||
141 | * @irq_ack: start of a new interrupt | ||
142 | * @irq_mask: mask an interrupt source | ||
143 | * @irq_mask_ack: ack and mask an interrupt source | ||
144 | * @irq_unmask: unmask an interrupt source | ||
145 | * @irq_eoi: end of interrupt | ||
146 | * @irq_set_affinity: set the CPU affinity on SMP machines | ||
147 | * @irq_retrigger: resend an IRQ to the CPU | ||
148 | * @irq_set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ | ||
149 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ | ||
150 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips | ||
151 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips | ||
107 | * | 152 | * |
108 | * @release: release function solely used by UML | 153 | * @release: release function solely used by UML |
109 | * @typename: obsoleted by name, kept as migration helper | ||
110 | */ | 154 | */ |
111 | struct irq_chip { | 155 | struct irq_chip { |
112 | const char *name; | 156 | const char *name; |
157 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | ||
113 | unsigned int (*startup)(unsigned int irq); | 158 | unsigned int (*startup)(unsigned int irq); |
114 | void (*shutdown)(unsigned int irq); | 159 | void (*shutdown)(unsigned int irq); |
115 | void (*enable)(unsigned int irq); | 160 | void (*enable)(unsigned int irq); |
@@ -130,154 +175,66 @@ struct irq_chip { | |||
130 | 175 | ||
131 | void (*bus_lock)(unsigned int irq); | 176 | void (*bus_lock)(unsigned int irq); |
132 | void (*bus_sync_unlock)(unsigned int irq); | 177 | void (*bus_sync_unlock)(unsigned int irq); |
178 | #endif | ||
179 | unsigned int (*irq_startup)(struct irq_data *data); | ||
180 | void (*irq_shutdown)(struct irq_data *data); | ||
181 | void (*irq_enable)(struct irq_data *data); | ||
182 | void (*irq_disable)(struct irq_data *data); | ||
183 | |||
184 | void (*irq_ack)(struct irq_data *data); | ||
185 | void (*irq_mask)(struct irq_data *data); | ||
186 | void (*irq_mask_ack)(struct irq_data *data); | ||
187 | void (*irq_unmask)(struct irq_data *data); | ||
188 | void (*irq_eoi)(struct irq_data *data); | ||
189 | |||
190 | int (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force); | ||
191 | int (*irq_retrigger)(struct irq_data *data); | ||
192 | int (*irq_set_type)(struct irq_data *data, unsigned int flow_type); | ||
193 | int (*irq_set_wake)(struct irq_data *data, unsigned int on); | ||
194 | |||
195 | void (*irq_bus_lock)(struct irq_data *data); | ||
196 | void (*irq_bus_sync_unlock)(struct irq_data *data); | ||
133 | 197 | ||
134 | /* Currently used only by UML, might disappear one day.*/ | 198 | /* Currently used only by UML, might disappear one day.*/ |
135 | #ifdef CONFIG_IRQ_RELEASE_METHOD | 199 | #ifdef CONFIG_IRQ_RELEASE_METHOD |
136 | void (*release)(unsigned int irq, void *dev_id); | 200 | void (*release)(unsigned int irq, void *dev_id); |
137 | #endif | 201 | #endif |
138 | /* | ||
139 | * For compatibility, ->typename is copied into ->name. | ||
140 | * Will disappear. | ||
141 | */ | ||
142 | const char *typename; | ||
143 | }; | 202 | }; |
144 | 203 | ||
145 | struct timer_rand_state; | 204 | /* This include will go away once we isolated irq_desc usage to core code */ |
146 | struct irq_2_iommu; | 205 | #include <linux/irqdesc.h> |
147 | /** | ||
148 | * struct irq_desc - interrupt descriptor | ||
149 | * @irq: interrupt number for this descriptor | ||
150 | * @timer_rand_state: pointer to timer rand state struct | ||
151 | * @kstat_irqs: irq stats per cpu | ||
152 | * @irq_2_iommu: iommu with this irq | ||
153 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | ||
154 | * @chip: low level interrupt hardware access | ||
155 | * @msi_desc: MSI descriptor | ||
156 | * @handler_data: per-IRQ data for the irq_chip methods | ||
157 | * @chip_data: platform-specific per-chip private data for the chip | ||
158 | * methods, to allow shared chip implementations | ||
159 | * @action: the irq action chain | ||
160 | * @status: status information | ||
161 | * @depth: disable-depth, for nested irq_disable() calls | ||
162 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | ||
163 | * @irq_count: stats field to detect stalled irqs | ||
164 | * @last_unhandled: aging timer for unhandled count | ||
165 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
166 | * @lock: locking for SMP | ||
167 | * @affinity: IRQ affinity on SMP | ||
168 | * @node: node index useful for balancing | ||
169 | * @pending_mask: pending rebalanced interrupts | ||
170 | * @threads_active: number of irqaction threads currently running | ||
171 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers | ||
172 | * @dir: /proc/irq/ procfs entry | ||
173 | * @name: flow handler name for /proc/interrupts output | ||
174 | */ | ||
175 | struct irq_desc { | ||
176 | unsigned int irq; | ||
177 | struct timer_rand_state *timer_rand_state; | ||
178 | unsigned int *kstat_irqs; | ||
179 | #ifdef CONFIG_INTR_REMAP | ||
180 | struct irq_2_iommu *irq_2_iommu; | ||
181 | #endif | ||
182 | irq_flow_handler_t handle_irq; | ||
183 | struct irq_chip *chip; | ||
184 | struct msi_desc *msi_desc; | ||
185 | void *handler_data; | ||
186 | void *chip_data; | ||
187 | struct irqaction *action; /* IRQ action list */ | ||
188 | unsigned int status; /* IRQ status */ | ||
189 | |||
190 | unsigned int depth; /* nested irq disables */ | ||
191 | unsigned int wake_depth; /* nested wake enables */ | ||
192 | unsigned int irq_count; /* For detecting broken IRQs */ | ||
193 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | ||
194 | unsigned int irqs_unhandled; | ||
195 | raw_spinlock_t lock; | ||
196 | #ifdef CONFIG_SMP | ||
197 | cpumask_var_t affinity; | ||
198 | const struct cpumask *affinity_hint; | ||
199 | unsigned int node; | ||
200 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
201 | cpumask_var_t pending_mask; | ||
202 | #endif | ||
203 | #endif | ||
204 | atomic_t threads_active; | ||
205 | wait_queue_head_t wait_for_threads; | ||
206 | #ifdef CONFIG_PROC_FS | ||
207 | struct proc_dir_entry *dir; | ||
208 | #endif | ||
209 | const char *name; | ||
210 | } ____cacheline_internodealigned_in_smp; | ||
211 | 206 | ||
212 | extern void arch_init_copy_chip_data(struct irq_desc *old_desc, | 207 | /* |
213 | struct irq_desc *desc, int node); | 208 | * Pick up the arch-dependent methods: |
214 | extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); | 209 | */ |
210 | #include <asm/hw_irq.h> | ||
215 | 211 | ||
216 | #ifndef CONFIG_SPARSE_IRQ | 212 | #ifndef NR_IRQS_LEGACY |
217 | extern struct irq_desc irq_desc[NR_IRQS]; | 213 | # define NR_IRQS_LEGACY 0 |
218 | #endif | 214 | #endif |
219 | 215 | ||
220 | #ifdef CONFIG_NUMA_IRQ_DESC | 216 | #ifndef ARCH_IRQ_INIT_FLAGS |
221 | extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int node); | 217 | # define ARCH_IRQ_INIT_FLAGS 0 |
222 | #else | ||
223 | static inline struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | ||
224 | { | ||
225 | return desc; | ||
226 | } | ||
227 | #endif | 218 | #endif |
228 | 219 | ||
229 | extern struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node); | 220 | #define IRQ_DEFAULT_INIT_FLAGS (IRQ_DISABLED | ARCH_IRQ_INIT_FLAGS) |
230 | |||
231 | /* | ||
232 | * Pick up the arch-dependent methods: | ||
233 | */ | ||
234 | #include <asm/hw_irq.h> | ||
235 | 221 | ||
222 | struct irqaction; | ||
236 | extern int setup_irq(unsigned int irq, struct irqaction *new); | 223 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
237 | extern void remove_irq(unsigned int irq, struct irqaction *act); | 224 | extern void remove_irq(unsigned int irq, struct irqaction *act); |
238 | 225 | ||
239 | #ifdef CONFIG_GENERIC_HARDIRQS | 226 | #ifdef CONFIG_GENERIC_HARDIRQS |
240 | 227 | ||
241 | #ifdef CONFIG_SMP | 228 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
242 | |||
243 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
244 | |||
245 | void move_native_irq(int irq); | 229 | void move_native_irq(int irq); |
246 | void move_masked_irq(int irq); | 230 | void move_masked_irq(int irq); |
247 | 231 | #else | |
248 | #else /* CONFIG_GENERIC_PENDING_IRQ */ | 232 | static inline void move_native_irq(int irq) { } |
249 | 233 | static inline void move_masked_irq(int irq) { } | |
250 | static inline void move_irq(int irq) | 234 | #endif |
251 | { | ||
252 | } | ||
253 | |||
254 | static inline void move_native_irq(int irq) | ||
255 | { | ||
256 | } | ||
257 | |||
258 | static inline void move_masked_irq(int irq) | ||
259 | { | ||
260 | } | ||
261 | |||
262 | #endif /* CONFIG_GENERIC_PENDING_IRQ */ | ||
263 | |||
264 | #else /* CONFIG_SMP */ | ||
265 | |||
266 | #define move_native_irq(x) | ||
267 | #define move_masked_irq(x) | ||
268 | |||
269 | #endif /* CONFIG_SMP */ | ||
270 | 235 | ||
271 | extern int no_irq_affinity; | 236 | extern int no_irq_affinity; |
272 | 237 | ||
273 | static inline int irq_balancing_disabled(unsigned int irq) | ||
274 | { | ||
275 | struct irq_desc *desc; | ||
276 | |||
277 | desc = irq_to_desc(irq); | ||
278 | return desc->status & IRQ_NO_BALANCING_MASK; | ||
279 | } | ||
280 | |||
281 | /* Handle irq action chains: */ | 238 | /* Handle irq action chains: */ |
282 | extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action); | 239 | extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action); |
283 | 240 | ||
@@ -293,42 +250,10 @@ extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); | |||
293 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); | 250 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); |
294 | extern void handle_nested_irq(unsigned int irq); | 251 | extern void handle_nested_irq(unsigned int irq); |
295 | 252 | ||
296 | /* | ||
297 | * Monolithic do_IRQ implementation. | ||
298 | */ | ||
299 | #ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
300 | extern unsigned int __do_IRQ(unsigned int irq); | ||
301 | #endif | ||
302 | |||
303 | /* | ||
304 | * Architectures call this to let the generic IRQ layer | ||
305 | * handle an interrupt. If the descriptor is attached to an | ||
306 | * irqchip-style controller then we call the ->handle_irq() handler, | ||
307 | * and it calls __do_IRQ() if it's attached to an irqtype-style controller. | ||
308 | */ | ||
309 | static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc) | ||
310 | { | ||
311 | #ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
312 | desc->handle_irq(irq, desc); | ||
313 | #else | ||
314 | if (likely(desc->handle_irq)) | ||
315 | desc->handle_irq(irq, desc); | ||
316 | else | ||
317 | __do_IRQ(irq); | ||
318 | #endif | ||
319 | } | ||
320 | |||
321 | static inline void generic_handle_irq(unsigned int irq) | ||
322 | { | ||
323 | generic_handle_irq_desc(irq, irq_to_desc(irq)); | ||
324 | } | ||
325 | |||
326 | /* Handling of unhandled and spurious interrupts: */ | 253 | /* Handling of unhandled and spurious interrupts: */ |
327 | extern void note_interrupt(unsigned int irq, struct irq_desc *desc, | 254 | extern void note_interrupt(unsigned int irq, struct irq_desc *desc, |
328 | irqreturn_t action_ret); | 255 | irqreturn_t action_ret); |
329 | 256 | ||
330 | /* Resending of interrupts :*/ | ||
331 | void check_irq_resend(struct irq_desc *desc, unsigned int irq); | ||
332 | 257 | ||
333 | /* Enable/disable irq debugging output: */ | 258 | /* Enable/disable irq debugging output: */ |
334 | extern int noirqdebug_setup(char *str); | 259 | extern int noirqdebug_setup(char *str); |
@@ -351,16 +276,6 @@ extern void | |||
351 | __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | 276 | __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, |
352 | const char *name); | 277 | const char *name); |
353 | 278 | ||
354 | /* caller has locked the irq_desc and both params are valid */ | ||
355 | static inline void __set_irq_handler_unlocked(int irq, | ||
356 | irq_flow_handler_t handler) | ||
357 | { | ||
358 | struct irq_desc *desc; | ||
359 | |||
360 | desc = irq_to_desc(irq); | ||
361 | desc->handle_irq = handler; | ||
362 | } | ||
363 | |||
364 | /* | 279 | /* |
365 | * Set a highlevel flow handler for a given IRQ: | 280 | * Set a highlevel flow handler for a given IRQ: |
366 | */ | 281 | */ |
@@ -384,141 +299,126 @@ set_irq_chained_handler(unsigned int irq, | |||
384 | 299 | ||
385 | extern void set_irq_nested_thread(unsigned int irq, int nest); | 300 | extern void set_irq_nested_thread(unsigned int irq, int nest); |
386 | 301 | ||
387 | extern void set_irq_noprobe(unsigned int irq); | 302 | void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set); |
388 | extern void set_irq_probe(unsigned int irq); | 303 | |
304 | static inline void irq_set_status_flags(unsigned int irq, unsigned long set) | ||
305 | { | ||
306 | irq_modify_status(irq, 0, set); | ||
307 | } | ||
308 | |||
309 | static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr) | ||
310 | { | ||
311 | irq_modify_status(irq, clr, 0); | ||
312 | } | ||
313 | |||
314 | static inline void set_irq_noprobe(unsigned int irq) | ||
315 | { | ||
316 | irq_modify_status(irq, 0, IRQ_NOPROBE); | ||
317 | } | ||
318 | |||
319 | static inline void set_irq_probe(unsigned int irq) | ||
320 | { | ||
321 | irq_modify_status(irq, IRQ_NOPROBE, 0); | ||
322 | } | ||
389 | 323 | ||
390 | /* Handle dynamic irq creation and destruction */ | 324 | /* Handle dynamic irq creation and destruction */ |
391 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); | 325 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
392 | extern int create_irq(void); | 326 | extern int create_irq(void); |
393 | extern void destroy_irq(unsigned int irq); | 327 | extern void destroy_irq(unsigned int irq); |
394 | 328 | ||
395 | /* Test to see if a driver has successfully requested an irq */ | 329 | /* |
396 | static inline int irq_has_action(unsigned int irq) | 330 | * Dynamic irq helper functions. Obsolete. Use irq_alloc_desc* and |
331 | * irq_free_desc instead. | ||
332 | */ | ||
333 | extern void dynamic_irq_cleanup(unsigned int irq); | ||
334 | static inline void dynamic_irq_init(unsigned int irq) | ||
397 | { | 335 | { |
398 | struct irq_desc *desc = irq_to_desc(irq); | 336 | dynamic_irq_cleanup(irq); |
399 | return desc->action != NULL; | ||
400 | } | 337 | } |
401 | 338 | ||
402 | /* Dynamic irq helper functions */ | ||
403 | extern void dynamic_irq_init(unsigned int irq); | ||
404 | void dynamic_irq_init_keep_chip_data(unsigned int irq); | ||
405 | extern void dynamic_irq_cleanup(unsigned int irq); | ||
406 | void dynamic_irq_cleanup_keep_chip_data(unsigned int irq); | ||
407 | |||
408 | /* Set/get chip/data for an IRQ: */ | 339 | /* Set/get chip/data for an IRQ: */ |
409 | extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); | 340 | extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); |
410 | extern int set_irq_data(unsigned int irq, void *data); | 341 | extern int set_irq_data(unsigned int irq, void *data); |
411 | extern int set_irq_chip_data(unsigned int irq, void *data); | 342 | extern int set_irq_chip_data(unsigned int irq, void *data); |
412 | extern int set_irq_type(unsigned int irq, unsigned int type); | 343 | extern int set_irq_type(unsigned int irq, unsigned int type); |
413 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | 344 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); |
345 | extern struct irq_data *irq_get_irq_data(unsigned int irq); | ||
414 | 346 | ||
415 | #define get_irq_chip(irq) (irq_to_desc(irq)->chip) | 347 | static inline struct irq_chip *get_irq_chip(unsigned int irq) |
416 | #define get_irq_chip_data(irq) (irq_to_desc(irq)->chip_data) | ||
417 | #define get_irq_data(irq) (irq_to_desc(irq)->handler_data) | ||
418 | #define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc) | ||
419 | |||
420 | #define get_irq_desc_chip(desc) ((desc)->chip) | ||
421 | #define get_irq_desc_chip_data(desc) ((desc)->chip_data) | ||
422 | #define get_irq_desc_data(desc) ((desc)->handler_data) | ||
423 | #define get_irq_desc_msi(desc) ((desc)->msi_desc) | ||
424 | |||
425 | #endif /* CONFIG_GENERIC_HARDIRQS */ | ||
426 | |||
427 | #endif /* !CONFIG_S390 */ | ||
428 | |||
429 | #ifdef CONFIG_SMP | ||
430 | /** | ||
431 | * alloc_desc_masks - allocate cpumasks for irq_desc | ||
432 | * @desc: pointer to irq_desc struct | ||
433 | * @node: node which will be handling the cpumasks | ||
434 | * @boot: true if need bootmem | ||
435 | * | ||
436 | * Allocates affinity and pending_mask cpumask if required. | ||
437 | * Returns true if successful (or not required). | ||
438 | */ | ||
439 | static inline bool alloc_desc_masks(struct irq_desc *desc, int node, | ||
440 | bool boot) | ||
441 | { | 348 | { |
442 | gfp_t gfp = GFP_ATOMIC; | 349 | struct irq_data *d = irq_get_irq_data(irq); |
443 | 350 | return d ? d->chip : NULL; | |
444 | if (boot) | 351 | } |
445 | gfp = GFP_NOWAIT; | ||
446 | |||
447 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
448 | if (!alloc_cpumask_var_node(&desc->affinity, gfp, node)) | ||
449 | return false; | ||
450 | 352 | ||
451 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 353 | static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d) |
452 | if (!alloc_cpumask_var_node(&desc->pending_mask, gfp, node)) { | 354 | { |
453 | free_cpumask_var(desc->affinity); | 355 | return d->chip; |
454 | return false; | ||
455 | } | ||
456 | #endif | ||
457 | #endif | ||
458 | return true; | ||
459 | } | 356 | } |
460 | 357 | ||
461 | static inline void init_desc_masks(struct irq_desc *desc) | 358 | static inline void *get_irq_chip_data(unsigned int irq) |
462 | { | 359 | { |
463 | cpumask_setall(desc->affinity); | 360 | struct irq_data *d = irq_get_irq_data(irq); |
464 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 361 | return d ? d->chip_data : NULL; |
465 | cpumask_clear(desc->pending_mask); | ||
466 | #endif | ||
467 | } | 362 | } |
468 | 363 | ||
469 | /** | 364 | static inline void *irq_data_get_irq_chip_data(struct irq_data *d) |
470 | * init_copy_desc_masks - copy cpumasks for irq_desc | 365 | { |
471 | * @old_desc: pointer to old irq_desc struct | 366 | return d->chip_data; |
472 | * @new_desc: pointer to new irq_desc struct | 367 | } |
473 | * | ||
474 | * Insures affinity and pending_masks are copied to new irq_desc. | ||
475 | * If !CONFIG_CPUMASKS_OFFSTACK the cpumasks are embedded in the | ||
476 | * irq_desc struct so the copy is redundant. | ||
477 | */ | ||
478 | 368 | ||
479 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | 369 | static inline void *get_irq_data(unsigned int irq) |
480 | struct irq_desc *new_desc) | ||
481 | { | 370 | { |
482 | #ifdef CONFIG_CPUMASK_OFFSTACK | 371 | struct irq_data *d = irq_get_irq_data(irq); |
483 | cpumask_copy(new_desc->affinity, old_desc->affinity); | 372 | return d ? d->handler_data : NULL; |
373 | } | ||
484 | 374 | ||
485 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 375 | static inline void *irq_data_get_irq_data(struct irq_data *d) |
486 | cpumask_copy(new_desc->pending_mask, old_desc->pending_mask); | 376 | { |
487 | #endif | 377 | return d->handler_data; |
488 | #endif | ||
489 | } | 378 | } |
490 | 379 | ||
491 | static inline void free_desc_masks(struct irq_desc *old_desc, | 380 | static inline struct msi_desc *get_irq_msi(unsigned int irq) |
492 | struct irq_desc *new_desc) | ||
493 | { | 381 | { |
494 | free_cpumask_var(old_desc->affinity); | 382 | struct irq_data *d = irq_get_irq_data(irq); |
383 | return d ? d->msi_desc : NULL; | ||
384 | } | ||
495 | 385 | ||
496 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 386 | static inline struct msi_desc *irq_data_get_msi(struct irq_data *d) |
497 | free_cpumask_var(old_desc->pending_mask); | 387 | { |
498 | #endif | 388 | return d->msi_desc; |
499 | } | 389 | } |
500 | 390 | ||
501 | #else /* !CONFIG_SMP */ | 391 | int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node); |
392 | void irq_free_descs(unsigned int irq, unsigned int cnt); | ||
393 | int irq_reserve_irqs(unsigned int from, unsigned int cnt); | ||
394 | |||
395 | static inline int irq_alloc_desc(int node) | ||
396 | { | ||
397 | return irq_alloc_descs(-1, 0, 1, node); | ||
398 | } | ||
502 | 399 | ||
503 | static inline bool alloc_desc_masks(struct irq_desc *desc, int node, | 400 | static inline int irq_alloc_desc_at(unsigned int at, int node) |
504 | bool boot) | ||
505 | { | 401 | { |
506 | return true; | 402 | return irq_alloc_descs(at, at, 1, node); |
507 | } | 403 | } |
508 | 404 | ||
509 | static inline void init_desc_masks(struct irq_desc *desc) | 405 | static inline int irq_alloc_desc_from(unsigned int from, int node) |
510 | { | 406 | { |
407 | return irq_alloc_descs(-1, from, 1, node); | ||
511 | } | 408 | } |
512 | 409 | ||
513 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | 410 | static inline void irq_free_desc(unsigned int irq) |
514 | struct irq_desc *new_desc) | ||
515 | { | 411 | { |
412 | irq_free_descs(irq, 1); | ||
516 | } | 413 | } |
517 | 414 | ||
518 | static inline void free_desc_masks(struct irq_desc *old_desc, | 415 | static inline int irq_reserve_irq(unsigned int irq) |
519 | struct irq_desc *new_desc) | ||
520 | { | 416 | { |
417 | return irq_reserve_irqs(irq, 1); | ||
521 | } | 418 | } |
522 | #endif /* CONFIG_SMP */ | 419 | |
420 | #endif /* CONFIG_GENERIC_HARDIRQS */ | ||
421 | |||
422 | #endif /* !CONFIG_S390 */ | ||
523 | 423 | ||
524 | #endif /* _LINUX_IRQ_H */ | 424 | #endif /* _LINUX_IRQ_H */ |
diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h new file mode 100644 index 000000000000..4fa09d4d0b71 --- /dev/null +++ b/include/linux/irq_work.h | |||
@@ -0,0 +1,20 @@ | |||
1 | #ifndef _LINUX_IRQ_WORK_H | ||
2 | #define _LINUX_IRQ_WORK_H | ||
3 | |||
4 | struct irq_work { | ||
5 | struct irq_work *next; | ||
6 | void (*func)(struct irq_work *); | ||
7 | }; | ||
8 | |||
9 | static inline | ||
10 | void init_irq_work(struct irq_work *entry, void (*func)(struct irq_work *)) | ||
11 | { | ||
12 | entry->next = NULL; | ||
13 | entry->func = func; | ||
14 | } | ||
15 | |||
16 | bool irq_work_queue(struct irq_work *entry); | ||
17 | void irq_work_run(void); | ||
18 | void irq_work_sync(struct irq_work *entry); | ||
19 | |||
20 | #endif /* _LINUX_IRQ_WORK_H */ | ||
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h new file mode 100644 index 000000000000..979c68cc7458 --- /dev/null +++ b/include/linux/irqdesc.h | |||
@@ -0,0 +1,159 @@ | |||
1 | #ifndef _LINUX_IRQDESC_H | ||
2 | #define _LINUX_IRQDESC_H | ||
3 | |||
4 | /* | ||
5 | * Core internal functions to deal with irq descriptors | ||
6 | * | ||
7 | * This include will move to kernel/irq once we cleaned up the tree. | ||
8 | * For now it's included from <linux/irq.h> | ||
9 | */ | ||
10 | |||
11 | struct proc_dir_entry; | ||
12 | struct timer_rand_state; | ||
13 | /** | ||
14 | * struct irq_desc - interrupt descriptor | ||
15 | * @irq_data: per irq and chip data passed down to chip functions | ||
16 | * @timer_rand_state: pointer to timer rand state struct | ||
17 | * @kstat_irqs: irq stats per cpu | ||
18 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | ||
19 | * @action: the irq action chain | ||
20 | * @status: status information | ||
21 | * @depth: disable-depth, for nested irq_disable() calls | ||
22 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | ||
23 | * @irq_count: stats field to detect stalled irqs | ||
24 | * @last_unhandled: aging timer for unhandled count | ||
25 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
26 | * @lock: locking for SMP | ||
27 | * @pending_mask: pending rebalanced interrupts | ||
28 | * @threads_active: number of irqaction threads currently running | ||
29 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers | ||
30 | * @dir: /proc/irq/ procfs entry | ||
31 | * @name: flow handler name for /proc/interrupts output | ||
32 | */ | ||
33 | struct irq_desc { | ||
34 | |||
35 | #ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | ||
36 | struct irq_data irq_data; | ||
37 | #else | ||
38 | /* | ||
39 | * This union will go away, once we fixed the direct access to | ||
40 | * irq_desc all over the place. The direct fields are a 1:1 | ||
41 | * overlay of irq_data. | ||
42 | */ | ||
43 | union { | ||
44 | struct irq_data irq_data; | ||
45 | struct { | ||
46 | unsigned int irq; | ||
47 | unsigned int node; | ||
48 | struct irq_chip *chip; | ||
49 | void *handler_data; | ||
50 | void *chip_data; | ||
51 | struct msi_desc *msi_desc; | ||
52 | #ifdef CONFIG_SMP | ||
53 | cpumask_var_t affinity; | ||
54 | #endif | ||
55 | }; | ||
56 | }; | ||
57 | #endif | ||
58 | |||
59 | struct timer_rand_state *timer_rand_state; | ||
60 | unsigned int *kstat_irqs; | ||
61 | irq_flow_handler_t handle_irq; | ||
62 | struct irqaction *action; /* IRQ action list */ | ||
63 | unsigned int status; /* IRQ status */ | ||
64 | |||
65 | unsigned int depth; /* nested irq disables */ | ||
66 | unsigned int wake_depth; /* nested wake enables */ | ||
67 | unsigned int irq_count; /* For detecting broken IRQs */ | ||
68 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | ||
69 | unsigned int irqs_unhandled; | ||
70 | raw_spinlock_t lock; | ||
71 | #ifdef CONFIG_SMP | ||
72 | const struct cpumask *affinity_hint; | ||
73 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
74 | cpumask_var_t pending_mask; | ||
75 | #endif | ||
76 | #endif | ||
77 | atomic_t threads_active; | ||
78 | wait_queue_head_t wait_for_threads; | ||
79 | #ifdef CONFIG_PROC_FS | ||
80 | struct proc_dir_entry *dir; | ||
81 | #endif | ||
82 | const char *name; | ||
83 | } ____cacheline_internodealigned_in_smp; | ||
84 | |||
85 | #ifndef CONFIG_SPARSE_IRQ | ||
86 | extern struct irq_desc irq_desc[NR_IRQS]; | ||
87 | #endif | ||
88 | |||
89 | /* Will be removed once the last users in power and sh are gone */ | ||
90 | extern struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node); | ||
91 | static inline struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | ||
92 | { | ||
93 | return desc; | ||
94 | } | ||
95 | |||
96 | #ifdef CONFIG_GENERIC_HARDIRQS | ||
97 | |||
98 | #define get_irq_desc_chip(desc) ((desc)->irq_data.chip) | ||
99 | #define get_irq_desc_chip_data(desc) ((desc)->irq_data.chip_data) | ||
100 | #define get_irq_desc_data(desc) ((desc)->irq_data.handler_data) | ||
101 | #define get_irq_desc_msi(desc) ((desc)->irq_data.msi_desc) | ||
102 | |||
103 | /* | ||
104 | * Monolithic do_IRQ implementation. | ||
105 | */ | ||
106 | #ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
107 | extern unsigned int __do_IRQ(unsigned int irq); | ||
108 | #endif | ||
109 | |||
110 | /* | ||
111 | * Architectures call this to let the generic IRQ layer | ||
112 | * handle an interrupt. If the descriptor is attached to an | ||
113 | * irqchip-style controller then we call the ->handle_irq() handler, | ||
114 | * and it calls __do_IRQ() if it's attached to an irqtype-style controller. | ||
115 | */ | ||
116 | static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc) | ||
117 | { | ||
118 | #ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
119 | desc->handle_irq(irq, desc); | ||
120 | #else | ||
121 | if (likely(desc->handle_irq)) | ||
122 | desc->handle_irq(irq, desc); | ||
123 | else | ||
124 | __do_IRQ(irq); | ||
125 | #endif | ||
126 | } | ||
127 | |||
128 | static inline void generic_handle_irq(unsigned int irq) | ||
129 | { | ||
130 | generic_handle_irq_desc(irq, irq_to_desc(irq)); | ||
131 | } | ||
132 | |||
133 | /* Test to see if a driver has successfully requested an irq */ | ||
134 | static inline int irq_has_action(unsigned int irq) | ||
135 | { | ||
136 | struct irq_desc *desc = irq_to_desc(irq); | ||
137 | return desc->action != NULL; | ||
138 | } | ||
139 | |||
140 | static inline int irq_balancing_disabled(unsigned int irq) | ||
141 | { | ||
142 | struct irq_desc *desc; | ||
143 | |||
144 | desc = irq_to_desc(irq); | ||
145 | return desc->status & IRQ_NO_BALANCING_MASK; | ||
146 | } | ||
147 | |||
148 | /* caller has locked the irq_desc and both params are valid */ | ||
149 | static inline void __set_irq_handler_unlocked(int irq, | ||
150 | irq_flow_handler_t handler) | ||
151 | { | ||
152 | struct irq_desc *desc; | ||
153 | |||
154 | desc = irq_to_desc(irq); | ||
155 | desc->handle_irq = handler; | ||
156 | } | ||
157 | #endif | ||
158 | |||
159 | #endif | ||
diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h index 006bf45eae30..d176d658fe25 100644 --- a/include/linux/irqflags.h +++ b/include/linux/irqflags.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define _LINUX_TRACE_IRQFLAGS_H | 12 | #define _LINUX_TRACE_IRQFLAGS_H |
13 | 13 | ||
14 | #include <linux/typecheck.h> | 14 | #include <linux/typecheck.h> |
15 | #include <asm/irqflags.h> | ||
15 | 16 | ||
16 | #ifdef CONFIG_TRACE_IRQFLAGS | 17 | #ifdef CONFIG_TRACE_IRQFLAGS |
17 | extern void trace_softirqs_on(unsigned long ip); | 18 | extern void trace_softirqs_on(unsigned long ip); |
@@ -52,17 +53,45 @@ | |||
52 | # define start_critical_timings() do { } while (0) | 53 | # define start_critical_timings() do { } while (0) |
53 | #endif | 54 | #endif |
54 | 55 | ||
55 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | 56 | /* |
56 | 57 | * Wrap the arch provided IRQ routines to provide appropriate checks. | |
57 | #include <asm/irqflags.h> | 58 | */ |
59 | #define raw_local_irq_disable() arch_local_irq_disable() | ||
60 | #define raw_local_irq_enable() arch_local_irq_enable() | ||
61 | #define raw_local_irq_save(flags) \ | ||
62 | do { \ | ||
63 | typecheck(unsigned long, flags); \ | ||
64 | flags = arch_local_irq_save(); \ | ||
65 | } while (0) | ||
66 | #define raw_local_irq_restore(flags) \ | ||
67 | do { \ | ||
68 | typecheck(unsigned long, flags); \ | ||
69 | arch_local_irq_restore(flags); \ | ||
70 | } while (0) | ||
71 | #define raw_local_save_flags(flags) \ | ||
72 | do { \ | ||
73 | typecheck(unsigned long, flags); \ | ||
74 | flags = arch_local_save_flags(); \ | ||
75 | } while (0) | ||
76 | #define raw_irqs_disabled_flags(flags) \ | ||
77 | ({ \ | ||
78 | typecheck(unsigned long, flags); \ | ||
79 | arch_irqs_disabled_flags(flags); \ | ||
80 | }) | ||
81 | #define raw_irqs_disabled() (arch_irqs_disabled()) | ||
82 | #define raw_safe_halt() arch_safe_halt() | ||
58 | 83 | ||
84 | /* | ||
85 | * The local_irq_*() APIs are equal to the raw_local_irq*() | ||
86 | * if !TRACE_IRQFLAGS. | ||
87 | */ | ||
88 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | ||
59 | #define local_irq_enable() \ | 89 | #define local_irq_enable() \ |
60 | do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0) | 90 | do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0) |
61 | #define local_irq_disable() \ | 91 | #define local_irq_disable() \ |
62 | do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) | 92 | do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) |
63 | #define local_irq_save(flags) \ | 93 | #define local_irq_save(flags) \ |
64 | do { \ | 94 | do { \ |
65 | typecheck(unsigned long, flags); \ | ||
66 | raw_local_irq_save(flags); \ | 95 | raw_local_irq_save(flags); \ |
67 | trace_hardirqs_off(); \ | 96 | trace_hardirqs_off(); \ |
68 | } while (0) | 97 | } while (0) |
@@ -70,7 +99,6 @@ | |||
70 | 99 | ||
71 | #define local_irq_restore(flags) \ | 100 | #define local_irq_restore(flags) \ |
72 | do { \ | 101 | do { \ |
73 | typecheck(unsigned long, flags); \ | ||
74 | if (raw_irqs_disabled_flags(flags)) { \ | 102 | if (raw_irqs_disabled_flags(flags)) { \ |
75 | raw_local_irq_restore(flags); \ | 103 | raw_local_irq_restore(flags); \ |
76 | trace_hardirqs_off(); \ | 104 | trace_hardirqs_off(); \ |
@@ -79,51 +107,44 @@ | |||
79 | raw_local_irq_restore(flags); \ | 107 | raw_local_irq_restore(flags); \ |
80 | } \ | 108 | } \ |
81 | } while (0) | 109 | } while (0) |
82 | #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */ | 110 | #define local_save_flags(flags) \ |
83 | /* | ||
84 | * The local_irq_*() APIs are equal to the raw_local_irq*() | ||
85 | * if !TRACE_IRQFLAGS. | ||
86 | */ | ||
87 | # define raw_local_irq_disable() local_irq_disable() | ||
88 | # define raw_local_irq_enable() local_irq_enable() | ||
89 | # define raw_local_irq_save(flags) \ | ||
90 | do { \ | ||
91 | typecheck(unsigned long, flags); \ | ||
92 | local_irq_save(flags); \ | ||
93 | } while (0) | ||
94 | # define raw_local_irq_restore(flags) \ | ||
95 | do { \ | 111 | do { \ |
96 | typecheck(unsigned long, flags); \ | 112 | raw_local_save_flags(flags); \ |
97 | local_irq_restore(flags); \ | ||
98 | } while (0) | 113 | } while (0) |
99 | #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ | ||
100 | 114 | ||
101 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | 115 | #define irqs_disabled_flags(flags) \ |
102 | #define safe_halt() \ | 116 | ({ \ |
103 | do { \ | 117 | raw_irqs_disabled_flags(flags); \ |
104 | trace_hardirqs_on(); \ | 118 | }) |
105 | raw_safe_halt(); \ | ||
106 | } while (0) | ||
107 | 119 | ||
108 | #define local_save_flags(flags) \ | 120 | #define irqs_disabled() \ |
109 | do { \ | 121 | ({ \ |
110 | typecheck(unsigned long, flags); \ | 122 | unsigned long _flags; \ |
111 | raw_local_save_flags(flags); \ | 123 | raw_local_save_flags(_flags); \ |
124 | raw_irqs_disabled_flags(_flags); \ | ||
125 | }) | ||
126 | |||
127 | #define safe_halt() \ | ||
128 | do { \ | ||
129 | trace_hardirqs_on(); \ | ||
130 | raw_safe_halt(); \ | ||
112 | } while (0) | 131 | } while (0) |
113 | 132 | ||
114 | #define irqs_disabled() \ | ||
115 | ({ \ | ||
116 | unsigned long _flags; \ | ||
117 | \ | ||
118 | raw_local_save_flags(_flags); \ | ||
119 | raw_irqs_disabled_flags(_flags); \ | ||
120 | }) | ||
121 | 133 | ||
122 | #define irqs_disabled_flags(flags) \ | 134 | #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */ |
123 | ({ \ | 135 | |
124 | typecheck(unsigned long, flags); \ | 136 | #define local_irq_enable() do { raw_local_irq_enable(); } while (0) |
125 | raw_irqs_disabled_flags(flags); \ | 137 | #define local_irq_disable() do { raw_local_irq_disable(); } while (0) |
126 | }) | 138 | #define local_irq_save(flags) \ |
139 | do { \ | ||
140 | raw_local_irq_save(flags); \ | ||
141 | } while (0) | ||
142 | #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0) | ||
143 | #define local_save_flags(flags) do { raw_local_save_flags(flags); } while (0) | ||
144 | #define irqs_disabled() (raw_irqs_disabled()) | ||
145 | #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags)) | ||
146 | #define safe_halt() do { raw_safe_halt(); } while (0) | ||
147 | |||
127 | #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ | 148 | #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ |
128 | 149 | ||
129 | #endif | 150 | #endif |
diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h index 7bf89bc8cbca..3bc4dcab6e82 100644 --- a/include/linux/irqnr.h +++ b/include/linux/irqnr.h | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | extern int nr_irqs; | 26 | extern int nr_irqs; |
27 | extern struct irq_desc *irq_to_desc(unsigned int irq); | 27 | extern struct irq_desc *irq_to_desc(unsigned int irq); |
28 | unsigned int irq_get_next_irq(unsigned int offset); | ||
28 | 29 | ||
29 | # define for_each_irq_desc(irq, desc) \ | 30 | # define for_each_irq_desc(irq, desc) \ |
30 | for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ | 31 | for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ |
@@ -42,11 +43,15 @@ extern struct irq_desc *irq_to_desc(unsigned int irq); | |||
42 | else | 43 | else |
43 | 44 | ||
44 | #ifdef CONFIG_SMP | 45 | #ifdef CONFIG_SMP |
45 | #define irq_node(irq) (irq_to_desc(irq)->node) | 46 | #define irq_node(irq) (irq_get_irq_data(irq)->node) |
46 | #else | 47 | #else |
47 | #define irq_node(irq) 0 | 48 | #define irq_node(irq) 0 |
48 | #endif | 49 | #endif |
49 | 50 | ||
51 | # define for_each_active_irq(irq) \ | ||
52 | for (irq = irq_get_next_irq(0); irq < nr_irqs; \ | ||
53 | irq = irq_get_next_irq(irq + 1)) | ||
54 | |||
50 | #endif /* CONFIG_GENERIC_HARDIRQS */ | 55 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
51 | 56 | ||
52 | #define for_each_irq_nr(irq) \ | 57 | #define for_each_irq_nr(irq) \ |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 0b52924a0cb6..2ae86aa21fce 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
@@ -395,7 +395,7 @@ struct jbd2_inode { | |||
395 | struct inode *i_vfs_inode; | 395 | struct inode *i_vfs_inode; |
396 | 396 | ||
397 | /* Flags of inode [j_list_lock] */ | 397 | /* Flags of inode [j_list_lock] */ |
398 | unsigned int i_flags; | 398 | unsigned long i_flags; |
399 | }; | 399 | }; |
400 | 400 | ||
401 | struct jbd2_revoke_table_s; | 401 | struct jbd2_revoke_table_s; |
diff --git a/include/linux/jhash.h b/include/linux/jhash.h index 2a2f99fbcb16..ced1159fa4f2 100644 --- a/include/linux/jhash.h +++ b/include/linux/jhash.h | |||
@@ -116,7 +116,7 @@ static inline u32 jhash2(const u32 *k, u32 length, u32 initval) | |||
116 | /* A special ultra-optimized versions that knows they are hashing exactly | 116 | /* A special ultra-optimized versions that knows they are hashing exactly |
117 | * 3, 2 or 1 word(s). | 117 | * 3, 2 or 1 word(s). |
118 | * | 118 | * |
119 | * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally | 119 | * NOTE: In particular the "c += length; __jhash_mix(a,b,c);" normally |
120 | * done at the end is not done here. | 120 | * done at the end is not done here. |
121 | */ | 121 | */ |
122 | static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval) | 122 | static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval) |
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h new file mode 100644 index 000000000000..7880f18e4b86 --- /dev/null +++ b/include/linux/jump_label.h | |||
@@ -0,0 +1,79 @@ | |||
1 | #ifndef _LINUX_JUMP_LABEL_H | ||
2 | #define _LINUX_JUMP_LABEL_H | ||
3 | |||
4 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) | ||
5 | # include <asm/jump_label.h> | ||
6 | # define HAVE_JUMP_LABEL | ||
7 | #endif | ||
8 | |||
9 | enum jump_label_type { | ||
10 | JUMP_LABEL_ENABLE, | ||
11 | JUMP_LABEL_DISABLE | ||
12 | }; | ||
13 | |||
14 | struct module; | ||
15 | |||
16 | #ifdef HAVE_JUMP_LABEL | ||
17 | |||
18 | extern struct jump_entry __start___jump_table[]; | ||
19 | extern struct jump_entry __stop___jump_table[]; | ||
20 | |||
21 | extern void jump_label_lock(void); | ||
22 | extern void jump_label_unlock(void); | ||
23 | extern void arch_jump_label_transform(struct jump_entry *entry, | ||
24 | enum jump_label_type type); | ||
25 | extern void arch_jump_label_text_poke_early(jump_label_t addr); | ||
26 | extern void jump_label_update(unsigned long key, enum jump_label_type type); | ||
27 | extern void jump_label_apply_nops(struct module *mod); | ||
28 | extern int jump_label_text_reserved(void *start, void *end); | ||
29 | |||
30 | #define jump_label_enable(key) \ | ||
31 | jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE); | ||
32 | |||
33 | #define jump_label_disable(key) \ | ||
34 | jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE); | ||
35 | |||
36 | #else | ||
37 | |||
38 | #define JUMP_LABEL(key, label) \ | ||
39 | do { \ | ||
40 | if (unlikely(*key)) \ | ||
41 | goto label; \ | ||
42 | } while (0) | ||
43 | |||
44 | #define jump_label_enable(cond_var) \ | ||
45 | do { \ | ||
46 | *(cond_var) = 1; \ | ||
47 | } while (0) | ||
48 | |||
49 | #define jump_label_disable(cond_var) \ | ||
50 | do { \ | ||
51 | *(cond_var) = 0; \ | ||
52 | } while (0) | ||
53 | |||
54 | static inline int jump_label_apply_nops(struct module *mod) | ||
55 | { | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static inline int jump_label_text_reserved(void *start, void *end) | ||
60 | { | ||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | static inline void jump_label_lock(void) {} | ||
65 | static inline void jump_label_unlock(void) {} | ||
66 | |||
67 | #endif | ||
68 | |||
69 | #define COND_STMT(key, stmt) \ | ||
70 | do { \ | ||
71 | __label__ jl_enabled; \ | ||
72 | JUMP_LABEL(key, jl_enabled); \ | ||
73 | if (0) { \ | ||
74 | jl_enabled: \ | ||
75 | stmt; \ | ||
76 | } \ | ||
77 | } while (0) | ||
78 | |||
79 | #endif | ||
diff --git a/include/linux/jump_label_ref.h b/include/linux/jump_label_ref.h new file mode 100644 index 000000000000..e5d012ad92c6 --- /dev/null +++ b/include/linux/jump_label_ref.h | |||
@@ -0,0 +1,44 @@ | |||
1 | #ifndef _LINUX_JUMP_LABEL_REF_H | ||
2 | #define _LINUX_JUMP_LABEL_REF_H | ||
3 | |||
4 | #include <linux/jump_label.h> | ||
5 | #include <asm/atomic.h> | ||
6 | |||
7 | #ifdef HAVE_JUMP_LABEL | ||
8 | |||
9 | static inline void jump_label_inc(atomic_t *key) | ||
10 | { | ||
11 | if (atomic_add_return(1, key) == 1) | ||
12 | jump_label_enable(key); | ||
13 | } | ||
14 | |||
15 | static inline void jump_label_dec(atomic_t *key) | ||
16 | { | ||
17 | if (atomic_dec_and_test(key)) | ||
18 | jump_label_disable(key); | ||
19 | } | ||
20 | |||
21 | #else /* !HAVE_JUMP_LABEL */ | ||
22 | |||
23 | static inline void jump_label_inc(atomic_t *key) | ||
24 | { | ||
25 | atomic_inc(key); | ||
26 | } | ||
27 | |||
28 | static inline void jump_label_dec(atomic_t *key) | ||
29 | { | ||
30 | atomic_dec(key); | ||
31 | } | ||
32 | |||
33 | #undef JUMP_LABEL | ||
34 | #define JUMP_LABEL(key, label) \ | ||
35 | do { \ | ||
36 | if (unlikely(__builtin_choose_expr( \ | ||
37 | __builtin_types_compatible_p(typeof(key), atomic_t *), \ | ||
38 | atomic_read((atomic_t *)(key)), *(key)))) \ | ||
39 | goto label; \ | ||
40 | } while (0) | ||
41 | |||
42 | #endif /* HAVE_JUMP_LABEL */ | ||
43 | |||
44 | #endif /* _LINUX_JUMP_LABEL_REF_H */ | ||
diff --git a/include/linux/kdb.h b/include/linux/kdb.h index ea6e5244ed3f..aadff7cc2b84 100644 --- a/include/linux/kdb.h +++ b/include/linux/kdb.h | |||
@@ -28,6 +28,41 @@ extern int kdb_poll_idx; | |||
28 | extern int kdb_initial_cpu; | 28 | extern int kdb_initial_cpu; |
29 | extern atomic_t kdb_event; | 29 | extern atomic_t kdb_event; |
30 | 30 | ||
31 | /* Types and messages used for dynamically added kdb shell commands */ | ||
32 | |||
33 | #define KDB_MAXARGS 16 /* Maximum number of arguments to a function */ | ||
34 | |||
35 | typedef enum { | ||
36 | KDB_REPEAT_NONE = 0, /* Do not repeat this command */ | ||
37 | KDB_REPEAT_NO_ARGS, /* Repeat the command without arguments */ | ||
38 | KDB_REPEAT_WITH_ARGS, /* Repeat the command including its arguments */ | ||
39 | } kdb_repeat_t; | ||
40 | |||
41 | typedef int (*kdb_func_t)(int, const char **); | ||
42 | |||
43 | /* KDB return codes from a command or internal kdb function */ | ||
44 | #define KDB_NOTFOUND (-1) | ||
45 | #define KDB_ARGCOUNT (-2) | ||
46 | #define KDB_BADWIDTH (-3) | ||
47 | #define KDB_BADRADIX (-4) | ||
48 | #define KDB_NOTENV (-5) | ||
49 | #define KDB_NOENVVALUE (-6) | ||
50 | #define KDB_NOTIMP (-7) | ||
51 | #define KDB_ENVFULL (-8) | ||
52 | #define KDB_ENVBUFFULL (-9) | ||
53 | #define KDB_TOOMANYBPT (-10) | ||
54 | #define KDB_TOOMANYDBREGS (-11) | ||
55 | #define KDB_DUPBPT (-12) | ||
56 | #define KDB_BPTNOTFOUND (-13) | ||
57 | #define KDB_BADMODE (-14) | ||
58 | #define KDB_BADINT (-15) | ||
59 | #define KDB_INVADDRFMT (-16) | ||
60 | #define KDB_BADREG (-17) | ||
61 | #define KDB_BADCPUNUM (-18) | ||
62 | #define KDB_BADLENGTH (-19) | ||
63 | #define KDB_NOBP (-20) | ||
64 | #define KDB_BADADDR (-21) | ||
65 | |||
31 | /* | 66 | /* |
32 | * kdb_diemsg | 67 | * kdb_diemsg |
33 | * | 68 | * |
@@ -104,10 +139,26 @@ int kdb_process_cpu(const struct task_struct *p) | |||
104 | 139 | ||
105 | /* kdb access to register set for stack dumping */ | 140 | /* kdb access to register set for stack dumping */ |
106 | extern struct pt_regs *kdb_current_regs; | 141 | extern struct pt_regs *kdb_current_regs; |
142 | #ifdef CONFIG_KALLSYMS | ||
143 | extern const char *kdb_walk_kallsyms(loff_t *pos); | ||
144 | #else /* ! CONFIG_KALLSYMS */ | ||
145 | static inline const char *kdb_walk_kallsyms(loff_t *pos) | ||
146 | { | ||
147 | return NULL; | ||
148 | } | ||
149 | #endif /* ! CONFIG_KALLSYMS */ | ||
107 | 150 | ||
151 | /* Dynamic kdb shell command registration */ | ||
152 | extern int kdb_register(char *, kdb_func_t, char *, char *, short); | ||
153 | extern int kdb_register_repeat(char *, kdb_func_t, char *, char *, | ||
154 | short, kdb_repeat_t); | ||
155 | extern int kdb_unregister(char *); | ||
108 | #else /* ! CONFIG_KGDB_KDB */ | 156 | #else /* ! CONFIG_KGDB_KDB */ |
109 | #define kdb_printf(...) | 157 | #define kdb_printf(...) |
110 | #define kdb_init(x) | 158 | #define kdb_init(x) |
159 | #define kdb_register(...) | ||
160 | #define kdb_register_repeat(...) | ||
161 | #define kdb_uregister(x) | ||
111 | #endif /* CONFIG_KGDB_KDB */ | 162 | #endif /* CONFIG_KGDB_KDB */ |
112 | enum { | 163 | enum { |
113 | KDB_NOT_INITIALIZED, | 164 | KDB_NOT_INITIALIZED, |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 2b0a35e6bc69..b6de9a6f7018 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -17,13 +17,11 @@ | |||
17 | #include <linux/bitops.h> | 17 | #include <linux/bitops.h> |
18 | #include <linux/log2.h> | 18 | #include <linux/log2.h> |
19 | #include <linux/typecheck.h> | 19 | #include <linux/typecheck.h> |
20 | #include <linux/printk.h> | ||
20 | #include <linux/dynamic_debug.h> | 21 | #include <linux/dynamic_debug.h> |
21 | #include <asm/byteorder.h> | 22 | #include <asm/byteorder.h> |
22 | #include <asm/bug.h> | 23 | #include <asm/bug.h> |
23 | 24 | ||
24 | extern const char linux_banner[]; | ||
25 | extern const char linux_proc_banner[]; | ||
26 | |||
27 | #define USHRT_MAX ((u16)(~0U)) | 25 | #define USHRT_MAX ((u16)(~0U)) |
28 | #define SHRT_MAX ((s16)(USHRT_MAX>>1)) | 26 | #define SHRT_MAX ((s16)(USHRT_MAX>>1)) |
29 | #define SHRT_MIN ((s16)(-SHRT_MAX - 1)) | 27 | #define SHRT_MIN ((s16)(-SHRT_MAX - 1)) |
@@ -58,7 +56,18 @@ extern const char linux_proc_banner[]; | |||
58 | 56 | ||
59 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 57 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
60 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 58 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
61 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 59 | #define roundup(x, y) ( \ |
60 | { \ | ||
61 | const typeof(y) __y = y; \ | ||
62 | (((x) + (__y - 1)) / __y) * __y; \ | ||
63 | } \ | ||
64 | ) | ||
65 | #define rounddown(x, y) ( \ | ||
66 | { \ | ||
67 | typeof(x) __x = (x); \ | ||
68 | __x - (__x % (y)); \ | ||
69 | } \ | ||
70 | ) | ||
62 | #define DIV_ROUND_CLOSEST(x, divisor)( \ | 71 | #define DIV_ROUND_CLOSEST(x, divisor)( \ |
63 | { \ | 72 | { \ |
64 | typeof(divisor) __divisor = divisor; \ | 73 | typeof(divisor) __divisor = divisor; \ |
@@ -99,31 +108,6 @@ extern const char linux_proc_banner[]; | |||
99 | */ | 108 | */ |
100 | #define lower_32_bits(n) ((u32)(n)) | 109 | #define lower_32_bits(n) ((u32)(n)) |
101 | 110 | ||
102 | #define KERN_EMERG "<0>" /* system is unusable */ | ||
103 | #define KERN_ALERT "<1>" /* action must be taken immediately */ | ||
104 | #define KERN_CRIT "<2>" /* critical conditions */ | ||
105 | #define KERN_ERR "<3>" /* error conditions */ | ||
106 | #define KERN_WARNING "<4>" /* warning conditions */ | ||
107 | #define KERN_NOTICE "<5>" /* normal but significant condition */ | ||
108 | #define KERN_INFO "<6>" /* informational */ | ||
109 | #define KERN_DEBUG "<7>" /* debug-level messages */ | ||
110 | |||
111 | /* Use the default kernel loglevel */ | ||
112 | #define KERN_DEFAULT "<d>" | ||
113 | /* | ||
114 | * Annotation for a "continued" line of log printout (only done after a | ||
115 | * line that had no enclosing \n). Only to be used by core/arch code | ||
116 | * during early bootup (a continued line is not SMP-safe otherwise). | ||
117 | */ | ||
118 | #define KERN_CONT "<c>" | ||
119 | |||
120 | extern int console_printk[]; | ||
121 | |||
122 | #define console_loglevel (console_printk[0]) | ||
123 | #define default_message_loglevel (console_printk[1]) | ||
124 | #define minimum_console_loglevel (console_printk[2]) | ||
125 | #define default_console_loglevel (console_printk[3]) | ||
126 | |||
127 | struct completion; | 111 | struct completion; |
128 | struct pt_regs; | 112 | struct pt_regs; |
129 | struct user; | 113 | struct user; |
@@ -162,6 +146,11 @@ extern int _cond_resched(void); | |||
162 | (__x < 0) ? -__x : __x; \ | 146 | (__x < 0) ? -__x : __x; \ |
163 | }) | 147 | }) |
164 | 148 | ||
149 | #define abs64(x) ({ \ | ||
150 | s64 __x = (x); \ | ||
151 | (__x < 0) ? -__x : __x; \ | ||
152 | }) | ||
153 | |||
165 | #ifdef CONFIG_PROVE_LOCKING | 154 | #ifdef CONFIG_PROVE_LOCKING |
166 | void might_fault(void); | 155 | void might_fault(void); |
167 | #else | 156 | #else |
@@ -171,11 +160,6 @@ static inline void might_fault(void) | |||
171 | } | 160 | } |
172 | #endif | 161 | #endif |
173 | 162 | ||
174 | struct va_format { | ||
175 | const char *fmt; | ||
176 | va_list *va; | ||
177 | }; | ||
178 | |||
179 | extern struct atomic_notifier_head panic_notifier_list; | 163 | extern struct atomic_notifier_head panic_notifier_list; |
180 | extern long (*panic_blink)(int state); | 164 | extern long (*panic_blink)(int state); |
181 | NORET_TYPE void panic(const char * fmt, ...) | 165 | NORET_TYPE void panic(const char * fmt, ...) |
@@ -192,10 +176,10 @@ extern unsigned long simple_strtoul(const char *,char **,unsigned int); | |||
192 | extern long simple_strtol(const char *,char **,unsigned int); | 176 | extern long simple_strtol(const char *,char **,unsigned int); |
193 | extern unsigned long long simple_strtoull(const char *,char **,unsigned int); | 177 | extern unsigned long long simple_strtoull(const char *,char **,unsigned int); |
194 | extern long long simple_strtoll(const char *,char **,unsigned int); | 178 | extern long long simple_strtoll(const char *,char **,unsigned int); |
195 | extern int strict_strtoul(const char *, unsigned int, unsigned long *); | 179 | extern int __must_check strict_strtoul(const char *, unsigned int, unsigned long *); |
196 | extern int strict_strtol(const char *, unsigned int, long *); | 180 | extern int __must_check strict_strtol(const char *, unsigned int, long *); |
197 | extern int strict_strtoull(const char *, unsigned int, unsigned long long *); | 181 | extern int __must_check strict_strtoull(const char *, unsigned int, unsigned long long *); |
198 | extern int strict_strtoll(const char *, unsigned int, long long *); | 182 | extern int __must_check strict_strtoll(const char *, unsigned int, long long *); |
199 | extern int sprintf(char * buf, const char * fmt, ...) | 183 | extern int sprintf(char * buf, const char * fmt, ...) |
200 | __attribute__ ((format (printf, 2, 3))); | 184 | __attribute__ ((format (printf, 2, 3))); |
201 | extern int vsprintf(char *buf, const char *, va_list) | 185 | extern int vsprintf(char *buf, const char *, va_list) |
@@ -229,109 +213,8 @@ extern int func_ptr_is_kernel_text(void *ptr); | |||
229 | struct pid; | 213 | struct pid; |
230 | extern struct pid *session_of_pgrp(struct pid *pgrp); | 214 | extern struct pid *session_of_pgrp(struct pid *pgrp); |
231 | 215 | ||
232 | /* | ||
233 | * FW_BUG | ||
234 | * Add this to a message where you are sure the firmware is buggy or behaves | ||
235 | * really stupid or out of spec. Be aware that the responsible BIOS developer | ||
236 | * should be able to fix this issue or at least get a concrete idea of the | ||
237 | * problem by reading your message without the need of looking at the kernel | ||
238 | * code. | ||
239 | * | ||
240 | * Use it for definite and high priority BIOS bugs. | ||
241 | * | ||
242 | * FW_WARN | ||
243 | * Use it for not that clear (e.g. could the kernel messed up things already?) | ||
244 | * and medium priority BIOS bugs. | ||
245 | * | ||
246 | * FW_INFO | ||
247 | * Use this one if you want to tell the user or vendor about something | ||
248 | * suspicious, but generally harmless related to the firmware. | ||
249 | * | ||
250 | * Use it for information or very low priority BIOS bugs. | ||
251 | */ | ||
252 | #define FW_BUG "[Firmware Bug]: " | ||
253 | #define FW_WARN "[Firmware Warn]: " | ||
254 | #define FW_INFO "[Firmware Info]: " | ||
255 | |||
256 | /* | ||
257 | * HW_ERR | ||
258 | * Add this to a message for hardware errors, so that user can report | ||
259 | * it to hardware vendor instead of LKML or software vendor. | ||
260 | */ | ||
261 | #define HW_ERR "[Hardware Error]: " | ||
262 | |||
263 | #ifdef CONFIG_PRINTK | ||
264 | asmlinkage int vprintk(const char *fmt, va_list args) | ||
265 | __attribute__ ((format (printf, 1, 0))); | ||
266 | asmlinkage int printk(const char * fmt, ...) | ||
267 | __attribute__ ((format (printf, 1, 2))) __cold; | ||
268 | |||
269 | extern int __printk_ratelimit(const char *func); | ||
270 | #define printk_ratelimit() __printk_ratelimit(__func__) | ||
271 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, | ||
272 | unsigned int interval_msec); | ||
273 | |||
274 | extern int printk_delay_msec; | ||
275 | |||
276 | /* | ||
277 | * Print a one-time message (analogous to WARN_ONCE() et al): | ||
278 | */ | ||
279 | #define printk_once(x...) ({ \ | ||
280 | static bool __print_once; \ | ||
281 | \ | ||
282 | if (!__print_once) { \ | ||
283 | __print_once = true; \ | ||
284 | printk(x); \ | ||
285 | } \ | ||
286 | }) | ||
287 | |||
288 | void log_buf_kexec_setup(void); | ||
289 | #else | ||
290 | static inline int vprintk(const char *s, va_list args) | ||
291 | __attribute__ ((format (printf, 1, 0))); | ||
292 | static inline int vprintk(const char *s, va_list args) { return 0; } | ||
293 | static inline int printk(const char *s, ...) | ||
294 | __attribute__ ((format (printf, 1, 2))); | ||
295 | static inline int __cold printk(const char *s, ...) { return 0; } | ||
296 | static inline int printk_ratelimit(void) { return 0; } | ||
297 | static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \ | ||
298 | unsigned int interval_msec) \ | ||
299 | { return false; } | ||
300 | |||
301 | /* No effect, but we still get type checking even in the !PRINTK case: */ | ||
302 | #define printk_once(x...) printk(x) | ||
303 | |||
304 | static inline void log_buf_kexec_setup(void) | ||
305 | { | ||
306 | } | ||
307 | #endif | ||
308 | |||
309 | /* | ||
310 | * Dummy printk for disabled debugging statements to use whilst maintaining | ||
311 | * gcc's format and side-effect checking. | ||
312 | */ | ||
313 | static inline __attribute__ ((format (printf, 1, 2))) | ||
314 | int no_printk(const char *s, ...) { return 0; } | ||
315 | |||
316 | extern int printk_needs_cpu(int cpu); | ||
317 | extern void printk_tick(void); | ||
318 | |||
319 | extern void asmlinkage __attribute__((format(printf, 1, 2))) | ||
320 | early_printk(const char *fmt, ...); | ||
321 | |||
322 | unsigned long int_sqrt(unsigned long); | 216 | unsigned long int_sqrt(unsigned long); |
323 | 217 | ||
324 | static inline void console_silent(void) | ||
325 | { | ||
326 | console_loglevel = 0; | ||
327 | } | ||
328 | |||
329 | static inline void console_verbose(void) | ||
330 | { | ||
331 | if (console_loglevel) | ||
332 | console_loglevel = 15; | ||
333 | } | ||
334 | |||
335 | extern void bust_spinlocks(int yes); | 218 | extern void bust_spinlocks(int yes); |
336 | extern void wake_up_klogd(void); | 219 | extern void wake_up_klogd(void); |
337 | extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in progress */ | 220 | extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in progress */ |
@@ -368,22 +251,6 @@ extern enum system_states { | |||
368 | #define TAINT_CRAP 10 | 251 | #define TAINT_CRAP 10 |
369 | #define TAINT_FIRMWARE_WORKAROUND 11 | 252 | #define TAINT_FIRMWARE_WORKAROUND 11 |
370 | 253 | ||
371 | extern void dump_stack(void) __cold; | ||
372 | |||
373 | enum { | ||
374 | DUMP_PREFIX_NONE, | ||
375 | DUMP_PREFIX_ADDRESS, | ||
376 | DUMP_PREFIX_OFFSET | ||
377 | }; | ||
378 | extern void hex_dump_to_buffer(const void *buf, size_t len, | ||
379 | int rowsize, int groupsize, | ||
380 | char *linebuf, size_t linebuflen, bool ascii); | ||
381 | extern void print_hex_dump(const char *level, const char *prefix_str, | ||
382 | int prefix_type, int rowsize, int groupsize, | ||
383 | const void *buf, size_t len, bool ascii); | ||
384 | extern void print_hex_dump_bytes(const char *prefix_str, int prefix_type, | ||
385 | const void *buf, size_t len); | ||
386 | |||
387 | extern const char hex_asc[]; | 254 | extern const char hex_asc[]; |
388 | #define hex_asc_lo(x) hex_asc[((x) & 0x0f)] | 255 | #define hex_asc_lo(x) hex_asc[((x) & 0x0f)] |
389 | #define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4] | 256 | #define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4] |
@@ -397,94 +264,6 @@ static inline char *pack_hex_byte(char *buf, u8 byte) | |||
397 | 264 | ||
398 | extern int hex_to_bin(char ch); | 265 | extern int hex_to_bin(char ch); |
399 | 266 | ||
400 | #ifndef pr_fmt | ||
401 | #define pr_fmt(fmt) fmt | ||
402 | #endif | ||
403 | |||
404 | #define pr_emerg(fmt, ...) \ | ||
405 | printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) | ||
406 | #define pr_alert(fmt, ...) \ | ||
407 | printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) | ||
408 | #define pr_crit(fmt, ...) \ | ||
409 | printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) | ||
410 | #define pr_err(fmt, ...) \ | ||
411 | printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) | ||
412 | #define pr_warning(fmt, ...) \ | ||
413 | printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) | ||
414 | #define pr_warn pr_warning | ||
415 | #define pr_notice(fmt, ...) \ | ||
416 | printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) | ||
417 | #define pr_info(fmt, ...) \ | ||
418 | printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) | ||
419 | #define pr_cont(fmt, ...) \ | ||
420 | printk(KERN_CONT fmt, ##__VA_ARGS__) | ||
421 | |||
422 | /* pr_devel() should produce zero code unless DEBUG is defined */ | ||
423 | #ifdef DEBUG | ||
424 | #define pr_devel(fmt, ...) \ | ||
425 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
426 | #else | ||
427 | #define pr_devel(fmt, ...) \ | ||
428 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) | ||
429 | #endif | ||
430 | |||
431 | /* If you are writing a driver, please use dev_dbg instead */ | ||
432 | #if defined(DEBUG) | ||
433 | #define pr_debug(fmt, ...) \ | ||
434 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
435 | #elif defined(CONFIG_DYNAMIC_DEBUG) | ||
436 | /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */ | ||
437 | #define pr_debug(fmt, ...) \ | ||
438 | dynamic_pr_debug(fmt, ##__VA_ARGS__) | ||
439 | #else | ||
440 | #define pr_debug(fmt, ...) \ | ||
441 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) | ||
442 | #endif | ||
443 | |||
444 | /* | ||
445 | * ratelimited messages with local ratelimit_state, | ||
446 | * no local ratelimit_state used in the !PRINTK case | ||
447 | */ | ||
448 | #ifdef CONFIG_PRINTK | ||
449 | #define printk_ratelimited(fmt, ...) ({ \ | ||
450 | static DEFINE_RATELIMIT_STATE(_rs, \ | ||
451 | DEFAULT_RATELIMIT_INTERVAL, \ | ||
452 | DEFAULT_RATELIMIT_BURST); \ | ||
453 | \ | ||
454 | if (__ratelimit(&_rs)) \ | ||
455 | printk(fmt, ##__VA_ARGS__); \ | ||
456 | }) | ||
457 | #else | ||
458 | /* No effect, but we still get type checking even in the !PRINTK case: */ | ||
459 | #define printk_ratelimited printk | ||
460 | #endif | ||
461 | |||
462 | #define pr_emerg_ratelimited(fmt, ...) \ | ||
463 | printk_ratelimited(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) | ||
464 | #define pr_alert_ratelimited(fmt, ...) \ | ||
465 | printk_ratelimited(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) | ||
466 | #define pr_crit_ratelimited(fmt, ...) \ | ||
467 | printk_ratelimited(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) | ||
468 | #define pr_err_ratelimited(fmt, ...) \ | ||
469 | printk_ratelimited(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) | ||
470 | #define pr_warning_ratelimited(fmt, ...) \ | ||
471 | printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) | ||
472 | #define pr_warn_ratelimited pr_warning_ratelimited | ||
473 | #define pr_notice_ratelimited(fmt, ...) \ | ||
474 | printk_ratelimited(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) | ||
475 | #define pr_info_ratelimited(fmt, ...) \ | ||
476 | printk_ratelimited(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) | ||
477 | /* no pr_cont_ratelimited, don't do that... */ | ||
478 | /* If you are writing a driver, please use dev_dbg instead */ | ||
479 | #if defined(DEBUG) | ||
480 | #define pr_debug_ratelimited(fmt, ...) \ | ||
481 | printk_ratelimited(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
482 | #else | ||
483 | #define pr_debug_ratelimited(fmt, ...) \ | ||
484 | ({ if (0) printk_ratelimited(KERN_DEBUG pr_fmt(fmt), \ | ||
485 | ##__VA_ARGS__); 0; }) | ||
486 | #endif | ||
487 | |||
488 | /* | 267 | /* |
489 | * General tracing related utility functions - trace_printk(), | 268 | * General tracing related utility functions - trace_printk(), |
490 | * tracing_on/tracing_off and tracing_start()/tracing_stop | 269 | * tracing_on/tracing_off and tracing_start()/tracing_stop |
@@ -640,6 +419,34 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } | |||
640 | (void) (&_max1 == &_max2); \ | 419 | (void) (&_max1 == &_max2); \ |
641 | _max1 > _max2 ? _max1 : _max2; }) | 420 | _max1 > _max2 ? _max1 : _max2; }) |
642 | 421 | ||
422 | #define min3(x, y, z) ({ \ | ||
423 | typeof(x) _min1 = (x); \ | ||
424 | typeof(y) _min2 = (y); \ | ||
425 | typeof(z) _min3 = (z); \ | ||
426 | (void) (&_min1 == &_min2); \ | ||
427 | (void) (&_min1 == &_min3); \ | ||
428 | _min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \ | ||
429 | (_min2 < _min3 ? _min2 : _min3); }) | ||
430 | |||
431 | #define max3(x, y, z) ({ \ | ||
432 | typeof(x) _max1 = (x); \ | ||
433 | typeof(y) _max2 = (y); \ | ||
434 | typeof(z) _max3 = (z); \ | ||
435 | (void) (&_max1 == &_max2); \ | ||
436 | (void) (&_max1 == &_max3); \ | ||
437 | _max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \ | ||
438 | (_max2 > _max3 ? _max2 : _max3); }) | ||
439 | |||
440 | /** | ||
441 | * min_not_zero - return the minimum that is _not_ zero, unless both are zero | ||
442 | * @x: value1 | ||
443 | * @y: value2 | ||
444 | */ | ||
445 | #define min_not_zero(x, y) ({ \ | ||
446 | typeof(x) __x = (x); \ | ||
447 | typeof(y) __y = (y); \ | ||
448 | __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); }) | ||
449 | |||
643 | /** | 450 | /** |
644 | * clamp - return a value clamped to a given range with strict typechecking | 451 | * clamp - return a value clamped to a given range with strict typechecking |
645 | * @val: current value | 452 | * @val: current value |
diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index c059044bc6dc..ad54c846911b 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h | |||
@@ -33,6 +33,7 @@ struct kernel_stat { | |||
33 | #ifndef CONFIG_GENERIC_HARDIRQS | 33 | #ifndef CONFIG_GENERIC_HARDIRQS |
34 | unsigned int irqs[NR_IRQS]; | 34 | unsigned int irqs[NR_IRQS]; |
35 | #endif | 35 | #endif |
36 | unsigned long irqs_sum; | ||
36 | unsigned int softirqs[NR_SOFTIRQS]; | 37 | unsigned int softirqs[NR_SOFTIRQS]; |
37 | }; | 38 | }; |
38 | 39 | ||
@@ -54,6 +55,7 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq, | |||
54 | struct irq_desc *desc) | 55 | struct irq_desc *desc) |
55 | { | 56 | { |
56 | kstat_this_cpu.irqs[irq]++; | 57 | kstat_this_cpu.irqs[irq]++; |
58 | kstat_this_cpu.irqs_sum++; | ||
57 | } | 59 | } |
58 | 60 | ||
59 | static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | 61 | static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) |
@@ -65,8 +67,9 @@ static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | |||
65 | extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); | 67 | extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); |
66 | #define kstat_irqs_this_cpu(DESC) \ | 68 | #define kstat_irqs_this_cpu(DESC) \ |
67 | ((DESC)->kstat_irqs[smp_processor_id()]) | 69 | ((DESC)->kstat_irqs[smp_processor_id()]) |
68 | #define kstat_incr_irqs_this_cpu(irqno, DESC) \ | 70 | #define kstat_incr_irqs_this_cpu(irqno, DESC) do {\ |
69 | ((DESC)->kstat_irqs[smp_processor_id()]++) | 71 | ((DESC)->kstat_irqs[smp_processor_id()]++);\ |
72 | kstat_this_cpu.irqs_sum++; } while (0) | ||
70 | 73 | ||
71 | #endif | 74 | #endif |
72 | 75 | ||
@@ -83,6 +86,7 @@ static inline unsigned int kstat_softirqs_cpu(unsigned int irq, int cpu) | |||
83 | /* | 86 | /* |
84 | * Number of interrupts per specific IRQ source, since bootup | 87 | * Number of interrupts per specific IRQ source, since bootup |
85 | */ | 88 | */ |
89 | #ifndef CONFIG_GENERIC_HARDIRQS | ||
86 | static inline unsigned int kstat_irqs(unsigned int irq) | 90 | static inline unsigned int kstat_irqs(unsigned int irq) |
87 | { | 91 | { |
88 | unsigned int sum = 0; | 92 | unsigned int sum = 0; |
@@ -93,7 +97,17 @@ static inline unsigned int kstat_irqs(unsigned int irq) | |||
93 | 97 | ||
94 | return sum; | 98 | return sum; |
95 | } | 99 | } |
100 | #else | ||
101 | extern unsigned int kstat_irqs(unsigned int irq); | ||
102 | #endif | ||
96 | 103 | ||
104 | /* | ||
105 | * Number of interrupts per cpu, since bootup | ||
106 | */ | ||
107 | static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu) | ||
108 | { | ||
109 | return kstat_cpu(cpu).irqs_sum; | ||
110 | } | ||
97 | 111 | ||
98 | /* | 112 | /* |
99 | * Lock/unlock the current runqueue - to extract task statistics: | 113 | * Lock/unlock the current runqueue - to extract task statistics: |
diff --git a/include/linux/key.h b/include/linux/key.h index cd50dfa1d4c2..3db0adce1fda 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
@@ -178,8 +178,9 @@ struct key { | |||
178 | */ | 178 | */ |
179 | union { | 179 | union { |
180 | unsigned long value; | 180 | unsigned long value; |
181 | void __rcu *rcudata; | ||
181 | void *data; | 182 | void *data; |
182 | struct keyring_list *subscriptions; | 183 | struct keyring_list __rcu *subscriptions; |
183 | } payload; | 184 | } payload; |
184 | }; | 185 | }; |
185 | 186 | ||
diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h index 62dbee554f60..10308c6a3d1c 100644 --- a/include/linux/kfifo.h +++ b/include/linux/kfifo.h | |||
@@ -172,7 +172,13 @@ struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void); | |||
172 | 172 | ||
173 | 173 | ||
174 | static inline unsigned int __must_check | 174 | static inline unsigned int __must_check |
175 | __kfifo_must_check_helper(unsigned int val) | 175 | __kfifo_uint_must_check_helper(unsigned int val) |
176 | { | ||
177 | return val; | ||
178 | } | ||
179 | |||
180 | static inline int __must_check | ||
181 | __kfifo_int_must_check_helper(int val) | ||
176 | { | 182 | { |
177 | return val; | 183 | return val; |
178 | } | 184 | } |
@@ -267,7 +273,7 @@ __kfifo_must_check_helper(unsigned int val) | |||
267 | * @fifo: address of the fifo to be used | 273 | * @fifo: address of the fifo to be used |
268 | */ | 274 | */ |
269 | #define kfifo_avail(fifo) \ | 275 | #define kfifo_avail(fifo) \ |
270 | __kfifo_must_check_helper( \ | 276 | __kfifo_uint_must_check_helper( \ |
271 | ({ \ | 277 | ({ \ |
272 | typeof((fifo) + 1) __tmpq = (fifo); \ | 278 | typeof((fifo) + 1) __tmpq = (fifo); \ |
273 | const size_t __recsize = sizeof(*__tmpq->rectype); \ | 279 | const size_t __recsize = sizeof(*__tmpq->rectype); \ |
@@ -300,7 +306,7 @@ __kfifo_must_check_helper( \ | |||
300 | * This function returns the size of the next fifo record in number of bytes. | 306 | * This function returns the size of the next fifo record in number of bytes. |
301 | */ | 307 | */ |
302 | #define kfifo_peek_len(fifo) \ | 308 | #define kfifo_peek_len(fifo) \ |
303 | __kfifo_must_check_helper( \ | 309 | __kfifo_uint_must_check_helper( \ |
304 | ({ \ | 310 | ({ \ |
305 | typeof((fifo) + 1) __tmp = (fifo); \ | 311 | typeof((fifo) + 1) __tmp = (fifo); \ |
306 | const size_t __recsize = sizeof(*__tmp->rectype); \ | 312 | const size_t __recsize = sizeof(*__tmp->rectype); \ |
@@ -323,7 +329,7 @@ __kfifo_must_check_helper( \ | |||
323 | * Return 0 if no error, otherwise an error code. | 329 | * Return 0 if no error, otherwise an error code. |
324 | */ | 330 | */ |
325 | #define kfifo_alloc(fifo, size, gfp_mask) \ | 331 | #define kfifo_alloc(fifo, size, gfp_mask) \ |
326 | __kfifo_must_check_helper( \ | 332 | __kfifo_int_must_check_helper( \ |
327 | ({ \ | 333 | ({ \ |
328 | typeof((fifo) + 1) __tmp = (fifo); \ | 334 | typeof((fifo) + 1) __tmp = (fifo); \ |
329 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | 335 | struct __kfifo *__kfifo = &__tmp->kfifo; \ |
@@ -419,7 +425,7 @@ __kfifo_must_check_helper( \ | |||
419 | * writer, you don't need extra locking to use these macro. | 425 | * writer, you don't need extra locking to use these macro. |
420 | */ | 426 | */ |
421 | #define kfifo_get(fifo, val) \ | 427 | #define kfifo_get(fifo, val) \ |
422 | __kfifo_must_check_helper( \ | 428 | __kfifo_uint_must_check_helper( \ |
423 | ({ \ | 429 | ({ \ |
424 | typeof((fifo) + 1) __tmp = (fifo); \ | 430 | typeof((fifo) + 1) __tmp = (fifo); \ |
425 | typeof((val) + 1) __val = (val); \ | 431 | typeof((val) + 1) __val = (val); \ |
@@ -460,7 +466,7 @@ __kfifo_must_check_helper( \ | |||
460 | * writer, you don't need extra locking to use these macro. | 466 | * writer, you don't need extra locking to use these macro. |
461 | */ | 467 | */ |
462 | #define kfifo_peek(fifo, val) \ | 468 | #define kfifo_peek(fifo, val) \ |
463 | __kfifo_must_check_helper( \ | 469 | __kfifo_uint_must_check_helper( \ |
464 | ({ \ | 470 | ({ \ |
465 | typeof((fifo) + 1) __tmp = (fifo); \ | 471 | typeof((fifo) + 1) __tmp = (fifo); \ |
466 | typeof((val) + 1) __val = (val); \ | 472 | typeof((val) + 1) __val = (val); \ |
@@ -552,7 +558,7 @@ __kfifo_must_check_helper( \ | |||
552 | * writer, you don't need extra locking to use these macro. | 558 | * writer, you don't need extra locking to use these macro. |
553 | */ | 559 | */ |
554 | #define kfifo_out(fifo, buf, n) \ | 560 | #define kfifo_out(fifo, buf, n) \ |
555 | __kfifo_must_check_helper( \ | 561 | __kfifo_uint_must_check_helper( \ |
556 | ({ \ | 562 | ({ \ |
557 | typeof((fifo) + 1) __tmp = (fifo); \ | 563 | typeof((fifo) + 1) __tmp = (fifo); \ |
558 | typeof((buf) + 1) __buf = (buf); \ | 564 | typeof((buf) + 1) __buf = (buf); \ |
@@ -580,7 +586,7 @@ __kfifo_must_check_helper( \ | |||
580 | * copied. | 586 | * copied. |
581 | */ | 587 | */ |
582 | #define kfifo_out_spinlocked(fifo, buf, n, lock) \ | 588 | #define kfifo_out_spinlocked(fifo, buf, n, lock) \ |
583 | __kfifo_must_check_helper( \ | 589 | __kfifo_uint_must_check_helper( \ |
584 | ({ \ | 590 | ({ \ |
585 | unsigned long __flags; \ | 591 | unsigned long __flags; \ |
586 | unsigned int __ret; \ | 592 | unsigned int __ret; \ |
@@ -609,7 +615,7 @@ __kfifo_must_check_helper( \ | |||
609 | * writer, you don't need extra locking to use these macro. | 615 | * writer, you don't need extra locking to use these macro. |
610 | */ | 616 | */ |
611 | #define kfifo_from_user(fifo, from, len, copied) \ | 617 | #define kfifo_from_user(fifo, from, len, copied) \ |
612 | __kfifo_must_check_helper( \ | 618 | __kfifo_uint_must_check_helper( \ |
613 | ({ \ | 619 | ({ \ |
614 | typeof((fifo) + 1) __tmp = (fifo); \ | 620 | typeof((fifo) + 1) __tmp = (fifo); \ |
615 | const void __user *__from = (from); \ | 621 | const void __user *__from = (from); \ |
@@ -637,7 +643,7 @@ __kfifo_must_check_helper( \ | |||
637 | * writer, you don't need extra locking to use these macro. | 643 | * writer, you don't need extra locking to use these macro. |
638 | */ | 644 | */ |
639 | #define kfifo_to_user(fifo, to, len, copied) \ | 645 | #define kfifo_to_user(fifo, to, len, copied) \ |
640 | __kfifo_must_check_helper( \ | 646 | __kfifo_uint_must_check_helper( \ |
641 | ({ \ | 647 | ({ \ |
642 | typeof((fifo) + 1) __tmp = (fifo); \ | 648 | typeof((fifo) + 1) __tmp = (fifo); \ |
643 | void __user *__to = (to); \ | 649 | void __user *__to = (to); \ |
@@ -764,7 +770,7 @@ __kfifo_must_check_helper( \ | |||
764 | * writer, you don't need extra locking to use these macro. | 770 | * writer, you don't need extra locking to use these macro. |
765 | */ | 771 | */ |
766 | #define kfifo_out_peek(fifo, buf, n) \ | 772 | #define kfifo_out_peek(fifo, buf, n) \ |
767 | __kfifo_must_check_helper( \ | 773 | __kfifo_uint_must_check_helper( \ |
768 | ({ \ | 774 | ({ \ |
769 | typeof((fifo) + 1) __tmp = (fifo); \ | 775 | typeof((fifo) + 1) __tmp = (fifo); \ |
770 | typeof((buf) + 1) __buf = (buf); \ | 776 | typeof((buf) + 1) __buf = (buf); \ |
diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index cc96f0f23e04..092e4250a458 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h | |||
@@ -35,16 +35,6 @@ struct pt_regs; | |||
35 | */ | 35 | */ |
36 | extern int kgdb_skipexception(int exception, struct pt_regs *regs); | 36 | extern int kgdb_skipexception(int exception, struct pt_regs *regs); |
37 | 37 | ||
38 | /** | ||
39 | * kgdb_disable_hw_debug - (optional) Disable hardware debugging hook | ||
40 | * @regs: Current &struct pt_regs. | ||
41 | * | ||
42 | * This function will be called if the particular architecture must | ||
43 | * disable hardware debugging while it is processing gdb packets or | ||
44 | * handling exception. | ||
45 | */ | ||
46 | extern void kgdb_disable_hw_debug(struct pt_regs *regs); | ||
47 | |||
48 | struct tasklet_struct; | 38 | struct tasklet_struct; |
49 | struct task_struct; | 39 | struct task_struct; |
50 | struct uart_port; | 40 | struct uart_port; |
@@ -243,6 +233,8 @@ extern void kgdb_arch_late(void); | |||
243 | * breakpoint. | 233 | * breakpoint. |
244 | * @remove_hw_breakpoint: Allow an architecture to specify how to remove a | 234 | * @remove_hw_breakpoint: Allow an architecture to specify how to remove a |
245 | * hardware breakpoint. | 235 | * hardware breakpoint. |
236 | * @disable_hw_break: Allow an architecture to specify how to disable | ||
237 | * hardware breakpoints for a single cpu. | ||
246 | * @remove_all_hw_break: Allow an architecture to specify how to remove all | 238 | * @remove_all_hw_break: Allow an architecture to specify how to remove all |
247 | * hardware breakpoints. | 239 | * hardware breakpoints. |
248 | * @correct_hw_break: Allow an architecture to specify how to correct the | 240 | * @correct_hw_break: Allow an architecture to specify how to correct the |
@@ -256,6 +248,7 @@ struct kgdb_arch { | |||
256 | int (*remove_breakpoint)(unsigned long, char *); | 248 | int (*remove_breakpoint)(unsigned long, char *); |
257 | int (*set_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); | 249 | int (*set_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); |
258 | int (*remove_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); | 250 | int (*remove_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); |
251 | void (*disable_hw_break)(struct pt_regs *regs); | ||
259 | void (*remove_all_hw_break)(void); | 252 | void (*remove_all_hw_break)(void); |
260 | void (*correct_hw_break)(void); | 253 | void (*correct_hw_break)(void); |
261 | }; | 254 | }; |
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 7950a37a7146..8f6d12151048 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
@@ -191,6 +191,8 @@ static inline struct kobj_type *get_ktype(struct kobject *kobj) | |||
191 | } | 191 | } |
192 | 192 | ||
193 | extern struct kobject *kset_find_obj(struct kset *, const char *); | 193 | extern struct kobject *kset_find_obj(struct kset *, const char *); |
194 | extern struct kobject *kset_find_obj_hinted(struct kset *, const char *, | ||
195 | struct kobject *); | ||
194 | 196 | ||
195 | /* The global /sys/kernel/ kobject for people to chain off of */ | 197 | /* The global /sys/kernel/ kobject for people to chain off of */ |
196 | extern struct kobject *kernel_kobj; | 198 | extern struct kobject *kernel_kobj; |
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 636fc381c897..919ae53adc5c 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -414,6 +414,14 @@ struct kvm_enable_cap { | |||
414 | __u8 pad[64]; | 414 | __u8 pad[64]; |
415 | }; | 415 | }; |
416 | 416 | ||
417 | /* for KVM_PPC_GET_PVINFO */ | ||
418 | struct kvm_ppc_pvinfo { | ||
419 | /* out */ | ||
420 | __u32 flags; | ||
421 | __u32 hcall[4]; | ||
422 | __u8 pad[108]; | ||
423 | }; | ||
424 | |||
417 | #define KVMIO 0xAE | 425 | #define KVMIO 0xAE |
418 | 426 | ||
419 | /* | 427 | /* |
@@ -530,6 +538,8 @@ struct kvm_enable_cap { | |||
530 | #ifdef __KVM_HAVE_XCRS | 538 | #ifdef __KVM_HAVE_XCRS |
531 | #define KVM_CAP_XCRS 56 | 539 | #define KVM_CAP_XCRS 56 |
532 | #endif | 540 | #endif |
541 | #define KVM_CAP_PPC_GET_PVINFO 57 | ||
542 | #define KVM_CAP_PPC_IRQ_LEVEL 58 | ||
533 | 543 | ||
534 | #ifdef KVM_CAP_IRQ_ROUTING | 544 | #ifdef KVM_CAP_IRQ_ROUTING |
535 | 545 | ||
@@ -664,6 +674,8 @@ struct kvm_clock_data { | |||
664 | /* Available with KVM_CAP_PIT_STATE2 */ | 674 | /* Available with KVM_CAP_PIT_STATE2 */ |
665 | #define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2) | 675 | #define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2) |
666 | #define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2) | 676 | #define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2) |
677 | /* Available with KVM_CAP_PPC_GET_PVINFO */ | ||
678 | #define KVM_PPC_GET_PVINFO _IOW(KVMIO, 0xa1, struct kvm_ppc_pvinfo) | ||
667 | 679 | ||
668 | /* | 680 | /* |
669 | * ioctls for vcpu fds | 681 | * ioctls for vcpu fds |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index c13cc48697aa..a0557422715e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -36,9 +36,10 @@ | |||
36 | #define KVM_REQ_PENDING_TIMER 5 | 36 | #define KVM_REQ_PENDING_TIMER 5 |
37 | #define KVM_REQ_UNHALT 6 | 37 | #define KVM_REQ_UNHALT 6 |
38 | #define KVM_REQ_MMU_SYNC 7 | 38 | #define KVM_REQ_MMU_SYNC 7 |
39 | #define KVM_REQ_KVMCLOCK_UPDATE 8 | 39 | #define KVM_REQ_CLOCK_UPDATE 8 |
40 | #define KVM_REQ_KICK 9 | 40 | #define KVM_REQ_KICK 9 |
41 | #define KVM_REQ_DEACTIVATE_FPU 10 | 41 | #define KVM_REQ_DEACTIVATE_FPU 10 |
42 | #define KVM_REQ_EVENT 11 | ||
42 | 43 | ||
43 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 | 44 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 |
44 | 45 | ||
@@ -205,7 +206,7 @@ struct kvm { | |||
205 | 206 | ||
206 | struct mutex irq_lock; | 207 | struct mutex irq_lock; |
207 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 208 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
208 | struct kvm_irq_routing_table *irq_routing; | 209 | struct kvm_irq_routing_table __rcu *irq_routing; |
209 | struct hlist_head mask_notifier_list; | 210 | struct hlist_head mask_notifier_list; |
210 | struct hlist_head irq_ack_notifier_list; | 211 | struct hlist_head irq_ack_notifier_list; |
211 | #endif | 212 | #endif |
@@ -289,6 +290,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, | |||
289 | void kvm_disable_largepages(void); | 290 | void kvm_disable_largepages(void); |
290 | void kvm_arch_flush_shadow(struct kvm *kvm); | 291 | void kvm_arch_flush_shadow(struct kvm *kvm); |
291 | 292 | ||
293 | int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages, | ||
294 | int nr_pages); | ||
295 | |||
292 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); | 296 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); |
293 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); | 297 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); |
294 | void kvm_release_page_clean(struct page *page); | 298 | void kvm_release_page_clean(struct page *page); |
@@ -296,6 +300,8 @@ void kvm_release_page_dirty(struct page *page); | |||
296 | void kvm_set_page_dirty(struct page *page); | 300 | void kvm_set_page_dirty(struct page *page); |
297 | void kvm_set_page_accessed(struct page *page); | 301 | void kvm_set_page_accessed(struct page *page); |
298 | 302 | ||
303 | pfn_t hva_to_pfn_atomic(struct kvm *kvm, unsigned long addr); | ||
304 | pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn); | ||
299 | pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); | 305 | pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); |
300 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, | 306 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, |
301 | struct kvm_memory_slot *slot, gfn_t gfn); | 307 | struct kvm_memory_slot *slot, gfn_t gfn); |
@@ -477,8 +483,7 @@ int kvm_deassign_device(struct kvm *kvm, | |||
477 | struct kvm_assigned_dev_kernel *assigned_dev); | 483 | struct kvm_assigned_dev_kernel *assigned_dev); |
478 | #else /* CONFIG_IOMMU_API */ | 484 | #else /* CONFIG_IOMMU_API */ |
479 | static inline int kvm_iommu_map_pages(struct kvm *kvm, | 485 | static inline int kvm_iommu_map_pages(struct kvm *kvm, |
480 | gfn_t base_gfn, | 486 | struct kvm_memory_slot *slot) |
481 | unsigned long npages) | ||
482 | { | 487 | { |
483 | return 0; | 488 | return 0; |
484 | } | 489 | } |
@@ -518,11 +523,22 @@ static inline void kvm_guest_exit(void) | |||
518 | current->flags &= ~PF_VCPU; | 523 | current->flags &= ~PF_VCPU; |
519 | } | 524 | } |
520 | 525 | ||
526 | static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, | ||
527 | gfn_t gfn) | ||
528 | { | ||
529 | return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE; | ||
530 | } | ||
531 | |||
521 | static inline gpa_t gfn_to_gpa(gfn_t gfn) | 532 | static inline gpa_t gfn_to_gpa(gfn_t gfn) |
522 | { | 533 | { |
523 | return (gpa_t)gfn << PAGE_SHIFT; | 534 | return (gpa_t)gfn << PAGE_SHIFT; |
524 | } | 535 | } |
525 | 536 | ||
537 | static inline gfn_t gpa_to_gfn(gpa_t gpa) | ||
538 | { | ||
539 | return (gfn_t)(gpa >> PAGE_SHIFT); | ||
540 | } | ||
541 | |||
526 | static inline hpa_t pfn_to_hpa(pfn_t pfn) | 542 | static inline hpa_t pfn_to_hpa(pfn_t pfn) |
527 | { | 543 | { |
528 | return (hpa_t)pfn << PAGE_SHIFT; | 544 | return (hpa_t)pfn << PAGE_SHIFT; |
diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h index d73109243fda..47a070b0520e 100644 --- a/include/linux/kvm_para.h +++ b/include/linux/kvm_para.h | |||
@@ -17,6 +17,8 @@ | |||
17 | 17 | ||
18 | #define KVM_HC_VAPIC_POLL_IRQ 1 | 18 | #define KVM_HC_VAPIC_POLL_IRQ 1 |
19 | #define KVM_HC_MMU_OP 2 | 19 | #define KVM_HC_MMU_OP 2 |
20 | #define KVM_HC_FEATURES 3 | ||
21 | #define KVM_HC_PPC_MAP_MAGIC_PAGE 4 | ||
20 | 22 | ||
21 | /* | 23 | /* |
22 | * hypercalls use architecture specific | 24 | * hypercalls use architecture specific |
@@ -24,11 +26,6 @@ | |||
24 | #include <asm/kvm_para.h> | 26 | #include <asm/kvm_para.h> |
25 | 27 | ||
26 | #ifdef __KERNEL__ | 28 | #ifdef __KERNEL__ |
27 | #ifdef CONFIG_KVM_GUEST | ||
28 | void __init kvm_guest_init(void); | ||
29 | #else | ||
30 | #define kvm_guest_init() do { } while (0) | ||
31 | #endif | ||
32 | 29 | ||
33 | static inline int kvm_para_has_feature(unsigned int feature) | 30 | static inline int kvm_para_has_feature(unsigned int feature) |
34 | { | 31 | { |
diff --git a/include/linux/leds-lp5521.h b/include/linux/leds-lp5521.h new file mode 100644 index 000000000000..38368d785f08 --- /dev/null +++ b/include/linux/leds-lp5521.h | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * LP5521 LED chip driver. | ||
3 | * | ||
4 | * Copyright (C) 2010 Nokia Corporation | ||
5 | * | ||
6 | * Contact: Samu Onkalo <samu.p.onkalo@nokia.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 | ||
10 | * version 2 as published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
20 | * 02110-1301 USA | ||
21 | */ | ||
22 | |||
23 | #ifndef __LINUX_LP5521_H | ||
24 | #define __LINUX_LP5521_H | ||
25 | |||
26 | /* See Documentation/leds/leds-lp5521.txt */ | ||
27 | |||
28 | struct lp5521_led_config { | ||
29 | u8 chan_nr; | ||
30 | u8 led_current; /* mA x10, 0 if led is not connected */ | ||
31 | u8 max_current; | ||
32 | }; | ||
33 | |||
34 | #define LP5521_CLOCK_AUTO 0 | ||
35 | #define LP5521_CLOCK_INT 1 | ||
36 | #define LP5521_CLOCK_EXT 2 | ||
37 | |||
38 | struct lp5521_platform_data { | ||
39 | struct lp5521_led_config *led_config; | ||
40 | u8 num_channels; | ||
41 | u8 clock_mode; | ||
42 | int (*setup_resources)(void); | ||
43 | void (*release_resources)(void); | ||
44 | void (*enable)(bool state); | ||
45 | }; | ||
46 | |||
47 | #endif /* __LINUX_LP5521_H */ | ||
diff --git a/include/linux/leds-lp5523.h b/include/linux/leds-lp5523.h new file mode 100644 index 000000000000..796747637b80 --- /dev/null +++ b/include/linux/leds-lp5523.h | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * LP5523 LED Driver | ||
3 | * | ||
4 | * Copyright (C) 2010 Nokia Corporation | ||
5 | * | ||
6 | * Contact: Samu Onkalo <samu.p.onkalo@nokia.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 | ||
10 | * version 2 as published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
20 | * 02110-1301 USA | ||
21 | */ | ||
22 | |||
23 | #ifndef __LINUX_LP5523_H | ||
24 | #define __LINUX_LP5523_H | ||
25 | |||
26 | /* See Documentation/leds/leds-lp5523.txt */ | ||
27 | |||
28 | struct lp5523_led_config { | ||
29 | u8 chan_nr; | ||
30 | u8 led_current; /* mA x10, 0 if led is not connected */ | ||
31 | u8 max_current; | ||
32 | }; | ||
33 | |||
34 | #define LP5523_CLOCK_AUTO 0 | ||
35 | #define LP5523_CLOCK_INT 1 | ||
36 | #define LP5523_CLOCK_EXT 2 | ||
37 | |||
38 | struct lp5523_platform_data { | ||
39 | struct lp5523_led_config *led_config; | ||
40 | u8 num_channels; | ||
41 | u8 clock_mode; | ||
42 | int (*setup_resources)(void); | ||
43 | void (*release_resources)(void); | ||
44 | void (*enable)(bool state); | ||
45 | }; | ||
46 | |||
47 | #endif /* __LINUX_LP5523_H */ | ||
diff --git a/include/linux/leds.h b/include/linux/leds.h index ba6986a11663..0f19df9e37b0 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/list.h> | 15 | #include <linux/list.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/rwsem.h> | 17 | #include <linux/rwsem.h> |
18 | #include <linux/timer.h> | ||
18 | 19 | ||
19 | struct device; | 20 | struct device; |
20 | /* | 21 | /* |
@@ -45,10 +46,14 @@ struct led_classdev { | |||
45 | /* Get LED brightness level */ | 46 | /* Get LED brightness level */ |
46 | enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); | 47 | enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); |
47 | 48 | ||
48 | /* Activate hardware accelerated blink, delays are in | 49 | /* |
49 | * miliseconds and if none is provided then a sensible default | 50 | * Activate hardware accelerated blink, delays are in milliseconds |
50 | * should be chosen. The call can adjust the timings if it can't | 51 | * and if both are zero then a sensible default should be chosen. |
51 | * match the values specified exactly. */ | 52 | * The call should adjust the timings in that case and if it can't |
53 | * match the values specified exactly. | ||
54 | * Deactivate blinking again when the brightness is set to a fixed | ||
55 | * value via the brightness_set() callback. | ||
56 | */ | ||
52 | int (*blink_set)(struct led_classdev *led_cdev, | 57 | int (*blink_set)(struct led_classdev *led_cdev, |
53 | unsigned long *delay_on, | 58 | unsigned long *delay_on, |
54 | unsigned long *delay_off); | 59 | unsigned long *delay_off); |
@@ -57,6 +62,10 @@ struct led_classdev { | |||
57 | struct list_head node; /* LED Device list */ | 62 | struct list_head node; /* LED Device list */ |
58 | const char *default_trigger; /* Trigger to use */ | 63 | const char *default_trigger; /* Trigger to use */ |
59 | 64 | ||
65 | unsigned long blink_delay_on, blink_delay_off; | ||
66 | struct timer_list blink_timer; | ||
67 | int blink_brightness; | ||
68 | |||
60 | #ifdef CONFIG_LEDS_TRIGGERS | 69 | #ifdef CONFIG_LEDS_TRIGGERS |
61 | /* Protects the trigger data below */ | 70 | /* Protects the trigger data below */ |
62 | struct rw_semaphore trigger_lock; | 71 | struct rw_semaphore trigger_lock; |
@@ -73,6 +82,36 @@ extern void led_classdev_unregister(struct led_classdev *led_cdev); | |||
73 | extern void led_classdev_suspend(struct led_classdev *led_cdev); | 82 | extern void led_classdev_suspend(struct led_classdev *led_cdev); |
74 | extern void led_classdev_resume(struct led_classdev *led_cdev); | 83 | extern void led_classdev_resume(struct led_classdev *led_cdev); |
75 | 84 | ||
85 | /** | ||
86 | * led_blink_set - set blinking with software fallback | ||
87 | * @led_cdev: the LED to start blinking | ||
88 | * @delay_on: the time it should be on (in ms) | ||
89 | * @delay_off: the time it should ble off (in ms) | ||
90 | * | ||
91 | * This function makes the LED blink, attempting to use the | ||
92 | * hardware acceleration if possible, but falling back to | ||
93 | * software blinking if there is no hardware blinking or if | ||
94 | * the LED refuses the passed values. | ||
95 | * | ||
96 | * Note that if software blinking is active, simply calling | ||
97 | * led_cdev->brightness_set() will not stop the blinking, | ||
98 | * use led_classdev_brightness_set() instead. | ||
99 | */ | ||
100 | extern void led_blink_set(struct led_classdev *led_cdev, | ||
101 | unsigned long *delay_on, | ||
102 | unsigned long *delay_off); | ||
103 | /** | ||
104 | * led_brightness_set - set LED brightness | ||
105 | * @led_cdev: the LED to set | ||
106 | * @brightness: the brightness to set it to | ||
107 | * | ||
108 | * Set an LED's brightness, and, if necessary, cancel the | ||
109 | * software blink timer that implements blinking when the | ||
110 | * hardware doesn't. | ||
111 | */ | ||
112 | extern void led_brightness_set(struct led_classdev *led_cdev, | ||
113 | enum led_brightness brightness); | ||
114 | |||
76 | /* | 115 | /* |
77 | * LED Triggers | 116 | * LED Triggers |
78 | */ | 117 | */ |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 45fb2967b66d..15b77b8dc7e1 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <scsi/scsi_host.h> | 37 | #include <scsi/scsi_host.h> |
38 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
39 | #include <linux/cdrom.h> | 39 | #include <linux/cdrom.h> |
40 | #include <linux/sched.h> | ||
40 | 41 | ||
41 | /* | 42 | /* |
42 | * Define if arch has non-standard setup. This is a _PCI_ standard | 43 | * Define if arch has non-standard setup. This is a _PCI_ standard |
@@ -172,6 +173,7 @@ enum { | |||
172 | ATA_LFLAG_NO_RETRY = (1 << 5), /* don't retry this link */ | 173 | ATA_LFLAG_NO_RETRY = (1 << 5), /* don't retry this link */ |
173 | ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ | 174 | ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ |
174 | ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ | 175 | ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ |
176 | ATA_LFLAG_NO_LPM = (1 << 8), /* disable LPM on this link */ | ||
175 | 177 | ||
176 | /* struct ata_port flags */ | 178 | /* struct ata_port flags */ |
177 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ | 179 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ |
@@ -196,7 +198,7 @@ enum { | |||
196 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ | 198 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ |
197 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ | 199 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ |
198 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ | 200 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ |
199 | ATA_FLAG_IPM = (1 << 20), /* driver can handle IPM */ | 201 | ATA_FLAG_LPM = (1 << 20), /* driver can handle LPM */ |
200 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure | 202 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure |
201 | * management */ | 203 | * management */ |
202 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity | 204 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity |
@@ -324,12 +326,11 @@ enum { | |||
324 | ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */ | 326 | ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */ |
325 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 327 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, |
326 | ATA_EH_ENABLE_LINK = (1 << 3), | 328 | ATA_EH_ENABLE_LINK = (1 << 3), |
327 | ATA_EH_LPM = (1 << 4), /* link power management action */ | ||
328 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ | 329 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ |
329 | 330 | ||
330 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, | 331 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, |
331 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | | 332 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | |
332 | ATA_EH_ENABLE_LINK | ATA_EH_LPM, | 333 | ATA_EH_ENABLE_LINK, |
333 | 334 | ||
334 | /* ata_eh_info->flags */ | 335 | /* ata_eh_info->flags */ |
335 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 336 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
@@ -341,7 +342,7 @@ enum { | |||
341 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ | 342 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ |
342 | ATA_EHI_PRINTINFO = (1 << 18), /* print configuration info */ | 343 | ATA_EHI_PRINTINFO = (1 << 18), /* print configuration info */ |
343 | ATA_EHI_SETMODE = (1 << 19), /* configure transfer mode */ | 344 | ATA_EHI_SETMODE = (1 << 19), /* configure transfer mode */ |
344 | ATA_EHI_POST_SETMODE = (1 << 20), /* revaildating after setmode */ | 345 | ATA_EHI_POST_SETMODE = (1 << 20), /* revalidating after setmode */ |
345 | 346 | ||
346 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, | 347 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, |
347 | 348 | ||
@@ -377,7 +378,6 @@ enum { | |||
377 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ | 378 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ |
378 | ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */ | 379 | ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */ |
379 | ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */ | 380 | ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */ |
380 | ATA_HORKAGE_IPM = (1 << 7), /* Link PM problems */ | ||
381 | ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ | 381 | ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ |
382 | ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ | 382 | ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ |
383 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ | 383 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ |
@@ -464,6 +464,22 @@ enum ata_completion_errors { | |||
464 | AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */ | 464 | AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */ |
465 | }; | 465 | }; |
466 | 466 | ||
467 | /* | ||
468 | * Link power management policy: If you alter this, you also need to | ||
469 | * alter libata-scsi.c (for the ascii descriptions) | ||
470 | */ | ||
471 | enum ata_lpm_policy { | ||
472 | ATA_LPM_UNKNOWN, | ||
473 | ATA_LPM_MAX_POWER, | ||
474 | ATA_LPM_MED_POWER, | ||
475 | ATA_LPM_MIN_POWER, | ||
476 | }; | ||
477 | |||
478 | enum ata_lpm_hints { | ||
479 | ATA_LPM_EMPTY = (1 << 0), /* port empty/probing */ | ||
480 | ATA_LPM_HIPM = (1 << 1), /* may use HIPM */ | ||
481 | }; | ||
482 | |||
467 | /* forward declarations */ | 483 | /* forward declarations */ |
468 | struct scsi_device; | 484 | struct scsi_device; |
469 | struct ata_port_operations; | 485 | struct ata_port_operations; |
@@ -478,16 +494,6 @@ typedef int (*ata_reset_fn_t)(struct ata_link *link, unsigned int *classes, | |||
478 | unsigned long deadline); | 494 | unsigned long deadline); |
479 | typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); | 495 | typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); |
480 | 496 | ||
481 | /* | ||
482 | * host pm policy: If you alter this, you also need to alter libata-scsi.c | ||
483 | * (for the ascii descriptions) | ||
484 | */ | ||
485 | enum link_pm { | ||
486 | NOT_AVAILABLE, | ||
487 | MIN_POWER, | ||
488 | MAX_PERFORMANCE, | ||
489 | MEDIUM_POWER, | ||
490 | }; | ||
491 | extern struct device_attribute dev_attr_link_power_management_policy; | 497 | extern struct device_attribute dev_attr_link_power_management_policy; |
492 | extern struct device_attribute dev_attr_unload_heads; | 498 | extern struct device_attribute dev_attr_unload_heads; |
493 | extern struct device_attribute dev_attr_em_message_type; | 499 | extern struct device_attribute dev_attr_em_message_type; |
@@ -530,6 +536,10 @@ struct ata_host { | |||
530 | void *private_data; | 536 | void *private_data; |
531 | struct ata_port_operations *ops; | 537 | struct ata_port_operations *ops; |
532 | unsigned long flags; | 538 | unsigned long flags; |
539 | |||
540 | struct mutex eh_mutex; | ||
541 | struct task_struct *eh_owner; | ||
542 | |||
533 | #ifdef CONFIG_ATA_ACPI | 543 | #ifdef CONFIG_ATA_ACPI |
534 | acpi_handle acpi_handle; | 544 | acpi_handle acpi_handle; |
535 | #endif | 545 | #endif |
@@ -560,13 +570,13 @@ struct ata_queued_cmd { | |||
560 | unsigned int extrabytes; | 570 | unsigned int extrabytes; |
561 | unsigned int curbytes; | 571 | unsigned int curbytes; |
562 | 572 | ||
563 | struct scatterlist *cursg; | ||
564 | unsigned int cursg_ofs; | ||
565 | |||
566 | struct scatterlist sgent; | 573 | struct scatterlist sgent; |
567 | 574 | ||
568 | struct scatterlist *sg; | 575 | struct scatterlist *sg; |
569 | 576 | ||
577 | struct scatterlist *cursg; | ||
578 | unsigned int cursg_ofs; | ||
579 | |||
570 | unsigned int err_mask; | 580 | unsigned int err_mask; |
571 | struct ata_taskfile result_tf; | 581 | struct ata_taskfile result_tf; |
572 | ata_qc_cb_t complete_fn; | 582 | ata_qc_cb_t complete_fn; |
@@ -604,6 +614,7 @@ struct ata_device { | |||
604 | union acpi_object *gtf_cache; | 614 | union acpi_object *gtf_cache; |
605 | unsigned int gtf_filter; | 615 | unsigned int gtf_filter; |
606 | #endif | 616 | #endif |
617 | struct device tdev; | ||
607 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ | 618 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ |
608 | u64 n_sectors; /* size of device, if ATA */ | 619 | u64 n_sectors; /* size of device, if ATA */ |
609 | u64 n_native_sectors; /* native size, if ATA */ | 620 | u64 n_native_sectors; /* native size, if ATA */ |
@@ -690,6 +701,7 @@ struct ata_link { | |||
690 | struct ata_port *ap; | 701 | struct ata_port *ap; |
691 | int pmp; /* port multiplier port # */ | 702 | int pmp; /* port multiplier port # */ |
692 | 703 | ||
704 | struct device tdev; | ||
693 | unsigned int active_tag; /* active tag on this link */ | 705 | unsigned int active_tag; /* active tag on this link */ |
694 | u32 sactive; /* active NCQ commands */ | 706 | u32 sactive; /* active NCQ commands */ |
695 | 707 | ||
@@ -699,6 +711,7 @@ struct ata_link { | |||
699 | unsigned int hw_sata_spd_limit; | 711 | unsigned int hw_sata_spd_limit; |
700 | unsigned int sata_spd_limit; | 712 | unsigned int sata_spd_limit; |
701 | unsigned int sata_spd; /* current SATA PHY speed */ | 713 | unsigned int sata_spd; /* current SATA PHY speed */ |
714 | enum ata_lpm_policy lpm_policy; | ||
702 | 715 | ||
703 | /* record runtime error info, protected by host_set lock */ | 716 | /* record runtime error info, protected by host_set lock */ |
704 | struct ata_eh_info eh_info; | 717 | struct ata_eh_info eh_info; |
@@ -707,6 +720,8 @@ struct ata_link { | |||
707 | 720 | ||
708 | struct ata_device device[ATA_MAX_DEVICES]; | 721 | struct ata_device device[ATA_MAX_DEVICES]; |
709 | }; | 722 | }; |
723 | #define ATA_LINK_CLEAR_BEGIN offsetof(struct ata_link, active_tag) | ||
724 | #define ATA_LINK_CLEAR_END offsetof(struct ata_link, device[0]) | ||
710 | 725 | ||
711 | struct ata_port { | 726 | struct ata_port { |
712 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ | 727 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ |
@@ -752,6 +767,7 @@ struct ata_port { | |||
752 | struct ata_port_stats stats; | 767 | struct ata_port_stats stats; |
753 | struct ata_host *host; | 768 | struct ata_host *host; |
754 | struct device *dev; | 769 | struct device *dev; |
770 | struct device tdev; | ||
755 | 771 | ||
756 | struct mutex scsi_scan_mutex; | 772 | struct mutex scsi_scan_mutex; |
757 | struct delayed_work hotplug_task; | 773 | struct delayed_work hotplug_task; |
@@ -767,7 +783,7 @@ struct ata_port { | |||
767 | 783 | ||
768 | pm_message_t pm_mesg; | 784 | pm_message_t pm_mesg; |
769 | int *pm_result; | 785 | int *pm_result; |
770 | enum link_pm pm_policy; | 786 | enum ata_lpm_policy target_lpm_policy; |
771 | 787 | ||
772 | struct timer_list fastdrain_timer; | 788 | struct timer_list fastdrain_timer; |
773 | unsigned long fastdrain_cnt; | 789 | unsigned long fastdrain_cnt; |
@@ -833,8 +849,8 @@ struct ata_port_operations { | |||
833 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); | 849 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); |
834 | void (*pmp_attach)(struct ata_port *ap); | 850 | void (*pmp_attach)(struct ata_port *ap); |
835 | void (*pmp_detach)(struct ata_port *ap); | 851 | void (*pmp_detach)(struct ata_port *ap); |
836 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 852 | int (*set_lpm)(struct ata_link *link, enum ata_lpm_policy policy, |
837 | void (*disable_pm)(struct ata_port *ap); | 853 | unsigned hints); |
838 | 854 | ||
839 | /* | 855 | /* |
840 | * Start, stop, suspend and resume | 856 | * Start, stop, suspend and resume |
@@ -946,6 +962,8 @@ extern int sata_link_debounce(struct ata_link *link, | |||
946 | const unsigned long *params, unsigned long deadline); | 962 | const unsigned long *params, unsigned long deadline); |
947 | extern int sata_link_resume(struct ata_link *link, const unsigned long *params, | 963 | extern int sata_link_resume(struct ata_link *link, const unsigned long *params, |
948 | unsigned long deadline); | 964 | unsigned long deadline); |
965 | extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, | ||
966 | bool spm_wakeup); | ||
949 | extern int sata_link_hardreset(struct ata_link *link, | 967 | extern int sata_link_hardreset(struct ata_link *link, |
950 | const unsigned long *timing, unsigned long deadline, | 968 | const unsigned long *timing, unsigned long deadline, |
951 | bool *online, int (*check_ready)(struct ata_link *)); | 969 | bool *online, int (*check_ready)(struct ata_link *)); |
@@ -991,8 +1009,9 @@ extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | |||
991 | extern void ata_host_resume(struct ata_host *host); | 1009 | extern void ata_host_resume(struct ata_host *host); |
992 | #endif | 1010 | #endif |
993 | extern int ata_ratelimit(void); | 1011 | extern int ata_ratelimit(void); |
994 | extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, | 1012 | extern void ata_msleep(struct ata_port *ap, unsigned int msecs); |
995 | unsigned long interval, unsigned long timeout); | 1013 | extern u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask, |
1014 | u32 val, unsigned long interval, unsigned long timeout); | ||
996 | extern int atapi_cmd_type(u8 opcode); | 1015 | extern int atapi_cmd_type(u8 opcode); |
997 | extern void ata_tf_to_fis(const struct ata_taskfile *tf, | 1016 | extern void ata_tf_to_fis(const struct ata_taskfile *tf, |
998 | u8 pmp, int is_cmd, u8 *fis); | 1017 | u8 pmp, int is_cmd, u8 *fis); |
diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h index 0e8a346424bb..d4292c8431e0 100644 --- a/include/linux/lis3lv02d.h +++ b/include/linux/lis3lv02d.h | |||
@@ -1,6 +1,52 @@ | |||
1 | #ifndef __LIS3LV02D_H_ | 1 | #ifndef __LIS3LV02D_H_ |
2 | #define __LIS3LV02D_H_ | 2 | #define __LIS3LV02D_H_ |
3 | 3 | ||
4 | /** | ||
5 | * struct lis3lv02d_platform_data - lis3 chip family platform data | ||
6 | * @click_flags: Click detection unit configuration | ||
7 | * @click_thresh_x: Click detection unit x axis threshold | ||
8 | * @click_thresh_y: Click detection unit y axis threshold | ||
9 | * @click_thresh_z: Click detection unit z axis threshold | ||
10 | * @click_time_limit: Click detection unit time parameter | ||
11 | * @click_latency: Click detection unit latency parameter | ||
12 | * @click_window: Click detection unit window parameter | ||
13 | * @irq_cfg: On chip irq source and type configuration (click / | ||
14 | * data available / wake up, open drain, polarity) | ||
15 | * @irq_flags1: Additional irq triggering flags for irq channel 0 | ||
16 | * @irq_flags2: Additional irq triggering flags for irq channel 1 | ||
17 | * @duration1: Wake up unit 1 duration parameter | ||
18 | * @duration2: Wake up unit 2 duration parameter | ||
19 | * @wakeup_flags: Wake up unit 1 flags | ||
20 | * @wakeup_thresh: Wake up unit 1 threshold value | ||
21 | * @wakeup_flags2: Wake up unit 2 flags | ||
22 | * @wakeup_thresh2: Wake up unit 2 threshold value | ||
23 | * @hipass_ctrl: High pass filter control (enable / disable, cut off | ||
24 | * frequency) | ||
25 | * @axis_x: Sensor orientation remapping for x-axis | ||
26 | * @axis_y: Sensor orientation remapping for y-axis | ||
27 | * @axis_z: Sensor orientation remapping for z-axis | ||
28 | * @driver_features: Enable bits for different features. Disabled by default | ||
29 | * @default_rate: Default sampling rate. 0 means reset default | ||
30 | * @setup_resources: Interrupt line setup call back function | ||
31 | * @release_resources: Interrupt line release call back function | ||
32 | * @st_min_limits[3]: Selftest acceptance minimum values | ||
33 | * @st_max_limits[3]: Selftest acceptance maximum values | ||
34 | * @irq2: Irq line 2 number | ||
35 | * | ||
36 | * Platform data is used to setup the sensor chip. Meaning of the different | ||
37 | * chip features can be found from the data sheet. It is publicly available | ||
38 | * at www.st.com web pages. Currently the platform data is used | ||
39 | * only for the 8 bit device. The 8 bit device has two wake up / free fall | ||
40 | * detection units and click detection unit. There are plenty of ways to | ||
41 | * configure the chip which makes is quite hard to explain deeper meaning of | ||
42 | * the fields here. Behaviour of the detection blocks varies heavily depending | ||
43 | * on the configuration. For example, interrupt detection block can use high | ||
44 | * pass filtered data which makes it react to the changes in the acceleration. | ||
45 | * Irq_flags can be used to enable interrupt detection on the both edges. | ||
46 | * With proper chip configuration this produces interrupt when some trigger | ||
47 | * starts and when it goes away. | ||
48 | */ | ||
49 | |||
4 | struct lis3lv02d_platform_data { | 50 | struct lis3lv02d_platform_data { |
5 | /* please note: the 'click' feature is only supported for | 51 | /* please note: the 'click' feature is only supported for |
6 | * LIS[32]02DL variants of the chip and will be ignored for | 52 | * LIS[32]02DL variants of the chip and will be ignored for |
@@ -36,7 +82,10 @@ struct lis3lv02d_platform_data { | |||
36 | #define LIS3_IRQ_OPEN_DRAIN (1 << 6) | 82 | #define LIS3_IRQ_OPEN_DRAIN (1 << 6) |
37 | #define LIS3_IRQ_ACTIVE_LOW (1 << 7) | 83 | #define LIS3_IRQ_ACTIVE_LOW (1 << 7) |
38 | unsigned char irq_cfg; | 84 | unsigned char irq_cfg; |
39 | 85 | unsigned char irq_flags1; /* Additional irq edge / level flags */ | |
86 | unsigned char irq_flags2; /* Additional irq edge / level flags */ | ||
87 | unsigned char duration1; | ||
88 | unsigned char duration2; | ||
40 | #define LIS3_WAKEUP_X_LO (1 << 0) | 89 | #define LIS3_WAKEUP_X_LO (1 << 0) |
41 | #define LIS3_WAKEUP_X_HI (1 << 1) | 90 | #define LIS3_WAKEUP_X_HI (1 << 1) |
42 | #define LIS3_WAKEUP_Y_LO (1 << 2) | 91 | #define LIS3_WAKEUP_Y_LO (1 << 2) |
@@ -64,6 +113,10 @@ struct lis3lv02d_platform_data { | |||
64 | s8 axis_x; | 113 | s8 axis_x; |
65 | s8 axis_y; | 114 | s8 axis_y; |
66 | s8 axis_z; | 115 | s8 axis_z; |
116 | #define LIS3_USE_REGULATOR_CTRL 0x01 | ||
117 | #define LIS3_USE_BLOCK_READ 0x02 | ||
118 | u16 driver_features; | ||
119 | int default_rate; | ||
67 | int (*setup_resources)(void); | 120 | int (*setup_resources)(void); |
68 | int (*release_resources)(void); | 121 | int (*release_resources)(void); |
69 | /* Limits for selftest are specified in chip data sheet */ | 122 | /* Limits for selftest are specified in chip data sheet */ |
diff --git a/include/linux/list.h b/include/linux/list.h index d167b5d7c0ac..9a5f8a71810c 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
@@ -5,7 +5,6 @@ | |||
5 | #include <linux/stddef.h> | 5 | #include <linux/stddef.h> |
6 | #include <linux/poison.h> | 6 | #include <linux/poison.h> |
7 | #include <linux/prefetch.h> | 7 | #include <linux/prefetch.h> |
8 | #include <asm/system.h> | ||
9 | 8 | ||
10 | /* | 9 | /* |
11 | * Simple doubly linked list implementation. | 10 | * Simple doubly linked list implementation. |
@@ -637,6 +636,12 @@ static inline void hlist_add_after(struct hlist_node *n, | |||
637 | next->next->pprev = &next->next; | 636 | next->next->pprev = &next->next; |
638 | } | 637 | } |
639 | 638 | ||
639 | /* after that we'll appear to be on some hlist and hlist_del will work */ | ||
640 | static inline void hlist_add_fake(struct hlist_node *n) | ||
641 | { | ||
642 | n->pprev = &n->next; | ||
643 | } | ||
644 | |||
640 | /* | 645 | /* |
641 | * Move a list from one list head to another. Fixup the pprev | 646 | * Move a list from one list head to another. Fixup the pprev |
642 | * reference of the first entry if it exists. | 647 | * reference of the first entry if it exists. |
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 06aed8305bf3..71c09b26c759 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
@@ -32,6 +32,17 @@ extern int lock_stat; | |||
32 | #define MAX_LOCKDEP_SUBCLASSES 8UL | 32 | #define MAX_LOCKDEP_SUBCLASSES 8UL |
33 | 33 | ||
34 | /* | 34 | /* |
35 | * NR_LOCKDEP_CACHING_CLASSES ... Number of classes | ||
36 | * cached in the instance of lockdep_map | ||
37 | * | ||
38 | * Currently main class (subclass == 0) and signle depth subclass | ||
39 | * are cached in lockdep_map. This optimization is mainly targeting | ||
40 | * on rq->lock. double_rq_lock() acquires this highly competitive with | ||
41 | * single depth. | ||
42 | */ | ||
43 | #define NR_LOCKDEP_CACHING_CLASSES 2 | ||
44 | |||
45 | /* | ||
35 | * Lock-classes are keyed via unique addresses, by embedding the | 46 | * Lock-classes are keyed via unique addresses, by embedding the |
36 | * lockclass-key into the kernel (or module) .data section. (For | 47 | * lockclass-key into the kernel (or module) .data section. (For |
37 | * static locks we use the lock address itself as the key.) | 48 | * static locks we use the lock address itself as the key.) |
@@ -138,7 +149,7 @@ void clear_lock_stats(struct lock_class *class); | |||
138 | */ | 149 | */ |
139 | struct lockdep_map { | 150 | struct lockdep_map { |
140 | struct lock_class_key *key; | 151 | struct lock_class_key *key; |
141 | struct lock_class *class_cache; | 152 | struct lock_class *class_cache[NR_LOCKDEP_CACHING_CLASSES]; |
142 | const char *name; | 153 | const char *name; |
143 | #ifdef CONFIG_LOCK_STAT | 154 | #ifdef CONFIG_LOCK_STAT |
144 | int cpu; | 155 | int cpu; |
@@ -424,14 +435,6 @@ do { \ | |||
424 | 435 | ||
425 | #endif /* CONFIG_LOCKDEP */ | 436 | #endif /* CONFIG_LOCKDEP */ |
426 | 437 | ||
427 | #ifdef CONFIG_GENERIC_HARDIRQS | ||
428 | extern void early_init_irq_lock_class(void); | ||
429 | #else | ||
430 | static inline void early_init_irq_lock_class(void) | ||
431 | { | ||
432 | } | ||
433 | #endif | ||
434 | |||
435 | #ifdef CONFIG_TRACE_IRQFLAGS | 438 | #ifdef CONFIG_TRACE_IRQFLAGS |
436 | extern void early_boot_irqs_off(void); | 439 | extern void early_boot_irqs_off(void); |
437 | extern void early_boot_irqs_on(void); | 440 | extern void early_boot_irqs_on(void); |
diff --git a/include/linux/magic.h b/include/linux/magic.h index eb9800f05782..ff690d05f129 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
@@ -57,5 +57,6 @@ | |||
57 | 57 | ||
58 | #define DEVPTS_SUPER_MAGIC 0x1cd1 | 58 | #define DEVPTS_SUPER_MAGIC 0x1cd1 |
59 | #define SOCKFS_MAGIC 0x534F434B | 59 | #define SOCKFS_MAGIC 0x534F434B |
60 | #define V9FS_MAGIC 0x01021997 | ||
60 | 61 | ||
61 | #endif /* __LINUX_MAGIC_H__ */ | 62 | #endif /* __LINUX_MAGIC_H__ */ |
diff --git a/include/linux/marvell_phy.h b/include/linux/marvell_phy.h index d0f08018335d..1ff81b51b656 100644 --- a/include/linux/marvell_phy.h +++ b/include/linux/marvell_phy.h | |||
@@ -12,7 +12,7 @@ | |||
12 | #define MARVELL_PHY_ID_88E1121R 0x01410cb0 | 12 | #define MARVELL_PHY_ID_88E1121R 0x01410cb0 |
13 | #define MARVELL_PHY_ID_88E1145 0x01410cd0 | 13 | #define MARVELL_PHY_ID_88E1145 0x01410cd0 |
14 | #define MARVELL_PHY_ID_88E1240 0x01410e30 | 14 | #define MARVELL_PHY_ID_88E1240 0x01410e30 |
15 | #define MARVELL_PHY_ID_88EC048 0x01410e90 | 15 | #define MARVELL_PHY_ID_88E1318S 0x01410e90 |
16 | 16 | ||
17 | /* struct phy_device dev_flags definitions */ | 17 | /* struct phy_device dev_flags definitions */ |
18 | #define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001 | 18 | #define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001 |
diff --git a/include/linux/math64.h b/include/linux/math64.h index c87f1528703a..23fcdfcba81b 100644 --- a/include/linux/math64.h +++ b/include/linux/math64.h | |||
@@ -35,6 +35,14 @@ static inline u64 div64_u64(u64 dividend, u64 divisor) | |||
35 | return dividend / divisor; | 35 | return dividend / divisor; |
36 | } | 36 | } |
37 | 37 | ||
38 | /** | ||
39 | * div64_s64 - signed 64bit divide with 64bit divisor | ||
40 | */ | ||
41 | static inline s64 div64_s64(s64 dividend, s64 divisor) | ||
42 | { | ||
43 | return dividend / divisor; | ||
44 | } | ||
45 | |||
38 | #elif BITS_PER_LONG == 32 | 46 | #elif BITS_PER_LONG == 32 |
39 | 47 | ||
40 | #ifndef div_u64_rem | 48 | #ifndef div_u64_rem |
@@ -53,6 +61,10 @@ extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder); | |||
53 | extern u64 div64_u64(u64 dividend, u64 divisor); | 61 | extern u64 div64_u64(u64 dividend, u64 divisor); |
54 | #endif | 62 | #endif |
55 | 63 | ||
64 | #ifndef div64_s64 | ||
65 | extern s64 div64_s64(s64 dividend, s64 divisor); | ||
66 | #endif | ||
67 | |||
56 | #endif /* BITS_PER_LONG */ | 68 | #endif /* BITS_PER_LONG */ |
57 | 69 | ||
58 | /** | 70 | /** |
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index a59faf2b5edd..62a10c2a11f2 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _LINUX_MEMBLOCK_H | 2 | #define _LINUX_MEMBLOCK_H |
3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
4 | 4 | ||
5 | #ifdef CONFIG_HAVE_MEMBLOCK | ||
5 | /* | 6 | /* |
6 | * Logical memory blocks. | 7 | * Logical memory blocks. |
7 | * | 8 | * |
@@ -16,73 +17,150 @@ | |||
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
17 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
18 | 19 | ||
19 | #define MAX_MEMBLOCK_REGIONS 128 | 20 | #include <asm/memblock.h> |
20 | 21 | ||
21 | struct memblock_property { | 22 | #define INIT_MEMBLOCK_REGIONS 128 |
22 | u64 base; | 23 | #define MEMBLOCK_ERROR 0 |
23 | u64 size; | ||
24 | }; | ||
25 | 24 | ||
26 | struct memblock_region { | 25 | struct memblock_region { |
27 | unsigned long cnt; | 26 | phys_addr_t base; |
28 | u64 size; | 27 | phys_addr_t size; |
29 | struct memblock_property region[MAX_MEMBLOCK_REGIONS+1]; | 28 | }; |
29 | |||
30 | struct memblock_type { | ||
31 | unsigned long cnt; /* number of regions */ | ||
32 | unsigned long max; /* size of the allocated array */ | ||
33 | struct memblock_region *regions; | ||
30 | }; | 34 | }; |
31 | 35 | ||
32 | struct memblock { | 36 | struct memblock { |
33 | unsigned long debug; | 37 | phys_addr_t current_limit; |
34 | u64 rmo_size; | 38 | phys_addr_t memory_size; /* Updated by memblock_analyze() */ |
35 | struct memblock_region memory; | 39 | struct memblock_type memory; |
36 | struct memblock_region reserved; | 40 | struct memblock_type reserved; |
37 | }; | 41 | }; |
38 | 42 | ||
39 | extern struct memblock memblock; | 43 | extern struct memblock memblock; |
44 | extern int memblock_debug; | ||
45 | extern int memblock_can_resize; | ||
40 | 46 | ||
41 | extern void __init memblock_init(void); | 47 | #define memblock_dbg(fmt, ...) \ |
42 | extern void __init memblock_analyze(void); | 48 | if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) |
43 | extern long memblock_add(u64 base, u64 size); | 49 | |
44 | extern long memblock_remove(u64 base, u64 size); | 50 | u64 memblock_find_in_range(u64 start, u64 end, u64 size, u64 align); |
45 | extern long __init memblock_free(u64 base, u64 size); | 51 | int memblock_free_reserved_regions(void); |
46 | extern long __init memblock_reserve(u64 base, u64 size); | 52 | int memblock_reserve_reserved_regions(void); |
47 | extern u64 __init memblock_alloc_nid(u64 size, u64 align, int nid, | 53 | |
48 | u64 (*nid_range)(u64, u64, int *)); | 54 | extern void memblock_init(void); |
49 | extern u64 __init memblock_alloc(u64 size, u64 align); | 55 | extern void memblock_analyze(void); |
50 | extern u64 __init memblock_alloc_base(u64 size, | 56 | extern long memblock_add(phys_addr_t base, phys_addr_t size); |
51 | u64, u64 max_addr); | 57 | extern long memblock_remove(phys_addr_t base, phys_addr_t size); |
52 | extern u64 __init __memblock_alloc_base(u64 size, | 58 | extern long memblock_free(phys_addr_t base, phys_addr_t size); |
53 | u64 align, u64 max_addr); | 59 | extern long memblock_reserve(phys_addr_t base, phys_addr_t size); |
54 | extern u64 __init memblock_phys_mem_size(void); | 60 | |
55 | extern u64 memblock_end_of_DRAM(void); | 61 | /* The numa aware allocator is only available if |
56 | extern void __init memblock_enforce_memory_limit(u64 memory_limit); | 62 | * CONFIG_ARCH_POPULATES_NODE_MAP is set |
57 | extern int __init memblock_is_reserved(u64 addr); | 63 | */ |
58 | extern int memblock_is_region_reserved(u64 base, u64 size); | 64 | extern phys_addr_t memblock_alloc_nid(phys_addr_t size, phys_addr_t align, |
59 | extern int memblock_find(struct memblock_property *res); | 65 | int nid); |
66 | extern phys_addr_t memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align, | ||
67 | int nid); | ||
68 | |||
69 | extern phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align); | ||
70 | |||
71 | /* Flags for memblock_alloc_base() amd __memblock_alloc_base() */ | ||
72 | #define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0) | ||
73 | #define MEMBLOCK_ALLOC_ACCESSIBLE 0 | ||
74 | |||
75 | extern phys_addr_t memblock_alloc_base(phys_addr_t size, | ||
76 | phys_addr_t align, | ||
77 | phys_addr_t max_addr); | ||
78 | extern phys_addr_t __memblock_alloc_base(phys_addr_t size, | ||
79 | phys_addr_t align, | ||
80 | phys_addr_t max_addr); | ||
81 | extern phys_addr_t memblock_phys_mem_size(void); | ||
82 | extern phys_addr_t memblock_end_of_DRAM(void); | ||
83 | extern void memblock_enforce_memory_limit(phys_addr_t memory_limit); | ||
84 | extern int memblock_is_memory(phys_addr_t addr); | ||
85 | extern int memblock_is_region_memory(phys_addr_t base, phys_addr_t size); | ||
86 | extern int memblock_is_reserved(phys_addr_t addr); | ||
87 | extern int memblock_is_region_reserved(phys_addr_t base, phys_addr_t size); | ||
60 | 88 | ||
61 | extern void memblock_dump_all(void); | 89 | extern void memblock_dump_all(void); |
62 | 90 | ||
63 | static inline u64 | 91 | /* Provided by the architecture */ |
64 | memblock_size_bytes(struct memblock_region *type, unsigned long region_nr) | 92 | extern phys_addr_t memblock_nid_range(phys_addr_t start, phys_addr_t end, int *nid); |
93 | extern int memblock_memory_can_coalesce(phys_addr_t addr1, phys_addr_t size1, | ||
94 | phys_addr_t addr2, phys_addr_t size2); | ||
95 | |||
96 | /** | ||
97 | * memblock_set_current_limit - Set the current allocation limit to allow | ||
98 | * limiting allocations to what is currently | ||
99 | * accessible during boot | ||
100 | * @limit: New limit value (physical address) | ||
101 | */ | ||
102 | extern void memblock_set_current_limit(phys_addr_t limit); | ||
103 | |||
104 | |||
105 | /* | ||
106 | * pfn conversion functions | ||
107 | * | ||
108 | * While the memory MEMBLOCKs should always be page aligned, the reserved | ||
109 | * MEMBLOCKs may not be. This accessor attempt to provide a very clear | ||
110 | * idea of what they return for such non aligned MEMBLOCKs. | ||
111 | */ | ||
112 | |||
113 | /** | ||
114 | * memblock_region_memory_base_pfn - Return the lowest pfn intersecting with the memory region | ||
115 | * @reg: memblock_region structure | ||
116 | */ | ||
117 | static inline unsigned long memblock_region_memory_base_pfn(const struct memblock_region *reg) | ||
65 | { | 118 | { |
66 | return type->region[region_nr].size; | 119 | return PFN_UP(reg->base); |
67 | } | 120 | } |
68 | static inline u64 | 121 | |
69 | memblock_size_pages(struct memblock_region *type, unsigned long region_nr) | 122 | /** |
123 | * memblock_region_memory_end_pfn - Return the end_pfn this region | ||
124 | * @reg: memblock_region structure | ||
125 | */ | ||
126 | static inline unsigned long memblock_region_memory_end_pfn(const struct memblock_region *reg) | ||
70 | { | 127 | { |
71 | return memblock_size_bytes(type, region_nr) >> PAGE_SHIFT; | 128 | return PFN_DOWN(reg->base + reg->size); |
72 | } | 129 | } |
73 | static inline u64 | 130 | |
74 | memblock_start_pfn(struct memblock_region *type, unsigned long region_nr) | 131 | /** |
132 | * memblock_region_reserved_base_pfn - Return the lowest pfn intersecting with the reserved region | ||
133 | * @reg: memblock_region structure | ||
134 | */ | ||
135 | static inline unsigned long memblock_region_reserved_base_pfn(const struct memblock_region *reg) | ||
75 | { | 136 | { |
76 | return type->region[region_nr].base >> PAGE_SHIFT; | 137 | return PFN_DOWN(reg->base); |
77 | } | 138 | } |
78 | static inline u64 | 139 | |
79 | memblock_end_pfn(struct memblock_region *type, unsigned long region_nr) | 140 | /** |
141 | * memblock_region_reserved_end_pfn - Return the end_pfn this region | ||
142 | * @reg: memblock_region structure | ||
143 | */ | ||
144 | static inline unsigned long memblock_region_reserved_end_pfn(const struct memblock_region *reg) | ||
80 | { | 145 | { |
81 | return memblock_start_pfn(type, region_nr) + | 146 | return PFN_UP(reg->base + reg->size); |
82 | memblock_size_pages(type, region_nr); | ||
83 | } | 147 | } |
84 | 148 | ||
85 | #include <asm/memblock.h> | 149 | #define for_each_memblock(memblock_type, region) \ |
150 | for (region = memblock.memblock_type.regions; \ | ||
151 | region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \ | ||
152 | region++) | ||
153 | |||
154 | |||
155 | #ifdef ARCH_DISCARD_MEMBLOCK | ||
156 | #define __init_memblock __init | ||
157 | #define __initdata_memblock __initdata | ||
158 | #else | ||
159 | #define __init_memblock | ||
160 | #define __initdata_memblock | ||
161 | #endif | ||
162 | |||
163 | #endif /* CONFIG_HAVE_MEMBLOCK */ | ||
86 | 164 | ||
87 | #endif /* __KERNEL__ */ | 165 | #endif /* __KERNEL__ */ |
88 | 166 | ||
diff --git a/include/linux/memory.h b/include/linux/memory.h index 85582e1bcee9..06c1fa0a5c7b 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
@@ -23,6 +23,8 @@ | |||
23 | struct memory_block { | 23 | struct memory_block { |
24 | unsigned long phys_index; | 24 | unsigned long phys_index; |
25 | unsigned long state; | 25 | unsigned long state; |
26 | int section_count; | ||
27 | |||
26 | /* | 28 | /* |
27 | * This serializes all state change requests. It isn't | 29 | * This serializes all state change requests. It isn't |
28 | * held during creation because the control files are | 30 | * held during creation because the control files are |
@@ -113,6 +115,8 @@ extern int memory_dev_init(void); | |||
113 | extern int remove_memory_block(unsigned long, struct mem_section *, int); | 115 | extern int remove_memory_block(unsigned long, struct mem_section *, int); |
114 | extern int memory_notify(unsigned long val, void *v); | 116 | extern int memory_notify(unsigned long val, void *v); |
115 | extern int memory_isolate_notify(unsigned long val, void *v); | 117 | extern int memory_isolate_notify(unsigned long val, void *v); |
118 | extern struct memory_block *find_memory_block_hinted(struct mem_section *, | ||
119 | struct memory_block *); | ||
116 | extern struct memory_block *find_memory_block(struct mem_section *); | 120 | extern struct memory_block *find_memory_block(struct mem_section *); |
117 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) | 121 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) |
118 | enum mem_add_context { BOOT, HOTPLUG }; | 122 | enum mem_add_context { BOOT, HOTPLUG }; |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 864035fb8f8a..4307231bd22f 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
@@ -70,6 +70,10 @@ extern void online_page(struct page *page); | |||
70 | extern int online_pages(unsigned long, unsigned long); | 70 | extern int online_pages(unsigned long, unsigned long); |
71 | extern void __offline_isolated_pages(unsigned long, unsigned long); | 71 | extern void __offline_isolated_pages(unsigned long, unsigned long); |
72 | 72 | ||
73 | #ifdef CONFIG_MEMORY_HOTREMOVE | ||
74 | extern bool is_pageblock_removable_nolock(struct page *page); | ||
75 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | ||
76 | |||
73 | /* reasonably generic interface to expand the physical pages in a zone */ | 77 | /* reasonably generic interface to expand the physical pages in a zone */ |
74 | extern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn, | 78 | extern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn, |
75 | unsigned long nr_pages); | 79 | unsigned long nr_pages); |
diff --git a/include/linux/mfd/88pm860x.h b/include/linux/mfd/88pm860x.h index bfd23bef7363..4db1fbd8969e 100644 --- a/include/linux/mfd/88pm860x.h +++ b/include/linux/mfd/88pm860x.h | |||
@@ -138,7 +138,7 @@ enum { | |||
138 | PM8607_ID_RG_MAX, | 138 | PM8607_ID_RG_MAX, |
139 | }; | 139 | }; |
140 | 140 | ||
141 | #define PM8607_VERSION (0x40) /* 8607 chip ID */ | 141 | /* 8607 chip ID is 0x40 or 0x50 */ |
142 | #define PM8607_VERSION_MASK (0xF0) /* 8607 chip ID mask */ | 142 | #define PM8607_VERSION_MASK (0xF0) /* 8607 chip ID mask */ |
143 | 143 | ||
144 | /* Interrupt Registers */ | 144 | /* Interrupt Registers */ |
diff --git a/include/linux/mfd/ab8500.h b/include/linux/mfd/ab8500.h index f5cec4500f38..d63b6050b183 100644 --- a/include/linux/mfd/ab8500.h +++ b/include/linux/mfd/ab8500.h | |||
@@ -10,6 +10,29 @@ | |||
10 | #include <linux/device.h> | 10 | #include <linux/device.h> |
11 | 11 | ||
12 | /* | 12 | /* |
13 | * AB8500 bank addresses | ||
14 | */ | ||
15 | #define AB8500_SYS_CTRL1_BLOCK 0x1 | ||
16 | #define AB8500_SYS_CTRL2_BLOCK 0x2 | ||
17 | #define AB8500_REGU_CTRL1 0x3 | ||
18 | #define AB8500_REGU_CTRL2 0x4 | ||
19 | #define AB8500_USB 0x5 | ||
20 | #define AB8500_TVOUT 0x6 | ||
21 | #define AB8500_DBI 0x7 | ||
22 | #define AB8500_ECI_AV_ACC 0x8 | ||
23 | #define AB8500_RESERVED 0x9 | ||
24 | #define AB8500_GPADC 0xA | ||
25 | #define AB8500_CHARGER 0xB | ||
26 | #define AB8500_GAS_GAUGE 0xC | ||
27 | #define AB8500_AUDIO 0xD | ||
28 | #define AB8500_INTERRUPT 0xE | ||
29 | #define AB8500_RTC 0xF | ||
30 | #define AB8500_MISC 0x10 | ||
31 | #define AB8500_DEBUG 0x12 | ||
32 | #define AB8500_PROD_TEST 0x13 | ||
33 | #define AB8500_OTP_EMUL 0x15 | ||
34 | |||
35 | /* | ||
13 | * Interrupts | 36 | * Interrupts |
14 | */ | 37 | */ |
15 | 38 | ||
@@ -99,6 +122,7 @@ struct ab8500 { | |||
99 | int revision; | 122 | int revision; |
100 | int irq_base; | 123 | int irq_base; |
101 | int irq; | 124 | int irq; |
125 | u8 chip_id; | ||
102 | 126 | ||
103 | int (*write) (struct ab8500 *a8500, u16 addr, u8 data); | 127 | int (*write) (struct ab8500 *a8500, u16 addr, u8 data); |
104 | int (*read) (struct ab8500 *a8500, u16 addr); | 128 | int (*read) (struct ab8500 *a8500, u16 addr); |
@@ -124,10 +148,6 @@ struct ab8500_platform_data { | |||
124 | struct regulator_init_data *regulator[AB8500_NUM_REGULATORS]; | 148 | struct regulator_init_data *regulator[AB8500_NUM_REGULATORS]; |
125 | }; | 149 | }; |
126 | 150 | ||
127 | extern int ab8500_write(struct ab8500 *a8500, u16 addr, u8 data); | ||
128 | extern int ab8500_read(struct ab8500 *a8500, u16 addr); | ||
129 | extern int ab8500_set_bits(struct ab8500 *a8500, u16 addr, u8 mask, u8 data); | ||
130 | |||
131 | extern int __devinit ab8500_init(struct ab8500 *ab8500); | 151 | extern int __devinit ab8500_init(struct ab8500 *ab8500); |
132 | extern int __devexit ab8500_exit(struct ab8500 *ab8500); | 152 | extern int __devexit ab8500_exit(struct ab8500 *ab8500); |
133 | 153 | ||
diff --git a/include/linux/mfd/abx500.h b/include/linux/mfd/abx500.h index 390726fcbcb1..67bd6f7ecf32 100644 --- a/include/linux/mfd/abx500.h +++ b/include/linux/mfd/abx500.h | |||
@@ -6,8 +6,7 @@ | |||
6 | * | 6 | * |
7 | * ABX500 core access functions. | 7 | * ABX500 core access functions. |
8 | * The abx500 interface is used for the Analog Baseband chip | 8 | * The abx500 interface is used for the Analog Baseband chip |
9 | * ab3100, ab3550, ab5500 and possibly comming. It is not used for | 9 | * ab3100, ab3550, ab5500, and ab8500. |
10 | * ab4500 and ab8500 since they are another family of chip. | ||
11 | * | 10 | * |
12 | * Author: Mattias Wallin <mattias.wallin@stericsson.com> | 11 | * Author: Mattias Wallin <mattias.wallin@stericsson.com> |
13 | * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> | 12 | * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> |
@@ -230,4 +229,5 @@ struct abx500_ops { | |||
230 | }; | 229 | }; |
231 | 230 | ||
232 | int abx500_register_ops(struct device *core_dev, struct abx500_ops *ops); | 231 | int abx500_register_ops(struct device *core_dev, struct abx500_ops *ops); |
232 | void abx500_remove_ops(struct device *dev); | ||
233 | #endif | 233 | #endif |
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h index 11d740b8831d..cb93d80aa642 100644 --- a/include/linux/mfd/core.h +++ b/include/linux/mfd/core.h | |||
@@ -44,6 +44,9 @@ struct mfd_cell { | |||
44 | */ | 44 | */ |
45 | int num_resources; | 45 | int num_resources; |
46 | const struct resource *resources; | 46 | const struct resource *resources; |
47 | |||
48 | /* don't check for resource conflicts */ | ||
49 | bool ignore_resource_conflicts; | ||
47 | }; | 50 | }; |
48 | 51 | ||
49 | extern int mfd_add_devices(struct device *parent, int id, | 52 | extern int mfd_add_devices(struct device *parent, int id, |
diff --git a/include/linux/mfd/max8998-private.h b/include/linux/mfd/max8998-private.h index 6dc75b3e2d33..7363dea6bbcd 100644 --- a/include/linux/mfd/max8998-private.h +++ b/include/linux/mfd/max8998-private.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * max8698.h - Voltage regulator driver for the Maxim 8998 | 2 | * max8998.h - Voltage regulator driver for the Maxim 8998 |
3 | * | 3 | * |
4 | * Copyright (C) 2009-2010 Samsung Electrnoics | 4 | * Copyright (C) 2009-2010 Samsung Electrnoics |
5 | * Kyungmin Park <kyungmin.park@samsung.com> | 5 | * Kyungmin Park <kyungmin.park@samsung.com> |
@@ -23,6 +23,8 @@ | |||
23 | #ifndef __LINUX_MFD_MAX8998_PRIV_H | 23 | #ifndef __LINUX_MFD_MAX8998_PRIV_H |
24 | #define __LINUX_MFD_MAX8998_PRIV_H | 24 | #define __LINUX_MFD_MAX8998_PRIV_H |
25 | 25 | ||
26 | #define MAX8998_NUM_IRQ_REGS 4 | ||
27 | |||
26 | /* MAX 8998 registers */ | 28 | /* MAX 8998 registers */ |
27 | enum { | 29 | enum { |
28 | MAX8998_REG_IRQ1, | 30 | MAX8998_REG_IRQ1, |
@@ -46,12 +48,12 @@ enum { | |||
46 | MAX8998_REG_ONOFF2, | 48 | MAX8998_REG_ONOFF2, |
47 | MAX8998_REG_ONOFF3, | 49 | MAX8998_REG_ONOFF3, |
48 | MAX8998_REG_ONOFF4, | 50 | MAX8998_REG_ONOFF4, |
49 | MAX8998_REG_BUCK1_DVSARM1, | 51 | MAX8998_REG_BUCK1_VOLTAGE1, |
50 | MAX8998_REG_BUCK1_DVSARM2, | 52 | MAX8998_REG_BUCK1_VOLTAGE2, |
51 | MAX8998_REG_BUCK1_DVSARM3, | 53 | MAX8998_REG_BUCK1_VOLTAGE3, |
52 | MAX8998_REG_BUCK1_DVSARM4, | 54 | MAX8998_REG_BUCK1_VOLTAGE4, |
53 | MAX8998_REG_BUCK2_DVSINT1, | 55 | MAX8998_REG_BUCK2_VOLTAGE1, |
54 | MAX8998_REG_BUCK2_DVSINT2, | 56 | MAX8998_REG_BUCK2_VOLTAGE2, |
55 | MAX8998_REG_BUCK3, | 57 | MAX8998_REG_BUCK3, |
56 | MAX8998_REG_BUCK4, | 58 | MAX8998_REG_BUCK4, |
57 | MAX8998_REG_LDO2_LDO3, | 59 | MAX8998_REG_LDO2_LDO3, |
@@ -72,41 +74,102 @@ enum { | |||
72 | MAX8998_REG_LBCNFG2, | 74 | MAX8998_REG_LBCNFG2, |
73 | }; | 75 | }; |
74 | 76 | ||
77 | /* IRQ definitions */ | ||
78 | enum { | ||
79 | MAX8998_IRQ_DCINF, | ||
80 | MAX8998_IRQ_DCINR, | ||
81 | MAX8998_IRQ_JIGF, | ||
82 | MAX8998_IRQ_JIGR, | ||
83 | MAX8998_IRQ_PWRONF, | ||
84 | MAX8998_IRQ_PWRONR, | ||
85 | |||
86 | MAX8998_IRQ_WTSREVNT, | ||
87 | MAX8998_IRQ_SMPLEVNT, | ||
88 | MAX8998_IRQ_ALARM1, | ||
89 | MAX8998_IRQ_ALARM0, | ||
90 | |||
91 | MAX8998_IRQ_ONKEY1S, | ||
92 | MAX8998_IRQ_TOPOFFR, | ||
93 | MAX8998_IRQ_DCINOVPR, | ||
94 | MAX8998_IRQ_CHGRSTF, | ||
95 | MAX8998_IRQ_DONER, | ||
96 | MAX8998_IRQ_CHGFAULT, | ||
97 | |||
98 | MAX8998_IRQ_LOBAT1, | ||
99 | MAX8998_IRQ_LOBAT2, | ||
100 | |||
101 | MAX8998_IRQ_NR, | ||
102 | }; | ||
103 | |||
104 | /* MAX8998 various variants */ | ||
105 | enum { | ||
106 | TYPE_MAX8998 = 0, /* Default */ | ||
107 | TYPE_LP3974, /* National version of MAX8998 */ | ||
108 | TYPE_LP3979, /* Added AVS */ | ||
109 | }; | ||
110 | |||
111 | #define MAX8998_IRQ_DCINF_MASK (1 << 2) | ||
112 | #define MAX8998_IRQ_DCINR_MASK (1 << 3) | ||
113 | #define MAX8998_IRQ_JIGF_MASK (1 << 4) | ||
114 | #define MAX8998_IRQ_JIGR_MASK (1 << 5) | ||
115 | #define MAX8998_IRQ_PWRONF_MASK (1 << 6) | ||
116 | #define MAX8998_IRQ_PWRONR_MASK (1 << 7) | ||
117 | |||
118 | #define MAX8998_IRQ_WTSREVNT_MASK (1 << 0) | ||
119 | #define MAX8998_IRQ_SMPLEVNT_MASK (1 << 1) | ||
120 | #define MAX8998_IRQ_ALARM1_MASK (1 << 2) | ||
121 | #define MAX8998_IRQ_ALARM0_MASK (1 << 3) | ||
122 | |||
123 | #define MAX8998_IRQ_ONKEY1S_MASK (1 << 0) | ||
124 | #define MAX8998_IRQ_TOPOFFR_MASK (1 << 2) | ||
125 | #define MAX8998_IRQ_DCINOVPR_MASK (1 << 3) | ||
126 | #define MAX8998_IRQ_CHGRSTF_MASK (1 << 4) | ||
127 | #define MAX8998_IRQ_DONER_MASK (1 << 5) | ||
128 | #define MAX8998_IRQ_CHGFAULT_MASK (1 << 7) | ||
129 | |||
130 | #define MAX8998_IRQ_LOBAT1_MASK (1 << 0) | ||
131 | #define MAX8998_IRQ_LOBAT2_MASK (1 << 1) | ||
132 | |||
133 | #define MAX8998_ENRAMP (1 << 4) | ||
134 | |||
75 | /** | 135 | /** |
76 | * struct max8998_dev - max8998 master device for sub-drivers | 136 | * struct max8998_dev - max8998 master device for sub-drivers |
77 | * @dev: master device of the chip (can be used to access platform data) | 137 | * @dev: master device of the chip (can be used to access platform data) |
78 | * @i2c_client: i2c client private data | 138 | * @i2c: i2c client private data for regulator |
79 | * @dev_read(): chip register read function | 139 | * @rtc: i2c client private data for rtc |
80 | * @dev_write(): chip register write function | ||
81 | * @dev_update(): chip register update function | ||
82 | * @iolock: mutex for serializing io access | 140 | * @iolock: mutex for serializing io access |
141 | * @irqlock: mutex for buslock | ||
142 | * @irq_base: base IRQ number for max8998, required for IRQs | ||
143 | * @irq: generic IRQ number for max8998 | ||
144 | * @ono: power onoff IRQ number for max8998 | ||
145 | * @irq_masks_cur: currently active value | ||
146 | * @irq_masks_cache: cached hardware value | ||
147 | * @type: indicate which max8998 "variant" is used | ||
83 | */ | 148 | */ |
84 | |||
85 | struct max8998_dev { | 149 | struct max8998_dev { |
86 | struct device *dev; | 150 | struct device *dev; |
87 | struct i2c_client *i2c_client; | 151 | struct i2c_client *i2c; |
88 | int (*dev_read)(struct max8998_dev *max8998, u8 reg, u8 *dest); | 152 | struct i2c_client *rtc; |
89 | int (*dev_write)(struct max8998_dev *max8998, u8 reg, u8 val); | ||
90 | int (*dev_update)(struct max8998_dev *max8998, u8 reg, u8 val, u8 mask); | ||
91 | struct mutex iolock; | 153 | struct mutex iolock; |
154 | struct mutex irqlock; | ||
155 | |||
156 | int irq_base; | ||
157 | int irq; | ||
158 | int ono; | ||
159 | u8 irq_masks_cur[MAX8998_NUM_IRQ_REGS]; | ||
160 | u8 irq_masks_cache[MAX8998_NUM_IRQ_REGS]; | ||
161 | int type; | ||
92 | }; | 162 | }; |
93 | 163 | ||
94 | static inline int max8998_read_reg(struct max8998_dev *max8998, u8 reg, | 164 | int max8998_irq_init(struct max8998_dev *max8998); |
95 | u8 *value) | 165 | void max8998_irq_exit(struct max8998_dev *max8998); |
96 | { | 166 | |
97 | return max8998->dev_read(max8998, reg, value); | 167 | extern int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest); |
98 | } | 168 | extern int max8998_bulk_read(struct i2c_client *i2c, u8 reg, int count, |
99 | 169 | u8 *buf); | |
100 | static inline int max8998_write_reg(struct max8998_dev *max8998, u8 reg, | 170 | extern int max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value); |
101 | u8 value) | 171 | extern int max8998_bulk_write(struct i2c_client *i2c, u8 reg, int count, |
102 | { | 172 | u8 *buf); |
103 | return max8998->dev_write(max8998, reg, value); | 173 | extern int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask); |
104 | } | ||
105 | |||
106 | static inline int max8998_update_reg(struct max8998_dev *max8998, u8 reg, | ||
107 | u8 value, u8 mask) | ||
108 | { | ||
109 | return max8998->dev_update(max8998, reg, value, mask); | ||
110 | } | ||
111 | 174 | ||
112 | #endif /* __LINUX_MFD_MAX8998_PRIV_H */ | 175 | #endif /* __LINUX_MFD_MAX8998_PRIV_H */ |
diff --git a/include/linux/mfd/max8998.h b/include/linux/mfd/max8998.h index 1d3601a2d853..f8c9f884aff2 100644 --- a/include/linux/mfd/max8998.h +++ b/include/linux/mfd/max8998.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * max8698.h - Voltage regulator driver for the Maxim 8998 | 2 | * max8998.h - Voltage regulator driver for the Maxim 8998 |
3 | * | 3 | * |
4 | * Copyright (C) 2009-2010 Samsung Electrnoics | 4 | * Copyright (C) 2009-2010 Samsung Electrnoics |
5 | * Kyungmin Park <kyungmin.park@samsung.com> | 5 | * Kyungmin Park <kyungmin.park@samsung.com> |
@@ -66,13 +66,28 @@ struct max8998_regulator_data { | |||
66 | 66 | ||
67 | /** | 67 | /** |
68 | * struct max8998_board - packages regulator init data | 68 | * struct max8998_board - packages regulator init data |
69 | * @num_regulators: number of regultors used | ||
70 | * @regulators: array of defined regulators | 69 | * @regulators: array of defined regulators |
70 | * @num_regulators: number of regultors used | ||
71 | * @irq_base: base IRQ number for max8998, required for IRQs | ||
72 | * @ono: power onoff IRQ number for max8998 | ||
73 | * @buck1_max_voltage1: BUCK1 maximum alowed voltage register 1 | ||
74 | * @buck1_max_voltage2: BUCK1 maximum alowed voltage register 2 | ||
75 | * @buck2_max_voltage: BUCK2 maximum alowed voltage | ||
76 | * @buck1_set1: BUCK1 gpio pin 1 to set output voltage | ||
77 | * @buck1_set2: BUCK1 gpio pin 2 to set output voltage | ||
78 | * @buck2_set3: BUCK2 gpio pin to set output voltage | ||
71 | */ | 79 | */ |
72 | |||
73 | struct max8998_platform_data { | 80 | struct max8998_platform_data { |
74 | int num_regulators; | ||
75 | struct max8998_regulator_data *regulators; | 81 | struct max8998_regulator_data *regulators; |
82 | int num_regulators; | ||
83 | int irq_base; | ||
84 | int ono; | ||
85 | int buck1_max_voltage1; | ||
86 | int buck1_max_voltage2; | ||
87 | int buck2_max_voltage; | ||
88 | int buck1_set1; | ||
89 | int buck1_set2; | ||
90 | int buck2_set3; | ||
76 | }; | 91 | }; |
77 | 92 | ||
78 | #endif /* __LINUX_MFD_MAX8998_H */ | 93 | #endif /* __LINUX_MFD_MAX8998_H */ |
diff --git a/include/linux/mfd/mc13783.h b/include/linux/mfd/mc13783.h index 0fa44fb8dd26..b4c741e352c2 100644 --- a/include/linux/mfd/mc13783.h +++ b/include/linux/mfd/mc13783.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright 2009 Pengutronix | 2 | * Copyright 2009-2010 Pengutronix |
3 | * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> | 3 | * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify it under | 5 | * This program is free software; you can redistribute it and/or modify it under |
@@ -9,48 +9,83 @@ | |||
9 | #ifndef __LINUX_MFD_MC13783_H | 9 | #ifndef __LINUX_MFD_MC13783_H |
10 | #define __LINUX_MFD_MC13783_H | 10 | #define __LINUX_MFD_MC13783_H |
11 | 11 | ||
12 | #include <linux/interrupt.h> | 12 | #include <linux/mfd/mc13xxx.h> |
13 | 13 | ||
14 | struct mc13783; | 14 | struct mc13783; |
15 | 15 | ||
16 | void mc13783_lock(struct mc13783 *mc13783); | 16 | struct mc13xxx *mc13783_to_mc13xxx(struct mc13783 *mc13783); |
17 | void mc13783_unlock(struct mc13783 *mc13783); | ||
18 | 17 | ||
19 | int mc13783_reg_read(struct mc13783 *mc13783, unsigned int offset, u32 *val); | 18 | static inline void mc13783_lock(struct mc13783 *mc13783) |
20 | int mc13783_reg_write(struct mc13783 *mc13783, unsigned int offset, u32 val); | 19 | { |
21 | int mc13783_reg_rmw(struct mc13783 *mc13783, unsigned int offset, | 20 | mc13xxx_lock(mc13783_to_mc13xxx(mc13783)); |
22 | u32 mask, u32 val); | 21 | } |
22 | |||
23 | static inline void mc13783_unlock(struct mc13783 *mc13783) | ||
24 | { | ||
25 | mc13xxx_unlock(mc13783_to_mc13xxx(mc13783)); | ||
26 | } | ||
27 | |||
28 | static inline int mc13783_reg_read(struct mc13783 *mc13783, | ||
29 | unsigned int offset, u32 *val) | ||
30 | { | ||
31 | return mc13xxx_reg_read(mc13783_to_mc13xxx(mc13783), offset, val); | ||
32 | } | ||
33 | |||
34 | static inline int mc13783_reg_write(struct mc13783 *mc13783, | ||
35 | unsigned int offset, u32 val) | ||
36 | { | ||
37 | return mc13xxx_reg_write(mc13783_to_mc13xxx(mc13783), offset, val); | ||
38 | } | ||
39 | |||
40 | static inline int mc13783_reg_rmw(struct mc13783 *mc13783, | ||
41 | unsigned int offset, u32 mask, u32 val) | ||
42 | { | ||
43 | return mc13xxx_reg_rmw(mc13783_to_mc13xxx(mc13783), offset, mask, val); | ||
44 | } | ||
23 | 45 | ||
24 | int mc13783_get_flags(struct mc13783 *mc13783); | 46 | static inline int mc13783_get_flags(struct mc13783 *mc13783) |
47 | { | ||
48 | return mc13xxx_get_flags(mc13783_to_mc13xxx(mc13783)); | ||
49 | } | ||
25 | 50 | ||
26 | int mc13783_irq_request(struct mc13783 *mc13783, int irq, | 51 | static inline int mc13783_irq_request(struct mc13783 *mc13783, int irq, |
27 | irq_handler_t handler, const char *name, void *dev); | 52 | irq_handler_t handler, const char *name, void *dev) |
28 | int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq, | 53 | { |
29 | irq_handler_t handler, const char *name, void *dev); | 54 | return mc13xxx_irq_request(mc13783_to_mc13xxx(mc13783), irq, |
30 | int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev); | 55 | handler, name, dev); |
56 | } | ||
31 | 57 | ||
32 | int mc13783_irq_mask(struct mc13783 *mc13783, int irq); | 58 | static inline int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq, |
33 | int mc13783_irq_unmask(struct mc13783 *mc13783, int irq); | 59 | irq_handler_t handler, const char *name, void *dev) |
34 | int mc13783_irq_status(struct mc13783 *mc13783, int irq, | 60 | { |
35 | int *enabled, int *pending); | 61 | return mc13xxx_irq_request_nounmask(mc13783_to_mc13xxx(mc13783), irq, |
36 | int mc13783_irq_ack(struct mc13783 *mc13783, int irq); | 62 | handler, name, dev); |
63 | } | ||
37 | 64 | ||
38 | static inline int mc13783_mask(struct mc13783 *mc13783, int irq) __deprecated; | 65 | static inline int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev) |
39 | static inline int mc13783_mask(struct mc13783 *mc13783, int irq) | ||
40 | { | 66 | { |
41 | return mc13783_irq_mask(mc13783, irq); | 67 | return mc13xxx_irq_free(mc13783_to_mc13xxx(mc13783), irq, dev); |
42 | } | 68 | } |
43 | 69 | ||
44 | static inline int mc13783_unmask(struct mc13783 *mc13783, int irq) __deprecated; | 70 | static inline int mc13783_irq_mask(struct mc13783 *mc13783, int irq) |
45 | static inline int mc13783_unmask(struct mc13783 *mc13783, int irq) | ||
46 | { | 71 | { |
47 | return mc13783_irq_unmask(mc13783, irq); | 72 | return mc13xxx_irq_mask(mc13783_to_mc13xxx(mc13783), irq); |
48 | } | 73 | } |
49 | 74 | ||
50 | static inline int mc13783_ackirq(struct mc13783 *mc13783, int irq) __deprecated; | 75 | static inline int mc13783_irq_unmask(struct mc13783 *mc13783, int irq) |
51 | static inline int mc13783_ackirq(struct mc13783 *mc13783, int irq) | ||
52 | { | 76 | { |
53 | return mc13783_irq_ack(mc13783, irq); | 77 | return mc13xxx_irq_unmask(mc13783_to_mc13xxx(mc13783), irq); |
78 | } | ||
79 | static inline int mc13783_irq_status(struct mc13783 *mc13783, int irq, | ||
80 | int *enabled, int *pending) | ||
81 | { | ||
82 | return mc13xxx_irq_status(mc13783_to_mc13xxx(mc13783), | ||
83 | irq, enabled, pending); | ||
84 | } | ||
85 | |||
86 | static inline int mc13783_irq_ack(struct mc13783 *mc13783, int irq) | ||
87 | { | ||
88 | return mc13xxx_irq_ack(mc13783_to_mc13xxx(mc13783), irq); | ||
54 | } | 89 | } |
55 | 90 | ||
56 | #define MC13783_ADC0 43 | 91 | #define MC13783_ADC0 43 |
@@ -66,96 +101,18 @@ static inline int mc13783_ackirq(struct mc13783 *mc13783, int irq) | |||
66 | MC13783_ADC0_TSMOD1 | \ | 101 | MC13783_ADC0_TSMOD1 | \ |
67 | MC13783_ADC0_TSMOD2) | 102 | MC13783_ADC0_TSMOD2) |
68 | 103 | ||
69 | struct mc13783_led_platform_data { | 104 | #define mc13783_regulator_init_data mc13xxx_regulator_init_data |
70 | #define MC13783_LED_MD 0 | 105 | #define mc13783_regulator_platform_data mc13xxx_regulator_platform_data |
71 | #define MC13783_LED_AD 1 | 106 | #define mc13783_led_platform_data mc13xxx_led_platform_data |
72 | #define MC13783_LED_KP 2 | 107 | #define mc13783_leds_platform_data mc13xxx_leds_platform_data |
73 | #define MC13783_LED_R1 3 | 108 | |
74 | #define MC13783_LED_G1 4 | 109 | #define mc13783_platform_data mc13xxx_platform_data |
75 | #define MC13783_LED_B1 5 | 110 | #define MC13783_USE_TOUCHSCREEN MC13XXX_USE_TOUCHSCREEN |
76 | #define MC13783_LED_R2 6 | 111 | #define MC13783_USE_CODEC MC13XXX_USE_CODEC |
77 | #define MC13783_LED_G2 7 | 112 | #define MC13783_USE_ADC MC13XXX_USE_ADC |
78 | #define MC13783_LED_B2 8 | 113 | #define MC13783_USE_RTC MC13XXX_USE_RTC |
79 | #define MC13783_LED_R3 9 | 114 | #define MC13783_USE_REGULATOR MC13XXX_USE_REGULATOR |
80 | #define MC13783_LED_G3 10 | 115 | #define MC13783_USE_LED MC13XXX_USE_LED |
81 | #define MC13783_LED_B3 11 | ||
82 | #define MC13783_LED_MAX MC13783_LED_B3 | ||
83 | int id; | ||
84 | const char *name; | ||
85 | const char *default_trigger; | ||
86 | |||
87 | /* Three or two bits current selection depending on the led */ | ||
88 | char max_current; | ||
89 | }; | ||
90 | |||
91 | struct mc13783_leds_platform_data { | ||
92 | int num_leds; | ||
93 | struct mc13783_led_platform_data *led; | ||
94 | |||
95 | #define MC13783_LED_TRIODE_MD (1 << 0) | ||
96 | #define MC13783_LED_TRIODE_AD (1 << 1) | ||
97 | #define MC13783_LED_TRIODE_KP (1 << 2) | ||
98 | #define MC13783_LED_BOOST_EN (1 << 3) | ||
99 | #define MC13783_LED_TC1HALF (1 << 4) | ||
100 | #define MC13783_LED_SLEWLIMTC (1 << 5) | ||
101 | #define MC13783_LED_SLEWLIMBL (1 << 6) | ||
102 | #define MC13783_LED_TRIODE_TC1 (1 << 7) | ||
103 | #define MC13783_LED_TRIODE_TC2 (1 << 8) | ||
104 | #define MC13783_LED_TRIODE_TC3 (1 << 9) | ||
105 | int flags; | ||
106 | |||
107 | #define MC13783_LED_AB_DISABLED 0 | ||
108 | #define MC13783_LED_AB_MD1 1 | ||
109 | #define MC13783_LED_AB_MD12 2 | ||
110 | #define MC13783_LED_AB_MD123 3 | ||
111 | #define MC13783_LED_AB_MD1234 4 | ||
112 | #define MC13783_LED_AB_MD1234_AD1 5 | ||
113 | #define MC13783_LED_AB_MD1234_AD12 6 | ||
114 | #define MC13783_LED_AB_MD1_AD 7 | ||
115 | char abmode; | ||
116 | |||
117 | #define MC13783_LED_ABREF_200MV 0 | ||
118 | #define MC13783_LED_ABREF_400MV 1 | ||
119 | #define MC13783_LED_ABREF_600MV 2 | ||
120 | #define MC13783_LED_ABREF_800MV 3 | ||
121 | char abref; | ||
122 | |||
123 | #define MC13783_LED_PERIOD_10MS 0 | ||
124 | #define MC13783_LED_PERIOD_100MS 1 | ||
125 | #define MC13783_LED_PERIOD_500MS 2 | ||
126 | #define MC13783_LED_PERIOD_2S 3 | ||
127 | char bl_period; | ||
128 | char tc1_period; | ||
129 | char tc2_period; | ||
130 | char tc3_period; | ||
131 | }; | ||
132 | |||
133 | /* to be cleaned up */ | ||
134 | struct regulator_init_data; | ||
135 | |||
136 | struct mc13783_regulator_init_data { | ||
137 | int id; | ||
138 | struct regulator_init_data *init_data; | ||
139 | }; | ||
140 | |||
141 | struct mc13783_regulator_platform_data { | ||
142 | int num_regulators; | ||
143 | struct mc13783_regulator_init_data *regulators; | ||
144 | }; | ||
145 | |||
146 | struct mc13783_platform_data { | ||
147 | int num_regulators; | ||
148 | struct mc13783_regulator_init_data *regulators; | ||
149 | struct mc13783_leds_platform_data *leds; | ||
150 | |||
151 | #define MC13783_USE_TOUCHSCREEN (1 << 0) | ||
152 | #define MC13783_USE_CODEC (1 << 1) | ||
153 | #define MC13783_USE_ADC (1 << 2) | ||
154 | #define MC13783_USE_RTC (1 << 3) | ||
155 | #define MC13783_USE_REGULATOR (1 << 4) | ||
156 | #define MC13783_USE_LED (1 << 5) | ||
157 | unsigned int flags; | ||
158 | }; | ||
159 | 116 | ||
160 | #define MC13783_ADC_MODE_TS 1 | 117 | #define MC13783_ADC_MODE_TS 1 |
161 | #define MC13783_ADC_MODE_SINGLE_CHAN 2 | 118 | #define MC13783_ADC_MODE_SINGLE_CHAN 2 |
@@ -199,46 +156,46 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode, | |||
199 | #define MC13783_REGU_PWGT1SPI 31 | 156 | #define MC13783_REGU_PWGT1SPI 31 |
200 | #define MC13783_REGU_PWGT2SPI 32 | 157 | #define MC13783_REGU_PWGT2SPI 32 |
201 | 158 | ||
202 | #define MC13783_IRQ_ADCDONE 0 | 159 | #define MC13783_IRQ_ADCDONE MC13XXX_IRQ_ADCDONE |
203 | #define MC13783_IRQ_ADCBISDONE 1 | 160 | #define MC13783_IRQ_ADCBISDONE MC13XXX_IRQ_ADCBISDONE |
204 | #define MC13783_IRQ_TS 2 | 161 | #define MC13783_IRQ_TS MC13XXX_IRQ_TS |
205 | #define MC13783_IRQ_WHIGH 3 | 162 | #define MC13783_IRQ_WHIGH 3 |
206 | #define MC13783_IRQ_WLOW 4 | 163 | #define MC13783_IRQ_WLOW 4 |
207 | #define MC13783_IRQ_CHGDET 6 | 164 | #define MC13783_IRQ_CHGDET MC13XXX_IRQ_CHGDET |
208 | #define MC13783_IRQ_CHGOV 7 | 165 | #define MC13783_IRQ_CHGOV 7 |
209 | #define MC13783_IRQ_CHGREV 8 | 166 | #define MC13783_IRQ_CHGREV MC13XXX_IRQ_CHGREV |
210 | #define MC13783_IRQ_CHGSHORT 9 | 167 | #define MC13783_IRQ_CHGSHORT MC13XXX_IRQ_CHGSHORT |
211 | #define MC13783_IRQ_CCCV 10 | 168 | #define MC13783_IRQ_CCCV MC13XXX_IRQ_CCCV |
212 | #define MC13783_IRQ_CHGCURR 11 | 169 | #define MC13783_IRQ_CHGCURR MC13XXX_IRQ_CHGCURR |
213 | #define MC13783_IRQ_BPON 12 | 170 | #define MC13783_IRQ_BPON MC13XXX_IRQ_BPON |
214 | #define MC13783_IRQ_LOBATL 13 | 171 | #define MC13783_IRQ_LOBATL MC13XXX_IRQ_LOBATL |
215 | #define MC13783_IRQ_LOBATH 14 | 172 | #define MC13783_IRQ_LOBATH MC13XXX_IRQ_LOBATH |
216 | #define MC13783_IRQ_UDP 15 | 173 | #define MC13783_IRQ_UDP 15 |
217 | #define MC13783_IRQ_USB 16 | 174 | #define MC13783_IRQ_USB 16 |
218 | #define MC13783_IRQ_ID 19 | 175 | #define MC13783_IRQ_ID 19 |
219 | #define MC13783_IRQ_SE1 21 | 176 | #define MC13783_IRQ_SE1 21 |
220 | #define MC13783_IRQ_CKDET 22 | 177 | #define MC13783_IRQ_CKDET 22 |
221 | #define MC13783_IRQ_UDM 23 | 178 | #define MC13783_IRQ_UDM 23 |
222 | #define MC13783_IRQ_1HZ 24 | 179 | #define MC13783_IRQ_1HZ MC13XXX_IRQ_1HZ |
223 | #define MC13783_IRQ_TODA 25 | 180 | #define MC13783_IRQ_TODA MC13XXX_IRQ_TODA |
224 | #define MC13783_IRQ_ONOFD1 27 | 181 | #define MC13783_IRQ_ONOFD1 27 |
225 | #define MC13783_IRQ_ONOFD2 28 | 182 | #define MC13783_IRQ_ONOFD2 28 |
226 | #define MC13783_IRQ_ONOFD3 29 | 183 | #define MC13783_IRQ_ONOFD3 29 |
227 | #define MC13783_IRQ_SYSRST 30 | 184 | #define MC13783_IRQ_SYSRST MC13XXX_IRQ_SYSRST |
228 | #define MC13783_IRQ_RTCRST 31 | 185 | #define MC13783_IRQ_RTCRST MC13XXX_IRQ_RTCRST |
229 | #define MC13783_IRQ_PC 32 | 186 | #define MC13783_IRQ_PC MC13XXX_IRQ_PC |
230 | #define MC13783_IRQ_WARM 33 | 187 | #define MC13783_IRQ_WARM MC13XXX_IRQ_WARM |
231 | #define MC13783_IRQ_MEMHLD 34 | 188 | #define MC13783_IRQ_MEMHLD MC13XXX_IRQ_MEMHLD |
232 | #define MC13783_IRQ_PWRRDY 35 | 189 | #define MC13783_IRQ_PWRRDY 35 |
233 | #define MC13783_IRQ_THWARNL 36 | 190 | #define MC13783_IRQ_THWARNL MC13XXX_IRQ_THWARNL |
234 | #define MC13783_IRQ_THWARNH 37 | 191 | #define MC13783_IRQ_THWARNH MC13XXX_IRQ_THWARNH |
235 | #define MC13783_IRQ_CLK 38 | 192 | #define MC13783_IRQ_CLK MC13XXX_IRQ_CLK |
236 | #define MC13783_IRQ_SEMAF 39 | 193 | #define MC13783_IRQ_SEMAF 39 |
237 | #define MC13783_IRQ_MC2B 41 | 194 | #define MC13783_IRQ_MC2B 41 |
238 | #define MC13783_IRQ_HSDET 42 | 195 | #define MC13783_IRQ_HSDET 42 |
239 | #define MC13783_IRQ_HSL 43 | 196 | #define MC13783_IRQ_HSL 43 |
240 | #define MC13783_IRQ_ALSPTH 44 | 197 | #define MC13783_IRQ_ALSPTH 44 |
241 | #define MC13783_IRQ_AHSSHORT 45 | 198 | #define MC13783_IRQ_AHSSHORT 45 |
242 | #define MC13783_NUM_IRQ 46 | 199 | #define MC13783_NUM_IRQ MC13XXX_NUM_IRQ |
243 | 200 | ||
244 | #endif /* __LINUX_MFD_MC13783_H */ | 201 | #endif /* ifndef __LINUX_MFD_MC13783_H */ |
diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h new file mode 100644 index 000000000000..a1d391b40e68 --- /dev/null +++ b/include/linux/mfd/mc13xxx.h | |||
@@ -0,0 +1,154 @@ | |||
1 | /* | ||
2 | * Copyright 2009-2010 Pengutronix | ||
3 | * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it under | ||
6 | * the terms of the GNU General Public License version 2 as published by the | ||
7 | * Free Software Foundation. | ||
8 | */ | ||
9 | #ifndef __LINUX_MFD_MC13XXX_H | ||
10 | #define __LINUX_MFD_MC13XXX_H | ||
11 | |||
12 | #include <linux/interrupt.h> | ||
13 | |||
14 | struct mc13xxx; | ||
15 | |||
16 | void mc13xxx_lock(struct mc13xxx *mc13xxx); | ||
17 | void mc13xxx_unlock(struct mc13xxx *mc13xxx); | ||
18 | |||
19 | int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val); | ||
20 | int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val); | ||
21 | int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset, | ||
22 | u32 mask, u32 val); | ||
23 | |||
24 | int mc13xxx_get_flags(struct mc13xxx *mc13xxx); | ||
25 | |||
26 | int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq, | ||
27 | irq_handler_t handler, const char *name, void *dev); | ||
28 | int mc13xxx_irq_request_nounmask(struct mc13xxx *mc13xxx, int irq, | ||
29 | irq_handler_t handler, const char *name, void *dev); | ||
30 | int mc13xxx_irq_free(struct mc13xxx *mc13xxx, int irq, void *dev); | ||
31 | |||
32 | int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq); | ||
33 | int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq); | ||
34 | int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq, | ||
35 | int *enabled, int *pending); | ||
36 | int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq); | ||
37 | |||
38 | int mc13xxx_get_flags(struct mc13xxx *mc13xxx); | ||
39 | |||
40 | #define MC13XXX_IRQ_ADCDONE 0 | ||
41 | #define MC13XXX_IRQ_ADCBISDONE 1 | ||
42 | #define MC13XXX_IRQ_TS 2 | ||
43 | #define MC13XXX_IRQ_CHGDET 6 | ||
44 | #define MC13XXX_IRQ_CHGREV 8 | ||
45 | #define MC13XXX_IRQ_CHGSHORT 9 | ||
46 | #define MC13XXX_IRQ_CCCV 10 | ||
47 | #define MC13XXX_IRQ_CHGCURR 11 | ||
48 | #define MC13XXX_IRQ_BPON 12 | ||
49 | #define MC13XXX_IRQ_LOBATL 13 | ||
50 | #define MC13XXX_IRQ_LOBATH 14 | ||
51 | #define MC13XXX_IRQ_1HZ 24 | ||
52 | #define MC13XXX_IRQ_TODA 25 | ||
53 | #define MC13XXX_IRQ_SYSRST 30 | ||
54 | #define MC13XXX_IRQ_RTCRST 31 | ||
55 | #define MC13XXX_IRQ_PC 32 | ||
56 | #define MC13XXX_IRQ_WARM 33 | ||
57 | #define MC13XXX_IRQ_MEMHLD 34 | ||
58 | #define MC13XXX_IRQ_THWARNL 36 | ||
59 | #define MC13XXX_IRQ_THWARNH 37 | ||
60 | #define MC13XXX_IRQ_CLK 38 | ||
61 | |||
62 | #define MC13XXX_NUM_IRQ 46 | ||
63 | |||
64 | struct regulator_init_data; | ||
65 | |||
66 | struct mc13xxx_regulator_init_data { | ||
67 | int id; | ||
68 | struct regulator_init_data *init_data; | ||
69 | }; | ||
70 | |||
71 | struct mc13xxx_regulator_platform_data { | ||
72 | int num_regulators; | ||
73 | struct mc13xxx_regulator_init_data *regulators; | ||
74 | }; | ||
75 | |||
76 | struct mc13xxx_led_platform_data { | ||
77 | #define MC13783_LED_MD 0 | ||
78 | #define MC13783_LED_AD 1 | ||
79 | #define MC13783_LED_KP 2 | ||
80 | #define MC13783_LED_R1 3 | ||
81 | #define MC13783_LED_G1 4 | ||
82 | #define MC13783_LED_B1 5 | ||
83 | #define MC13783_LED_R2 6 | ||
84 | #define MC13783_LED_G2 7 | ||
85 | #define MC13783_LED_B2 8 | ||
86 | #define MC13783_LED_R3 9 | ||
87 | #define MC13783_LED_G3 10 | ||
88 | #define MC13783_LED_B3 11 | ||
89 | #define MC13783_LED_MAX MC13783_LED_B3 | ||
90 | int id; | ||
91 | const char *name; | ||
92 | const char *default_trigger; | ||
93 | |||
94 | /* Three or two bits current selection depending on the led */ | ||
95 | char max_current; | ||
96 | }; | ||
97 | |||
98 | struct mc13xxx_leds_platform_data { | ||
99 | int num_leds; | ||
100 | struct mc13xxx_led_platform_data *led; | ||
101 | |||
102 | #define MC13783_LED_TRIODE_MD (1 << 0) | ||
103 | #define MC13783_LED_TRIODE_AD (1 << 1) | ||
104 | #define MC13783_LED_TRIODE_KP (1 << 2) | ||
105 | #define MC13783_LED_BOOST_EN (1 << 3) | ||
106 | #define MC13783_LED_TC1HALF (1 << 4) | ||
107 | #define MC13783_LED_SLEWLIMTC (1 << 5) | ||
108 | #define MC13783_LED_SLEWLIMBL (1 << 6) | ||
109 | #define MC13783_LED_TRIODE_TC1 (1 << 7) | ||
110 | #define MC13783_LED_TRIODE_TC2 (1 << 8) | ||
111 | #define MC13783_LED_TRIODE_TC3 (1 << 9) | ||
112 | int flags; | ||
113 | |||
114 | #define MC13783_LED_AB_DISABLED 0 | ||
115 | #define MC13783_LED_AB_MD1 1 | ||
116 | #define MC13783_LED_AB_MD12 2 | ||
117 | #define MC13783_LED_AB_MD123 3 | ||
118 | #define MC13783_LED_AB_MD1234 4 | ||
119 | #define MC13783_LED_AB_MD1234_AD1 5 | ||
120 | #define MC13783_LED_AB_MD1234_AD12 6 | ||
121 | #define MC13783_LED_AB_MD1_AD 7 | ||
122 | char abmode; | ||
123 | |||
124 | #define MC13783_LED_ABREF_200MV 0 | ||
125 | #define MC13783_LED_ABREF_400MV 1 | ||
126 | #define MC13783_LED_ABREF_600MV 2 | ||
127 | #define MC13783_LED_ABREF_800MV 3 | ||
128 | char abref; | ||
129 | |||
130 | #define MC13783_LED_PERIOD_10MS 0 | ||
131 | #define MC13783_LED_PERIOD_100MS 1 | ||
132 | #define MC13783_LED_PERIOD_500MS 2 | ||
133 | #define MC13783_LED_PERIOD_2S 3 | ||
134 | char bl_period; | ||
135 | char tc1_period; | ||
136 | char tc2_period; | ||
137 | char tc3_period; | ||
138 | }; | ||
139 | |||
140 | struct mc13xxx_platform_data { | ||
141 | #define MC13XXX_USE_TOUCHSCREEN (1 << 0) | ||
142 | #define MC13XXX_USE_CODEC (1 << 1) | ||
143 | #define MC13XXX_USE_ADC (1 << 2) | ||
144 | #define MC13XXX_USE_RTC (1 << 3) | ||
145 | #define MC13XXX_USE_REGULATOR (1 << 4) | ||
146 | #define MC13XXX_USE_LED (1 << 5) | ||
147 | unsigned int flags; | ||
148 | |||
149 | int num_regulators; | ||
150 | struct mc13xxx_regulator_init_data *regulators; | ||
151 | struct mc13xxx_leds_platform_data *leds; | ||
152 | }; | ||
153 | |||
154 | #endif /* ifndef __LINUX_MFD_MC13XXX_H */ | ||
diff --git a/include/linux/mfd/pcf50633/core.h b/include/linux/mfd/pcf50633/core.h index ad411a78870c..50d4a047118d 100644 --- a/include/linux/mfd/pcf50633/core.h +++ b/include/linux/mfd/pcf50633/core.h | |||
@@ -227,4 +227,11 @@ static inline struct pcf50633 *dev_to_pcf50633(struct device *dev) | |||
227 | return dev_get_drvdata(dev); | 227 | return dev_get_drvdata(dev); |
228 | } | 228 | } |
229 | 229 | ||
230 | int pcf50633_irq_init(struct pcf50633 *pcf, int irq); | ||
231 | void pcf50633_irq_free(struct pcf50633 *pcf); | ||
232 | #ifdef CONFIG_PM | ||
233 | int pcf50633_irq_suspend(struct pcf50633 *pcf); | ||
234 | int pcf50633_irq_resume(struct pcf50633 *pcf); | ||
235 | #endif | ||
236 | |||
230 | #endif | 237 | #endif |
diff --git a/include/linux/mfd/sh_mobile_sdhi.h b/include/linux/mfd/sh_mobile_sdhi.h index 49067802a6d7..c981b959760f 100644 --- a/include/linux/mfd/sh_mobile_sdhi.h +++ b/include/linux/mfd/sh_mobile_sdhi.h | |||
@@ -7,8 +7,10 @@ struct sh_mobile_sdhi_info { | |||
7 | int dma_slave_tx; | 7 | int dma_slave_tx; |
8 | int dma_slave_rx; | 8 | int dma_slave_rx; |
9 | unsigned long tmio_flags; | 9 | unsigned long tmio_flags; |
10 | unsigned long tmio_caps; | ||
10 | u32 tmio_ocr_mask; /* available MMC voltages */ | 11 | u32 tmio_ocr_mask; /* available MMC voltages */ |
11 | void (*set_pwr)(struct platform_device *pdev, int state); | 12 | void (*set_pwr)(struct platform_device *pdev, int state); |
13 | int (*get_cd)(struct platform_device *pdev); | ||
12 | }; | 14 | }; |
13 | 15 | ||
14 | #endif /* __SH_MOBILE_SDHI_H__ */ | 16 | #endif /* __SH_MOBILE_SDHI_H__ */ |
diff --git a/include/linux/mfd/stmpe.h b/include/linux/mfd/stmpe.h index 39ca7588659b..e762c270d8d4 100644 --- a/include/linux/mfd/stmpe.h +++ b/include/linux/mfd/stmpe.h | |||
@@ -112,13 +112,19 @@ struct stmpe_keypad_platform_data { | |||
112 | bool no_autorepeat; | 112 | bool no_autorepeat; |
113 | }; | 113 | }; |
114 | 114 | ||
115 | #define STMPE_GPIO_NOREQ_811_TOUCH (0xf0) | ||
116 | |||
115 | /** | 117 | /** |
116 | * struct stmpe_gpio_platform_data - STMPE GPIO platform data | 118 | * struct stmpe_gpio_platform_data - STMPE GPIO platform data |
117 | * @gpio_base: first gpio number assigned. A maximum of | 119 | * @gpio_base: first gpio number assigned. A maximum of |
118 | * %STMPE_NR_GPIOS GPIOs will be allocated. | 120 | * %STMPE_NR_GPIOS GPIOs will be allocated. |
121 | * @norequest_mask: bitmask specifying which GPIOs should _not_ be | ||
122 | * requestable due to different usage (e.g. touch, keypad) | ||
123 | * STMPE_GPIO_NOREQ_* macros can be used here. | ||
119 | */ | 124 | */ |
120 | struct stmpe_gpio_platform_data { | 125 | struct stmpe_gpio_platform_data { |
121 | int gpio_base; | 126 | int gpio_base; |
127 | unsigned norequest_mask; | ||
122 | void (*setup)(struct stmpe *stmpe, unsigned gpio_base); | 128 | void (*setup)(struct stmpe *stmpe, unsigned gpio_base); |
123 | void (*remove)(struct stmpe *stmpe, unsigned gpio_base); | 129 | void (*remove)(struct stmpe *stmpe, unsigned gpio_base); |
124 | }; | 130 | }; |
diff --git a/include/linux/mfd/tc35892.h b/include/linux/mfd/tc35892.h index e47f770d3068..eff3094ca84e 100644 --- a/include/linux/mfd/tc35892.h +++ b/include/linux/mfd/tc35892.h | |||
@@ -111,9 +111,13 @@ extern int tc35892_set_bits(struct tc35892 *tc35892, u8 reg, u8 mask, u8 val); | |||
111 | * struct tc35892_gpio_platform_data - TC35892 GPIO platform data | 111 | * struct tc35892_gpio_platform_data - TC35892 GPIO platform data |
112 | * @gpio_base: first gpio number assigned to TC35892. A maximum of | 112 | * @gpio_base: first gpio number assigned to TC35892. A maximum of |
113 | * %TC35892_NR_GPIOS GPIOs will be allocated. | 113 | * %TC35892_NR_GPIOS GPIOs will be allocated. |
114 | * @setup: callback for board-specific initialization | ||
115 | * @remove: callback for board-specific teardown | ||
114 | */ | 116 | */ |
115 | struct tc35892_gpio_platform_data { | 117 | struct tc35892_gpio_platform_data { |
116 | int gpio_base; | 118 | int gpio_base; |
119 | void (*setup)(struct tc35892 *tc35892, unsigned gpio_base); | ||
120 | void (*remove)(struct tc35892 *tc35892, unsigned gpio_base); | ||
117 | }; | 121 | }; |
118 | 122 | ||
119 | /** | 123 | /** |
diff --git a/include/linux/mfd/tmio.h b/include/linux/mfd/tmio.h index f07425bc3dcd..085f041197dc 100644 --- a/include/linux/mfd/tmio.h +++ b/include/linux/mfd/tmio.h | |||
@@ -52,6 +52,11 @@ | |||
52 | 52 | ||
53 | /* tmio MMC platform flags */ | 53 | /* tmio MMC platform flags */ |
54 | #define TMIO_MMC_WRPROTECT_DISABLE (1 << 0) | 54 | #define TMIO_MMC_WRPROTECT_DISABLE (1 << 0) |
55 | /* | ||
56 | * Some controllers can support a 2-byte block size when the bus width | ||
57 | * is configured in 4-bit mode. | ||
58 | */ | ||
59 | #define TMIO_MMC_BLKSZ_2BYTES (1 << 1) | ||
55 | 60 | ||
56 | int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base); | 61 | int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base); |
57 | int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base); | 62 | int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base); |
@@ -74,6 +79,7 @@ struct tmio_mmc_data { | |||
74 | struct tmio_mmc_dma *dma; | 79 | struct tmio_mmc_dma *dma; |
75 | void (*set_pwr)(struct platform_device *host, int state); | 80 | void (*set_pwr)(struct platform_device *host, int state); |
76 | void (*set_clk_div)(struct platform_device *host, int state); | 81 | void (*set_clk_div)(struct platform_device *host, int state); |
82 | int (*get_cd)(struct platform_device *host); | ||
77 | }; | 83 | }; |
78 | 84 | ||
79 | /* | 85 | /* |
diff --git a/include/linux/mfd/tps6586x.h b/include/linux/mfd/tps6586x.h index 772b3ae640af..b6bab1b04e25 100644 --- a/include/linux/mfd/tps6586x.h +++ b/include/linux/mfd/tps6586x.h | |||
@@ -18,6 +18,36 @@ enum { | |||
18 | TPS6586X_ID_LDO_RTC, | 18 | TPS6586X_ID_LDO_RTC, |
19 | }; | 19 | }; |
20 | 20 | ||
21 | enum { | ||
22 | TPS6586X_INT_PLDO_0, | ||
23 | TPS6586X_INT_PLDO_1, | ||
24 | TPS6586X_INT_PLDO_2, | ||
25 | TPS6586X_INT_PLDO_3, | ||
26 | TPS6586X_INT_PLDO_4, | ||
27 | TPS6586X_INT_PLDO_5, | ||
28 | TPS6586X_INT_PLDO_6, | ||
29 | TPS6586X_INT_PLDO_7, | ||
30 | TPS6586X_INT_COMP_DET, | ||
31 | TPS6586X_INT_ADC, | ||
32 | TPS6586X_INT_PLDO_8, | ||
33 | TPS6586X_INT_PLDO_9, | ||
34 | TPS6586X_INT_PSM_0, | ||
35 | TPS6586X_INT_PSM_1, | ||
36 | TPS6586X_INT_PSM_2, | ||
37 | TPS6586X_INT_PSM_3, | ||
38 | TPS6586X_INT_RTC_ALM1, | ||
39 | TPS6586X_INT_ACUSB_OVP, | ||
40 | TPS6586X_INT_USB_DET, | ||
41 | TPS6586X_INT_AC_DET, | ||
42 | TPS6586X_INT_BAT_DET, | ||
43 | TPS6586X_INT_CHG_STAT, | ||
44 | TPS6586X_INT_CHG_TEMP, | ||
45 | TPS6586X_INT_PP, | ||
46 | TPS6586X_INT_RESUME, | ||
47 | TPS6586X_INT_LOW_SYS, | ||
48 | TPS6586X_INT_RTC_ALM2, | ||
49 | }; | ||
50 | |||
21 | struct tps6586x_subdev_info { | 51 | struct tps6586x_subdev_info { |
22 | int id; | 52 | int id; |
23 | const char *name; | 53 | const char *name; |
@@ -29,6 +59,7 @@ struct tps6586x_platform_data { | |||
29 | struct tps6586x_subdev_info *subdevs; | 59 | struct tps6586x_subdev_info *subdevs; |
30 | 60 | ||
31 | int gpio_base; | 61 | int gpio_base; |
62 | int irq_base; | ||
32 | }; | 63 | }; |
33 | 64 | ||
34 | /* | 65 | /* |
diff --git a/include/linux/mfd/wm831x/core.h b/include/linux/mfd/wm831x/core.h index eb5bd4e0e03c..a1239c48b41a 100644 --- a/include/linux/mfd/wm831x/core.h +++ b/include/linux/mfd/wm831x/core.h | |||
@@ -238,6 +238,15 @@ struct regulator_dev; | |||
238 | 238 | ||
239 | #define WM831X_NUM_IRQ_REGS 5 | 239 | #define WM831X_NUM_IRQ_REGS 5 |
240 | 240 | ||
241 | enum wm831x_parent { | ||
242 | WM8310 = 0x8310, | ||
243 | WM8311 = 0x8311, | ||
244 | WM8312 = 0x8312, | ||
245 | WM8320 = 0x8320, | ||
246 | WM8321 = 0x8321, | ||
247 | WM8325 = 0x8325, | ||
248 | }; | ||
249 | |||
241 | struct wm831x { | 250 | struct wm831x { |
242 | struct mutex io_lock; | 251 | struct mutex io_lock; |
243 | 252 | ||
@@ -285,6 +294,9 @@ int wm831x_set_bits(struct wm831x *wm831x, unsigned short reg, | |||
285 | int wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg, | 294 | int wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg, |
286 | int count, u16 *buf); | 295 | int count, u16 *buf); |
287 | 296 | ||
297 | int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq); | ||
298 | void wm831x_device_exit(struct wm831x *wm831x); | ||
299 | int wm831x_device_suspend(struct wm831x *wm831x); | ||
288 | int wm831x_irq_init(struct wm831x *wm831x, int irq); | 300 | int wm831x_irq_init(struct wm831x *wm831x, int irq); |
289 | void wm831x_irq_exit(struct wm831x *wm831x); | 301 | void wm831x_irq_exit(struct wm831x *wm831x); |
290 | 302 | ||
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 7238231b8dd4..085527fb8261 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h | |||
@@ -14,6 +14,8 @@ extern int migrate_page(struct address_space *, | |||
14 | struct page *, struct page *); | 14 | struct page *, struct page *); |
15 | extern int migrate_pages(struct list_head *l, new_page_t x, | 15 | extern int migrate_pages(struct list_head *l, new_page_t x, |
16 | unsigned long private, int offlining); | 16 | unsigned long private, int offlining); |
17 | extern int migrate_huge_pages(struct list_head *l, new_page_t x, | ||
18 | unsigned long private, int offlining); | ||
17 | 19 | ||
18 | extern int fail_migrate_page(struct address_space *, | 20 | extern int fail_migrate_page(struct address_space *, |
19 | struct page *, struct page *); | 21 | struct page *, struct page *); |
@@ -23,12 +25,17 @@ extern int migrate_prep_local(void); | |||
23 | extern int migrate_vmas(struct mm_struct *mm, | 25 | extern int migrate_vmas(struct mm_struct *mm, |
24 | const nodemask_t *from, const nodemask_t *to, | 26 | const nodemask_t *from, const nodemask_t *to, |
25 | unsigned long flags); | 27 | unsigned long flags); |
28 | extern void migrate_page_copy(struct page *newpage, struct page *page); | ||
29 | extern int migrate_huge_page_move_mapping(struct address_space *mapping, | ||
30 | struct page *newpage, struct page *page); | ||
26 | #else | 31 | #else |
27 | #define PAGE_MIGRATION 0 | 32 | #define PAGE_MIGRATION 0 |
28 | 33 | ||
29 | static inline void putback_lru_pages(struct list_head *l) {} | 34 | static inline void putback_lru_pages(struct list_head *l) {} |
30 | static inline int migrate_pages(struct list_head *l, new_page_t x, | 35 | static inline int migrate_pages(struct list_head *l, new_page_t x, |
31 | unsigned long private, int offlining) { return -ENOSYS; } | 36 | unsigned long private, int offlining) { return -ENOSYS; } |
37 | static inline int migrate_huge_pages(struct list_head *l, new_page_t x, | ||
38 | unsigned long private, int offlining) { return -ENOSYS; } | ||
32 | 39 | ||
33 | static inline int migrate_prep(void) { return -ENOSYS; } | 40 | static inline int migrate_prep(void) { return -ENOSYS; } |
34 | static inline int migrate_prep_local(void) { return -ENOSYS; } | 41 | static inline int migrate_prep_local(void) { return -ENOSYS; } |
@@ -40,6 +47,15 @@ static inline int migrate_vmas(struct mm_struct *mm, | |||
40 | return -ENOSYS; | 47 | return -ENOSYS; |
41 | } | 48 | } |
42 | 49 | ||
50 | static inline void migrate_page_copy(struct page *newpage, | ||
51 | struct page *page) {} | ||
52 | |||
53 | static inline int migrate_huge_page_move_mapping(struct address_space *mapping, | ||
54 | struct page *newpage, struct page *page) | ||
55 | { | ||
56 | return -ENOSYS; | ||
57 | } | ||
58 | |||
43 | /* Possible settings for the migrate_page() method in address_operations */ | 59 | /* Possible settings for the migrate_page() method in address_operations */ |
44 | #define migrate_page NULL | 60 | #define migrate_page NULL |
45 | #define fail_migrate_page NULL | 61 | #define fail_migrate_page NULL |
diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h index 0f82293a82ed..9a18667c13cc 100644 --- a/include/linux/mlx4/cmd.h +++ b/include/linux/mlx4/cmd.h | |||
@@ -56,7 +56,9 @@ enum { | |||
56 | MLX4_CMD_QUERY_HCA = 0xb, | 56 | MLX4_CMD_QUERY_HCA = 0xb, |
57 | MLX4_CMD_QUERY_PORT = 0x43, | 57 | MLX4_CMD_QUERY_PORT = 0x43, |
58 | MLX4_CMD_SENSE_PORT = 0x4d, | 58 | MLX4_CMD_SENSE_PORT = 0x4d, |
59 | MLX4_CMD_HW_HEALTH_CHECK = 0x50, | ||
59 | MLX4_CMD_SET_PORT = 0xc, | 60 | MLX4_CMD_SET_PORT = 0xc, |
61 | MLX4_CMD_SET_NODE = 0x5a, | ||
60 | MLX4_CMD_ACCESS_DDR = 0x2e, | 62 | MLX4_CMD_ACCESS_DDR = 0x2e, |
61 | MLX4_CMD_MAP_ICM = 0xffa, | 63 | MLX4_CMD_MAP_ICM = 0xffa, |
62 | MLX4_CMD_UNMAP_ICM = 0xff9, | 64 | MLX4_CMD_UNMAP_ICM = 0xff9, |
@@ -140,6 +142,7 @@ enum { | |||
140 | MLX4_SET_PORT_MAC_TABLE = 0x2, | 142 | MLX4_SET_PORT_MAC_TABLE = 0x2, |
141 | MLX4_SET_PORT_VLAN_TABLE = 0x3, | 143 | MLX4_SET_PORT_VLAN_TABLE = 0x3, |
142 | MLX4_SET_PORT_PRIO_MAP = 0x4, | 144 | MLX4_SET_PORT_PRIO_MAP = 0x4, |
145 | MLX4_SET_PORT_GID_TABLE = 0x5, | ||
143 | }; | 146 | }; |
144 | 147 | ||
145 | struct mlx4_dev; | 148 | struct mlx4_dev; |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 7a7f9c1e679a..a7b15bc7648e 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
@@ -67,7 +67,8 @@ enum { | |||
67 | MLX4_DEV_CAP_FLAG_ATOMIC = 1 << 18, | 67 | MLX4_DEV_CAP_FLAG_ATOMIC = 1 << 18, |
68 | MLX4_DEV_CAP_FLAG_RAW_MCAST = 1 << 19, | 68 | MLX4_DEV_CAP_FLAG_RAW_MCAST = 1 << 19, |
69 | MLX4_DEV_CAP_FLAG_UD_AV_PORT = 1 << 20, | 69 | MLX4_DEV_CAP_FLAG_UD_AV_PORT = 1 << 20, |
70 | MLX4_DEV_CAP_FLAG_UD_MCAST = 1 << 21 | 70 | MLX4_DEV_CAP_FLAG_UD_MCAST = 1 << 21, |
71 | MLX4_DEV_CAP_FLAG_IBOE = 1 << 30 | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | enum { | 74 | enum { |
@@ -171,6 +172,10 @@ enum { | |||
171 | MLX4_NUM_FEXCH = 64 * 1024, | 172 | MLX4_NUM_FEXCH = 64 * 1024, |
172 | }; | 173 | }; |
173 | 174 | ||
175 | enum { | ||
176 | MLX4_MAX_FAST_REG_PAGES = 511, | ||
177 | }; | ||
178 | |||
174 | static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor) | 179 | static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor) |
175 | { | 180 | { |
176 | return (major << 32) | (minor << 16) | subminor; | 181 | return (major << 32) | (minor << 16) | subminor; |
@@ -186,6 +191,10 @@ struct mlx4_caps { | |||
186 | int eth_mtu_cap[MLX4_MAX_PORTS + 1]; | 191 | int eth_mtu_cap[MLX4_MAX_PORTS + 1]; |
187 | int gid_table_len[MLX4_MAX_PORTS + 1]; | 192 | int gid_table_len[MLX4_MAX_PORTS + 1]; |
188 | int pkey_table_len[MLX4_MAX_PORTS + 1]; | 193 | int pkey_table_len[MLX4_MAX_PORTS + 1]; |
194 | int trans_type[MLX4_MAX_PORTS + 1]; | ||
195 | int vendor_oui[MLX4_MAX_PORTS + 1]; | ||
196 | int wavelength[MLX4_MAX_PORTS + 1]; | ||
197 | u64 trans_code[MLX4_MAX_PORTS + 1]; | ||
189 | int local_ca_ack_delay; | 198 | int local_ca_ack_delay; |
190 | int num_uars; | 199 | int num_uars; |
191 | int bf_reg_size; | 200 | int bf_reg_size; |
@@ -229,6 +238,8 @@ struct mlx4_caps { | |||
229 | u32 bmme_flags; | 238 | u32 bmme_flags; |
230 | u32 reserved_lkey; | 239 | u32 reserved_lkey; |
231 | u16 stat_rate_support; | 240 | u16 stat_rate_support; |
241 | int udp_rss; | ||
242 | int loopback_support; | ||
232 | u8 port_width_cap[MLX4_MAX_PORTS + 1]; | 243 | u8 port_width_cap[MLX4_MAX_PORTS + 1]; |
233 | int max_gso_sz; | 244 | int max_gso_sz; |
234 | int reserved_qps_cnt[MLX4_NUM_QP_REGION]; | 245 | int reserved_qps_cnt[MLX4_NUM_QP_REGION]; |
@@ -373,6 +384,27 @@ struct mlx4_av { | |||
373 | u8 dgid[16]; | 384 | u8 dgid[16]; |
374 | }; | 385 | }; |
375 | 386 | ||
387 | struct mlx4_eth_av { | ||
388 | __be32 port_pd; | ||
389 | u8 reserved1; | ||
390 | u8 smac_idx; | ||
391 | u16 reserved2; | ||
392 | u8 reserved3; | ||
393 | u8 gid_index; | ||
394 | u8 stat_rate; | ||
395 | u8 hop_limit; | ||
396 | __be32 sl_tclass_flowlabel; | ||
397 | u8 dgid[16]; | ||
398 | u32 reserved4[2]; | ||
399 | __be16 vlan; | ||
400 | u8 mac[6]; | ||
401 | }; | ||
402 | |||
403 | union mlx4_ext_av { | ||
404 | struct mlx4_av ib; | ||
405 | struct mlx4_eth_av eth; | ||
406 | }; | ||
407 | |||
376 | struct mlx4_dev { | 408 | struct mlx4_dev { |
377 | struct pci_dev *pdev; | 409 | struct pci_dev *pdev; |
378 | unsigned long flags; | 410 | unsigned long flags; |
@@ -401,6 +433,12 @@ struct mlx4_init_port_param { | |||
401 | if (((type) == MLX4_PORT_TYPE_IB ? (dev)->caps.port_mask : \ | 433 | if (((type) == MLX4_PORT_TYPE_IB ? (dev)->caps.port_mask : \ |
402 | ~(dev)->caps.port_mask) & 1 << ((port) - 1)) | 434 | ~(dev)->caps.port_mask) & 1 << ((port) - 1)) |
403 | 435 | ||
436 | #define mlx4_foreach_ib_transport_port(port, dev) \ | ||
437 | for ((port) = 1; (port) <= (dev)->caps.num_ports; (port)++) \ | ||
438 | if (((dev)->caps.port_mask & 1 << ((port) - 1)) || \ | ||
439 | ((dev)->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)) | ||
440 | |||
441 | |||
404 | int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, | 442 | int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, |
405 | struct mlx4_buf *buf); | 443 | struct mlx4_buf *buf); |
406 | void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf); | 444 | void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf); |
@@ -468,6 +506,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]); | |||
468 | int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *index); | 506 | int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *index); |
469 | void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int index); | 507 | void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int index); |
470 | 508 | ||
509 | int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); | ||
471 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); | 510 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); |
472 | void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index); | 511 | void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index); |
473 | 512 | ||
@@ -480,5 +519,6 @@ void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr, | |||
480 | u32 *lkey, u32 *rkey); | 519 | u32 *lkey, u32 *rkey); |
481 | int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr); | 520 | int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr); |
482 | int mlx4_SYNC_TPT(struct mlx4_dev *dev); | 521 | int mlx4_SYNC_TPT(struct mlx4_dev *dev); |
522 | int mlx4_test_interrupts(struct mlx4_dev *dev); | ||
483 | 523 | ||
484 | #endif /* MLX4_DEVICE_H */ | 524 | #endif /* MLX4_DEVICE_H */ |
diff --git a/include/linux/mlx4/driver.h b/include/linux/mlx4/driver.h index 53c5fdb6eac4..f407cd4bfb34 100644 --- a/include/linux/mlx4/driver.h +++ b/include/linux/mlx4/driver.h | |||
@@ -44,15 +44,24 @@ enum mlx4_dev_event { | |||
44 | MLX4_DEV_EVENT_PORT_REINIT, | 44 | MLX4_DEV_EVENT_PORT_REINIT, |
45 | }; | 45 | }; |
46 | 46 | ||
47 | enum mlx4_protocol { | ||
48 | MLX4_PROTOCOL_IB, | ||
49 | MLX4_PROTOCOL_EN, | ||
50 | }; | ||
51 | |||
47 | struct mlx4_interface { | 52 | struct mlx4_interface { |
48 | void * (*add) (struct mlx4_dev *dev); | 53 | void * (*add) (struct mlx4_dev *dev); |
49 | void (*remove)(struct mlx4_dev *dev, void *context); | 54 | void (*remove)(struct mlx4_dev *dev, void *context); |
50 | void (*event) (struct mlx4_dev *dev, void *context, | 55 | void (*event) (struct mlx4_dev *dev, void *context, |
51 | enum mlx4_dev_event event, int port); | 56 | enum mlx4_dev_event event, int port); |
57 | void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port); | ||
52 | struct list_head list; | 58 | struct list_head list; |
59 | enum mlx4_protocol protocol; | ||
53 | }; | 60 | }; |
54 | 61 | ||
55 | int mlx4_register_interface(struct mlx4_interface *intf); | 62 | int mlx4_register_interface(struct mlx4_interface *intf); |
56 | void mlx4_unregister_interface(struct mlx4_interface *intf); | 63 | void mlx4_unregister_interface(struct mlx4_interface *intf); |
57 | 64 | ||
65 | void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); | ||
66 | |||
58 | #endif /* MLX4_DRIVER_H */ | 67 | #endif /* MLX4_DRIVER_H */ |
diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 7abe64326f72..0eeb2a1a867c 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h | |||
@@ -109,10 +109,11 @@ struct mlx4_qp_path { | |||
109 | __be32 tclass_flowlabel; | 109 | __be32 tclass_flowlabel; |
110 | u8 rgid[16]; | 110 | u8 rgid[16]; |
111 | u8 sched_queue; | 111 | u8 sched_queue; |
112 | u8 snooper_flags; | 112 | u8 vlan_index; |
113 | u8 reserved3[2]; | 113 | u8 reserved3[2]; |
114 | u8 counter_index; | 114 | u8 counter_index; |
115 | u8 reserved4[7]; | 115 | u8 reserved4; |
116 | u8 dmac[6]; | ||
116 | }; | 117 | }; |
117 | 118 | ||
118 | struct mlx4_qp_context { | 119 | struct mlx4_qp_context { |
@@ -166,6 +167,7 @@ enum { | |||
166 | MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5, | 167 | MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5, |
167 | MLX4_WQE_CTRL_INS_VLAN = 1 << 6, | 168 | MLX4_WQE_CTRL_INS_VLAN = 1 << 6, |
168 | MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7, | 169 | MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7, |
170 | MLX4_WQE_CTRL_FORCE_LOOPBACK = 1 << 0, | ||
169 | }; | 171 | }; |
170 | 172 | ||
171 | struct mlx4_wqe_ctrl_seg { | 173 | struct mlx4_wqe_ctrl_seg { |
@@ -219,7 +221,8 @@ struct mlx4_wqe_datagram_seg { | |||
219 | __be32 av[8]; | 221 | __be32 av[8]; |
220 | __be32 dqpn; | 222 | __be32 dqpn; |
221 | __be32 qkey; | 223 | __be32 qkey; |
222 | __be32 reservd[2]; | 224 | __be16 vlan; |
225 | u8 mac[6]; | ||
223 | }; | 226 | }; |
224 | 227 | ||
225 | struct mlx4_wqe_lso_seg { | 228 | struct mlx4_wqe_lso_seg { |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 74949fbef8c6..721f451c3029 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -144,6 +144,7 @@ extern pgprot_t protection_map[16]; | |||
144 | #define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */ | 144 | #define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */ |
145 | #define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ | 145 | #define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ |
146 | #define FAULT_FLAG_MKWRITE 0x04 /* Fault was mkwrite of existing pte */ | 146 | #define FAULT_FLAG_MKWRITE 0x04 /* Fault was mkwrite of existing pte */ |
147 | #define FAULT_FLAG_ALLOW_RETRY 0x08 /* Retry fault if blocking */ | ||
147 | 148 | ||
148 | /* | 149 | /* |
149 | * This interface is used by x86 PAT code to identify a pfn mapping that is | 150 | * This interface is used by x86 PAT code to identify a pfn mapping that is |
@@ -497,8 +498,8 @@ static inline void set_compound_order(struct page *page, unsigned long order) | |||
497 | #define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0)) | 498 | #define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0)) |
498 | #define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0)) | 499 | #define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0)) |
499 | 500 | ||
500 | /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allcator */ | 501 | /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allocator */ |
501 | #ifdef NODE_NOT_IN_PAGEFLAGS | 502 | #ifdef NODE_NOT_IN_PAGE_FLAGS |
502 | #define ZONEID_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT) | 503 | #define ZONEID_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT) |
503 | #define ZONEID_PGOFF ((SECTIONS_PGOFF < ZONES_PGOFF)? \ | 504 | #define ZONEID_PGOFF ((SECTIONS_PGOFF < ZONES_PGOFF)? \ |
504 | SECTIONS_PGOFF : ZONES_PGOFF) | 505 | SECTIONS_PGOFF : ZONES_PGOFF) |
@@ -718,12 +719,21 @@ static inline int page_mapped(struct page *page) | |||
718 | #define VM_FAULT_SIGBUS 0x0002 | 719 | #define VM_FAULT_SIGBUS 0x0002 |
719 | #define VM_FAULT_MAJOR 0x0004 | 720 | #define VM_FAULT_MAJOR 0x0004 |
720 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ | 721 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ |
721 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned page */ | 722 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ |
723 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ | ||
722 | 724 | ||
723 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ | 725 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ |
724 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ | 726 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ |
727 | #define VM_FAULT_RETRY 0x0400 /* ->fault blocked, must retry */ | ||
728 | |||
729 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ | ||
730 | |||
731 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \ | ||
732 | VM_FAULT_HWPOISON_LARGE) | ||
725 | 733 | ||
726 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON) | 734 | /* Encode hstate index for a hwpoisoned large page */ |
735 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) | ||
736 | #define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf) | ||
727 | 737 | ||
728 | /* | 738 | /* |
729 | * Can be called by the pagefault handler when it gets a VM_FAULT_OOM. | 739 | * Can be called by the pagefault handler when it gets a VM_FAULT_OOM. |
@@ -860,6 +870,7 @@ int __set_page_dirty_no_writeback(struct page *page); | |||
860 | int redirty_page_for_writepage(struct writeback_control *wbc, | 870 | int redirty_page_for_writepage(struct writeback_control *wbc, |
861 | struct page *page); | 871 | struct page *page); |
862 | void account_page_dirtied(struct page *page, struct address_space *mapping); | 872 | void account_page_dirtied(struct page *page, struct address_space *mapping); |
873 | void account_page_writeback(struct page *page); | ||
863 | int set_page_dirty(struct page *page); | 874 | int set_page_dirty(struct page *page); |
864 | int set_page_dirty_lock(struct page *page); | 875 | int set_page_dirty_lock(struct page *page); |
865 | int clear_page_dirty_for_io(struct page *page); | 876 | int clear_page_dirty_for_io(struct page *page); |
@@ -1023,7 +1034,15 @@ extern void unregister_shrinker(struct shrinker *); | |||
1023 | 1034 | ||
1024 | int vma_wants_writenotify(struct vm_area_struct *vma); | 1035 | int vma_wants_writenotify(struct vm_area_struct *vma); |
1025 | 1036 | ||
1026 | extern pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl); | 1037 | extern pte_t *__get_locked_pte(struct mm_struct *mm, unsigned long addr, |
1038 | spinlock_t **ptl); | ||
1039 | static inline pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, | ||
1040 | spinlock_t **ptl) | ||
1041 | { | ||
1042 | pte_t *ptep; | ||
1043 | __cond_lock(*ptl, ptep = __get_locked_pte(mm, addr, ptl)); | ||
1044 | return ptep; | ||
1045 | } | ||
1027 | 1046 | ||
1028 | #ifdef __PAGETABLE_PUD_FOLDED | 1047 | #ifdef __PAGETABLE_PUD_FOLDED |
1029 | static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, | 1048 | static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, |
@@ -1175,6 +1194,8 @@ extern void free_bootmem_with_active_regions(int nid, | |||
1175 | unsigned long max_low_pfn); | 1194 | unsigned long max_low_pfn); |
1176 | int add_from_early_node_map(struct range *range, int az, | 1195 | int add_from_early_node_map(struct range *range, int az, |
1177 | int nr_range, int nid); | 1196 | int nr_range, int nid); |
1197 | u64 __init find_memory_core_early(int nid, u64 size, u64 align, | ||
1198 | u64 goal, u64 limit); | ||
1178 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, | 1199 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, |
1179 | u64 goal, u64 limit); | 1200 | u64 goal, u64 limit); |
1180 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); | 1201 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index ee7e258627f9..bb7288a782fd 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -299,7 +299,7 @@ struct mm_struct { | |||
299 | * new_owner->mm == mm | 299 | * new_owner->mm == mm |
300 | * new_owner->alloc_lock is held | 300 | * new_owner->alloc_lock is held |
301 | */ | 301 | */ |
302 | struct task_struct *owner; | 302 | struct task_struct __rcu *owner; |
303 | #endif | 303 | #endif |
304 | 304 | ||
305 | #ifdef CONFIG_PROC_FS | 305 | #ifdef CONFIG_PROC_FS |
@@ -310,6 +310,8 @@ struct mm_struct { | |||
310 | #ifdef CONFIG_MMU_NOTIFIER | 310 | #ifdef CONFIG_MMU_NOTIFIER |
311 | struct mmu_notifier_mm *mmu_notifier_mm; | 311 | struct mmu_notifier_mm *mmu_notifier_mm; |
312 | #endif | 312 | #endif |
313 | /* How many tasks sharing this mm are OOM_DISABLE */ | ||
314 | atomic_t oom_disable_count; | ||
313 | }; | 315 | }; |
314 | 316 | ||
315 | /* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ | 317 | /* 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 6b7525099e56..8ce082781ccb 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -48,6 +48,7 @@ struct mmc_ext_csd { | |||
48 | unsigned int sa_timeout; /* Units: 100ns */ | 48 | unsigned int sa_timeout; /* Units: 100ns */ |
49 | unsigned int hs_max_dtr; | 49 | unsigned int hs_max_dtr; |
50 | unsigned int sectors; | 50 | unsigned int sectors; |
51 | unsigned int card_type; | ||
51 | unsigned int hc_erase_size; /* In sectors */ | 52 | unsigned int hc_erase_size; /* In sectors */ |
52 | unsigned int hc_erase_timeout; /* In milliseconds */ | 53 | unsigned int hc_erase_timeout; /* In milliseconds */ |
53 | unsigned int sec_trim_mult; /* Secure trim multiplier */ | 54 | unsigned int sec_trim_mult; /* Secure trim multiplier */ |
@@ -113,6 +114,7 @@ struct mmc_card { | |||
113 | #define MMC_STATE_READONLY (1<<1) /* card is read-only */ | 114 | #define MMC_STATE_READONLY (1<<1) /* card is read-only */ |
114 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ | 115 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ |
115 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ | 116 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ |
117 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ | ||
116 | unsigned int quirks; /* card quirks */ | 118 | unsigned int quirks; /* card quirks */ |
117 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 119 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
118 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 120 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
@@ -154,11 +156,13 @@ struct mmc_card { | |||
154 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) | 156 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) |
155 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) | 157 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) |
156 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) | 158 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) |
159 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) | ||
157 | 160 | ||
158 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 161 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
159 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 162 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
160 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) | 163 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) |
161 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) | 164 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) |
165 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) | ||
162 | 166 | ||
163 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) | 167 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) |
164 | { | 168 | { |
@@ -173,6 +177,8 @@ static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c) | |||
173 | #define mmc_card_name(c) ((c)->cid.prod_name) | 177 | #define mmc_card_name(c) ((c)->cid.prod_name) |
174 | #define mmc_card_id(c) (dev_name(&(c)->dev)) | 178 | #define mmc_card_id(c) (dev_name(&(c)->dev)) |
175 | 179 | ||
180 | #define mmc_dev_to_card(d) container_of(d, struct mmc_card, dev) | ||
181 | |||
176 | #define mmc_list_to_card(l) container_of(l, struct mmc_card, node) | 182 | #define mmc_list_to_card(l) container_of(l, struct mmc_card, node) |
177 | #define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev) | 183 | #define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev) |
178 | #define mmc_set_drvdata(c,d) dev_set_drvdata(&(c)->dev, d) | 184 | #define mmc_set_drvdata(c,d) dev_set_drvdata(&(c)->dev, d) |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 7429033acb66..64e013f1cfb8 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
@@ -153,6 +153,8 @@ extern int mmc_can_secure_erase_trim(struct mmc_card *card); | |||
153 | extern int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from, | 153 | extern int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from, |
154 | unsigned int nr); | 154 | unsigned int nr); |
155 | 155 | ||
156 | extern int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen); | ||
157 | |||
156 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *); | 158 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *); |
157 | extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); | 159 | extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); |
158 | 160 | ||
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 1575b52c3bfa..6d87f68ce4b6 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
@@ -50,6 +50,12 @@ struct mmc_ios { | |||
50 | #define MMC_TIMING_LEGACY 0 | 50 | #define MMC_TIMING_LEGACY 0 |
51 | #define MMC_TIMING_MMC_HS 1 | 51 | #define MMC_TIMING_MMC_HS 1 |
52 | #define MMC_TIMING_SD_HS 2 | 52 | #define MMC_TIMING_SD_HS 2 |
53 | |||
54 | unsigned char ddr; /* dual data rate used */ | ||
55 | |||
56 | #define MMC_SDR_MODE 0 | ||
57 | #define MMC_1_2V_DDR_MODE 1 | ||
58 | #define MMC_1_8V_DDR_MODE 2 | ||
53 | }; | 59 | }; |
54 | 60 | ||
55 | struct mmc_host_ops { | 61 | struct mmc_host_ops { |
@@ -123,6 +129,7 @@ struct mmc_host { | |||
123 | const struct mmc_host_ops *ops; | 129 | const struct mmc_host_ops *ops; |
124 | unsigned int f_min; | 130 | unsigned int f_min; |
125 | unsigned int f_max; | 131 | unsigned int f_max; |
132 | unsigned int f_init; | ||
126 | u32 ocr_avail; | 133 | u32 ocr_avail; |
127 | struct notifier_block pm_notify; | 134 | struct notifier_block pm_notify; |
128 | 135 | ||
@@ -157,13 +164,16 @@ struct mmc_host { | |||
157 | #define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */ | 164 | #define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */ |
158 | #define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */ | 165 | #define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */ |
159 | #define MMC_CAP_ERASE (1 << 10) /* Allow erase/trim commands */ | 166 | #define MMC_CAP_ERASE (1 << 10) /* Allow erase/trim commands */ |
167 | #define MMC_CAP_1_8V_DDR (1 << 11) /* can support */ | ||
168 | /* DDR mode at 1.8V */ | ||
169 | #define MMC_CAP_1_2V_DDR (1 << 12) /* can support */ | ||
170 | /* DDR mode at 1.2V */ | ||
160 | 171 | ||
161 | mmc_pm_flag_t pm_caps; /* supported pm features */ | 172 | mmc_pm_flag_t pm_caps; /* supported pm features */ |
162 | 173 | ||
163 | /* host specific block data */ | 174 | /* host specific block data */ |
164 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ | 175 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ |
165 | unsigned short max_hw_segs; /* see blk_queue_max_hw_segments */ | 176 | unsigned short max_segs; /* see blk_queue_max_segments */ |
166 | unsigned short max_phys_segs; /* see blk_queue_max_phys_segments */ | ||
167 | unsigned short unused; | 177 | unsigned short unused; |
168 | unsigned int max_req_size; /* maximum number of bytes in one req */ | 178 | unsigned int max_req_size; /* maximum number of bytes in one req */ |
169 | unsigned int max_blk_size; /* maximum size of one mmc block */ | 179 | unsigned int max_blk_size; /* maximum size of one mmc block */ |
@@ -212,6 +222,10 @@ struct mmc_host { | |||
212 | struct led_trigger *led; /* activity led */ | 222 | struct led_trigger *led; /* activity led */ |
213 | #endif | 223 | #endif |
214 | 224 | ||
225 | #ifdef CONFIG_REGULATOR | ||
226 | bool regulator_enabled; /* regulator state */ | ||
227 | #endif | ||
228 | |||
215 | struct dentry *debugfs_root; | 229 | struct dentry *debugfs_root; |
216 | 230 | ||
217 | unsigned long private[0] ____cacheline_aligned; | 231 | unsigned long private[0] ____cacheline_aligned; |
@@ -236,8 +250,8 @@ static inline void *mmc_priv(struct mmc_host *host) | |||
236 | extern int mmc_suspend_host(struct mmc_host *); | 250 | extern int mmc_suspend_host(struct mmc_host *); |
237 | extern int mmc_resume_host(struct mmc_host *); | 251 | extern int mmc_resume_host(struct mmc_host *); |
238 | 252 | ||
239 | extern void mmc_power_save_host(struct mmc_host *host); | 253 | extern int mmc_power_save_host(struct mmc_host *host); |
240 | extern void mmc_power_restore_host(struct mmc_host *host); | 254 | extern int mmc_power_restore_host(struct mmc_host *host); |
241 | 255 | ||
242 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); | 256 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); |
243 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); | 257 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); |
@@ -250,8 +264,24 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) | |||
250 | 264 | ||
251 | struct regulator; | 265 | struct regulator; |
252 | 266 | ||
267 | #ifdef CONFIG_REGULATOR | ||
253 | int mmc_regulator_get_ocrmask(struct regulator *supply); | 268 | int mmc_regulator_get_ocrmask(struct regulator *supply); |
254 | int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); | 269 | int mmc_regulator_set_ocr(struct mmc_host *mmc, |
270 | struct regulator *supply, | ||
271 | unsigned short vdd_bit); | ||
272 | #else | ||
273 | static inline int mmc_regulator_get_ocrmask(struct regulator *supply) | ||
274 | { | ||
275 | return 0; | ||
276 | } | ||
277 | |||
278 | static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, | ||
279 | struct regulator *supply, | ||
280 | unsigned short vdd_bit) | ||
281 | { | ||
282 | return 0; | ||
283 | } | ||
284 | #endif | ||
255 | 285 | ||
256 | int mmc_card_awake(struct mmc_host *host); | 286 | int mmc_card_awake(struct mmc_host *host); |
257 | int mmc_card_sleep(struct mmc_host *host); | 287 | int mmc_card_sleep(struct mmc_host *host); |
@@ -268,5 +298,13 @@ static inline void mmc_set_disable_delay(struct mmc_host *host, | |||
268 | host->disable_delay = disable_delay; | 298 | host->disable_delay = disable_delay; |
269 | } | 299 | } |
270 | 300 | ||
301 | /* Module parameter */ | ||
302 | extern int mmc_assume_removable; | ||
303 | |||
304 | static inline int mmc_card_is_removable(struct mmc_host *host) | ||
305 | { | ||
306 | return !(host->caps & MMC_CAP_NONREMOVABLE) && mmc_assume_removable; | ||
307 | } | ||
308 | |||
271 | #endif | 309 | #endif |
272 | 310 | ||
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index dd11ae51fb68..956fbd877692 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
@@ -277,11 +277,19 @@ struct _mmc_csd { | |||
277 | 277 | ||
278 | #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run at 26MHz */ | 278 | #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run at 26MHz */ |
279 | #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run at 52MHz */ | 279 | #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run at 52MHz */ |
280 | #define EXT_CSD_CARD_TYPE_MASK 0x3 /* Mask out reserved and DDR bits */ | 280 | #define EXT_CSD_CARD_TYPE_MASK 0xF /* Mask out reserved bits */ |
281 | #define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */ | ||
282 | /* DDR mode @1.8V or 3V I/O */ | ||
283 | #define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */ | ||
284 | /* DDR mode @1.2V I/O */ | ||
285 | #define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \ | ||
286 | | EXT_CSD_CARD_TYPE_DDR_1_2V) | ||
281 | 287 | ||
282 | #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ | 288 | #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ |
283 | #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ | 289 | #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ |
284 | #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */ | 290 | #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */ |
291 | #define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */ | ||
292 | #define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */ | ||
285 | 293 | ||
286 | #define EXT_CSD_SEC_ER_EN BIT(0) | 294 | #define EXT_CSD_SEC_ER_EN BIT(0) |
287 | #define EXT_CSD_SEC_BD_BLK_EN BIT(2) | 295 | #define EXT_CSD_SEC_BD_BLK_EN BIT(2) |
diff --git a/include/linux/sdhci-pltfm.h b/include/linux/mmc/sdhci-pltfm.h index 0239bd70241e..548d59d404cb 100644 --- a/include/linux/sdhci-pltfm.h +++ b/include/linux/mmc/sdhci-pltfm.h | |||
@@ -28,7 +28,7 @@ struct sdhci_host; | |||
28 | struct sdhci_pltfm_data { | 28 | struct sdhci_pltfm_data { |
29 | struct sdhci_ops *ops; | 29 | struct sdhci_ops *ops; |
30 | unsigned int quirks; | 30 | unsigned int quirks; |
31 | int (*init)(struct sdhci_host *host); | 31 | int (*init)(struct sdhci_host *host, struct sdhci_pltfm_data *pdata); |
32 | void (*exit)(struct sdhci_host *host); | 32 | void (*exit)(struct sdhci_host *host); |
33 | }; | 33 | }; |
34 | 34 | ||
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h new file mode 100644 index 000000000000..1fdc673f2396 --- /dev/null +++ b/include/linux/mmc/sdhci.h | |||
@@ -0,0 +1,144 @@ | |||
1 | /* | ||
2 | * linux/include/linux/mmc/sdhci.h - Secure Digital Host Controller Interface | ||
3 | * | ||
4 | * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved. | ||
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 (at | ||
9 | * your option) any later version. | ||
10 | */ | ||
11 | #ifndef __SDHCI_H | ||
12 | #define __SDHCI_H | ||
13 | |||
14 | #include <linux/scatterlist.h> | ||
15 | #include <linux/compiler.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/mmc/host.h> | ||
19 | |||
20 | struct sdhci_host { | ||
21 | /* Data set by hardware interface driver */ | ||
22 | const char *hw_name; /* Hardware bus name */ | ||
23 | |||
24 | unsigned int quirks; /* Deviations from spec. */ | ||
25 | |||
26 | /* Controller doesn't honor resets unless we touch the clock register */ | ||
27 | #define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0) | ||
28 | /* Controller has bad caps bits, but really supports DMA */ | ||
29 | #define SDHCI_QUIRK_FORCE_DMA (1<<1) | ||
30 | /* Controller doesn't like to be reset when there is no card inserted. */ | ||
31 | #define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2) | ||
32 | /* Controller doesn't like clearing the power reg before a change */ | ||
33 | #define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3) | ||
34 | /* Controller has flaky internal state so reset it on each ios change */ | ||
35 | #define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4) | ||
36 | /* Controller has an unusable DMA engine */ | ||
37 | #define SDHCI_QUIRK_BROKEN_DMA (1<<5) | ||
38 | /* Controller has an unusable ADMA engine */ | ||
39 | #define SDHCI_QUIRK_BROKEN_ADMA (1<<6) | ||
40 | /* Controller can only DMA from 32-bit aligned addresses */ | ||
41 | #define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7) | ||
42 | /* Controller can only DMA chunk sizes that are a multiple of 32 bits */ | ||
43 | #define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8) | ||
44 | /* Controller can only ADMA chunks that are a multiple of 32 bits */ | ||
45 | #define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9) | ||
46 | /* Controller needs to be reset after each request to stay stable */ | ||
47 | #define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10) | ||
48 | /* Controller needs voltage and power writes to happen separately */ | ||
49 | #define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11) | ||
50 | /* Controller provides an incorrect timeout value for transfers */ | ||
51 | #define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12) | ||
52 | /* Controller has an issue with buffer bits for small transfers */ | ||
53 | #define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13) | ||
54 | /* Controller does not provide transfer-complete interrupt when not busy */ | ||
55 | #define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14) | ||
56 | /* Controller has unreliable card detection */ | ||
57 | #define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15) | ||
58 | /* Controller reports inverted write-protect state */ | ||
59 | #define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16) | ||
60 | /* Controller has nonstandard clock management */ | ||
61 | #define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17) | ||
62 | /* Controller does not like fast PIO transfers */ | ||
63 | #define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18) | ||
64 | /* Controller losing signal/interrupt enable states after reset */ | ||
65 | #define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19) | ||
66 | /* Controller has to be forced to use block size of 2048 bytes */ | ||
67 | #define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20) | ||
68 | /* Controller cannot do multi-block transfers */ | ||
69 | #define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21) | ||
70 | /* Controller can only handle 1-bit data transfers */ | ||
71 | #define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22) | ||
72 | /* Controller needs 10ms delay between applying power and clock */ | ||
73 | #define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23) | ||
74 | /* Controller uses SDCLK instead of TMCLK for data timeouts */ | ||
75 | #define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24) | ||
76 | /* Controller reports wrong base clock capability */ | ||
77 | #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25) | ||
78 | /* Controller cannot support End Attribute in NOP ADMA descriptor */ | ||
79 | #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26) | ||
80 | /* Controller is missing device caps. Use caps provided by host */ | ||
81 | #define SDHCI_QUIRK_MISSING_CAPS (1<<27) | ||
82 | /* Controller uses Auto CMD12 command to stop the transfer */ | ||
83 | #define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28) | ||
84 | /* Controller doesn't have HISPD bit field in HI-SPEED SD card */ | ||
85 | #define SDHCI_QUIRK_NO_HISPD_BIT (1<<29) | ||
86 | |||
87 | int irq; /* Device IRQ */ | ||
88 | void __iomem *ioaddr; /* Mapped address */ | ||
89 | |||
90 | const struct sdhci_ops *ops; /* Low level hw interface */ | ||
91 | |||
92 | struct regulator *vmmc; /* Power regulator */ | ||
93 | |||
94 | /* Internal data */ | ||
95 | struct mmc_host *mmc; /* MMC structure */ | ||
96 | u64 dma_mask; /* custom DMA mask */ | ||
97 | |||
98 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) | ||
99 | struct led_classdev led; /* LED control */ | ||
100 | char led_name[32]; | ||
101 | #endif | ||
102 | |||
103 | spinlock_t lock; /* Mutex */ | ||
104 | |||
105 | int flags; /* Host attributes */ | ||
106 | #define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */ | ||
107 | #define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */ | ||
108 | #define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */ | ||
109 | #define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */ | ||
110 | |||
111 | unsigned int version; /* SDHCI spec. version */ | ||
112 | |||
113 | unsigned int max_clk; /* Max possible freq (MHz) */ | ||
114 | unsigned int timeout_clk; /* Timeout freq (KHz) */ | ||
115 | |||
116 | unsigned int clock; /* Current clock (MHz) */ | ||
117 | u8 pwr; /* Current voltage */ | ||
118 | |||
119 | struct mmc_request *mrq; /* Current request */ | ||
120 | struct mmc_command *cmd; /* Current command */ | ||
121 | struct mmc_data *data; /* Current data request */ | ||
122 | unsigned int data_early:1; /* Data finished before cmd */ | ||
123 | |||
124 | struct sg_mapping_iter sg_miter; /* SG state for PIO */ | ||
125 | unsigned int blocks; /* remaining PIO blocks */ | ||
126 | |||
127 | int sg_count; /* Mapped sg entries */ | ||
128 | |||
129 | u8 *adma_desc; /* ADMA descriptor table */ | ||
130 | u8 *align_buffer; /* Bounce buffer */ | ||
131 | |||
132 | dma_addr_t adma_addr; /* Mapped ADMA descr. table */ | ||
133 | dma_addr_t align_addr; /* Mapped bounce buffer */ | ||
134 | |||
135 | struct tasklet_struct card_tasklet; /* Tasklet structures */ | ||
136 | struct tasklet_struct finish_tasklet; | ||
137 | |||
138 | struct timer_list timer; /* Timer for timeouts */ | ||
139 | |||
140 | unsigned int caps; /* Alternative capabilities */ | ||
141 | |||
142 | unsigned long private[0] ____cacheline_aligned; | ||
143 | }; | ||
144 | #endif /* __SDHCI_H */ | ||
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 33b2ea09a4ad..a36ab3bc7b03 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #define SDIO_CLASS_PHS 0x06 /* PHS standard interface */ | 18 | #define SDIO_CLASS_PHS 0x06 /* PHS standard interface */ |
19 | #define SDIO_CLASS_WLAN 0x07 /* WLAN interface */ | 19 | #define SDIO_CLASS_WLAN 0x07 /* WLAN interface */ |
20 | #define SDIO_CLASS_ATA 0x08 /* Embedded SDIO-ATA std interface */ | 20 | #define SDIO_CLASS_ATA 0x08 /* Embedded SDIO-ATA std interface */ |
21 | #define SDIO_CLASS_BT_AMP 0x09 /* Type-A Bluetooth AMP interface */ | ||
21 | 22 | ||
22 | /* | 23 | /* |
23 | * Vendors and devices. Sort key: vendor first, device next. | 24 | * Vendors and devices. Sort key: vendor first, device next. |
diff --git a/include/linux/mmc/sh_mmcif.h b/include/linux/mmc/sh_mmcif.h index d4a2ebbdab4b..5c99da1078aa 100644 --- a/include/linux/mmc/sh_mmcif.h +++ b/include/linux/mmc/sh_mmcif.h | |||
@@ -34,6 +34,7 @@ | |||
34 | struct sh_mmcif_plat_data { | 34 | struct sh_mmcif_plat_data { |
35 | void (*set_pwr)(struct platform_device *pdev, int state); | 35 | void (*set_pwr)(struct platform_device *pdev, int state); |
36 | void (*down_pwr)(struct platform_device *pdev); | 36 | void (*down_pwr)(struct platform_device *pdev); |
37 | int (*get_cd)(struct platform_device *pdef); | ||
37 | u8 sup_pclk; /* 1 :SH7757, 0: SH7724/SH7372 */ | 38 | u8 sup_pclk; /* 1 :SH7757, 0: SH7724/SH7372 */ |
38 | unsigned long caps; | 39 | unsigned long caps; |
39 | u32 ocr; | 40 | u32 ocr; |
@@ -58,19 +59,19 @@ struct sh_mmcif_plat_data { | |||
58 | #define MMCIF_CE_HOST_STS2 0x0000004C | 59 | #define MMCIF_CE_HOST_STS2 0x0000004C |
59 | #define MMCIF_CE_VERSION 0x0000007C | 60 | #define MMCIF_CE_VERSION 0x0000007C |
60 | 61 | ||
61 | extern inline u32 sh_mmcif_readl(void __iomem *addr, int reg) | 62 | static inline u32 sh_mmcif_readl(void __iomem *addr, int reg) |
62 | { | 63 | { |
63 | return readl(addr + reg); | 64 | return readl(addr + reg); |
64 | } | 65 | } |
65 | 66 | ||
66 | extern inline void sh_mmcif_writel(void __iomem *addr, int reg, u32 val) | 67 | static inline void sh_mmcif_writel(void __iomem *addr, int reg, u32 val) |
67 | { | 68 | { |
68 | writel(val, addr + reg); | 69 | writel(val, addr + reg); |
69 | } | 70 | } |
70 | 71 | ||
71 | #define SH_MMCIF_BBS 512 /* boot block size */ | 72 | #define SH_MMCIF_BBS 512 /* boot block size */ |
72 | 73 | ||
73 | extern inline void sh_mmcif_boot_cmd_send(void __iomem *base, | 74 | static inline void sh_mmcif_boot_cmd_send(void __iomem *base, |
74 | unsigned long cmd, unsigned long arg) | 75 | unsigned long cmd, unsigned long arg) |
75 | { | 76 | { |
76 | sh_mmcif_writel(base, MMCIF_CE_INT, 0); | 77 | sh_mmcif_writel(base, MMCIF_CE_INT, 0); |
@@ -78,7 +79,7 @@ extern inline void sh_mmcif_boot_cmd_send(void __iomem *base, | |||
78 | sh_mmcif_writel(base, MMCIF_CE_CMD_SET, cmd); | 79 | sh_mmcif_writel(base, MMCIF_CE_CMD_SET, cmd); |
79 | } | 80 | } |
80 | 81 | ||
81 | extern inline int sh_mmcif_boot_cmd_poll(void __iomem *base, unsigned long mask) | 82 | static inline int sh_mmcif_boot_cmd_poll(void __iomem *base, unsigned long mask) |
82 | { | 83 | { |
83 | unsigned long tmp; | 84 | unsigned long tmp; |
84 | int cnt; | 85 | int cnt; |
@@ -94,14 +95,14 @@ extern inline int sh_mmcif_boot_cmd_poll(void __iomem *base, unsigned long mask) | |||
94 | return -1; | 95 | return -1; |
95 | } | 96 | } |
96 | 97 | ||
97 | extern inline int sh_mmcif_boot_cmd(void __iomem *base, | 98 | static inline int sh_mmcif_boot_cmd(void __iomem *base, |
98 | unsigned long cmd, unsigned long arg) | 99 | unsigned long cmd, unsigned long arg) |
99 | { | 100 | { |
100 | sh_mmcif_boot_cmd_send(base, cmd, arg); | 101 | sh_mmcif_boot_cmd_send(base, cmd, arg); |
101 | return sh_mmcif_boot_cmd_poll(base, 0x00010000); | 102 | return sh_mmcif_boot_cmd_poll(base, 0x00010000); |
102 | } | 103 | } |
103 | 104 | ||
104 | extern inline int sh_mmcif_boot_do_read_single(void __iomem *base, | 105 | static inline int sh_mmcif_boot_do_read_single(void __iomem *base, |
105 | unsigned int block_nr, | 106 | unsigned int block_nr, |
106 | unsigned long *buf) | 107 | unsigned long *buf) |
107 | { | 108 | { |
@@ -124,7 +125,7 @@ extern inline int sh_mmcif_boot_do_read_single(void __iomem *base, | |||
124 | return 0; | 125 | return 0; |
125 | } | 126 | } |
126 | 127 | ||
127 | extern inline int sh_mmcif_boot_do_read(void __iomem *base, | 128 | static inline int sh_mmcif_boot_do_read(void __iomem *base, |
128 | unsigned long first_block, | 129 | unsigned long first_block, |
129 | unsigned long nr_blocks, | 130 | unsigned long nr_blocks, |
130 | void *buf) | 131 | void *buf) |
@@ -142,7 +143,7 @@ extern inline int sh_mmcif_boot_do_read(void __iomem *base, | |||
142 | return ret; | 143 | return ret; |
143 | } | 144 | } |
144 | 145 | ||
145 | extern inline void sh_mmcif_boot_init(void __iomem *base) | 146 | static inline void sh_mmcif_boot_init(void __iomem *base) |
146 | { | 147 | { |
147 | unsigned long tmp; | 148 | unsigned long tmp; |
148 | 149 | ||
@@ -176,7 +177,7 @@ extern inline void sh_mmcif_boot_init(void __iomem *base) | |||
176 | sh_mmcif_boot_cmd(base, 0x03400040, 0x00010000); | 177 | sh_mmcif_boot_cmd(base, 0x03400040, 0x00010000); |
177 | } | 178 | } |
178 | 179 | ||
179 | extern inline void sh_mmcif_boot_slurp(void __iomem *base, | 180 | static inline void sh_mmcif_boot_slurp(void __iomem *base, |
180 | unsigned char *buf, | 181 | unsigned char *buf, |
181 | unsigned long no_bytes) | 182 | unsigned long no_bytes) |
182 | { | 183 | { |
diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h index 4e02ee2b071e..43dcfbdc39de 100644 --- a/include/linux/mmu_notifier.h +++ b/include/linux/mmu_notifier.h | |||
@@ -227,7 +227,7 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm) | |||
227 | 227 | ||
228 | /* | 228 | /* |
229 | * These two macros will sometime replace ptep_clear_flush. | 229 | * These two macros will sometime replace ptep_clear_flush. |
230 | * ptep_clear_flush is impleemnted as macro itself, so this also is | 230 | * ptep_clear_flush is implemented as macro itself, so this also is |
231 | * implemented as a macro until ptep_clear_flush will converted to an | 231 | * implemented as a macro until ptep_clear_flush will converted to an |
232 | * inline function, to diminish the risk of compilation failure. The | 232 | * inline function, to diminish the risk of compilation failure. The |
233 | * invalidate_page method over time can be moved outside the PT lock | 233 | * invalidate_page method over time can be moved outside the PT lock |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 3984c4eb41fd..39c24ebe9cfd 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -104,6 +104,8 @@ enum zone_stat_item { | |||
104 | NR_ISOLATED_ANON, /* Temporary isolated pages from anon lru */ | 104 | NR_ISOLATED_ANON, /* Temporary isolated pages from anon lru */ |
105 | NR_ISOLATED_FILE, /* Temporary isolated pages from file lru */ | 105 | NR_ISOLATED_FILE, /* Temporary isolated pages from file lru */ |
106 | NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ | 106 | NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ |
107 | NR_DIRTIED, /* page dirtyings since bootup */ | ||
108 | NR_WRITTEN, /* page writings since bootup */ | ||
107 | #ifdef CONFIG_NUMA | 109 | #ifdef CONFIG_NUMA |
108 | NUMA_HIT, /* allocated in intended node */ | 110 | NUMA_HIT, /* allocated in intended node */ |
109 | NUMA_MISS, /* allocated in non intended node */ | 111 | NUMA_MISS, /* allocated in non intended node */ |
@@ -421,6 +423,9 @@ struct zone { | |||
421 | typedef enum { | 423 | typedef enum { |
422 | ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ | 424 | ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ |
423 | ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ | 425 | ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ |
426 | ZONE_CONGESTED, /* zone has many dirty pages backed by | ||
427 | * a congested BDI | ||
428 | */ | ||
424 | } zone_flags_t; | 429 | } zone_flags_t; |
425 | 430 | ||
426 | static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) | 431 | static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) |
@@ -438,6 +443,11 @@ static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag) | |||
438 | clear_bit(flag, &zone->flags); | 443 | clear_bit(flag, &zone->flags); |
439 | } | 444 | } |
440 | 445 | ||
446 | static inline int zone_is_reclaim_congested(const struct zone *zone) | ||
447 | { | ||
448 | return test_bit(ZONE_CONGESTED, &zone->flags); | ||
449 | } | ||
450 | |||
441 | static inline int zone_is_reclaim_locked(const struct zone *zone) | 451 | static inline int zone_is_reclaim_locked(const struct zone *zone) |
442 | { | 452 | { |
443 | return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); | 453 | return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); |
diff --git a/include/linux/module.h b/include/linux/module.h index aace066bad8f..b29e7458b966 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -350,7 +350,10 @@ struct module | |||
350 | struct tracepoint *tracepoints; | 350 | struct tracepoint *tracepoints; |
351 | unsigned int num_tracepoints; | 351 | unsigned int num_tracepoints; |
352 | #endif | 352 | #endif |
353 | 353 | #ifdef HAVE_JUMP_LABEL | |
354 | struct jump_entry *jump_entries; | ||
355 | unsigned int num_jump_entries; | ||
356 | #endif | ||
354 | #ifdef CONFIG_TRACING | 357 | #ifdef CONFIG_TRACING |
355 | const char **trace_bprintk_fmt_start; | 358 | const char **trace_bprintk_fmt_start; |
356 | unsigned int num_trace_bprintk_fmt; | 359 | unsigned int num_trace_bprintk_fmt; |
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 9d2f1837b3d8..112adf8bd47d 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h | |||
@@ -21,8 +21,8 @@ | |||
21 | #define __module_cat(a,b) ___module_cat(a,b) | 21 | #define __module_cat(a,b) ___module_cat(a,b) |
22 | #define __MODULE_INFO(tag, name, info) \ | 22 | #define __MODULE_INFO(tag, name, info) \ |
23 | static const char __module_cat(name,__LINE__)[] \ | 23 | static const char __module_cat(name,__LINE__)[] \ |
24 | __used \ | 24 | __used __attribute__((section(".modinfo"), unused, aligned(1))) \ |
25 | __attribute__((section(".modinfo"),unused)) = __stringify(tag) "=" info | 25 | = __stringify(tag) "=" info |
26 | #else /* !MODULE */ | 26 | #else /* !MODULE */ |
27 | #define __MODULE_INFO(tag, name, info) | 27 | #define __MODULE_INFO(tag, name, info) |
28 | #endif | 28 | #endif |
diff --git a/include/linux/mroute.h b/include/linux/mroute.h index fa04b246c9ae..0fa7a3a874c8 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h | |||
@@ -213,6 +213,7 @@ struct mfc_cache { | |||
213 | unsigned char ttls[MAXVIFS]; /* TTL thresholds */ | 213 | unsigned char ttls[MAXVIFS]; /* TTL thresholds */ |
214 | } res; | 214 | } res; |
215 | } mfc_un; | 215 | } mfc_un; |
216 | struct rcu_head rcu; | ||
216 | }; | 217 | }; |
217 | 218 | ||
218 | #define MFC_STATIC 1 | 219 | #define MFC_STATIC 1 |
diff --git a/include/linux/msi.h b/include/linux/msi.h index 91b05c171854..05acced439a3 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
@@ -10,12 +10,13 @@ struct msi_msg { | |||
10 | }; | 10 | }; |
11 | 11 | ||
12 | /* Helper functions */ | 12 | /* Helper functions */ |
13 | struct irq_desc; | 13 | struct irq_data; |
14 | extern void mask_msi_irq(unsigned int irq); | 14 | struct msi_desc; |
15 | extern void unmask_msi_irq(unsigned int irq); | 15 | extern void mask_msi_irq(struct irq_data *data); |
16 | extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | 16 | extern void unmask_msi_irq(struct irq_data *data); |
17 | extern void get_cached_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | 17 | extern void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
18 | extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | 18 | extern void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
19 | extern void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | ||
19 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); | 20 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); |
20 | extern void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); | 21 | extern void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); |
21 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); | 22 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); |
diff --git a/include/linux/mtd/bbm.h b/include/linux/mtd/bbm.h index 7fa20beb2ab9..57cc0e63714f 100644 --- a/include/linux/mtd/bbm.h +++ b/include/linux/mtd/bbm.h | |||
@@ -84,7 +84,7 @@ struct nand_bbt_descr { | |||
84 | #define NAND_BBT_PERCHIP 0x00000080 | 84 | #define NAND_BBT_PERCHIP 0x00000080 |
85 | /* bbt has a version counter at offset veroffs */ | 85 | /* bbt has a version counter at offset veroffs */ |
86 | #define NAND_BBT_VERSION 0x00000100 | 86 | #define NAND_BBT_VERSION 0x00000100 |
87 | /* Create a bbt if none axists */ | 87 | /* Create a bbt if none exists */ |
88 | #define NAND_BBT_CREATE 0x00000200 | 88 | #define NAND_BBT_CREATE 0x00000200 |
89 | /* Search good / bad pattern through all pages of a block */ | 89 | /* Search good / bad pattern through all pages of a block */ |
90 | #define NAND_BBT_SCANALLPAGES 0x00000400 | 90 | #define NAND_BBT_SCANALLPAGES 0x00000400 |
@@ -102,6 +102,8 @@ struct nand_bbt_descr { | |||
102 | #define NAND_BBT_SCANBYTE1AND6 0x00100000 | 102 | #define NAND_BBT_SCANBYTE1AND6 0x00100000 |
103 | /* The nand_bbt_descr was created dynamicaly and must be freed */ | 103 | /* The nand_bbt_descr was created dynamicaly and must be freed */ |
104 | #define NAND_BBT_DYNAMICSTRUCT 0x00200000 | 104 | #define NAND_BBT_DYNAMICSTRUCT 0x00200000 |
105 | /* The bad block table does not OOB for marker */ | ||
106 | #define NAND_BBT_NO_OOB 0x00400000 | ||
105 | 107 | ||
106 | /* The maximum number of blocks to scan for a bbt */ | 108 | /* The maximum number of blocks to scan for a bbt */ |
107 | #define NAND_BBT_SCAN_MAXBLOCKS 4 | 109 | #define NAND_BBT_SCAN_MAXBLOCKS 4 |
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index d2118b0eac9a..4dd0c2cd7659 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h | |||
@@ -289,6 +289,7 @@ struct cfi_private { | |||
289 | must be of the same type. */ | 289 | must be of the same type. */ |
290 | int mfr, id; | 290 | int mfr, id; |
291 | int numchips; | 291 | int numchips; |
292 | map_word sector_erase_cmd; | ||
292 | unsigned long chipshift; /* Because they're of the same type */ | 293 | unsigned long chipshift; /* Because they're of the same type */ |
293 | const char *im_name; /* inter_module name for cmdset_setup */ | 294 | const char *im_name; /* inter_module name for cmdset_setup */ |
294 | struct flchip chips[0]; /* per-chip data structure for each chip */ | 295 | struct flchip chips[0]; /* per-chip data structure for each chip */ |
diff --git a/include/linux/mtd/fsmc.h b/include/linux/mtd/fsmc.h new file mode 100644 index 000000000000..5d2556700ec2 --- /dev/null +++ b/include/linux/mtd/fsmc.h | |||
@@ -0,0 +1,181 @@ | |||
1 | /* | ||
2 | * incude/mtd/fsmc.h | ||
3 | * | ||
4 | * ST Microelectronics | ||
5 | * Flexible Static Memory Controller (FSMC) | ||
6 | * platform data interface and header file | ||
7 | * | ||
8 | * Copyright © 2010 ST Microelectronics | ||
9 | * Vipin Kumar <vipin.kumar@st.com> | ||
10 | * | ||
11 | * This file is licensed under the terms of the GNU General Public | ||
12 | * License version 2. This program is licensed "as is" without any | ||
13 | * warranty of any kind, whether express or implied. | ||
14 | */ | ||
15 | |||
16 | #ifndef __MTD_FSMC_H | ||
17 | #define __MTD_FSMC_H | ||
18 | |||
19 | #include <linux/platform_device.h> | ||
20 | #include <linux/mtd/physmap.h> | ||
21 | #include <linux/types.h> | ||
22 | #include <linux/mtd/partitions.h> | ||
23 | #include <asm/param.h> | ||
24 | |||
25 | #define FSMC_NAND_BW8 1 | ||
26 | #define FSMC_NAND_BW16 2 | ||
27 | |||
28 | /* | ||
29 | * The placement of the Command Latch Enable (CLE) and | ||
30 | * Address Latch Enable (ALE) is twised around in the | ||
31 | * SPEAR310 implementation. | ||
32 | */ | ||
33 | #if defined(CONFIG_MACH_SPEAR310) | ||
34 | #define PLAT_NAND_CLE (1 << 17) | ||
35 | #define PLAT_NAND_ALE (1 << 16) | ||
36 | #else | ||
37 | #define PLAT_NAND_CLE (1 << 16) | ||
38 | #define PLAT_NAND_ALE (1 << 17) | ||
39 | #endif | ||
40 | |||
41 | #define FSMC_MAX_NOR_BANKS 4 | ||
42 | #define FSMC_MAX_NAND_BANKS 4 | ||
43 | |||
44 | #define FSMC_FLASH_WIDTH8 1 | ||
45 | #define FSMC_FLASH_WIDTH16 2 | ||
46 | |||
47 | struct fsmc_nor_bank_regs { | ||
48 | uint32_t ctrl; | ||
49 | uint32_t ctrl_tim; | ||
50 | }; | ||
51 | |||
52 | /* ctrl register definitions */ | ||
53 | #define BANK_ENABLE (1 << 0) | ||
54 | #define MUXED (1 << 1) | ||
55 | #define NOR_DEV (2 << 2) | ||
56 | #define WIDTH_8 (0 << 4) | ||
57 | #define WIDTH_16 (1 << 4) | ||
58 | #define RSTPWRDWN (1 << 6) | ||
59 | #define WPROT (1 << 7) | ||
60 | #define WRT_ENABLE (1 << 12) | ||
61 | #define WAIT_ENB (1 << 13) | ||
62 | |||
63 | /* ctrl_tim register definitions */ | ||
64 | |||
65 | struct fsms_nand_bank_regs { | ||
66 | uint32_t pc; | ||
67 | uint32_t sts; | ||
68 | uint32_t comm; | ||
69 | uint32_t attrib; | ||
70 | uint32_t ioata; | ||
71 | uint32_t ecc1; | ||
72 | uint32_t ecc2; | ||
73 | uint32_t ecc3; | ||
74 | }; | ||
75 | |||
76 | #define FSMC_NOR_REG_SIZE 0x40 | ||
77 | |||
78 | struct fsmc_regs { | ||
79 | struct fsmc_nor_bank_regs nor_bank_regs[FSMC_MAX_NOR_BANKS]; | ||
80 | uint8_t reserved_1[0x40 - 0x20]; | ||
81 | struct fsms_nand_bank_regs bank_regs[FSMC_MAX_NAND_BANKS]; | ||
82 | uint8_t reserved_2[0xfe0 - 0xc0]; | ||
83 | uint32_t peripid0; /* 0xfe0 */ | ||
84 | uint32_t peripid1; /* 0xfe4 */ | ||
85 | uint32_t peripid2; /* 0xfe8 */ | ||
86 | uint32_t peripid3; /* 0xfec */ | ||
87 | uint32_t pcellid0; /* 0xff0 */ | ||
88 | uint32_t pcellid1; /* 0xff4 */ | ||
89 | uint32_t pcellid2; /* 0xff8 */ | ||
90 | uint32_t pcellid3; /* 0xffc */ | ||
91 | }; | ||
92 | |||
93 | #define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ) | ||
94 | |||
95 | /* pc register definitions */ | ||
96 | #define FSMC_RESET (1 << 0) | ||
97 | #define FSMC_WAITON (1 << 1) | ||
98 | #define FSMC_ENABLE (1 << 2) | ||
99 | #define FSMC_DEVTYPE_NAND (1 << 3) | ||
100 | #define FSMC_DEVWID_8 (0 << 4) | ||
101 | #define FSMC_DEVWID_16 (1 << 4) | ||
102 | #define FSMC_ECCEN (1 << 6) | ||
103 | #define FSMC_ECCPLEN_512 (0 << 7) | ||
104 | #define FSMC_ECCPLEN_256 (1 << 7) | ||
105 | #define FSMC_TCLR_1 (1 << 9) | ||
106 | #define FSMC_TAR_1 (1 << 13) | ||
107 | |||
108 | /* sts register definitions */ | ||
109 | #define FSMC_CODE_RDY (1 << 15) | ||
110 | |||
111 | /* comm register definitions */ | ||
112 | #define FSMC_TSET_0 (0 << 0) | ||
113 | #define FSMC_TWAIT_6 (6 << 8) | ||
114 | #define FSMC_THOLD_4 (4 << 16) | ||
115 | #define FSMC_THIZ_1 (1 << 24) | ||
116 | |||
117 | /* peripid2 register definitions */ | ||
118 | #define FSMC_REVISION_MSK (0xf) | ||
119 | #define FSMC_REVISION_SHFT (0x4) | ||
120 | |||
121 | #define FSMC_VER1 1 | ||
122 | #define FSMC_VER2 2 | ||
123 | #define FSMC_VER3 3 | ||
124 | #define FSMC_VER4 4 | ||
125 | #define FSMC_VER5 5 | ||
126 | #define FSMC_VER6 6 | ||
127 | #define FSMC_VER7 7 | ||
128 | #define FSMC_VER8 8 | ||
129 | |||
130 | static inline uint32_t get_fsmc_version(struct fsmc_regs *regs) | ||
131 | { | ||
132 | return (readl(®s->peripid2) >> FSMC_REVISION_SHFT) & | ||
133 | FSMC_REVISION_MSK; | ||
134 | } | ||
135 | |||
136 | /* | ||
137 | * There are 13 bytes of ecc for every 512 byte block in FSMC version 8 | ||
138 | * and it has to be read consecutively and immediately after the 512 | ||
139 | * byte data block for hardware to generate the error bit offsets | ||
140 | * Managing the ecc bytes in the following way is easier. This way is | ||
141 | * similar to oobfree structure maintained already in u-boot nand driver | ||
142 | */ | ||
143 | #define MAX_ECCPLACE_ENTRIES 32 | ||
144 | |||
145 | struct fsmc_nand_eccplace { | ||
146 | uint8_t offset; | ||
147 | uint8_t length; | ||
148 | }; | ||
149 | |||
150 | struct fsmc_eccplace { | ||
151 | struct fsmc_nand_eccplace eccplace[MAX_ECCPLACE_ENTRIES]; | ||
152 | }; | ||
153 | |||
154 | /** | ||
155 | * fsmc_nand_platform_data - platform specific NAND controller config | ||
156 | * @partitions: partition table for the platform, use a default fallback | ||
157 | * if this is NULL | ||
158 | * @nr_partitions: the number of partitions in the previous entry | ||
159 | * @options: different options for the driver | ||
160 | * @width: bus width | ||
161 | * @bank: default bank | ||
162 | * @select_bank: callback to select a certain bank, this is | ||
163 | * platform-specific. If the controller only supports one bank | ||
164 | * this may be set to NULL | ||
165 | */ | ||
166 | struct fsmc_nand_platform_data { | ||
167 | struct mtd_partition *partitions; | ||
168 | unsigned int nr_partitions; | ||
169 | unsigned int options; | ||
170 | unsigned int width; | ||
171 | unsigned int bank; | ||
172 | void (*select_bank)(uint32_t bank, uint32_t busw); | ||
173 | }; | ||
174 | |||
175 | extern int __init fsmc_nor_init(struct platform_device *pdev, | ||
176 | unsigned long base, uint32_t bank, uint32_t width); | ||
177 | extern void __init fsmc_init_board_info(struct platform_device *pdev, | ||
178 | struct mtd_partition *partitions, unsigned int nr_partitions, | ||
179 | unsigned int width); | ||
180 | |||
181 | #endif /* __MTD_FSMC_H */ | ||
diff --git a/include/linux/mtd/inftl.h b/include/linux/mtd/inftl.h index 64ee53ce95a9..02cd5f9b79b8 100644 --- a/include/linux/mtd/inftl.h +++ b/include/linux/mtd/inftl.h | |||
@@ -37,14 +37,14 @@ struct INFTLrecord { | |||
37 | __u16 firstEUN; | 37 | __u16 firstEUN; |
38 | __u16 lastEUN; | 38 | __u16 lastEUN; |
39 | __u16 numfreeEUNs; | 39 | __u16 numfreeEUNs; |
40 | __u16 LastFreeEUN; /* To speed up finding a free EUN */ | 40 | __u16 LastFreeEUN; /* To speed up finding a free EUN */ |
41 | int head,sect,cyl; | 41 | int head,sect,cyl; |
42 | __u16 *PUtable; /* Physical Unit Table */ | 42 | __u16 *PUtable; /* Physical Unit Table */ |
43 | __u16 *VUtable; /* Virtual Unit Table */ | 43 | __u16 *VUtable; /* Virtual Unit Table */ |
44 | unsigned int nb_blocks; /* number of physical blocks */ | 44 | unsigned int nb_blocks; /* number of physical blocks */ |
45 | unsigned int nb_boot_blocks; /* number of blocks used by the bios */ | 45 | unsigned int nb_boot_blocks; /* number of blocks used by the bios */ |
46 | struct erase_info instr; | 46 | struct erase_info instr; |
47 | struct nand_ecclayout oobinfo; | 47 | struct nand_ecclayout oobinfo; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | int INFTL_mount(struct INFTLrecord *s); | 50 | int INFTL_mount(struct INFTLrecord *s); |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 8485e42a9b09..fe8d77ebec13 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -110,6 +110,21 @@ struct mtd_oob_ops { | |||
110 | uint8_t *oobbuf; | 110 | uint8_t *oobbuf; |
111 | }; | 111 | }; |
112 | 112 | ||
113 | #define MTD_MAX_OOBFREE_ENTRIES_LARGE 32 | ||
114 | #define MTD_MAX_ECCPOS_ENTRIES_LARGE 448 | ||
115 | /* | ||
116 | * Internal ECC layout control structure. For historical reasons, there is a | ||
117 | * similar, smaller struct nand_ecclayout_user (in mtd-abi.h) that is retained | ||
118 | * for export to user-space via the ECCGETLAYOUT ioctl. | ||
119 | * nand_ecclayout should be expandable in the future simply by the above macros. | ||
120 | */ | ||
121 | struct nand_ecclayout { | ||
122 | __u32 eccbytes; | ||
123 | __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES_LARGE]; | ||
124 | __u32 oobavail; | ||
125 | struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES_LARGE]; | ||
126 | }; | ||
127 | |||
113 | struct mtd_info { | 128 | struct mtd_info { |
114 | u_char type; | 129 | u_char type; |
115 | uint32_t flags; | 130 | uint32_t flags; |
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 102e12c58cb3..63e17d01fde9 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -27,15 +27,17 @@ | |||
27 | struct mtd_info; | 27 | struct mtd_info; |
28 | struct nand_flash_dev; | 28 | struct nand_flash_dev; |
29 | /* Scan and identify a NAND device */ | 29 | /* Scan and identify a NAND device */ |
30 | extern int nand_scan (struct mtd_info *mtd, int max_chips); | 30 | extern int nand_scan(struct mtd_info *mtd, int max_chips); |
31 | /* Separate phases of nand_scan(), allowing board driver to intervene | 31 | /* |
32 | * and override command or ECC setup according to flash type */ | 32 | * Separate phases of nand_scan(), allowing board driver to intervene |
33 | * and override command or ECC setup according to flash type. | ||
34 | */ | ||
33 | extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, | 35 | extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, |
34 | struct nand_flash_dev *table); | 36 | struct nand_flash_dev *table); |
35 | extern int nand_scan_tail(struct mtd_info *mtd); | 37 | extern int nand_scan_tail(struct mtd_info *mtd); |
36 | 38 | ||
37 | /* Free resources held by the NAND device */ | 39 | /* Free resources held by the NAND device */ |
38 | extern void nand_release (struct mtd_info *mtd); | 40 | extern void nand_release(struct mtd_info *mtd); |
39 | 41 | ||
40 | /* Internal helper for board drivers which need to override command function */ | 42 | /* Internal helper for board drivers which need to override command function */ |
41 | extern void nand_wait_ready(struct mtd_info *mtd); | 43 | extern void nand_wait_ready(struct mtd_info *mtd); |
@@ -49,12 +51,13 @@ extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | |||
49 | /* The maximum number of NAND chips in an array */ | 51 | /* The maximum number of NAND chips in an array */ |
50 | #define NAND_MAX_CHIPS 8 | 52 | #define NAND_MAX_CHIPS 8 |
51 | 53 | ||
52 | /* This constant declares the max. oobsize / page, which | 54 | /* |
55 | * This constant declares the max. oobsize / page, which | ||
53 | * is supported now. If you add a chip with bigger oobsize/page | 56 | * is supported now. If you add a chip with bigger oobsize/page |
54 | * adjust this accordingly. | 57 | * adjust this accordingly. |
55 | */ | 58 | */ |
56 | #define NAND_MAX_OOBSIZE 256 | 59 | #define NAND_MAX_OOBSIZE 576 |
57 | #define NAND_MAX_PAGESIZE 4096 | 60 | #define NAND_MAX_PAGESIZE 8192 |
58 | 61 | ||
59 | /* | 62 | /* |
60 | * Constants for hardware specific CLE/ALE/NCE function | 63 | * Constants for hardware specific CLE/ALE/NCE function |
@@ -88,6 +91,7 @@ extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | |||
88 | #define NAND_CMD_RNDIN 0x85 | 91 | #define NAND_CMD_RNDIN 0x85 |
89 | #define NAND_CMD_READID 0x90 | 92 | #define NAND_CMD_READID 0x90 |
90 | #define NAND_CMD_ERASE2 0xd0 | 93 | #define NAND_CMD_ERASE2 0xd0 |
94 | #define NAND_CMD_PARAM 0xec | ||
91 | #define NAND_CMD_RESET 0xff | 95 | #define NAND_CMD_RESET 0xff |
92 | 96 | ||
93 | #define NAND_CMD_LOCK 0x2a | 97 | #define NAND_CMD_LOCK 0x2a |
@@ -152,9 +156,10 @@ typedef enum { | |||
152 | #define NAND_GET_DEVICE 0x80 | 156 | #define NAND_GET_DEVICE 0x80 |
153 | 157 | ||
154 | 158 | ||
155 | /* Option constants for bizarre disfunctionality and real | 159 | /* |
156 | * features | 160 | * Option constants for bizarre disfunctionality and real |
157 | */ | 161 | * features. |
162 | */ | ||
158 | /* Chip can not auto increment pages */ | 163 | /* Chip can not auto increment pages */ |
159 | #define NAND_NO_AUTOINCR 0x00000001 | 164 | #define NAND_NO_AUTOINCR 0x00000001 |
160 | /* Buswitdh is 16 bit */ | 165 | /* Buswitdh is 16 bit */ |
@@ -165,19 +170,27 @@ typedef enum { | |||
165 | #define NAND_CACHEPRG 0x00000008 | 170 | #define NAND_CACHEPRG 0x00000008 |
166 | /* Chip has copy back function */ | 171 | /* Chip has copy back function */ |
167 | #define NAND_COPYBACK 0x00000010 | 172 | #define NAND_COPYBACK 0x00000010 |
168 | /* AND Chip which has 4 banks and a confusing page / block | 173 | /* |
169 | * assignment. See Renesas datasheet for further information */ | 174 | * AND Chip which has 4 banks and a confusing page / block |
175 | * assignment. See Renesas datasheet for further information. | ||
176 | */ | ||
170 | #define NAND_IS_AND 0x00000020 | 177 | #define NAND_IS_AND 0x00000020 |
171 | /* Chip has a array of 4 pages which can be read without | 178 | /* |
172 | * additional ready /busy waits */ | 179 | * Chip has a array of 4 pages which can be read without |
180 | * additional ready /busy waits. | ||
181 | */ | ||
173 | #define NAND_4PAGE_ARRAY 0x00000040 | 182 | #define NAND_4PAGE_ARRAY 0x00000040 |
174 | /* Chip requires that BBT is periodically rewritten to prevent | 183 | /* |
184 | * Chip requires that BBT is periodically rewritten to prevent | ||
175 | * bits from adjacent blocks from 'leaking' in altering data. | 185 | * bits from adjacent blocks from 'leaking' in altering data. |
176 | * This happens with the Renesas AG-AND chips, possibly others. */ | 186 | * This happens with the Renesas AG-AND chips, possibly others. |
187 | */ | ||
177 | #define BBT_AUTO_REFRESH 0x00000080 | 188 | #define BBT_AUTO_REFRESH 0x00000080 |
178 | /* Chip does not require ready check on read. True | 189 | /* |
190 | * Chip does not require ready check on read. True | ||
179 | * for all large page devices, as they do not support | 191 | * for all large page devices, as they do not support |
180 | * autoincrement.*/ | 192 | * autoincrement. |
193 | */ | ||
181 | #define NAND_NO_READRDY 0x00000100 | 194 | #define NAND_NO_READRDY 0x00000100 |
182 | /* Chip does not allow subpage writes */ | 195 | /* Chip does not allow subpage writes */ |
183 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 | 196 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 |
@@ -205,16 +218,27 @@ typedef enum { | |||
205 | #define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR) | 218 | #define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR) |
206 | 219 | ||
207 | /* Non chip related options */ | 220 | /* Non chip related options */ |
208 | /* Use a flash based bad block table. This option is passed to the | 221 | /* |
209 | * default bad block table function. */ | 222 | * Use a flash based bad block table. OOB identifier is saved in OOB area. |
223 | * This option is passed to the default bad block table function. | ||
224 | */ | ||
210 | #define NAND_USE_FLASH_BBT 0x00010000 | 225 | #define NAND_USE_FLASH_BBT 0x00010000 |
211 | /* This option skips the bbt scan during initialization. */ | 226 | /* This option skips the bbt scan during initialization. */ |
212 | #define NAND_SKIP_BBTSCAN 0x00020000 | 227 | #define NAND_SKIP_BBTSCAN 0x00020000 |
213 | /* This option is defined if the board driver allocates its own buffers | 228 | /* |
214 | (e.g. because it needs them DMA-coherent */ | 229 | * This option is defined if the board driver allocates its own buffers |
230 | * (e.g. because it needs them DMA-coherent). | ||
231 | */ | ||
215 | #define NAND_OWN_BUFFERS 0x00040000 | 232 | #define NAND_OWN_BUFFERS 0x00040000 |
216 | /* Chip may not exist, so silence any errors in scan */ | 233 | /* Chip may not exist, so silence any errors in scan */ |
217 | #define NAND_SCAN_SILENT_NODEV 0x00080000 | 234 | #define NAND_SCAN_SILENT_NODEV 0x00080000 |
235 | /* | ||
236 | * If passed additionally to NAND_USE_FLASH_BBT then BBT code will not touch | ||
237 | * the OOB area. | ||
238 | */ | ||
239 | #define NAND_USE_FLASH_BBT_NO_OOB 0x00100000 | ||
240 | /* Create an empty BBT with no vendor information if the BBT is available */ | ||
241 | #define NAND_CREATE_EMPTY_BBT 0x00200000 | ||
218 | 242 | ||
219 | /* Options set by nand scan */ | 243 | /* Options set by nand scan */ |
220 | /* Nand scan has allocated controller struct */ | 244 | /* Nand scan has allocated controller struct */ |
@@ -227,15 +251,80 @@ typedef enum { | |||
227 | /* Keep gcc happy */ | 251 | /* Keep gcc happy */ |
228 | struct nand_chip; | 252 | struct nand_chip; |
229 | 253 | ||
254 | struct nand_onfi_params { | ||
255 | /* rev info and features block */ | ||
256 | /* 'O' 'N' 'F' 'I' */ | ||
257 | u8 sig[4]; | ||
258 | __le16 revision; | ||
259 | __le16 features; | ||
260 | __le16 opt_cmd; | ||
261 | u8 reserved[22]; | ||
262 | |||
263 | /* manufacturer information block */ | ||
264 | char manufacturer[12]; | ||
265 | char model[20]; | ||
266 | u8 jedec_id; | ||
267 | __le16 date_code; | ||
268 | u8 reserved2[13]; | ||
269 | |||
270 | /* memory organization block */ | ||
271 | __le32 byte_per_page; | ||
272 | __le16 spare_bytes_per_page; | ||
273 | __le32 data_bytes_per_ppage; | ||
274 | __le16 spare_bytes_per_ppage; | ||
275 | __le32 pages_per_block; | ||
276 | __le32 blocks_per_lun; | ||
277 | u8 lun_count; | ||
278 | u8 addr_cycles; | ||
279 | u8 bits_per_cell; | ||
280 | __le16 bb_per_lun; | ||
281 | __le16 block_endurance; | ||
282 | u8 guaranteed_good_blocks; | ||
283 | __le16 guaranteed_block_endurance; | ||
284 | u8 programs_per_page; | ||
285 | u8 ppage_attr; | ||
286 | u8 ecc_bits; | ||
287 | u8 interleaved_bits; | ||
288 | u8 interleaved_ops; | ||
289 | u8 reserved3[13]; | ||
290 | |||
291 | /* electrical parameter block */ | ||
292 | u8 io_pin_capacitance_max; | ||
293 | __le16 async_timing_mode; | ||
294 | __le16 program_cache_timing_mode; | ||
295 | __le16 t_prog; | ||
296 | __le16 t_bers; | ||
297 | __le16 t_r; | ||
298 | __le16 t_ccs; | ||
299 | __le16 src_sync_timing_mode; | ||
300 | __le16 src_ssync_features; | ||
301 | __le16 clk_pin_capacitance_typ; | ||
302 | __le16 io_pin_capacitance_typ; | ||
303 | __le16 input_pin_capacitance_typ; | ||
304 | u8 input_pin_capacitance_max; | ||
305 | u8 driver_strenght_support; | ||
306 | __le16 t_int_r; | ||
307 | __le16 t_ald; | ||
308 | u8 reserved4[7]; | ||
309 | |||
310 | /* vendor */ | ||
311 | u8 reserved5[90]; | ||
312 | |||
313 | __le16 crc; | ||
314 | } __attribute__((packed)); | ||
315 | |||
316 | #define ONFI_CRC_BASE 0x4F4E | ||
317 | |||
230 | /** | 318 | /** |
231 | * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices | 319 | * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices |
232 | * @lock: protection lock | 320 | * @lock: protection lock |
233 | * @active: the mtd device which holds the controller currently | 321 | * @active: the mtd device which holds the controller currently |
234 | * @wq: wait queue to sleep on if a NAND operation is in progress | 322 | * @wq: wait queue to sleep on if a NAND operation is in |
235 | * used instead of the per chip wait queue when a hw controller is available | 323 | * progress used instead of the per chip wait queue |
324 | * when a hw controller is available. | ||
236 | */ | 325 | */ |
237 | struct nand_hw_control { | 326 | struct nand_hw_control { |
238 | spinlock_t lock; | 327 | spinlock_t lock; |
239 | struct nand_chip *active; | 328 | struct nand_chip *active; |
240 | wait_queue_head_t wq; | 329 | wait_queue_head_t wq; |
241 | }; | 330 | }; |
@@ -256,51 +345,42 @@ struct nand_hw_control { | |||
256 | * @correct: function for ecc correction, matching to ecc generator (sw/hw) | 345 | * @correct: function for ecc correction, matching to ecc generator (sw/hw) |
257 | * @read_page_raw: function to read a raw page without ECC | 346 | * @read_page_raw: function to read a raw page without ECC |
258 | * @write_page_raw: function to write a raw page without ECC | 347 | * @write_page_raw: function to write a raw page without ECC |
259 | * @read_page: function to read a page according to the ecc generator requirements | 348 | * @read_page: function to read a page according to the ecc generator |
349 | * requirements. | ||
260 | * @read_subpage: function to read parts of the page covered by ECC. | 350 | * @read_subpage: function to read parts of the page covered by ECC. |
261 | * @write_page: function to write a page according to the ecc generator requirements | 351 | * @write_page: function to write a page according to the ecc generator |
352 | * requirements. | ||
262 | * @read_oob: function to read chip OOB data | 353 | * @read_oob: function to read chip OOB data |
263 | * @write_oob: function to write chip OOB data | 354 | * @write_oob: function to write chip OOB data |
264 | */ | 355 | */ |
265 | struct nand_ecc_ctrl { | 356 | struct nand_ecc_ctrl { |
266 | nand_ecc_modes_t mode; | 357 | nand_ecc_modes_t mode; |
267 | int steps; | 358 | int steps; |
268 | int size; | 359 | int size; |
269 | int bytes; | 360 | int bytes; |
270 | int total; | 361 | int total; |
271 | int prepad; | 362 | int prepad; |
272 | int postpad; | 363 | int postpad; |
273 | struct nand_ecclayout *layout; | 364 | struct nand_ecclayout *layout; |
274 | void (*hwctl)(struct mtd_info *mtd, int mode); | 365 | void (*hwctl)(struct mtd_info *mtd, int mode); |
275 | int (*calculate)(struct mtd_info *mtd, | 366 | int (*calculate)(struct mtd_info *mtd, const uint8_t *dat, |
276 | const uint8_t *dat, | 367 | uint8_t *ecc_code); |
277 | uint8_t *ecc_code); | 368 | int (*correct)(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc, |
278 | int (*correct)(struct mtd_info *mtd, uint8_t *dat, | 369 | uint8_t *calc_ecc); |
279 | uint8_t *read_ecc, | 370 | int (*read_page_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
280 | uint8_t *calc_ecc); | 371 | uint8_t *buf, int page); |
281 | int (*read_page_raw)(struct mtd_info *mtd, | 372 | void (*write_page_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
282 | struct nand_chip *chip, | 373 | const uint8_t *buf); |
283 | uint8_t *buf, int page); | 374 | int (*read_page)(struct mtd_info *mtd, struct nand_chip *chip, |
284 | void (*write_page_raw)(struct mtd_info *mtd, | 375 | uint8_t *buf, int page); |
285 | struct nand_chip *chip, | 376 | int (*read_subpage)(struct mtd_info *mtd, struct nand_chip *chip, |
286 | const uint8_t *buf); | 377 | uint32_t offs, uint32_t len, uint8_t *buf); |
287 | int (*read_page)(struct mtd_info *mtd, | 378 | void (*write_page)(struct mtd_info *mtd, struct nand_chip *chip, |
288 | struct nand_chip *chip, | 379 | const uint8_t *buf); |
289 | uint8_t *buf, int page); | 380 | int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page, |
290 | int (*read_subpage)(struct mtd_info *mtd, | 381 | int sndcmd); |
291 | struct nand_chip *chip, | 382 | int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip, |
292 | uint32_t offs, uint32_t len, | 383 | int page); |
293 | uint8_t *buf); | ||
294 | void (*write_page)(struct mtd_info *mtd, | ||
295 | struct nand_chip *chip, | ||
296 | const uint8_t *buf); | ||
297 | int (*read_oob)(struct mtd_info *mtd, | ||
298 | struct nand_chip *chip, | ||
299 | int page, | ||
300 | int sndcmd); | ||
301 | int (*write_oob)(struct mtd_info *mtd, | ||
302 | struct nand_chip *chip, | ||
303 | int page); | ||
304 | }; | 384 | }; |
305 | 385 | ||
306 | /** | 386 | /** |
@@ -320,102 +400,132 @@ struct nand_buffers { | |||
320 | 400 | ||
321 | /** | 401 | /** |
322 | * struct nand_chip - NAND Private Flash Chip Data | 402 | * struct nand_chip - NAND Private Flash Chip Data |
323 | * @IO_ADDR_R: [BOARDSPECIFIC] address to read the 8 I/O lines of the flash device | 403 | * @IO_ADDR_R: [BOARDSPECIFIC] address to read the 8 I/O lines of the |
324 | * @IO_ADDR_W: [BOARDSPECIFIC] address to write the 8 I/O lines of the flash device | 404 | * flash device |
405 | * @IO_ADDR_W: [BOARDSPECIFIC] address to write the 8 I/O lines of the | ||
406 | * flash device. | ||
325 | * @read_byte: [REPLACEABLE] read one byte from the chip | 407 | * @read_byte: [REPLACEABLE] read one byte from the chip |
326 | * @read_word: [REPLACEABLE] read one word from the chip | 408 | * @read_word: [REPLACEABLE] read one word from the chip |
327 | * @write_buf: [REPLACEABLE] write data from the buffer to the chip | 409 | * @write_buf: [REPLACEABLE] write data from the buffer to the chip |
328 | * @read_buf: [REPLACEABLE] read data from the chip into the buffer | 410 | * @read_buf: [REPLACEABLE] read data from the chip into the buffer |
329 | * @verify_buf: [REPLACEABLE] verify buffer contents against the chip data | 411 | * @verify_buf: [REPLACEABLE] verify buffer contents against the chip |
412 | * data. | ||
330 | * @select_chip: [REPLACEABLE] select chip nr | 413 | * @select_chip: [REPLACEABLE] select chip nr |
331 | * @block_bad: [REPLACEABLE] check, if the block is bad | 414 | * @block_bad: [REPLACEABLE] check, if the block is bad |
332 | * @block_markbad: [REPLACEABLE] mark the block bad | 415 | * @block_markbad: [REPLACEABLE] mark the block bad |
333 | * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific funtion for controlling | 416 | * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific funtion for controlling |
334 | * ALE/CLE/nCE. Also used to write command and address | 417 | * ALE/CLE/nCE. Also used to write command and address |
335 | * @dev_ready: [BOARDSPECIFIC] hardwarespecific function for accesing device ready/busy line | 418 | * @init_size: [BOARDSPECIFIC] hardwarespecific funtion for setting |
336 | * If set to NULL no access to ready/busy is available and the ready/busy information | 419 | * mtd->oobsize, mtd->writesize and so on. |
337 | * is read from the chip status register | 420 | * @id_data contains the 8 bytes values of NAND_CMD_READID. |
338 | * @cmdfunc: [REPLACEABLE] hardwarespecific function for writing commands to the chip | 421 | * Return with the bus width. |
339 | * @waitfunc: [REPLACEABLE] hardwarespecific function for wait on ready | 422 | * @dev_ready: [BOARDSPECIFIC] hardwarespecific function for accesing |
423 | * device ready/busy line. If set to NULL no access to | ||
424 | * ready/busy is available and the ready/busy information | ||
425 | * is read from the chip status register. | ||
426 | * @cmdfunc: [REPLACEABLE] hardwarespecific function for writing | ||
427 | * commands to the chip. | ||
428 | * @waitfunc: [REPLACEABLE] hardwarespecific function for wait on | ||
429 | * ready. | ||
340 | * @ecc: [BOARDSPECIFIC] ecc control ctructure | 430 | * @ecc: [BOARDSPECIFIC] ecc control ctructure |
341 | * @buffers: buffer structure for read/write | 431 | * @buffers: buffer structure for read/write |
342 | * @hwcontrol: platform-specific hardware control structure | 432 | * @hwcontrol: platform-specific hardware control structure |
343 | * @ops: oob operation operands | 433 | * @ops: oob operation operands |
344 | * @erase_cmd: [INTERN] erase command write function, selectable due to AND support | 434 | * @erase_cmd: [INTERN] erase command write function, selectable due |
435 | * to AND support. | ||
345 | * @scan_bbt: [REPLACEABLE] function to scan bad block table | 436 | * @scan_bbt: [REPLACEABLE] function to scan bad block table |
346 | * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering data from array to read regs (tR) | 437 | * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering |
438 | * data from array to read regs (tR). | ||
347 | * @state: [INTERN] the current state of the NAND device | 439 | * @state: [INTERN] the current state of the NAND device |
348 | * @oob_poi: poison value buffer | 440 | * @oob_poi: poison value buffer |
349 | * @page_shift: [INTERN] number of address bits in a page (column address bits) | 441 | * @page_shift: [INTERN] number of address bits in a page (column |
442 | * address bits). | ||
350 | * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock | 443 | * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock |
351 | * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry | 444 | * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry |
352 | * @chip_shift: [INTERN] number of address bits in one chip | 445 | * @chip_shift: [INTERN] number of address bits in one chip |
353 | * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about | 446 | * @options: [BOARDSPECIFIC] various chip options. They can partly |
354 | * special functionality. See the defines for further explanation | 447 | * be set to inform nand_scan about special functionality. |
355 | * @badblockpos: [INTERN] position of the bad block marker in the oob area | 448 | * See the defines for further explanation. |
449 | * @badblockpos: [INTERN] position of the bad block marker in the oob | ||
450 | * area. | ||
356 | * @cellinfo: [INTERN] MLC/multichip data from chip ident | 451 | * @cellinfo: [INTERN] MLC/multichip data from chip ident |
357 | * @numchips: [INTERN] number of physical chips | 452 | * @numchips: [INTERN] number of physical chips |
358 | * @chipsize: [INTERN] the size of one chip for multichip arrays | 453 | * @chipsize: [INTERN] the size of one chip for multichip arrays |
359 | * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 | 454 | * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 |
360 | * @pagebuf: [INTERN] holds the pagenumber which is currently in data_buf | 455 | * @pagebuf: [INTERN] holds the pagenumber which is currently in |
456 | * data_buf. | ||
361 | * @subpagesize: [INTERN] holds the subpagesize | 457 | * @subpagesize: [INTERN] holds the subpagesize |
458 | * @onfi_version: [INTERN] holds the chip ONFI version (BCD encoded), | ||
459 | * non 0 if ONFI supported. | ||
460 | * @onfi_params: [INTERN] holds the ONFI page parameter when ONFI is | ||
461 | * supported, 0 otherwise. | ||
362 | * @ecclayout: [REPLACEABLE] the default ecc placement scheme | 462 | * @ecclayout: [REPLACEABLE] the default ecc placement scheme |
363 | * @bbt: [INTERN] bad block table pointer | 463 | * @bbt: [INTERN] bad block table pointer |
364 | * @bbt_td: [REPLACEABLE] bad block table descriptor for flash lookup | 464 | * @bbt_td: [REPLACEABLE] bad block table descriptor for flash |
465 | * lookup. | ||
365 | * @bbt_md: [REPLACEABLE] bad block table mirror descriptor | 466 | * @bbt_md: [REPLACEABLE] bad block table mirror descriptor |
366 | * @badblock_pattern: [REPLACEABLE] bad block scan pattern used for initial bad block scan | 467 | * @badblock_pattern: [REPLACEABLE] bad block scan pattern used for initial |
367 | * @controller: [REPLACEABLE] a pointer to a hardware controller structure | 468 | * bad block scan. |
368 | * which is shared among multiple independend devices | 469 | * @controller: [REPLACEABLE] a pointer to a hardware controller |
470 | * structure which is shared among multiple independend | ||
471 | * devices. | ||
369 | * @priv: [OPTIONAL] pointer to private chip date | 472 | * @priv: [OPTIONAL] pointer to private chip date |
370 | * @errstat: [OPTIONAL] hardware specific function to perform additional error status checks | 473 | * @errstat: [OPTIONAL] hardware specific function to perform |
371 | * (determine if errors are correctable) | 474 | * additional error status checks (determine if errors are |
475 | * correctable). | ||
372 | * @write_page: [REPLACEABLE] High-level page write function | 476 | * @write_page: [REPLACEABLE] High-level page write function |
373 | */ | 477 | */ |
374 | 478 | ||
375 | struct nand_chip { | 479 | struct nand_chip { |
376 | void __iomem *IO_ADDR_R; | 480 | void __iomem *IO_ADDR_R; |
377 | void __iomem *IO_ADDR_W; | 481 | void __iomem *IO_ADDR_W; |
378 | 482 | ||
379 | uint8_t (*read_byte)(struct mtd_info *mtd); | 483 | uint8_t (*read_byte)(struct mtd_info *mtd); |
380 | u16 (*read_word)(struct mtd_info *mtd); | 484 | u16 (*read_word)(struct mtd_info *mtd); |
381 | void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); | 485 | void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); |
382 | void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len); | 486 | void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len); |
383 | int (*verify_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); | 487 | int (*verify_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); |
384 | void (*select_chip)(struct mtd_info *mtd, int chip); | 488 | void (*select_chip)(struct mtd_info *mtd, int chip); |
385 | int (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip); | 489 | int (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip); |
386 | int (*block_markbad)(struct mtd_info *mtd, loff_t ofs); | 490 | int (*block_markbad)(struct mtd_info *mtd, loff_t ofs); |
387 | void (*cmd_ctrl)(struct mtd_info *mtd, int dat, | 491 | void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl); |
388 | unsigned int ctrl); | 492 | int (*init_size)(struct mtd_info *mtd, struct nand_chip *this, |
389 | int (*dev_ready)(struct mtd_info *mtd); | 493 | u8 *id_data); |
390 | void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr); | 494 | int (*dev_ready)(struct mtd_info *mtd); |
391 | int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this); | 495 | void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, |
392 | void (*erase_cmd)(struct mtd_info *mtd, int page); | 496 | int page_addr); |
393 | int (*scan_bbt)(struct mtd_info *mtd); | 497 | int(*waitfunc)(struct mtd_info *mtd, struct nand_chip *this); |
394 | int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page); | 498 | void (*erase_cmd)(struct mtd_info *mtd, int page); |
395 | int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip, | 499 | int (*scan_bbt)(struct mtd_info *mtd); |
396 | const uint8_t *buf, int page, int cached, int raw); | 500 | int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, |
397 | 501 | int status, int page); | |
398 | int chip_delay; | 502 | int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip, |
399 | unsigned int options; | 503 | const uint8_t *buf, int page, int cached, int raw); |
400 | 504 | ||
401 | int page_shift; | 505 | int chip_delay; |
402 | int phys_erase_shift; | 506 | unsigned int options; |
403 | int bbt_erase_shift; | 507 | |
404 | int chip_shift; | 508 | int page_shift; |
405 | int numchips; | 509 | int phys_erase_shift; |
406 | uint64_t chipsize; | 510 | int bbt_erase_shift; |
407 | int pagemask; | 511 | int chip_shift; |
408 | int pagebuf; | 512 | int numchips; |
409 | int subpagesize; | 513 | uint64_t chipsize; |
410 | uint8_t cellinfo; | 514 | int pagemask; |
411 | int badblockpos; | 515 | int pagebuf; |
412 | int badblockbits; | 516 | int subpagesize; |
413 | 517 | uint8_t cellinfo; | |
414 | flstate_t state; | 518 | int badblockpos; |
415 | 519 | int badblockbits; | |
416 | uint8_t *oob_poi; | 520 | |
417 | struct nand_hw_control *controller; | 521 | int onfi_version; |
418 | struct nand_ecclayout *ecclayout; | 522 | struct nand_onfi_params onfi_params; |
523 | |||
524 | flstate_t state; | ||
525 | |||
526 | uint8_t *oob_poi; | ||
527 | struct nand_hw_control *controller; | ||
528 | struct nand_ecclayout *ecclayout; | ||
419 | 529 | ||
420 | struct nand_ecc_ctrl ecc; | 530 | struct nand_ecc_ctrl ecc; |
421 | struct nand_buffers *buffers; | 531 | struct nand_buffers *buffers; |
@@ -423,13 +533,13 @@ struct nand_chip { | |||
423 | 533 | ||
424 | struct mtd_oob_ops ops; | 534 | struct mtd_oob_ops ops; |
425 | 535 | ||
426 | uint8_t *bbt; | 536 | uint8_t *bbt; |
427 | struct nand_bbt_descr *bbt_td; | 537 | struct nand_bbt_descr *bbt_td; |
428 | struct nand_bbt_descr *bbt_md; | 538 | struct nand_bbt_descr *bbt_md; |
429 | 539 | ||
430 | struct nand_bbt_descr *badblock_pattern; | 540 | struct nand_bbt_descr *badblock_pattern; |
431 | 541 | ||
432 | void *priv; | 542 | void *priv; |
433 | }; | 543 | }; |
434 | 544 | ||
435 | /* | 545 | /* |
@@ -473,7 +583,7 @@ struct nand_flash_dev { | |||
473 | */ | 583 | */ |
474 | struct nand_manufacturers { | 584 | struct nand_manufacturers { |
475 | int id; | 585 | int id; |
476 | char * name; | 586 | char *name; |
477 | }; | 587 | }; |
478 | 588 | ||
479 | extern struct nand_flash_dev nand_flash_ids[]; | 589 | extern struct nand_flash_dev nand_flash_ids[]; |
@@ -486,7 +596,7 @@ extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); | |||
486 | extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, | 596 | extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, |
487 | int allowbbt); | 597 | int allowbbt); |
488 | extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len, | 598 | extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len, |
489 | size_t * retlen, uint8_t * buf); | 599 | size_t *retlen, uint8_t *buf); |
490 | 600 | ||
491 | /** | 601 | /** |
492 | * struct platform_nand_chip - chip level device structure | 602 | * struct platform_nand_chip - chip level device structure |
@@ -502,17 +612,16 @@ extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len, | |||
502 | * @priv: hardware controller specific settings | 612 | * @priv: hardware controller specific settings |
503 | */ | 613 | */ |
504 | struct platform_nand_chip { | 614 | struct platform_nand_chip { |
505 | int nr_chips; | 615 | int nr_chips; |
506 | int chip_offset; | 616 | int chip_offset; |
507 | int nr_partitions; | 617 | int nr_partitions; |
508 | struct mtd_partition *partitions; | 618 | struct mtd_partition *partitions; |
509 | struct nand_ecclayout *ecclayout; | 619 | struct nand_ecclayout *ecclayout; |
510 | int chip_delay; | 620 | int chip_delay; |
511 | unsigned int options; | 621 | unsigned int options; |
512 | const char **part_probe_types; | 622 | const char **part_probe_types; |
513 | void (*set_parts)(uint64_t size, | 623 | void (*set_parts)(uint64_t size, struct platform_nand_chip *chip); |
514 | struct platform_nand_chip *chip); | 624 | void *priv; |
515 | void *priv; | ||
516 | }; | 625 | }; |
517 | 626 | ||
518 | /* Keep gcc happy */ | 627 | /* Keep gcc happy */ |
@@ -534,18 +643,15 @@ struct platform_device; | |||
534 | * All fields are optional and depend on the hardware driver requirements | 643 | * All fields are optional and depend on the hardware driver requirements |
535 | */ | 644 | */ |
536 | struct platform_nand_ctrl { | 645 | struct platform_nand_ctrl { |
537 | int (*probe)(struct platform_device *pdev); | 646 | int (*probe)(struct platform_device *pdev); |
538 | void (*remove)(struct platform_device *pdev); | 647 | void (*remove)(struct platform_device *pdev); |
539 | void (*hwcontrol)(struct mtd_info *mtd, int cmd); | 648 | void (*hwcontrol)(struct mtd_info *mtd, int cmd); |
540 | int (*dev_ready)(struct mtd_info *mtd); | 649 | int (*dev_ready)(struct mtd_info *mtd); |
541 | void (*select_chip)(struct mtd_info *mtd, int chip); | 650 | void (*select_chip)(struct mtd_info *mtd, int chip); |
542 | void (*cmd_ctrl)(struct mtd_info *mtd, int dat, | 651 | void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl); |
543 | unsigned int ctrl); | 652 | void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); |
544 | void (*write_buf)(struct mtd_info *mtd, | 653 | void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len); |
545 | const uint8_t *buf, int len); | 654 | void *priv; |
546 | void (*read_buf)(struct mtd_info *mtd, | ||
547 | uint8_t *buf, int len); | ||
548 | void *priv; | ||
549 | }; | 655 | }; |
550 | 656 | ||
551 | /** | 657 | /** |
@@ -554,8 +660,8 @@ struct platform_nand_ctrl { | |||
554 | * @ctrl: controller level device structure | 660 | * @ctrl: controller level device structure |
555 | */ | 661 | */ |
556 | struct platform_nand_data { | 662 | struct platform_nand_data { |
557 | struct platform_nand_chip chip; | 663 | struct platform_nand_chip chip; |
558 | struct platform_nand_ctrl ctrl; | 664 | struct platform_nand_ctrl ctrl; |
559 | }; | 665 | }; |
560 | 666 | ||
561 | /* Some helpers to access the data structures */ | 667 | /* Some helpers to access the data structures */ |
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index 274b6196091d..2b54316591d2 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h | |||
@@ -39,7 +39,7 @@ struct mtd_partition { | |||
39 | uint64_t size; /* partition size */ | 39 | uint64_t size; /* partition size */ |
40 | uint64_t offset; /* offset within the master MTD space */ | 40 | uint64_t offset; /* offset within the master MTD space */ |
41 | uint32_t mask_flags; /* master MTD flags to mask out for this partition */ | 41 | uint32_t mask_flags; /* master MTD flags to mask out for this partition */ |
42 | struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ | 42 | struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only) */ |
43 | }; | 43 | }; |
44 | 44 | ||
45 | #define MTDPART_OFS_NXTBLK (-2) | 45 | #define MTDPART_OFS_NXTBLK (-2) |
@@ -89,4 +89,9 @@ static inline int mtd_has_cmdlinepart(void) { return 1; } | |||
89 | static inline int mtd_has_cmdlinepart(void) { return 0; } | 89 | static inline int mtd_has_cmdlinepart(void) { return 0; } |
90 | #endif | 90 | #endif |
91 | 91 | ||
92 | int mtd_is_master(struct mtd_info *mtd); | ||
93 | int mtd_add_partition(struct mtd_info *master, char *name, | ||
94 | long long offset, long long length); | ||
95 | int mtd_del_partition(struct mtd_info *master, int partno); | ||
96 | |||
92 | #endif | 97 | #endif |
diff --git a/include/linux/mtd/super.h b/include/linux/mtd/super.h index 4016dd6fe336..f456230f9330 100644 --- a/include/linux/mtd/super.h +++ b/include/linux/mtd/super.h | |||
@@ -18,10 +18,9 @@ | |||
18 | #include <linux/fs.h> | 18 | #include <linux/fs.h> |
19 | #include <linux/mount.h> | 19 | #include <linux/mount.h> |
20 | 20 | ||
21 | extern int get_sb_mtd(struct file_system_type *fs_type, int flags, | 21 | extern struct dentry *mount_mtd(struct file_system_type *fs_type, int flags, |
22 | const char *dev_name, void *data, | 22 | const char *dev_name, void *data, |
23 | int (*fill_super)(struct super_block *, void *, int), | 23 | int (*fill_super)(struct super_block *, void *, int)); |
24 | struct vfsmount *mnt); | ||
25 | extern void kill_mtd_super(struct super_block *sb); | 24 | extern void kill_mtd_super(struct super_block *sb); |
26 | 25 | ||
27 | 26 | ||
diff --git a/include/linux/mtio.h b/include/linux/mtio.h index ef01d6aa5934..8f825756c459 100644 --- a/include/linux/mtio.h +++ b/include/linux/mtio.h | |||
@@ -63,6 +63,7 @@ struct mtop { | |||
63 | #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ | 63 | #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ |
64 | #define MTSETPART 33 /* Change the active tape partition */ | 64 | #define MTSETPART 33 /* Change the active tape partition */ |
65 | #define MTMKPART 34 /* Format the tape with one or two partitions */ | 65 | #define MTMKPART 34 /* Format the tape with one or two partitions */ |
66 | #define MTWEOFI 35 /* write an end-of-file record (mark) in immediate mode */ | ||
66 | 67 | ||
67 | /* structure for MTIOCGET - mag tape get status command */ | 68 | /* structure for MTIOCGET - mag tape get status command */ |
68 | 69 | ||
diff --git a/include/linux/n_r3964.h b/include/linux/n_r3964.h index de24af79ebd3..54b8e0d8d916 100644 --- a/include/linux/n_r3964.h +++ b/include/linux/n_r3964.h | |||
@@ -4,7 +4,6 @@ | |||
4 | * Copyright by | 4 | * Copyright by |
5 | * Philips Automation Projects | 5 | * Philips Automation Projects |
6 | * Kassel (Germany) | 6 | * Kassel (Germany) |
7 | * http://www.pap-philips.de | ||
8 | * ----------------------------------------------------------- | 7 | * ----------------------------------------------------------- |
9 | * This software may be used and distributed according to the terms of | 8 | * This software may be used and distributed according to the terms of |
10 | * the GNU General Public License, incorporated herein by reference. | 9 | * the GNU General Public License, incorporated herein by reference. |
diff --git a/include/linux/ncp_fs.h b/include/linux/ncp_fs.h index 4522aed00906..ef663061d5ac 100644 --- a/include/linux/ncp_fs.h +++ b/include/linux/ncp_fs.h | |||
@@ -241,34 +241,6 @@ int ncp_mmap(struct file *, struct vm_area_struct *); | |||
241 | /* linux/fs/ncpfs/ncplib_kernel.c */ | 241 | /* linux/fs/ncpfs/ncplib_kernel.c */ |
242 | int ncp_make_closed(struct inode *); | 242 | int ncp_make_closed(struct inode *); |
243 | 243 | ||
244 | #define ncp_namespace(i) (NCP_SERVER(i)->name_space[NCP_FINFO(i)->volNumber]) | ||
245 | |||
246 | static inline int ncp_preserve_entry_case(struct inode *i, __u32 nscreator) | ||
247 | { | ||
248 | #ifdef CONFIG_NCPFS_SMALLDOS | ||
249 | int ns = ncp_namespace(i); | ||
250 | |||
251 | if ((ns == NW_NS_DOS) | ||
252 | #ifdef CONFIG_NCPFS_OS2_NS | ||
253 | || ((ns == NW_NS_OS2) && (nscreator == NW_NS_DOS)) | ||
254 | #endif /* CONFIG_NCPFS_OS2_NS */ | ||
255 | ) | ||
256 | return 0; | ||
257 | #endif /* CONFIG_NCPFS_SMALLDOS */ | ||
258 | return 1; | ||
259 | } | ||
260 | |||
261 | #define ncp_preserve_case(i) (ncp_namespace(i) != NW_NS_DOS) | ||
262 | |||
263 | static inline int ncp_case_sensitive(struct inode *i) | ||
264 | { | ||
265 | #ifdef CONFIG_NCPFS_NFS_NS | ||
266 | return ncp_namespace(i) == NW_NS_NFS; | ||
267 | #else | ||
268 | return 0; | ||
269 | #endif /* CONFIG_NCPFS_NFS_NS */ | ||
270 | } | ||
271 | |||
272 | #endif /* __KERNEL__ */ | 244 | #endif /* __KERNEL__ */ |
273 | 245 | ||
274 | #endif /* _LINUX_NCP_FS_H */ | 246 | #endif /* _LINUX_NCP_FS_H */ |
diff --git a/include/linux/ncp_fs_sb.h b/include/linux/ncp_fs_sb.h index 8da05bc098ca..d64b0e894336 100644 --- a/include/linux/ncp_fs_sb.h +++ b/include/linux/ncp_fs_sb.h | |||
@@ -62,6 +62,7 @@ struct ncp_server { | |||
62 | int ncp_reply_size; | 62 | int ncp_reply_size; |
63 | 63 | ||
64 | int root_setuped; | 64 | int root_setuped; |
65 | struct mutex root_setup_lock; | ||
65 | 66 | ||
66 | /* info for packet signing */ | 67 | /* info for packet signing */ |
67 | int sign_wanted; /* 1=Server needs signed packets */ | 68 | int sign_wanted; /* 1=Server needs signed packets */ |
@@ -81,13 +82,14 @@ struct ncp_server { | |||
81 | size_t len; | 82 | size_t len; |
82 | void* data; | 83 | void* data; |
83 | } priv; | 84 | } priv; |
85 | struct rw_semaphore auth_rwsem; | ||
84 | 86 | ||
85 | /* nls info: codepage for volume and charset for I/O */ | 87 | /* nls info: codepage for volume and charset for I/O */ |
86 | struct nls_table *nls_vol; | 88 | struct nls_table *nls_vol; |
87 | struct nls_table *nls_io; | 89 | struct nls_table *nls_io; |
88 | 90 | ||
89 | /* maximum age in jiffies */ | 91 | /* maximum age in jiffies */ |
90 | int dentry_ttl; | 92 | atomic_t dentry_ttl; |
91 | 93 | ||
92 | /* miscellaneous */ | 94 | /* miscellaneous */ |
93 | unsigned int flags; | 95 | unsigned int flags; |
diff --git a/include/linux/net.h b/include/linux/net.h index dee0b11a8759..16faa130088c 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -229,6 +229,8 @@ enum { | |||
229 | extern int sock_wake_async(struct socket *sk, int how, int band); | 229 | extern int sock_wake_async(struct socket *sk, int how, int band); |
230 | extern int sock_register(const struct net_proto_family *fam); | 230 | extern int sock_register(const struct net_proto_family *fam); |
231 | extern void sock_unregister(int family); | 231 | extern void sock_unregister(int family); |
232 | extern int __sock_create(struct net *net, int family, int type, int proto, | ||
233 | struct socket **res, int kern); | ||
232 | extern int sock_create(int family, int type, int proto, | 234 | extern int sock_create(int family, int type, int proto, |
233 | struct socket **res); | 235 | struct socket **res); |
234 | extern int sock_create_kern(int family, int type, int proto, | 236 | extern int sock_create_kern(int family, int type, int proto, |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 46c36ffe20ee..d8fd2c23a1b9 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -228,9 +228,9 @@ struct netdev_hw_addr { | |||
228 | #define NETDEV_HW_ADDR_T_SLAVE 3 | 228 | #define NETDEV_HW_ADDR_T_SLAVE 3 |
229 | #define NETDEV_HW_ADDR_T_UNICAST 4 | 229 | #define NETDEV_HW_ADDR_T_UNICAST 4 |
230 | #define NETDEV_HW_ADDR_T_MULTICAST 5 | 230 | #define NETDEV_HW_ADDR_T_MULTICAST 5 |
231 | int refcount; | ||
232 | bool synced; | 231 | bool synced; |
233 | bool global_use; | 232 | bool global_use; |
233 | int refcount; | ||
234 | struct rcu_head rcu_head; | 234 | struct rcu_head rcu_head; |
235 | }; | 235 | }; |
236 | 236 | ||
@@ -281,6 +281,12 @@ struct hh_cache { | |||
281 | unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; | 281 | unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; |
282 | }; | 282 | }; |
283 | 283 | ||
284 | static inline void hh_cache_put(struct hh_cache *hh) | ||
285 | { | ||
286 | if (atomic_dec_and_test(&hh->hh_refcnt)) | ||
287 | kfree(hh); | ||
288 | } | ||
289 | |||
284 | /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. | 290 | /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. |
285 | * Alternative is: | 291 | * Alternative is: |
286 | * dev->hard_header_len ? (dev->hard_header_len + | 292 | * dev->hard_header_len ? (dev->hard_header_len + |
@@ -579,15 +585,15 @@ static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, | |||
579 | table->ents[hash & table->mask] = RPS_NO_CPU; | 585 | table->ents[hash & table->mask] = RPS_NO_CPU; |
580 | } | 586 | } |
581 | 587 | ||
582 | extern struct rps_sock_flow_table *rps_sock_flow_table; | 588 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; |
583 | 589 | ||
584 | /* This structure contains an instance of an RX queue. */ | 590 | /* This structure contains an instance of an RX queue. */ |
585 | struct netdev_rx_queue { | 591 | struct netdev_rx_queue { |
586 | struct rps_map *rps_map; | 592 | struct rps_map __rcu *rps_map; |
587 | struct rps_dev_flow_table *rps_flow_table; | 593 | struct rps_dev_flow_table __rcu *rps_flow_table; |
588 | struct kobject kobj; | 594 | struct kobject kobj; |
589 | struct netdev_rx_queue *first; | 595 | struct netdev_rx_queue *first; |
590 | atomic_t count; | 596 | atomic_t count; |
591 | } ____cacheline_aligned_in_smp; | 597 | } ____cacheline_aligned_in_smp; |
592 | #endif /* CONFIG_RPS */ | 598 | #endif /* CONFIG_RPS */ |
593 | 599 | ||
@@ -884,6 +890,9 @@ struct net_device { | |||
884 | int iflink; | 890 | int iflink; |
885 | 891 | ||
886 | struct net_device_stats stats; | 892 | struct net_device_stats stats; |
893 | atomic_long_t rx_dropped; /* dropped packets by core network | ||
894 | * Do not use this in drivers. | ||
895 | */ | ||
887 | 896 | ||
888 | #ifdef CONFIG_WIRELESS_EXT | 897 | #ifdef CONFIG_WIRELESS_EXT |
889 | /* List of functions to handle Wireless Extensions (instead of ioctl). | 898 | /* List of functions to handle Wireless Extensions (instead of ioctl). |
@@ -901,7 +910,7 @@ struct net_device { | |||
901 | 910 | ||
902 | unsigned int flags; /* interface flags (a la BSD) */ | 911 | unsigned int flags; /* interface flags (a la BSD) */ |
903 | unsigned short gflags; | 912 | unsigned short gflags; |
904 | unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ | 913 | unsigned int priv_flags; /* Like 'flags' but invisible to userspace. */ |
905 | unsigned short padded; /* How much padding added by alloc_netdev() */ | 914 | unsigned short padded; /* How much padding added by alloc_netdev() */ |
906 | 915 | ||
907 | unsigned char operstate; /* RFC2863 operstate */ | 916 | unsigned char operstate; /* RFC2863 operstate */ |
@@ -918,10 +927,6 @@ struct net_device { | |||
918 | unsigned short needed_headroom; | 927 | unsigned short needed_headroom; |
919 | unsigned short needed_tailroom; | 928 | unsigned short needed_tailroom; |
920 | 929 | ||
921 | struct net_device *master; /* Pointer to master device of a group, | ||
922 | * which this device is member of. | ||
923 | */ | ||
924 | |||
925 | /* Interface address info. */ | 930 | /* Interface address info. */ |
926 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ | 931 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ |
927 | unsigned char addr_assign_type; /* hw address assignment type */ | 932 | unsigned char addr_assign_type; /* hw address assignment type */ |
@@ -937,23 +942,37 @@ struct net_device { | |||
937 | 942 | ||
938 | 943 | ||
939 | /* Protocol specific pointers */ | 944 | /* Protocol specific pointers */ |
940 | 945 | ||
946 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | ||
947 | struct vlan_group __rcu *vlgrp; /* VLAN group */ | ||
948 | #endif | ||
941 | #ifdef CONFIG_NET_DSA | 949 | #ifdef CONFIG_NET_DSA |
942 | void *dsa_ptr; /* dsa specific data */ | 950 | void *dsa_ptr; /* dsa specific data */ |
943 | #endif | 951 | #endif |
944 | void *atalk_ptr; /* AppleTalk link */ | 952 | void *atalk_ptr; /* AppleTalk link */ |
945 | void *ip_ptr; /* IPv4 specific data */ | 953 | struct in_device __rcu *ip_ptr; /* IPv4 specific data */ |
946 | void *dn_ptr; /* DECnet specific data */ | 954 | void *dn_ptr; /* DECnet specific data */ |
947 | void *ip6_ptr; /* IPv6 specific data */ | 955 | struct inet6_dev __rcu *ip6_ptr; /* IPv6 specific data */ |
948 | void *ec_ptr; /* Econet specific data */ | 956 | void *ec_ptr; /* Econet specific data */ |
949 | void *ax25_ptr; /* AX.25 specific data */ | 957 | void *ax25_ptr; /* AX.25 specific data */ |
950 | struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, | 958 | struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, |
951 | assign before registering */ | 959 | assign before registering */ |
952 | 960 | ||
953 | /* | 961 | /* |
954 | * Cache line mostly used on receive path (including eth_type_trans()) | 962 | * Cache lines mostly used on receive path (including eth_type_trans()) |
955 | */ | 963 | */ |
956 | unsigned long last_rx; /* Time of last Rx */ | 964 | unsigned long last_rx; /* Time of last Rx |
965 | * This should not be set in | ||
966 | * drivers, unless really needed, | ||
967 | * because network stack (bonding) | ||
968 | * use it if/when necessary, to | ||
969 | * avoid dirtying this cache line. | ||
970 | */ | ||
971 | |||
972 | struct net_device *master; /* Pointer to master device of a group, | ||
973 | * which this device is member of. | ||
974 | */ | ||
975 | |||
957 | /* Interface address info used in eth_type_trans() */ | 976 | /* Interface address info used in eth_type_trans() */ |
958 | unsigned char *dev_addr; /* hw address, (before bcast | 977 | unsigned char *dev_addr; /* hw address, (before bcast |
959 | because most packets are | 978 | because most packets are |
@@ -969,14 +988,21 @@ struct net_device { | |||
969 | 988 | ||
970 | struct netdev_rx_queue *_rx; | 989 | struct netdev_rx_queue *_rx; |
971 | 990 | ||
972 | /* Number of RX queues allocated at alloc_netdev_mq() time */ | 991 | /* Number of RX queues allocated at register_netdev() time */ |
973 | unsigned int num_rx_queues; | 992 | unsigned int num_rx_queues; |
993 | |||
994 | /* Number of RX queues currently active in device */ | ||
995 | unsigned int real_num_rx_queues; | ||
974 | #endif | 996 | #endif |
975 | 997 | ||
976 | struct netdev_queue rx_queue; | ||
977 | rx_handler_func_t *rx_handler; | 998 | rx_handler_func_t *rx_handler; |
978 | void *rx_handler_data; | 999 | void *rx_handler_data; |
979 | 1000 | ||
1001 | struct netdev_queue __rcu *ingress_queue; | ||
1002 | |||
1003 | /* | ||
1004 | * Cache lines mostly used on transmit path | ||
1005 | */ | ||
980 | struct netdev_queue *_tx ____cacheline_aligned_in_smp; | 1006 | struct netdev_queue *_tx ____cacheline_aligned_in_smp; |
981 | 1007 | ||
982 | /* Number of TX queues allocated at alloc_netdev_mq() time */ | 1008 | /* Number of TX queues allocated at alloc_netdev_mq() time */ |
@@ -990,9 +1016,7 @@ struct net_device { | |||
990 | 1016 | ||
991 | unsigned long tx_queue_len; /* Max frames per queue allowed */ | 1017 | unsigned long tx_queue_len; /* Max frames per queue allowed */ |
992 | spinlock_t tx_global_lock; | 1018 | spinlock_t tx_global_lock; |
993 | /* | 1019 | |
994 | * One part is mostly used on xmit path (device) | ||
995 | */ | ||
996 | /* These may be needed for future network-power-down code. */ | 1020 | /* These may be needed for future network-power-down code. */ |
997 | 1021 | ||
998 | /* | 1022 | /* |
@@ -1005,7 +1029,7 @@ struct net_device { | |||
1005 | struct timer_list watchdog_timer; | 1029 | struct timer_list watchdog_timer; |
1006 | 1030 | ||
1007 | /* Number of references to this device */ | 1031 | /* Number of references to this device */ |
1008 | atomic_t refcnt ____cacheline_aligned_in_smp; | 1032 | int __percpu *pcpu_refcnt; |
1009 | 1033 | ||
1010 | /* delayed register/unregister */ | 1034 | /* delayed register/unregister */ |
1011 | struct list_head todo_list; | 1035 | struct list_head todo_list; |
@@ -1041,10 +1065,14 @@ struct net_device { | |||
1041 | #endif | 1065 | #endif |
1042 | 1066 | ||
1043 | /* mid-layer private */ | 1067 | /* mid-layer private */ |
1044 | void *ml_priv; | 1068 | union { |
1045 | 1069 | void *ml_priv; | |
1070 | struct pcpu_lstats __percpu *lstats; /* loopback stats */ | ||
1071 | struct pcpu_tstats __percpu *tstats; /* tunnel stats */ | ||
1072 | struct pcpu_dstats __percpu *dstats; /* dummy stats */ | ||
1073 | }; | ||
1046 | /* GARP */ | 1074 | /* GARP */ |
1047 | struct garp_port *garp_port; | 1075 | struct garp_port __rcu *garp_port; |
1048 | 1076 | ||
1049 | /* class/net/name entry */ | 1077 | /* class/net/name entry */ |
1050 | struct device dev; | 1078 | struct device dev; |
@@ -1305,6 +1333,7 @@ static inline void unregister_netdevice(struct net_device *dev) | |||
1305 | unregister_netdevice_queue(dev, NULL); | 1333 | unregister_netdevice_queue(dev, NULL); |
1306 | } | 1334 | } |
1307 | 1335 | ||
1336 | extern int netdev_refcnt_read(const struct net_device *dev); | ||
1308 | extern void free_netdev(struct net_device *dev); | 1337 | extern void free_netdev(struct net_device *dev); |
1309 | extern void synchronize_net(void); | 1338 | extern void synchronize_net(void); |
1310 | extern int register_netdevice_notifier(struct notifier_block *nb); | 1339 | extern int register_netdevice_notifier(struct notifier_block *nb); |
@@ -1525,6 +1554,11 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev) | |||
1525 | 1554 | ||
1526 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) | 1555 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) |
1527 | { | 1556 | { |
1557 | if (WARN_ON(!dev_queue)) { | ||
1558 | printk(KERN_INFO "netif_stop_queue() cannot be called before " | ||
1559 | "register_netdev()"); | ||
1560 | return; | ||
1561 | } | ||
1528 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); | 1562 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); |
1529 | } | 1563 | } |
1530 | 1564 | ||
@@ -1667,11 +1701,34 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index) | |||
1667 | */ | 1701 | */ |
1668 | static inline int netif_is_multiqueue(const struct net_device *dev) | 1702 | static inline int netif_is_multiqueue(const struct net_device *dev) |
1669 | { | 1703 | { |
1670 | return (dev->num_tx_queues > 1); | 1704 | return dev->num_tx_queues > 1; |
1671 | } | 1705 | } |
1672 | 1706 | ||
1673 | extern void netif_set_real_num_tx_queues(struct net_device *dev, | 1707 | extern int netif_set_real_num_tx_queues(struct net_device *dev, |
1674 | unsigned int txq); | 1708 | unsigned int txq); |
1709 | |||
1710 | #ifdef CONFIG_RPS | ||
1711 | extern int netif_set_real_num_rx_queues(struct net_device *dev, | ||
1712 | unsigned int rxq); | ||
1713 | #else | ||
1714 | static inline int netif_set_real_num_rx_queues(struct net_device *dev, | ||
1715 | unsigned int rxq) | ||
1716 | { | ||
1717 | return 0; | ||
1718 | } | ||
1719 | #endif | ||
1720 | |||
1721 | static inline int netif_copy_real_num_queues(struct net_device *to_dev, | ||
1722 | const struct net_device *from_dev) | ||
1723 | { | ||
1724 | netif_set_real_num_tx_queues(to_dev, from_dev->real_num_tx_queues); | ||
1725 | #ifdef CONFIG_RPS | ||
1726 | return netif_set_real_num_rx_queues(to_dev, | ||
1727 | from_dev->real_num_rx_queues); | ||
1728 | #else | ||
1729 | return 0; | ||
1730 | #endif | ||
1731 | } | ||
1675 | 1732 | ||
1676 | /* Use this variant when it is known for sure that it | 1733 | /* Use this variant when it is known for sure that it |
1677 | * is executing from hardware interrupt context or with hardware interrupts | 1734 | * is executing from hardware interrupt context or with hardware interrupts |
@@ -1695,8 +1752,7 @@ extern gro_result_t dev_gro_receive(struct napi_struct *napi, | |||
1695 | extern gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb); | 1752 | extern gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb); |
1696 | extern gro_result_t napi_gro_receive(struct napi_struct *napi, | 1753 | extern gro_result_t napi_gro_receive(struct napi_struct *napi, |
1697 | struct sk_buff *skb); | 1754 | struct sk_buff *skb); |
1698 | extern void napi_reuse_skb(struct napi_struct *napi, | 1755 | extern void napi_gro_flush(struct napi_struct *napi); |
1699 | struct sk_buff *skb); | ||
1700 | extern struct sk_buff * napi_get_frags(struct napi_struct *napi); | 1756 | extern struct sk_buff * napi_get_frags(struct napi_struct *napi); |
1701 | extern gro_result_t napi_frags_finish(struct napi_struct *napi, | 1757 | extern gro_result_t napi_frags_finish(struct napi_struct *napi, |
1702 | struct sk_buff *skb, | 1758 | struct sk_buff *skb, |
@@ -1715,7 +1771,6 @@ extern int netdev_rx_handler_register(struct net_device *dev, | |||
1715 | void *rx_handler_data); | 1771 | void *rx_handler_data); |
1716 | extern void netdev_rx_handler_unregister(struct net_device *dev); | 1772 | extern void netdev_rx_handler_unregister(struct net_device *dev); |
1717 | 1773 | ||
1718 | extern void netif_nit_deliver(struct sk_buff *skb); | ||
1719 | extern int dev_valid_name(const char *name); | 1774 | extern int dev_valid_name(const char *name); |
1720 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); | 1775 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); |
1721 | extern int dev_ethtool(struct net *net, struct ifreq *); | 1776 | extern int dev_ethtool(struct net *net, struct ifreq *); |
@@ -1749,7 +1804,7 @@ extern void netdev_run_todo(void); | |||
1749 | */ | 1804 | */ |
1750 | static inline void dev_put(struct net_device *dev) | 1805 | static inline void dev_put(struct net_device *dev) |
1751 | { | 1806 | { |
1752 | atomic_dec(&dev->refcnt); | 1807 | irqsafe_cpu_dec(*dev->pcpu_refcnt); |
1753 | } | 1808 | } |
1754 | 1809 | ||
1755 | /** | 1810 | /** |
@@ -1760,7 +1815,7 @@ static inline void dev_put(struct net_device *dev) | |||
1760 | */ | 1815 | */ |
1761 | static inline void dev_hold(struct net_device *dev) | 1816 | static inline void dev_hold(struct net_device *dev) |
1762 | { | 1817 | { |
1763 | atomic_inc(&dev->refcnt); | 1818 | irqsafe_cpu_inc(*dev->pcpu_refcnt); |
1764 | } | 1819 | } |
1765 | 1820 | ||
1766 | /* Carrier loss detection, dial on demand. The functions netif_carrier_on | 1821 | /* Carrier loss detection, dial on demand. The functions netif_carrier_on |
@@ -2171,6 +2226,8 @@ extern void dev_seq_stop(struct seq_file *seq, void *v); | |||
2171 | extern int netdev_class_create_file(struct class_attribute *class_attr); | 2226 | extern int netdev_class_create_file(struct class_attribute *class_attr); |
2172 | extern void netdev_class_remove_file(struct class_attribute *class_attr); | 2227 | extern void netdev_class_remove_file(struct class_attribute *class_attr); |
2173 | 2228 | ||
2229 | extern struct kobj_ns_type_operations net_ns_type_operations; | ||
2230 | |||
2174 | extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len); | 2231 | extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len); |
2175 | 2232 | ||
2176 | extern void linkwatch_run_queue(void); | 2233 | extern void linkwatch_run_queue(void); |
@@ -2191,14 +2248,22 @@ static inline int net_gso_ok(int features, int gso_type) | |||
2191 | static inline int skb_gso_ok(struct sk_buff *skb, int features) | 2248 | static inline int skb_gso_ok(struct sk_buff *skb, int features) |
2192 | { | 2249 | { |
2193 | return net_gso_ok(features, skb_shinfo(skb)->gso_type) && | 2250 | return net_gso_ok(features, skb_shinfo(skb)->gso_type) && |
2194 | (!skb_has_frags(skb) || (features & NETIF_F_FRAGLIST)); | 2251 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); |
2195 | } | 2252 | } |
2196 | 2253 | ||
2197 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | 2254 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) |
2198 | { | 2255 | { |
2199 | return skb_is_gso(skb) && | 2256 | if (skb_is_gso(skb)) { |
2200 | (!skb_gso_ok(skb, dev->features) || | 2257 | int features = dev->features; |
2201 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | 2258 | |
2259 | if (skb->protocol == htons(ETH_P_8021Q) || skb->vlan_tci) | ||
2260 | features &= dev->vlan_features; | ||
2261 | |||
2262 | return (!skb_gso_ok(skb, features) || | ||
2263 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | ||
2264 | } | ||
2265 | |||
2266 | return 0; | ||
2202 | } | 2267 | } |
2203 | 2268 | ||
2204 | static inline void netif_set_gso_max_size(struct net_device *dev, | 2269 | static inline void netif_set_gso_max_size(struct net_device *dev, |
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 89341c32631a..03317c8d4077 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
@@ -215,7 +215,7 @@ NF_HOOK_COND(uint8_t pf, unsigned int hook, struct sk_buff *skb, | |||
215 | int ret; | 215 | int ret; |
216 | 216 | ||
217 | if (!cond || | 217 | if (!cond || |
218 | (ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN) == 1)) | 218 | ((ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN)) == 1)) |
219 | ret = okfn(skb); | 219 | ret = okfn(skb); |
220 | return ret; | 220 | return ret; |
221 | } | 221 | } |
diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 1afd18c855ec..50cdc2559a5a 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h | |||
@@ -98,8 +98,14 @@ enum ip_conntrack_events { | |||
98 | 98 | ||
99 | enum ip_conntrack_expect_events { | 99 | enum ip_conntrack_expect_events { |
100 | IPEXP_NEW, /* new expectation */ | 100 | IPEXP_NEW, /* new expectation */ |
101 | IPEXP_DESTROY, /* destroyed expectation */ | ||
101 | }; | 102 | }; |
102 | 103 | ||
104 | /* expectation flags */ | ||
105 | #define NF_CT_EXPECT_PERMANENT 0x1 | ||
106 | #define NF_CT_EXPECT_INACTIVE 0x2 | ||
107 | #define NF_CT_EXPECT_USERSPACE 0x4 | ||
108 | |||
103 | #ifdef __KERNEL__ | 109 | #ifdef __KERNEL__ |
104 | struct ip_conntrack_stat { | 110 | struct ip_conntrack_stat { |
105 | unsigned int searched; | 111 | unsigned int searched; |
diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h index ff8cfbcf3b81..0ce91d56a5f2 100644 --- a/include/linux/netfilter/nf_conntrack_sip.h +++ b/include/linux/netfilter/nf_conntrack_sip.h | |||
@@ -89,6 +89,7 @@ enum sip_header_types { | |||
89 | SIP_HDR_VIA_TCP, | 89 | SIP_HDR_VIA_TCP, |
90 | SIP_HDR_EXPIRES, | 90 | SIP_HDR_EXPIRES, |
91 | SIP_HDR_CONTENT_LENGTH, | 91 | SIP_HDR_CONTENT_LENGTH, |
92 | SIP_HDR_CALL_ID, | ||
92 | }; | 93 | }; |
93 | 94 | ||
94 | enum sdp_header_types { | 95 | enum sdp_header_types { |
diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index 9ed534c991b9..19711e3ffd42 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h | |||
@@ -39,8 +39,9 @@ enum ctattr_type { | |||
39 | CTA_TUPLE_MASTER, | 39 | CTA_TUPLE_MASTER, |
40 | CTA_NAT_SEQ_ADJ_ORIG, | 40 | CTA_NAT_SEQ_ADJ_ORIG, |
41 | CTA_NAT_SEQ_ADJ_REPLY, | 41 | CTA_NAT_SEQ_ADJ_REPLY, |
42 | CTA_SECMARK, | 42 | CTA_SECMARK, /* obsolete */ |
43 | CTA_ZONE, | 43 | CTA_ZONE, |
44 | CTA_SECCTX, | ||
44 | __CTA_MAX | 45 | __CTA_MAX |
45 | }; | 46 | }; |
46 | #define CTA_MAX (__CTA_MAX - 1) | 47 | #define CTA_MAX (__CTA_MAX - 1) |
@@ -161,6 +162,7 @@ enum ctattr_expect { | |||
161 | CTA_EXPECT_ID, | 162 | CTA_EXPECT_ID, |
162 | CTA_EXPECT_HELP_NAME, | 163 | CTA_EXPECT_HELP_NAME, |
163 | CTA_EXPECT_ZONE, | 164 | CTA_EXPECT_ZONE, |
165 | CTA_EXPECT_FLAGS, | ||
164 | __CTA_EXPECT_MAX | 166 | __CTA_EXPECT_MAX |
165 | }; | 167 | }; |
166 | #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1) | 168 | #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1) |
@@ -172,4 +174,11 @@ enum ctattr_help { | |||
172 | }; | 174 | }; |
173 | #define CTA_HELP_MAX (__CTA_HELP_MAX - 1) | 175 | #define CTA_HELP_MAX (__CTA_HELP_MAX - 1) |
174 | 176 | ||
177 | enum ctattr_secctx { | ||
178 | CTA_SECCTX_UNSPEC, | ||
179 | CTA_SECCTX_NAME, | ||
180 | __CTA_SECCTX_MAX | ||
181 | }; | ||
182 | #define CTA_SECCTX_MAX (__CTA_SECCTX_MAX - 1) | ||
183 | |||
175 | #endif /* _IPCONNTRACK_NETLINK_H */ | 184 | #endif /* _IPCONNTRACK_NETLINK_H */ |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 24e5d01d27d0..742bec051440 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
@@ -66,6 +66,11 @@ struct xt_standard_target { | |||
66 | int verdict; | 66 | int verdict; |
67 | }; | 67 | }; |
68 | 68 | ||
69 | struct xt_error_target { | ||
70 | struct xt_entry_target target; | ||
71 | char errorname[XT_FUNCTION_MAXNAMELEN]; | ||
72 | }; | ||
73 | |||
69 | /* The argument to IPT_SO_GET_REVISION_*. Returns highest revision | 74 | /* The argument to IPT_SO_GET_REVISION_*. Returns highest revision |
70 | * kernel supports, if >= revision. */ | 75 | * kernel supports, if >= revision. */ |
71 | struct xt_get_revision { | 76 | struct xt_get_revision { |
diff --git a/include/linux/netfilter/xt_SECMARK.h b/include/linux/netfilter/xt_SECMARK.h index 6fcd3448b186..989092bd6274 100644 --- a/include/linux/netfilter/xt_SECMARK.h +++ b/include/linux/netfilter/xt_SECMARK.h | |||
@@ -11,18 +11,12 @@ | |||
11 | * packets are being marked for. | 11 | * packets are being marked for. |
12 | */ | 12 | */ |
13 | #define SECMARK_MODE_SEL 0x01 /* SELinux */ | 13 | #define SECMARK_MODE_SEL 0x01 /* SELinux */ |
14 | #define SECMARK_SELCTX_MAX 256 | 14 | #define SECMARK_SECCTX_MAX 256 |
15 | |||
16 | struct xt_secmark_target_selinux_info { | ||
17 | __u32 selsid; | ||
18 | char selctx[SECMARK_SELCTX_MAX]; | ||
19 | }; | ||
20 | 15 | ||
21 | struct xt_secmark_target_info { | 16 | struct xt_secmark_target_info { |
22 | __u8 mode; | 17 | __u8 mode; |
23 | union { | 18 | __u32 secid; |
24 | struct xt_secmark_target_selinux_info sel; | 19 | char secctx[SECMARK_SECCTX_MAX]; |
25 | } u; | ||
26 | }; | 20 | }; |
27 | 21 | ||
28 | #endif /*_XT_SECMARK_H_target */ | 22 | #endif /*_XT_SECMARK_H_target */ |
diff --git a/include/linux/netfilter/xt_TPROXY.h b/include/linux/netfilter/xt_TPROXY.h index 152e8f97132b..3f3d69361289 100644 --- a/include/linux/netfilter/xt_TPROXY.h +++ b/include/linux/netfilter/xt_TPROXY.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef _XT_TPROXY_H_target | 1 | #ifndef _XT_TPROXY_H |
2 | #define _XT_TPROXY_H_target | 2 | #define _XT_TPROXY_H |
3 | 3 | ||
4 | /* TPROXY target is capable of marking the packet to perform | 4 | /* TPROXY target is capable of marking the packet to perform |
5 | * redirection. We can get rid of that whenever we get support for | 5 | * redirection. We can get rid of that whenever we get support for |
@@ -11,4 +11,11 @@ struct xt_tproxy_target_info { | |||
11 | __be16 lport; | 11 | __be16 lport; |
12 | }; | 12 | }; |
13 | 13 | ||
14 | #endif /* _XT_TPROXY_H_target */ | 14 | struct xt_tproxy_target_info_v1 { |
15 | u_int32_t mark_mask; | ||
16 | u_int32_t mark_value; | ||
17 | union nf_inet_addr laddr; | ||
18 | __be16 lport; | ||
19 | }; | ||
20 | |||
21 | #endif /* _XT_TPROXY_H */ | ||
diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index e9948c0560f6..adbf4bff87ed 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h | |||
@@ -21,8 +21,21 @@ | |||
21 | 21 | ||
22 | #include <linux/netfilter/x_tables.h> | 22 | #include <linux/netfilter/x_tables.h> |
23 | 23 | ||
24 | #ifndef __KERNEL__ | ||
24 | #define ARPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN | 25 | #define ARPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN |
25 | #define ARPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN | 26 | #define ARPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN |
27 | #define arpt_entry_target xt_entry_target | ||
28 | #define arpt_standard_target xt_standard_target | ||
29 | #define arpt_error_target xt_error_target | ||
30 | #define ARPT_CONTINUE XT_CONTINUE | ||
31 | #define ARPT_RETURN XT_RETURN | ||
32 | #define arpt_counters_info xt_counters_info | ||
33 | #define arpt_counters xt_counters | ||
34 | #define ARPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
35 | #define ARPT_ERROR_TARGET XT_ERROR_TARGET | ||
36 | #define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
37 | XT_ENTRY_ITERATE(struct arpt_entry, entries, size, fn, ## args) | ||
38 | #endif | ||
26 | 39 | ||
27 | #define ARPT_DEV_ADDR_LEN_MAX 16 | 40 | #define ARPT_DEV_ADDR_LEN_MAX 16 |
28 | 41 | ||
@@ -63,9 +76,6 @@ struct arpt_arp { | |||
63 | u_int16_t invflags; | 76 | u_int16_t invflags; |
64 | }; | 77 | }; |
65 | 78 | ||
66 | #define arpt_entry_target xt_entry_target | ||
67 | #define arpt_standard_target xt_standard_target | ||
68 | |||
69 | /* Values for "flag" field in struct arpt_ip (general arp structure). | 79 | /* Values for "flag" field in struct arpt_ip (general arp structure). |
70 | * No flags defined yet. | 80 | * No flags defined yet. |
71 | */ | 81 | */ |
@@ -125,16 +135,10 @@ struct arpt_entry | |||
125 | #define ARPT_SO_GET_REVISION_TARGET (ARPT_BASE_CTL + 3) | 135 | #define ARPT_SO_GET_REVISION_TARGET (ARPT_BASE_CTL + 3) |
126 | #define ARPT_SO_GET_MAX (ARPT_SO_GET_REVISION_TARGET) | 136 | #define ARPT_SO_GET_MAX (ARPT_SO_GET_REVISION_TARGET) |
127 | 137 | ||
128 | /* CONTINUE verdict for targets */ | ||
129 | #define ARPT_CONTINUE XT_CONTINUE | ||
130 | |||
131 | /* For standard target */ | ||
132 | #define ARPT_RETURN XT_RETURN | ||
133 | |||
134 | /* The argument to ARPT_SO_GET_INFO */ | 138 | /* The argument to ARPT_SO_GET_INFO */ |
135 | struct arpt_getinfo { | 139 | struct arpt_getinfo { |
136 | /* Which table: caller fills this in. */ | 140 | /* Which table: caller fills this in. */ |
137 | char name[ARPT_TABLE_MAXNAMELEN]; | 141 | char name[XT_TABLE_MAXNAMELEN]; |
138 | 142 | ||
139 | /* Kernel fills these in. */ | 143 | /* Kernel fills these in. */ |
140 | /* Which hook entry points are valid: bitmask */ | 144 | /* Which hook entry points are valid: bitmask */ |
@@ -156,7 +160,7 @@ struct arpt_getinfo { | |||
156 | /* The argument to ARPT_SO_SET_REPLACE. */ | 160 | /* The argument to ARPT_SO_SET_REPLACE. */ |
157 | struct arpt_replace { | 161 | struct arpt_replace { |
158 | /* Which table. */ | 162 | /* Which table. */ |
159 | char name[ARPT_TABLE_MAXNAMELEN]; | 163 | char name[XT_TABLE_MAXNAMELEN]; |
160 | 164 | ||
161 | /* Which hook entry points are valid: bitmask. You can't | 165 | /* Which hook entry points are valid: bitmask. You can't |
162 | change this. */ | 166 | change this. */ |
@@ -184,14 +188,10 @@ struct arpt_replace { | |||
184 | struct arpt_entry entries[0]; | 188 | struct arpt_entry entries[0]; |
185 | }; | 189 | }; |
186 | 190 | ||
187 | /* The argument to ARPT_SO_ADD_COUNTERS. */ | ||
188 | #define arpt_counters_info xt_counters_info | ||
189 | #define arpt_counters xt_counters | ||
190 | |||
191 | /* The argument to ARPT_SO_GET_ENTRIES. */ | 191 | /* The argument to ARPT_SO_GET_ENTRIES. */ |
192 | struct arpt_get_entries { | 192 | struct arpt_get_entries { |
193 | /* Which table: user fills this in. */ | 193 | /* Which table: user fills this in. */ |
194 | char name[ARPT_TABLE_MAXNAMELEN]; | 194 | char name[XT_TABLE_MAXNAMELEN]; |
195 | 195 | ||
196 | /* User fills this in: total entry size. */ | 196 | /* User fills this in: total entry size. */ |
197 | unsigned int size; | 197 | unsigned int size; |
@@ -200,23 +200,12 @@ struct arpt_get_entries { | |||
200 | struct arpt_entry entrytable[0]; | 200 | struct arpt_entry entrytable[0]; |
201 | }; | 201 | }; |
202 | 202 | ||
203 | /* Standard return verdict, or do jump. */ | ||
204 | #define ARPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
205 | /* Error verdict. */ | ||
206 | #define ARPT_ERROR_TARGET XT_ERROR_TARGET | ||
207 | |||
208 | /* Helper functions */ | 203 | /* Helper functions */ |
209 | static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e) | 204 | static __inline__ struct xt_entry_target *arpt_get_target(struct arpt_entry *e) |
210 | { | 205 | { |
211 | return (void *)e + e->target_offset; | 206 | return (void *)e + e->target_offset; |
212 | } | 207 | } |
213 | 208 | ||
214 | #ifndef __KERNEL__ | ||
215 | /* fn returns 0 to continue iteration */ | ||
216 | #define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
217 | XT_ENTRY_ITERATE(struct arpt_entry, entries, size, fn, ## args) | ||
218 | #endif | ||
219 | |||
220 | /* | 209 | /* |
221 | * Main firewall chains definitions and global var's definitions. | 210 | * Main firewall chains definitions and global var's definitions. |
222 | */ | 211 | */ |
@@ -225,17 +214,12 @@ static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e | |||
225 | /* Standard entry. */ | 214 | /* Standard entry. */ |
226 | struct arpt_standard { | 215 | struct arpt_standard { |
227 | struct arpt_entry entry; | 216 | struct arpt_entry entry; |
228 | struct arpt_standard_target target; | 217 | struct xt_standard_target target; |
229 | }; | ||
230 | |||
231 | struct arpt_error_target { | ||
232 | struct arpt_entry_target target; | ||
233 | char errorname[ARPT_FUNCTION_MAXNAMELEN]; | ||
234 | }; | 218 | }; |
235 | 219 | ||
236 | struct arpt_error { | 220 | struct arpt_error { |
237 | struct arpt_entry entry; | 221 | struct arpt_entry entry; |
238 | struct arpt_error_target target; | 222 | struct xt_error_target target; |
239 | }; | 223 | }; |
240 | 224 | ||
241 | #define ARPT_ENTRY_INIT(__size) \ | 225 | #define ARPT_ENTRY_INIT(__size) \ |
@@ -247,16 +231,16 @@ struct arpt_error { | |||
247 | #define ARPT_STANDARD_INIT(__verdict) \ | 231 | #define ARPT_STANDARD_INIT(__verdict) \ |
248 | { \ | 232 | { \ |
249 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_standard)), \ | 233 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_standard)), \ |
250 | .target = XT_TARGET_INIT(ARPT_STANDARD_TARGET, \ | 234 | .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ |
251 | sizeof(struct arpt_standard_target)), \ | 235 | sizeof(struct xt_standard_target)), \ |
252 | .target.verdict = -(__verdict) - 1, \ | 236 | .target.verdict = -(__verdict) - 1, \ |
253 | } | 237 | } |
254 | 238 | ||
255 | #define ARPT_ERROR_INIT \ | 239 | #define ARPT_ERROR_INIT \ |
256 | { \ | 240 | { \ |
257 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_error)), \ | 241 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_error)), \ |
258 | .target = XT_TARGET_INIT(ARPT_ERROR_TARGET, \ | 242 | .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ |
259 | sizeof(struct arpt_error_target)), \ | 243 | sizeof(struct xt_error_target)), \ |
260 | .target.errorname = "ERROR", \ | 244 | .target.errorname = "ERROR", \ |
261 | } | 245 | } |
262 | 246 | ||
@@ -271,8 +255,6 @@ extern unsigned int arpt_do_table(struct sk_buff *skb, | |||
271 | const struct net_device *out, | 255 | const struct net_device *out, |
272 | struct xt_table *table); | 256 | struct xt_table *table); |
273 | 257 | ||
274 | #define ARPT_ALIGN(s) XT_ALIGN(s) | ||
275 | |||
276 | #ifdef CONFIG_COMPAT | 258 | #ifdef CONFIG_COMPAT |
277 | #include <net/compat.h> | 259 | #include <net/compat.h> |
278 | 260 | ||
@@ -285,14 +267,12 @@ struct compat_arpt_entry { | |||
285 | unsigned char elems[0]; | 267 | unsigned char elems[0]; |
286 | }; | 268 | }; |
287 | 269 | ||
288 | static inline struct arpt_entry_target * | 270 | static inline struct xt_entry_target * |
289 | compat_arpt_get_target(struct compat_arpt_entry *e) | 271 | compat_arpt_get_target(struct compat_arpt_entry *e) |
290 | { | 272 | { |
291 | return (void *)e + e->target_offset; | 273 | return (void *)e + e->target_offset; |
292 | } | 274 | } |
293 | 275 | ||
294 | #define COMPAT_ARPT_ALIGN(s) COMPAT_XT_ALIGN(s) | ||
295 | |||
296 | #endif /* CONFIG_COMPAT */ | 276 | #endif /* CONFIG_COMPAT */ |
297 | #endif /*__KERNEL__*/ | 277 | #endif /*__KERNEL__*/ |
298 | #endif /* _ARPTABLES_H */ | 278 | #endif /* _ARPTABLES_H */ |
diff --git a/include/linux/netfilter_bridge/Kbuild b/include/linux/netfilter_bridge/Kbuild index d4d78672873e..e48f1a3f5a4a 100644 --- a/include/linux/netfilter_bridge/Kbuild +++ b/include/linux/netfilter_bridge/Kbuild | |||
@@ -3,11 +3,13 @@ header-y += ebt_among.h | |||
3 | header-y += ebt_arp.h | 3 | header-y += ebt_arp.h |
4 | header-y += ebt_arpreply.h | 4 | header-y += ebt_arpreply.h |
5 | header-y += ebt_ip.h | 5 | header-y += ebt_ip.h |
6 | header-y += ebt_ip6.h | ||
6 | header-y += ebt_limit.h | 7 | header-y += ebt_limit.h |
7 | header-y += ebt_log.h | 8 | header-y += ebt_log.h |
8 | header-y += ebt_mark_m.h | 9 | header-y += ebt_mark_m.h |
9 | header-y += ebt_mark_t.h | 10 | header-y += ebt_mark_t.h |
10 | header-y += ebt_nat.h | 11 | header-y += ebt_nat.h |
12 | header-y += ebt_nflog.h | ||
11 | header-y += ebt_pkttype.h | 13 | header-y += ebt_pkttype.h |
12 | header-y += ebt_redirect.h | 14 | header-y += ebt_redirect.h |
13 | header-y += ebt_stp.h | 15 | header-y += ebt_stp.h |
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index 704a7b6e8169..64a5d95c58e8 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
@@ -27,12 +27,49 @@ | |||
27 | 27 | ||
28 | #include <linux/netfilter/x_tables.h> | 28 | #include <linux/netfilter/x_tables.h> |
29 | 29 | ||
30 | #ifndef __KERNEL__ | ||
30 | #define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN | 31 | #define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN |
31 | #define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN | 32 | #define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN |
32 | #define ipt_match xt_match | 33 | #define ipt_match xt_match |
33 | #define ipt_target xt_target | 34 | #define ipt_target xt_target |
34 | #define ipt_table xt_table | 35 | #define ipt_table xt_table |
35 | #define ipt_get_revision xt_get_revision | 36 | #define ipt_get_revision xt_get_revision |
37 | #define ipt_entry_match xt_entry_match | ||
38 | #define ipt_entry_target xt_entry_target | ||
39 | #define ipt_standard_target xt_standard_target | ||
40 | #define ipt_error_target xt_error_target | ||
41 | #define ipt_counters xt_counters | ||
42 | #define IPT_CONTINUE XT_CONTINUE | ||
43 | #define IPT_RETURN XT_RETURN | ||
44 | |||
45 | /* This group is older than old (iptables < v1.4.0-rc1~89) */ | ||
46 | #include <linux/netfilter/xt_tcpudp.h> | ||
47 | #define ipt_udp xt_udp | ||
48 | #define ipt_tcp xt_tcp | ||
49 | #define IPT_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
50 | #define IPT_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
51 | #define IPT_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
52 | #define IPT_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
53 | #define IPT_TCP_INV_MASK XT_TCP_INV_MASK | ||
54 | #define IPT_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
55 | #define IPT_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
56 | #define IPT_UDP_INV_MASK XT_UDP_INV_MASK | ||
57 | |||
58 | /* The argument to IPT_SO_ADD_COUNTERS. */ | ||
59 | #define ipt_counters_info xt_counters_info | ||
60 | /* Standard return verdict, or do jump. */ | ||
61 | #define IPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
62 | /* Error verdict. */ | ||
63 | #define IPT_ERROR_TARGET XT_ERROR_TARGET | ||
64 | |||
65 | /* fn returns 0 to continue iteration */ | ||
66 | #define IPT_MATCH_ITERATE(e, fn, args...) \ | ||
67 | XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) | ||
68 | |||
69 | /* fn returns 0 to continue iteration */ | ||
70 | #define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
71 | XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) | ||
72 | #endif | ||
36 | 73 | ||
37 | /* Yes, Virginia, you have to zero the padding. */ | 74 | /* Yes, Virginia, you have to zero the padding. */ |
38 | struct ipt_ip { | 75 | struct ipt_ip { |
@@ -52,12 +89,6 @@ struct ipt_ip { | |||
52 | u_int8_t invflags; | 89 | u_int8_t invflags; |
53 | }; | 90 | }; |
54 | 91 | ||
55 | #define ipt_entry_match xt_entry_match | ||
56 | #define ipt_entry_target xt_entry_target | ||
57 | #define ipt_standard_target xt_standard_target | ||
58 | |||
59 | #define ipt_counters xt_counters | ||
60 | |||
61 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ | 92 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ |
62 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ | 93 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ |
63 | #define IPT_F_GOTO 0x02 /* Set if jump is a goto */ | 94 | #define IPT_F_GOTO 0x02 /* Set if jump is a goto */ |
@@ -116,23 +147,6 @@ struct ipt_entry { | |||
116 | #define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) | 147 | #define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) |
117 | #define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET | 148 | #define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET |
118 | 149 | ||
119 | #define IPT_CONTINUE XT_CONTINUE | ||
120 | #define IPT_RETURN XT_RETURN | ||
121 | |||
122 | #include <linux/netfilter/xt_tcpudp.h> | ||
123 | #define ipt_udp xt_udp | ||
124 | #define ipt_tcp xt_tcp | ||
125 | |||
126 | #define IPT_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
127 | #define IPT_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
128 | #define IPT_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
129 | #define IPT_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
130 | #define IPT_TCP_INV_MASK XT_TCP_INV_MASK | ||
131 | |||
132 | #define IPT_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
133 | #define IPT_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
134 | #define IPT_UDP_INV_MASK XT_UDP_INV_MASK | ||
135 | |||
136 | /* ICMP matching stuff */ | 150 | /* ICMP matching stuff */ |
137 | struct ipt_icmp { | 151 | struct ipt_icmp { |
138 | u_int8_t type; /* type to match */ | 152 | u_int8_t type; /* type to match */ |
@@ -146,7 +160,7 @@ struct ipt_icmp { | |||
146 | /* The argument to IPT_SO_GET_INFO */ | 160 | /* The argument to IPT_SO_GET_INFO */ |
147 | struct ipt_getinfo { | 161 | struct ipt_getinfo { |
148 | /* Which table: caller fills this in. */ | 162 | /* Which table: caller fills this in. */ |
149 | char name[IPT_TABLE_MAXNAMELEN]; | 163 | char name[XT_TABLE_MAXNAMELEN]; |
150 | 164 | ||
151 | /* Kernel fills these in. */ | 165 | /* Kernel fills these in. */ |
152 | /* Which hook entry points are valid: bitmask */ | 166 | /* Which hook entry points are valid: bitmask */ |
@@ -168,7 +182,7 @@ struct ipt_getinfo { | |||
168 | /* The argument to IPT_SO_SET_REPLACE. */ | 182 | /* The argument to IPT_SO_SET_REPLACE. */ |
169 | struct ipt_replace { | 183 | struct ipt_replace { |
170 | /* Which table. */ | 184 | /* Which table. */ |
171 | char name[IPT_TABLE_MAXNAMELEN]; | 185 | char name[XT_TABLE_MAXNAMELEN]; |
172 | 186 | ||
173 | /* Which hook entry points are valid: bitmask. You can't | 187 | /* Which hook entry points are valid: bitmask. You can't |
174 | change this. */ | 188 | change this. */ |
@@ -196,13 +210,10 @@ struct ipt_replace { | |||
196 | struct ipt_entry entries[0]; | 210 | struct ipt_entry entries[0]; |
197 | }; | 211 | }; |
198 | 212 | ||
199 | /* The argument to IPT_SO_ADD_COUNTERS. */ | ||
200 | #define ipt_counters_info xt_counters_info | ||
201 | |||
202 | /* The argument to IPT_SO_GET_ENTRIES. */ | 213 | /* The argument to IPT_SO_GET_ENTRIES. */ |
203 | struct ipt_get_entries { | 214 | struct ipt_get_entries { |
204 | /* Which table: user fills this in. */ | 215 | /* Which table: user fills this in. */ |
205 | char name[IPT_TABLE_MAXNAMELEN]; | 216 | char name[XT_TABLE_MAXNAMELEN]; |
206 | 217 | ||
207 | /* User fills this in: total entry size. */ | 218 | /* User fills this in: total entry size. */ |
208 | unsigned int size; | 219 | unsigned int size; |
@@ -211,28 +222,13 @@ struct ipt_get_entries { | |||
211 | struct ipt_entry entrytable[0]; | 222 | struct ipt_entry entrytable[0]; |
212 | }; | 223 | }; |
213 | 224 | ||
214 | /* Standard return verdict, or do jump. */ | ||
215 | #define IPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
216 | /* Error verdict. */ | ||
217 | #define IPT_ERROR_TARGET XT_ERROR_TARGET | ||
218 | |||
219 | /* Helper functions */ | 225 | /* Helper functions */ |
220 | static __inline__ struct ipt_entry_target * | 226 | static __inline__ struct xt_entry_target * |
221 | ipt_get_target(struct ipt_entry *e) | 227 | ipt_get_target(struct ipt_entry *e) |
222 | { | 228 | { |
223 | return (void *)e + e->target_offset; | 229 | return (void *)e + e->target_offset; |
224 | } | 230 | } |
225 | 231 | ||
226 | #ifndef __KERNEL__ | ||
227 | /* fn returns 0 to continue iteration */ | ||
228 | #define IPT_MATCH_ITERATE(e, fn, args...) \ | ||
229 | XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) | ||
230 | |||
231 | /* fn returns 0 to continue iteration */ | ||
232 | #define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
233 | XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) | ||
234 | #endif | ||
235 | |||
236 | /* | 232 | /* |
237 | * Main firewall chains definitions and global var's definitions. | 233 | * Main firewall chains definitions and global var's definitions. |
238 | */ | 234 | */ |
@@ -249,17 +245,12 @@ extern void ipt_unregister_table(struct net *net, struct xt_table *table); | |||
249 | /* Standard entry. */ | 245 | /* Standard entry. */ |
250 | struct ipt_standard { | 246 | struct ipt_standard { |
251 | struct ipt_entry entry; | 247 | struct ipt_entry entry; |
252 | struct ipt_standard_target target; | 248 | struct xt_standard_target target; |
253 | }; | ||
254 | |||
255 | struct ipt_error_target { | ||
256 | struct ipt_entry_target target; | ||
257 | char errorname[IPT_FUNCTION_MAXNAMELEN]; | ||
258 | }; | 249 | }; |
259 | 250 | ||
260 | struct ipt_error { | 251 | struct ipt_error { |
261 | struct ipt_entry entry; | 252 | struct ipt_entry entry; |
262 | struct ipt_error_target target; | 253 | struct xt_error_target target; |
263 | }; | 254 | }; |
264 | 255 | ||
265 | #define IPT_ENTRY_INIT(__size) \ | 256 | #define IPT_ENTRY_INIT(__size) \ |
@@ -271,7 +262,7 @@ struct ipt_error { | |||
271 | #define IPT_STANDARD_INIT(__verdict) \ | 262 | #define IPT_STANDARD_INIT(__verdict) \ |
272 | { \ | 263 | { \ |
273 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_standard)), \ | 264 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_standard)), \ |
274 | .target = XT_TARGET_INIT(IPT_STANDARD_TARGET, \ | 265 | .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ |
275 | sizeof(struct xt_standard_target)), \ | 266 | sizeof(struct xt_standard_target)), \ |
276 | .target.verdict = -(__verdict) - 1, \ | 267 | .target.verdict = -(__verdict) - 1, \ |
277 | } | 268 | } |
@@ -279,8 +270,8 @@ struct ipt_error { | |||
279 | #define IPT_ERROR_INIT \ | 270 | #define IPT_ERROR_INIT \ |
280 | { \ | 271 | { \ |
281 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_error)), \ | 272 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_error)), \ |
282 | .target = XT_TARGET_INIT(IPT_ERROR_TARGET, \ | 273 | .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ |
283 | sizeof(struct ipt_error_target)), \ | 274 | sizeof(struct xt_error_target)), \ |
284 | .target.errorname = "ERROR", \ | 275 | .target.errorname = "ERROR", \ |
285 | } | 276 | } |
286 | 277 | ||
@@ -291,8 +282,6 @@ extern unsigned int ipt_do_table(struct sk_buff *skb, | |||
291 | const struct net_device *out, | 282 | const struct net_device *out, |
292 | struct xt_table *table); | 283 | struct xt_table *table); |
293 | 284 | ||
294 | #define IPT_ALIGN(s) XT_ALIGN(s) | ||
295 | |||
296 | #ifdef CONFIG_COMPAT | 285 | #ifdef CONFIG_COMPAT |
297 | #include <net/compat.h> | 286 | #include <net/compat.h> |
298 | 287 | ||
@@ -307,14 +296,12 @@ struct compat_ipt_entry { | |||
307 | }; | 296 | }; |
308 | 297 | ||
309 | /* Helper functions */ | 298 | /* Helper functions */ |
310 | static inline struct ipt_entry_target * | 299 | static inline struct xt_entry_target * |
311 | compat_ipt_get_target(struct compat_ipt_entry *e) | 300 | compat_ipt_get_target(struct compat_ipt_entry *e) |
312 | { | 301 | { |
313 | return (void *)e + e->target_offset; | 302 | return (void *)e + e->target_offset; |
314 | } | 303 | } |
315 | 304 | ||
316 | #define COMPAT_IPT_ALIGN(s) COMPAT_XT_ALIGN(s) | ||
317 | |||
318 | #endif /* CONFIG_COMPAT */ | 305 | #endif /* CONFIG_COMPAT */ |
319 | #endif /*__KERNEL__*/ | 306 | #endif /*__KERNEL__*/ |
320 | #endif /* _IPTABLES_H */ | 307 | #endif /* _IPTABLES_H */ |
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index 18442ff19c07..c9784f7a9c1f 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
@@ -27,13 +27,42 @@ | |||
27 | 27 | ||
28 | #include <linux/netfilter/x_tables.h> | 28 | #include <linux/netfilter/x_tables.h> |
29 | 29 | ||
30 | #ifndef __KERNEL__ | ||
30 | #define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN | 31 | #define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN |
31 | #define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN | 32 | #define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN |
32 | |||
33 | #define ip6t_match xt_match | 33 | #define ip6t_match xt_match |
34 | #define ip6t_target xt_target | 34 | #define ip6t_target xt_target |
35 | #define ip6t_table xt_table | 35 | #define ip6t_table xt_table |
36 | #define ip6t_get_revision xt_get_revision | 36 | #define ip6t_get_revision xt_get_revision |
37 | #define ip6t_entry_match xt_entry_match | ||
38 | #define ip6t_entry_target xt_entry_target | ||
39 | #define ip6t_standard_target xt_standard_target | ||
40 | #define ip6t_error_target xt_error_target | ||
41 | #define ip6t_counters xt_counters | ||
42 | #define IP6T_CONTINUE XT_CONTINUE | ||
43 | #define IP6T_RETURN XT_RETURN | ||
44 | |||
45 | /* Pre-iptables-1.4.0 */ | ||
46 | #include <linux/netfilter/xt_tcpudp.h> | ||
47 | #define ip6t_tcp xt_tcp | ||
48 | #define ip6t_udp xt_udp | ||
49 | #define IP6T_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
50 | #define IP6T_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
51 | #define IP6T_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
52 | #define IP6T_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
53 | #define IP6T_TCP_INV_MASK XT_TCP_INV_MASK | ||
54 | #define IP6T_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
55 | #define IP6T_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
56 | #define IP6T_UDP_INV_MASK XT_UDP_INV_MASK | ||
57 | |||
58 | #define ip6t_counters_info xt_counters_info | ||
59 | #define IP6T_STANDARD_TARGET XT_STANDARD_TARGET | ||
60 | #define IP6T_ERROR_TARGET XT_ERROR_TARGET | ||
61 | #define IP6T_MATCH_ITERATE(e, fn, args...) \ | ||
62 | XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) | ||
63 | #define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
64 | XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) | ||
65 | #endif | ||
37 | 66 | ||
38 | /* Yes, Virginia, you have to zero the padding. */ | 67 | /* Yes, Virginia, you have to zero the padding. */ |
39 | struct ip6t_ip6 { | 68 | struct ip6t_ip6 { |
@@ -62,12 +91,6 @@ struct ip6t_ip6 { | |||
62 | u_int8_t invflags; | 91 | u_int8_t invflags; |
63 | }; | 92 | }; |
64 | 93 | ||
65 | #define ip6t_entry_match xt_entry_match | ||
66 | #define ip6t_entry_target xt_entry_target | ||
67 | #define ip6t_standard_target xt_standard_target | ||
68 | |||
69 | #define ip6t_counters xt_counters | ||
70 | |||
71 | /* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ | 94 | /* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ |
72 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper | 95 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper |
73 | protocols */ | 96 | protocols */ |
@@ -112,17 +135,12 @@ struct ip6t_entry { | |||
112 | /* Standard entry */ | 135 | /* Standard entry */ |
113 | struct ip6t_standard { | 136 | struct ip6t_standard { |
114 | struct ip6t_entry entry; | 137 | struct ip6t_entry entry; |
115 | struct ip6t_standard_target target; | 138 | struct xt_standard_target target; |
116 | }; | ||
117 | |||
118 | struct ip6t_error_target { | ||
119 | struct ip6t_entry_target target; | ||
120 | char errorname[IP6T_FUNCTION_MAXNAMELEN]; | ||
121 | }; | 139 | }; |
122 | 140 | ||
123 | struct ip6t_error { | 141 | struct ip6t_error { |
124 | struct ip6t_entry entry; | 142 | struct ip6t_entry entry; |
125 | struct ip6t_error_target target; | 143 | struct xt_error_target target; |
126 | }; | 144 | }; |
127 | 145 | ||
128 | #define IP6T_ENTRY_INIT(__size) \ | 146 | #define IP6T_ENTRY_INIT(__size) \ |
@@ -134,16 +152,16 @@ struct ip6t_error { | |||
134 | #define IP6T_STANDARD_INIT(__verdict) \ | 152 | #define IP6T_STANDARD_INIT(__verdict) \ |
135 | { \ | 153 | { \ |
136 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)), \ | 154 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)), \ |
137 | .target = XT_TARGET_INIT(IP6T_STANDARD_TARGET, \ | 155 | .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ |
138 | sizeof(struct ip6t_standard_target)), \ | 156 | sizeof(struct xt_standard_target)), \ |
139 | .target.verdict = -(__verdict) - 1, \ | 157 | .target.verdict = -(__verdict) - 1, \ |
140 | } | 158 | } |
141 | 159 | ||
142 | #define IP6T_ERROR_INIT \ | 160 | #define IP6T_ERROR_INIT \ |
143 | { \ | 161 | { \ |
144 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)), \ | 162 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)), \ |
145 | .target = XT_TARGET_INIT(IP6T_ERROR_TARGET, \ | 163 | .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ |
146 | sizeof(struct ip6t_error_target)), \ | 164 | sizeof(struct xt_error_target)), \ |
147 | .target.errorname = "ERROR", \ | 165 | .target.errorname = "ERROR", \ |
148 | } | 166 | } |
149 | 167 | ||
@@ -166,30 +184,6 @@ struct ip6t_error { | |||
166 | #define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) | 184 | #define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) |
167 | #define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET | 185 | #define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET |
168 | 186 | ||
169 | /* CONTINUE verdict for targets */ | ||
170 | #define IP6T_CONTINUE XT_CONTINUE | ||
171 | |||
172 | /* For standard target */ | ||
173 | #define IP6T_RETURN XT_RETURN | ||
174 | |||
175 | /* TCP/UDP matching stuff */ | ||
176 | #include <linux/netfilter/xt_tcpudp.h> | ||
177 | |||
178 | #define ip6t_tcp xt_tcp | ||
179 | #define ip6t_udp xt_udp | ||
180 | |||
181 | /* Values for "inv" field in struct ipt_tcp. */ | ||
182 | #define IP6T_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
183 | #define IP6T_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
184 | #define IP6T_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
185 | #define IP6T_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
186 | #define IP6T_TCP_INV_MASK XT_TCP_INV_MASK | ||
187 | |||
188 | /* Values for "invflags" field in struct ipt_udp. */ | ||
189 | #define IP6T_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
190 | #define IP6T_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
191 | #define IP6T_UDP_INV_MASK XT_UDP_INV_MASK | ||
192 | |||
193 | /* ICMP matching stuff */ | 187 | /* ICMP matching stuff */ |
194 | struct ip6t_icmp { | 188 | struct ip6t_icmp { |
195 | u_int8_t type; /* type to match */ | 189 | u_int8_t type; /* type to match */ |
@@ -203,7 +197,7 @@ struct ip6t_icmp { | |||
203 | /* The argument to IP6T_SO_GET_INFO */ | 197 | /* The argument to IP6T_SO_GET_INFO */ |
204 | struct ip6t_getinfo { | 198 | struct ip6t_getinfo { |
205 | /* Which table: caller fills this in. */ | 199 | /* Which table: caller fills this in. */ |
206 | char name[IP6T_TABLE_MAXNAMELEN]; | 200 | char name[XT_TABLE_MAXNAMELEN]; |
207 | 201 | ||
208 | /* Kernel fills these in. */ | 202 | /* Kernel fills these in. */ |
209 | /* Which hook entry points are valid: bitmask */ | 203 | /* Which hook entry points are valid: bitmask */ |
@@ -225,7 +219,7 @@ struct ip6t_getinfo { | |||
225 | /* The argument to IP6T_SO_SET_REPLACE. */ | 219 | /* The argument to IP6T_SO_SET_REPLACE. */ |
226 | struct ip6t_replace { | 220 | struct ip6t_replace { |
227 | /* Which table. */ | 221 | /* Which table. */ |
228 | char name[IP6T_TABLE_MAXNAMELEN]; | 222 | char name[XT_TABLE_MAXNAMELEN]; |
229 | 223 | ||
230 | /* Which hook entry points are valid: bitmask. You can't | 224 | /* Which hook entry points are valid: bitmask. You can't |
231 | change this. */ | 225 | change this. */ |
@@ -253,13 +247,10 @@ struct ip6t_replace { | |||
253 | struct ip6t_entry entries[0]; | 247 | struct ip6t_entry entries[0]; |
254 | }; | 248 | }; |
255 | 249 | ||
256 | /* The argument to IP6T_SO_ADD_COUNTERS. */ | ||
257 | #define ip6t_counters_info xt_counters_info | ||
258 | |||
259 | /* The argument to IP6T_SO_GET_ENTRIES. */ | 250 | /* The argument to IP6T_SO_GET_ENTRIES. */ |
260 | struct ip6t_get_entries { | 251 | struct ip6t_get_entries { |
261 | /* Which table: user fills this in. */ | 252 | /* Which table: user fills this in. */ |
262 | char name[IP6T_TABLE_MAXNAMELEN]; | 253 | char name[XT_TABLE_MAXNAMELEN]; |
263 | 254 | ||
264 | /* User fills this in: total entry size. */ | 255 | /* User fills this in: total entry size. */ |
265 | unsigned int size; | 256 | unsigned int size; |
@@ -268,28 +259,13 @@ struct ip6t_get_entries { | |||
268 | struct ip6t_entry entrytable[0]; | 259 | struct ip6t_entry entrytable[0]; |
269 | }; | 260 | }; |
270 | 261 | ||
271 | /* Standard return verdict, or do jump. */ | ||
272 | #define IP6T_STANDARD_TARGET XT_STANDARD_TARGET | ||
273 | /* Error verdict. */ | ||
274 | #define IP6T_ERROR_TARGET XT_ERROR_TARGET | ||
275 | |||
276 | /* Helper functions */ | 262 | /* Helper functions */ |
277 | static __inline__ struct ip6t_entry_target * | 263 | static __inline__ struct xt_entry_target * |
278 | ip6t_get_target(struct ip6t_entry *e) | 264 | ip6t_get_target(struct ip6t_entry *e) |
279 | { | 265 | { |
280 | return (void *)e + e->target_offset; | 266 | return (void *)e + e->target_offset; |
281 | } | 267 | } |
282 | 268 | ||
283 | #ifndef __KERNEL__ | ||
284 | /* fn returns 0 to continue iteration */ | ||
285 | #define IP6T_MATCH_ITERATE(e, fn, args...) \ | ||
286 | XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) | ||
287 | |||
288 | /* fn returns 0 to continue iteration */ | ||
289 | #define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
290 | XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) | ||
291 | #endif | ||
292 | |||
293 | /* | 269 | /* |
294 | * Main firewall chains definitions and global var's definitions. | 270 | * Main firewall chains definitions and global var's definitions. |
295 | */ | 271 | */ |
@@ -316,8 +292,6 @@ extern int ip6t_ext_hdr(u8 nexthdr); | |||
316 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | 292 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, |
317 | int target, unsigned short *fragoff); | 293 | int target, unsigned short *fragoff); |
318 | 294 | ||
319 | #define IP6T_ALIGN(s) XT_ALIGN(s) | ||
320 | |||
321 | #ifdef CONFIG_COMPAT | 295 | #ifdef CONFIG_COMPAT |
322 | #include <net/compat.h> | 296 | #include <net/compat.h> |
323 | 297 | ||
@@ -331,14 +305,12 @@ struct compat_ip6t_entry { | |||
331 | unsigned char elems[0]; | 305 | unsigned char elems[0]; |
332 | }; | 306 | }; |
333 | 307 | ||
334 | static inline struct ip6t_entry_target * | 308 | static inline struct xt_entry_target * |
335 | compat_ip6t_get_target(struct compat_ip6t_entry *e) | 309 | compat_ip6t_get_target(struct compat_ip6t_entry *e) |
336 | { | 310 | { |
337 | return (void *)e + e->target_offset; | 311 | return (void *)e + e->target_offset; |
338 | } | 312 | } |
339 | 313 | ||
340 | #define COMPAT_IP6T_ALIGN(s) COMPAT_XT_ALIGN(s) | ||
341 | |||
342 | #endif /* CONFIG_COMPAT */ | 314 | #endif /* CONFIG_COMPAT */ |
343 | #endif /*__KERNEL__*/ | 315 | #endif /*__KERNEL__*/ |
344 | #endif /* _IP6_TABLES_H */ | 316 | #endif /* _IP6_TABLES_H */ |
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 50d8009be86c..79358bb712c6 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h | |||
@@ -14,7 +14,6 @@ | |||
14 | 14 | ||
15 | struct netpoll { | 15 | struct netpoll { |
16 | struct net_device *dev; | 16 | struct net_device *dev; |
17 | struct net_device *real_dev; | ||
18 | char dev_name[IFNAMSIZ]; | 17 | char dev_name[IFNAMSIZ]; |
19 | const char *name; | 18 | const char *name; |
20 | void (*rx_hook)(struct netpoll *, int, char *, int); | 19 | void (*rx_hook)(struct netpoll *, int, char *, int); |
@@ -53,7 +52,13 @@ void netpoll_set_trap(int trap); | |||
53 | void __netpoll_cleanup(struct netpoll *np); | 52 | void __netpoll_cleanup(struct netpoll *np); |
54 | void netpoll_cleanup(struct netpoll *np); | 53 | void netpoll_cleanup(struct netpoll *np); |
55 | int __netpoll_rx(struct sk_buff *skb); | 54 | int __netpoll_rx(struct sk_buff *skb); |
56 | void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb); | 55 | void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, |
56 | struct net_device *dev); | ||
57 | static inline void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) | ||
58 | { | ||
59 | netpoll_send_skb_on_dev(np, skb, np->dev); | ||
60 | } | ||
61 | |||
57 | 62 | ||
58 | 63 | ||
59 | #ifdef CONFIG_NETPOLL | 64 | #ifdef CONFIG_NETPOLL |
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 07e40c625972..4925b22219d2 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
@@ -17,7 +17,9 @@ | |||
17 | 17 | ||
18 | #define NFS4_BITMAP_SIZE 2 | 18 | #define NFS4_BITMAP_SIZE 2 |
19 | #define NFS4_VERIFIER_SIZE 8 | 19 | #define NFS4_VERIFIER_SIZE 8 |
20 | #define NFS4_STATEID_SIZE 16 | 20 | #define NFS4_STATEID_SEQID_SIZE 4 |
21 | #define NFS4_STATEID_OTHER_SIZE 12 | ||
22 | #define NFS4_STATEID_SIZE (NFS4_STATEID_SEQID_SIZE + NFS4_STATEID_OTHER_SIZE) | ||
21 | #define NFS4_FHSIZE 128 | 23 | #define NFS4_FHSIZE 128 |
22 | #define NFS4_MAXPATHLEN PATH_MAX | 24 | #define NFS4_MAXPATHLEN PATH_MAX |
23 | #define NFS4_MAXNAMLEN NAME_MAX | 25 | #define NFS4_MAXNAMLEN NAME_MAX |
@@ -61,6 +63,9 @@ | |||
61 | #define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000 | 63 | #define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000 |
62 | #define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED 0x20000 | 64 | #define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED 0x20000 |
63 | 65 | ||
66 | #define NFS4_CDFC4_FORE 0x1 | ||
67 | #define NFS4_CDFC4_BACK 0x2 | ||
68 | |||
64 | #define NFS4_SET_TO_SERVER_TIME 0 | 69 | #define NFS4_SET_TO_SERVER_TIME 0 |
65 | #define NFS4_SET_TO_CLIENT_TIME 1 | 70 | #define NFS4_SET_TO_CLIENT_TIME 1 |
66 | 71 | ||
@@ -167,7 +172,16 @@ struct nfs4_acl { | |||
167 | }; | 172 | }; |
168 | 173 | ||
169 | typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier; | 174 | typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier; |
170 | typedef struct { char data[NFS4_STATEID_SIZE]; } nfs4_stateid; | 175 | |
176 | struct nfs41_stateid { | ||
177 | __be32 seqid; | ||
178 | char other[NFS4_STATEID_OTHER_SIZE]; | ||
179 | } __attribute__ ((packed)); | ||
180 | |||
181 | typedef union { | ||
182 | char data[NFS4_STATEID_SIZE]; | ||
183 | struct nfs41_stateid stateid; | ||
184 | } nfs4_stateid; | ||
171 | 185 | ||
172 | enum nfs_opnum4 { | 186 | enum nfs_opnum4 { |
173 | OP_ACCESS = 3, | 187 | OP_ACCESS = 3, |
@@ -471,6 +485,8 @@ enum lock_type4 { | |||
471 | #define FATTR4_WORD1_TIME_MODIFY (1UL << 21) | 485 | #define FATTR4_WORD1_TIME_MODIFY (1UL << 21) |
472 | #define FATTR4_WORD1_TIME_MODIFY_SET (1UL << 22) | 486 | #define FATTR4_WORD1_TIME_MODIFY_SET (1UL << 22) |
473 | #define FATTR4_WORD1_MOUNTED_ON_FILEID (1UL << 23) | 487 | #define FATTR4_WORD1_MOUNTED_ON_FILEID (1UL << 23) |
488 | #define FATTR4_WORD1_FS_LAYOUT_TYPES (1UL << 30) | ||
489 | #define FATTR4_WORD2_LAYOUT_BLKSIZE (1UL << 1) | ||
474 | 490 | ||
475 | #define NFSPROC4_NULL 0 | 491 | #define NFSPROC4_NULL 0 |
476 | #define NFSPROC4_COMPOUND 1 | 492 | #define NFSPROC4_COMPOUND 1 |
@@ -532,6 +548,8 @@ enum { | |||
532 | NFSPROC4_CLNT_SEQUENCE, | 548 | NFSPROC4_CLNT_SEQUENCE, |
533 | NFSPROC4_CLNT_GET_LEASE_TIME, | 549 | NFSPROC4_CLNT_GET_LEASE_TIME, |
534 | NFSPROC4_CLNT_RECLAIM_COMPLETE, | 550 | NFSPROC4_CLNT_RECLAIM_COMPLETE, |
551 | NFSPROC4_CLNT_LAYOUTGET, | ||
552 | NFSPROC4_CLNT_GETDEVICEINFO, | ||
535 | }; | 553 | }; |
536 | 554 | ||
537 | /* nfs41 types */ | 555 | /* nfs41 types */ |
@@ -550,6 +568,49 @@ enum state_protect_how4 { | |||
550 | SP4_SSV = 2 | 568 | SP4_SSV = 2 |
551 | }; | 569 | }; |
552 | 570 | ||
571 | enum pnfs_layouttype { | ||
572 | LAYOUT_NFSV4_1_FILES = 1, | ||
573 | LAYOUT_OSD2_OBJECTS = 2, | ||
574 | LAYOUT_BLOCK_VOLUME = 3, | ||
575 | }; | ||
576 | |||
577 | /* used for both layout return and recall */ | ||
578 | enum pnfs_layoutreturn_type { | ||
579 | RETURN_FILE = 1, | ||
580 | RETURN_FSID = 2, | ||
581 | RETURN_ALL = 3 | ||
582 | }; | ||
583 | |||
584 | enum pnfs_iomode { | ||
585 | IOMODE_READ = 1, | ||
586 | IOMODE_RW = 2, | ||
587 | IOMODE_ANY = 3, | ||
588 | }; | ||
589 | |||
590 | enum pnfs_notify_deviceid_type4 { | ||
591 | NOTIFY_DEVICEID4_CHANGE = 1 << 1, | ||
592 | NOTIFY_DEVICEID4_DELETE = 1 << 2, | ||
593 | }; | ||
594 | |||
595 | #define NFL4_UFLG_MASK 0x0000003F | ||
596 | #define NFL4_UFLG_DENSE 0x00000001 | ||
597 | #define NFL4_UFLG_COMMIT_THRU_MDS 0x00000002 | ||
598 | #define NFL4_UFLG_STRIPE_UNIT_SIZE_MASK 0xFFFFFFC0 | ||
599 | |||
600 | /* Encoded in the loh_body field of type layouthint4 */ | ||
601 | enum filelayout_hint_care4 { | ||
602 | NFLH4_CARE_DENSE = NFL4_UFLG_DENSE, | ||
603 | NFLH4_CARE_COMMIT_THRU_MDS = NFL4_UFLG_COMMIT_THRU_MDS, | ||
604 | NFLH4_CARE_STRIPE_UNIT_SIZE = 0x00000040, | ||
605 | NFLH4_CARE_STRIPE_COUNT = 0x00000080 | ||
606 | }; | ||
607 | |||
608 | #define NFS4_DEVICEID4_SIZE 16 | ||
609 | |||
610 | struct nfs4_deviceid { | ||
611 | char data[NFS4_DEVICEID4_SIZE]; | ||
612 | }; | ||
613 | |||
553 | #endif | 614 | #endif |
554 | #endif | 615 | #endif |
555 | 616 | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 508f8cf6da37..bba26684acdc 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -185,9 +185,12 @@ struct nfs_inode { | |||
185 | struct nfs4_cached_acl *nfs4_acl; | 185 | struct nfs4_cached_acl *nfs4_acl; |
186 | /* NFSv4 state */ | 186 | /* NFSv4 state */ |
187 | struct list_head open_states; | 187 | struct list_head open_states; |
188 | struct nfs_delegation *delegation; | 188 | struct nfs_delegation __rcu *delegation; |
189 | fmode_t delegation_state; | 189 | fmode_t delegation_state; |
190 | struct rw_semaphore rwsem; | 190 | struct rw_semaphore rwsem; |
191 | |||
192 | /* pNFS layout information */ | ||
193 | struct pnfs_layout_hdr *layout; | ||
191 | #endif /* CONFIG_NFS_V4*/ | 194 | #endif /* CONFIG_NFS_V4*/ |
192 | #ifdef CONFIG_NFS_FSCACHE | 195 | #ifdef CONFIG_NFS_FSCACHE |
193 | struct fscache_cookie *fscache; | 196 | struct fscache_cookie *fscache; |
@@ -360,10 +363,13 @@ extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr); | |||
360 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); | 363 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); |
361 | extern void put_nfs_open_context(struct nfs_open_context *ctx); | 364 | extern void put_nfs_open_context(struct nfs_open_context *ctx); |
362 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); | 365 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); |
366 | extern struct nfs_open_context *alloc_nfs_open_context(struct path *path, struct rpc_cred *cred, fmode_t f_mode); | ||
367 | extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx); | ||
363 | extern struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx); | 368 | extern struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx); |
364 | extern void nfs_put_lock_context(struct nfs_lock_context *l_ctx); | 369 | extern void nfs_put_lock_context(struct nfs_lock_context *l_ctx); |
365 | extern u64 nfs_compat_user_ino64(u64 fileid); | 370 | extern u64 nfs_compat_user_ino64(u64 fileid); |
366 | extern void nfs_fattr_init(struct nfs_fattr *fattr); | 371 | extern void nfs_fattr_init(struct nfs_fattr *fattr); |
372 | extern unsigned long nfs_inc_attr_generation_counter(void); | ||
367 | 373 | ||
368 | extern struct nfs_fattr *nfs_alloc_fattr(void); | 374 | extern struct nfs_fattr *nfs_alloc_fattr(void); |
369 | 375 | ||
@@ -379,9 +385,12 @@ static inline void nfs_free_fhandle(const struct nfs_fh *fh) | |||
379 | kfree(fh); | 385 | kfree(fh); |
380 | } | 386 | } |
381 | 387 | ||
388 | /* | ||
389 | * linux/fs/nfs/nfsroot.c | ||
390 | */ | ||
391 | extern int nfs_root_data(char **root_device, char **root_data); /*__init*/ | ||
382 | /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ | 392 | /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ |
383 | extern __be32 root_nfs_parse_addr(char *name); /*__init*/ | 393 | extern __be32 root_nfs_parse_addr(char *name); /*__init*/ |
384 | extern unsigned long nfs_inc_attr_generation_counter(void); | ||
385 | 394 | ||
386 | /* | 395 | /* |
387 | * linux/fs/nfs/file.c | 396 | * linux/fs/nfs/file.c |
@@ -479,10 +488,10 @@ extern void nfs_release_automount_timer(void); | |||
479 | /* | 488 | /* |
480 | * linux/fs/nfs/unlink.c | 489 | * linux/fs/nfs/unlink.c |
481 | */ | 490 | */ |
482 | extern int nfs_async_unlink(struct inode *dir, struct dentry *dentry); | ||
483 | extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); | 491 | extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); |
484 | extern void nfs_block_sillyrename(struct dentry *dentry); | 492 | extern void nfs_block_sillyrename(struct dentry *dentry); |
485 | extern void nfs_unblock_sillyrename(struct dentry *dentry); | 493 | extern void nfs_unblock_sillyrename(struct dentry *dentry); |
494 | extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry); | ||
486 | 495 | ||
487 | /* | 496 | /* |
488 | * linux/fs/nfs/write.c | 497 | * linux/fs/nfs/write.c |
@@ -584,10 +593,6 @@ nfs_fileid_to_ino_t(u64 fileid) | |||
584 | return ino; | 593 | return ino; |
585 | } | 594 | } |
586 | 595 | ||
587 | /* NFS root */ | ||
588 | |||
589 | extern void * nfs_root_data(void); | ||
590 | |||
591 | #define nfs_wait_event(clnt, wq, condition) \ | 596 | #define nfs_wait_event(clnt, wq, condition) \ |
592 | ({ \ | 597 | ({ \ |
593 | int __retval = wait_event_killable(wq, condition); \ | 598 | int __retval = wait_event_killable(wq, condition); \ |
@@ -613,6 +618,8 @@ extern void * nfs_root_data(void); | |||
613 | #define NFSDBG_CLIENT 0x0200 | 618 | #define NFSDBG_CLIENT 0x0200 |
614 | #define NFSDBG_MOUNT 0x0400 | 619 | #define NFSDBG_MOUNT 0x0400 |
615 | #define NFSDBG_FSCACHE 0x0800 | 620 | #define NFSDBG_FSCACHE 0x0800 |
621 | #define NFSDBG_PNFS 0x1000 | ||
622 | #define NFSDBG_PNFS_LD 0x2000 | ||
616 | #define NFSDBG_ALL 0xFFFF | 623 | #define NFSDBG_ALL 0xFFFF |
617 | 624 | ||
618 | #ifdef __KERNEL__ | 625 | #ifdef __KERNEL__ |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index c82ee7cd6288..452d96436d26 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -82,6 +82,8 @@ struct nfs_client { | |||
82 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ | 82 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ |
83 | u32 cl_exchange_flags; | 83 | u32 cl_exchange_flags; |
84 | struct nfs4_session *cl_session; /* sharred session */ | 84 | struct nfs4_session *cl_session; /* sharred session */ |
85 | struct list_head cl_layouts; | ||
86 | struct pnfs_deviceid_cache *cl_devid_cache; /* pNFS deviceid cache */ | ||
85 | #endif /* CONFIG_NFS_V4_1 */ | 87 | #endif /* CONFIG_NFS_V4_1 */ |
86 | 88 | ||
87 | #ifdef CONFIG_NFS_FSCACHE | 89 | #ifdef CONFIG_NFS_FSCACHE |
@@ -124,6 +126,7 @@ struct nfs_server { | |||
124 | 126 | ||
125 | struct nfs_fsid fsid; | 127 | struct nfs_fsid fsid; |
126 | __u64 maxfilesize; /* maximum file size */ | 128 | __u64 maxfilesize; /* maximum file size */ |
129 | struct timespec time_delta; /* smallest time granularity */ | ||
127 | unsigned long mount_time; /* when this fs was mounted */ | 130 | unsigned long mount_time; /* when this fs was mounted */ |
128 | dev_t s_dev; /* superblock dev numbers */ | 131 | dev_t s_dev; /* superblock dev numbers */ |
129 | 132 | ||
@@ -144,6 +147,7 @@ struct nfs_server { | |||
144 | u32 acl_bitmask; /* V4 bitmask representing the ACEs | 147 | u32 acl_bitmask; /* V4 bitmask representing the ACEs |
145 | that are supported on this | 148 | that are supported on this |
146 | filesystem */ | 149 | filesystem */ |
150 | struct pnfs_layoutdriver_type *pnfs_curr_ld; /* Active layout driver */ | ||
147 | #endif | 151 | #endif |
148 | void (*destroy)(struct nfs_server *); | 152 | void (*destroy)(struct nfs_server *); |
149 | 153 | ||
diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h index 91a1c24e0cbf..e8352dc5afb5 100644 --- a/include/linux/nfs_idmap.h +++ b/include/linux/nfs_idmap.h | |||
@@ -66,13 +66,40 @@ struct idmap_msg { | |||
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 | 68 | ||
69 | #ifdef CONFIG_NFS_USE_NEW_IDMAPPER | ||
70 | |||
71 | int nfs_idmap_init(void); | ||
72 | void nfs_idmap_quit(void); | ||
73 | |||
74 | static inline int nfs_idmap_new(struct nfs_client *clp) | ||
75 | { | ||
76 | return 0; | ||
77 | } | ||
78 | |||
79 | static inline void nfs_idmap_delete(struct nfs_client *clp) | ||
80 | { | ||
81 | } | ||
82 | |||
83 | #else /* CONFIG_NFS_USE_NEW_IDMAPPER not set */ | ||
84 | |||
85 | static inline int nfs_idmap_init(void) | ||
86 | { | ||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | static inline void nfs_idmap_quit(void) | ||
91 | { | ||
92 | } | ||
93 | |||
69 | int nfs_idmap_new(struct nfs_client *); | 94 | int nfs_idmap_new(struct nfs_client *); |
70 | void nfs_idmap_delete(struct nfs_client *); | 95 | void nfs_idmap_delete(struct nfs_client *); |
71 | 96 | ||
97 | #endif /* CONFIG_NFS_USE_NEW_IDMAPPER */ | ||
98 | |||
72 | int nfs_map_name_to_uid(struct nfs_client *, const char *, size_t, __u32 *); | 99 | int nfs_map_name_to_uid(struct nfs_client *, const char *, size_t, __u32 *); |
73 | int nfs_map_group_to_gid(struct nfs_client *, const char *, size_t, __u32 *); | 100 | int nfs_map_group_to_gid(struct nfs_client *, const char *, size_t, __u32 *); |
74 | int nfs_map_uid_to_name(struct nfs_client *, __u32, char *); | 101 | int nfs_map_uid_to_name(struct nfs_client *, __u32, char *, size_t); |
75 | int nfs_map_gid_to_group(struct nfs_client *, __u32, char *); | 102 | int nfs_map_gid_to_group(struct nfs_client *, __u32, char *, size_t); |
76 | 103 | ||
77 | extern unsigned int nfs_idmap_cache_timeout; | 104 | extern unsigned int nfs_idmap_cache_timeout; |
78 | #endif /* __KERNEL__ */ | 105 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/nfs_mount.h b/include/linux/nfs_mount.h index 5d59ae861aa6..576bddd72e04 100644 --- a/include/linux/nfs_mount.h +++ b/include/linux/nfs_mount.h | |||
@@ -71,4 +71,7 @@ struct nfs_mount_data { | |||
71 | #define NFS_MOUNT_NORESVPORT 0x40000 | 71 | #define NFS_MOUNT_NORESVPORT 0x40000 |
72 | #define NFS_MOUNT_LEGACY_INTERFACE 0x80000 | 72 | #define NFS_MOUNT_LEGACY_INTERFACE 0x80000 |
73 | 73 | ||
74 | #define NFS_MOUNT_LOCAL_FLOCK 0x100000 | ||
75 | #define NFS_MOUNT_LOCAL_FCNTL 0x200000 | ||
76 | |||
74 | #endif | 77 | #endif |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index fc461926c412..ba6cc8f223c9 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -112,7 +112,9 @@ struct nfs_fsinfo { | |||
112 | __u32 wtmult; /* writes should be multiple of this */ | 112 | __u32 wtmult; /* writes should be multiple of this */ |
113 | __u32 dtpref; /* pref. readdir transfer size */ | 113 | __u32 dtpref; /* pref. readdir transfer size */ |
114 | __u64 maxfilesize; | 114 | __u64 maxfilesize; |
115 | struct timespec time_delta; /* server time granularity */ | ||
115 | __u32 lease_time; /* in seconds */ | 116 | __u32 lease_time; /* in seconds */ |
117 | __u32 layouttype; /* supported pnfs layout driver */ | ||
116 | }; | 118 | }; |
117 | 119 | ||
118 | struct nfs_fsstat { | 120 | struct nfs_fsstat { |
@@ -170,7 +172,7 @@ struct nfs4_sequence_args { | |||
170 | 172 | ||
171 | struct nfs4_sequence_res { | 173 | struct nfs4_sequence_res { |
172 | struct nfs4_session *sr_session; | 174 | struct nfs4_session *sr_session; |
173 | u8 sr_slotid; /* slot used to send request */ | 175 | struct nfs4_slot *sr_slot; /* slot used to send request */ |
174 | int sr_status; /* sequence operation status */ | 176 | int sr_status; /* sequence operation status */ |
175 | unsigned long sr_renewal_time; | 177 | unsigned long sr_renewal_time; |
176 | u32 sr_status_flags; | 178 | u32 sr_status_flags; |
@@ -185,6 +187,55 @@ struct nfs4_get_lease_time_res { | |||
185 | struct nfs4_sequence_res lr_seq_res; | 187 | struct nfs4_sequence_res lr_seq_res; |
186 | }; | 188 | }; |
187 | 189 | ||
190 | #define PNFS_LAYOUT_MAXSIZE 4096 | ||
191 | |||
192 | struct nfs4_layoutdriver_data { | ||
193 | __u32 len; | ||
194 | void *buf; | ||
195 | }; | ||
196 | |||
197 | struct pnfs_layout_range { | ||
198 | u32 iomode; | ||
199 | u64 offset; | ||
200 | u64 length; | ||
201 | }; | ||
202 | |||
203 | struct nfs4_layoutget_args { | ||
204 | __u32 type; | ||
205 | struct pnfs_layout_range range; | ||
206 | __u64 minlength; | ||
207 | __u32 maxcount; | ||
208 | struct inode *inode; | ||
209 | struct nfs_open_context *ctx; | ||
210 | struct nfs4_sequence_args seq_args; | ||
211 | }; | ||
212 | |||
213 | struct nfs4_layoutget_res { | ||
214 | __u32 return_on_close; | ||
215 | struct pnfs_layout_range range; | ||
216 | __u32 type; | ||
217 | nfs4_stateid stateid; | ||
218 | struct nfs4_layoutdriver_data layout; | ||
219 | struct nfs4_sequence_res seq_res; | ||
220 | }; | ||
221 | |||
222 | struct nfs4_layoutget { | ||
223 | struct nfs4_layoutget_args args; | ||
224 | struct nfs4_layoutget_res res; | ||
225 | struct pnfs_layout_segment **lsegpp; | ||
226 | int status; | ||
227 | }; | ||
228 | |||
229 | struct nfs4_getdeviceinfo_args { | ||
230 | struct pnfs_device *pdev; | ||
231 | struct nfs4_sequence_args seq_args; | ||
232 | }; | ||
233 | |||
234 | struct nfs4_getdeviceinfo_res { | ||
235 | struct pnfs_device *pdev; | ||
236 | struct nfs4_sequence_res seq_res; | ||
237 | }; | ||
238 | |||
188 | /* | 239 | /* |
189 | * Arguments to the open call. | 240 | * Arguments to the open call. |
190 | */ | 241 | */ |
@@ -400,6 +451,27 @@ struct nfs_removeres { | |||
400 | }; | 451 | }; |
401 | 452 | ||
402 | /* | 453 | /* |
454 | * Common arguments to the rename call | ||
455 | */ | ||
456 | struct nfs_renameargs { | ||
457 | const struct nfs_fh *old_dir; | ||
458 | const struct nfs_fh *new_dir; | ||
459 | const struct qstr *old_name; | ||
460 | const struct qstr *new_name; | ||
461 | const u32 *bitmask; | ||
462 | struct nfs4_sequence_args seq_args; | ||
463 | }; | ||
464 | |||
465 | struct nfs_renameres { | ||
466 | const struct nfs_server *server; | ||
467 | struct nfs4_change_info old_cinfo; | ||
468 | struct nfs_fattr *old_fattr; | ||
469 | struct nfs4_change_info new_cinfo; | ||
470 | struct nfs_fattr *new_fattr; | ||
471 | struct nfs4_sequence_res seq_res; | ||
472 | }; | ||
473 | |||
474 | /* | ||
403 | * Argument struct for decode_entry function | 475 | * Argument struct for decode_entry function |
404 | */ | 476 | */ |
405 | struct nfs_entry { | 477 | struct nfs_entry { |
@@ -434,15 +506,6 @@ struct nfs_createargs { | |||
434 | struct iattr * sattr; | 506 | struct iattr * sattr; |
435 | }; | 507 | }; |
436 | 508 | ||
437 | struct nfs_renameargs { | ||
438 | struct nfs_fh * fromfh; | ||
439 | const char * fromname; | ||
440 | unsigned int fromlen; | ||
441 | struct nfs_fh * tofh; | ||
442 | const char * toname; | ||
443 | unsigned int tolen; | ||
444 | }; | ||
445 | |||
446 | struct nfs_setattrargs { | 509 | struct nfs_setattrargs { |
447 | struct nfs_fh * fh; | 510 | struct nfs_fh * fh; |
448 | nfs4_stateid stateid; | 511 | nfs4_stateid stateid; |
@@ -586,15 +649,6 @@ struct nfs3_mknodargs { | |||
586 | dev_t rdev; | 649 | dev_t rdev; |
587 | }; | 650 | }; |
588 | 651 | ||
589 | struct nfs3_renameargs { | ||
590 | struct nfs_fh * fromfh; | ||
591 | const char * fromname; | ||
592 | unsigned int fromlen; | ||
593 | struct nfs_fh * tofh; | ||
594 | const char * toname; | ||
595 | unsigned int tolen; | ||
596 | }; | ||
597 | |||
598 | struct nfs3_linkargs { | 652 | struct nfs3_linkargs { |
599 | struct nfs_fh * fromfh; | 653 | struct nfs_fh * fromfh; |
600 | struct nfs_fh * tofh; | 654 | struct nfs_fh * tofh; |
@@ -629,11 +683,6 @@ struct nfs3_readlinkargs { | |||
629 | struct page ** pages; | 683 | struct page ** pages; |
630 | }; | 684 | }; |
631 | 685 | ||
632 | struct nfs3_renameres { | ||
633 | struct nfs_fattr * fromattr; | ||
634 | struct nfs_fattr * toattr; | ||
635 | }; | ||
636 | |||
637 | struct nfs3_linkres { | 686 | struct nfs3_linkres { |
638 | struct nfs_fattr * dir_attr; | 687 | struct nfs_fattr * dir_attr; |
639 | struct nfs_fattr * fattr; | 688 | struct nfs_fattr * fattr; |
@@ -780,6 +829,7 @@ struct nfs4_readdir_arg { | |||
780 | struct page ** pages; /* zero-copy data */ | 829 | struct page ** pages; /* zero-copy data */ |
781 | unsigned int pgbase; /* zero-copy data */ | 830 | unsigned int pgbase; /* zero-copy data */ |
782 | const u32 * bitmask; | 831 | const u32 * bitmask; |
832 | int plus; | ||
783 | struct nfs4_sequence_args seq_args; | 833 | struct nfs4_sequence_args seq_args; |
784 | }; | 834 | }; |
785 | 835 | ||
@@ -801,24 +851,6 @@ struct nfs4_readlink_res { | |||
801 | struct nfs4_sequence_res seq_res; | 851 | struct nfs4_sequence_res seq_res; |
802 | }; | 852 | }; |
803 | 853 | ||
804 | struct nfs4_rename_arg { | ||
805 | const struct nfs_fh * old_dir; | ||
806 | const struct nfs_fh * new_dir; | ||
807 | const struct qstr * old_name; | ||
808 | const struct qstr * new_name; | ||
809 | const u32 * bitmask; | ||
810 | struct nfs4_sequence_args seq_args; | ||
811 | }; | ||
812 | |||
813 | struct nfs4_rename_res { | ||
814 | const struct nfs_server * server; | ||
815 | struct nfs4_change_info old_cinfo; | ||
816 | struct nfs_fattr * old_fattr; | ||
817 | struct nfs4_change_info new_cinfo; | ||
818 | struct nfs_fattr * new_fattr; | ||
819 | struct nfs4_sequence_res seq_res; | ||
820 | }; | ||
821 | |||
822 | #define NFS4_SETCLIENTID_NAMELEN (127) | 854 | #define NFS4_SETCLIENTID_NAMELEN (127) |
823 | struct nfs4_setclientid { | 855 | struct nfs4_setclientid { |
824 | const nfs4_verifier * sc_verifier; | 856 | const nfs4_verifier * sc_verifier; |
@@ -1032,19 +1064,21 @@ struct nfs_rpc_ops { | |||
1032 | int (*readlink)(struct inode *, struct page *, unsigned int, | 1064 | int (*readlink)(struct inode *, struct page *, unsigned int, |
1033 | unsigned int); | 1065 | unsigned int); |
1034 | int (*create) (struct inode *, struct dentry *, | 1066 | int (*create) (struct inode *, struct dentry *, |
1035 | struct iattr *, int, struct nameidata *); | 1067 | struct iattr *, int, struct nfs_open_context *); |
1036 | int (*remove) (struct inode *, struct qstr *); | 1068 | int (*remove) (struct inode *, struct qstr *); |
1037 | void (*unlink_setup) (struct rpc_message *, struct inode *dir); | 1069 | void (*unlink_setup) (struct rpc_message *, struct inode *dir); |
1038 | int (*unlink_done) (struct rpc_task *, struct inode *); | 1070 | int (*unlink_done) (struct rpc_task *, struct inode *); |
1039 | int (*rename) (struct inode *, struct qstr *, | 1071 | int (*rename) (struct inode *, struct qstr *, |
1040 | struct inode *, struct qstr *); | 1072 | struct inode *, struct qstr *); |
1073 | void (*rename_setup) (struct rpc_message *msg, struct inode *dir); | ||
1074 | int (*rename_done) (struct rpc_task *task, struct inode *old_dir, struct inode *new_dir); | ||
1041 | int (*link) (struct inode *, struct inode *, struct qstr *); | 1075 | int (*link) (struct inode *, struct inode *, struct qstr *); |
1042 | int (*symlink) (struct inode *, struct dentry *, struct page *, | 1076 | int (*symlink) (struct inode *, struct dentry *, struct page *, |
1043 | unsigned int, struct iattr *); | 1077 | unsigned int, struct iattr *); |
1044 | int (*mkdir) (struct inode *, struct dentry *, struct iattr *); | 1078 | int (*mkdir) (struct inode *, struct dentry *, struct iattr *); |
1045 | int (*rmdir) (struct inode *, struct qstr *); | 1079 | int (*rmdir) (struct inode *, struct qstr *); |
1046 | int (*readdir) (struct dentry *, struct rpc_cred *, | 1080 | int (*readdir) (struct dentry *, struct rpc_cred *, |
1047 | u64, struct page *, unsigned int, int); | 1081 | u64, struct page **, unsigned int, int); |
1048 | int (*mknod) (struct inode *, struct dentry *, struct iattr *, | 1082 | int (*mknod) (struct inode *, struct dentry *, struct iattr *, |
1049 | dev_t); | 1083 | dev_t); |
1050 | int (*statfs) (struct nfs_server *, struct nfs_fh *, | 1084 | int (*statfs) (struct nfs_server *, struct nfs_fh *, |
@@ -1054,7 +1088,7 @@ struct nfs_rpc_ops { | |||
1054 | int (*pathconf) (struct nfs_server *, struct nfs_fh *, | 1088 | int (*pathconf) (struct nfs_server *, struct nfs_fh *, |
1055 | struct nfs_pathconf *); | 1089 | struct nfs_pathconf *); |
1056 | int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); | 1090 | int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); |
1057 | __be32 *(*decode_dirent)(__be32 *, struct nfs_entry *, int plus); | 1091 | __be32 *(*decode_dirent)(struct xdr_stream *, struct nfs_entry *, struct nfs_server *, int plus); |
1058 | void (*read_setup) (struct nfs_read_data *, struct rpc_message *); | 1092 | void (*read_setup) (struct nfs_read_data *, struct rpc_message *); |
1059 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); | 1093 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); |
1060 | void (*write_setup) (struct nfs_write_data *, struct rpc_message *); | 1094 | void (*write_setup) (struct nfs_write_data *, struct rpc_message *); |
@@ -1065,6 +1099,10 @@ struct nfs_rpc_ops { | |||
1065 | int (*lock_check_bounds)(const struct file_lock *); | 1099 | int (*lock_check_bounds)(const struct file_lock *); |
1066 | void (*clear_acl_cache)(struct inode *); | 1100 | void (*clear_acl_cache)(struct inode *); |
1067 | void (*close_context)(struct nfs_open_context *ctx, int); | 1101 | void (*close_context)(struct nfs_open_context *ctx, int); |
1102 | struct inode * (*open_context) (struct inode *dir, | ||
1103 | struct nfs_open_context *ctx, | ||
1104 | int open_flags, | ||
1105 | struct iattr *iattr); | ||
1068 | }; | 1106 | }; |
1069 | 1107 | ||
1070 | /* | 1108 | /* |
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h index f5487b6f91ed..227e49dd5720 100644 --- a/include/linux/nilfs2_fs.h +++ b/include/linux/nilfs2_fs.h | |||
@@ -4,16 +4,16 @@ | |||
4 | * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. | 4 | * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 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 | 7 | * it under the terms of the GNU Lesser General Public License as published |
8 | * the Free Software Foundation; either version 2 of the License, or | 8 | * by the Free Software Foundation; either version 2.1 of the License, or |
9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
10 | * | 10 | * |
11 | * This program is distributed in the hope that it will be useful, | 11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU Lesser General Public License for more details. |
15 | * | 15 | * |
16 | * You should have received a copy of the GNU General Public License | 16 | * You should have received a copy of the GNU Lesser General Public License |
17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
19 | * | 19 | * |
@@ -147,7 +147,6 @@ struct nilfs_super_root { | |||
147 | #define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ | 147 | #define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ |
148 | #define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ | 148 | #define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ |
149 | #define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ | 149 | #define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ |
150 | #define NILFS_MOUNT_SNAPSHOT 0x0080 /* Snapshot flag */ | ||
151 | #define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ | 150 | #define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ |
152 | #define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order | 151 | #define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order |
153 | semantics also for data */ | 152 | semantics also for data */ |
@@ -229,6 +228,7 @@ struct nilfs_super_block { | |||
229 | */ | 228 | */ |
230 | #define NILFS_CURRENT_REV 2 /* current major revision */ | 229 | #define NILFS_CURRENT_REV 2 /* current major revision */ |
231 | #define NILFS_MINOR_REV 0 /* minor revision */ | 230 | #define NILFS_MINOR_REV 0 /* minor revision */ |
231 | #define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */ | ||
232 | 232 | ||
233 | /* | 233 | /* |
234 | * Feature set definitions | 234 | * Feature set definitions |
@@ -270,6 +270,14 @@ struct nilfs_super_block { | |||
270 | segments */ | 270 | segments */ |
271 | 271 | ||
272 | /* | 272 | /* |
273 | * We call DAT, cpfile, and sufile root metadata files. Inodes of | ||
274 | * these files are written in super root block instead of ifile, and | ||
275 | * garbage collector doesn't keep any past versions of these files. | ||
276 | */ | ||
277 | #define NILFS_ROOT_METADATA_FILE(ino) \ | ||
278 | ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO) | ||
279 | |||
280 | /* | ||
273 | * bytes offset of secondary super block | 281 | * bytes offset of secondary super block |
274 | */ | 282 | */ |
275 | #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) | 283 | #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) |
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 2c8701687336..0edb2566c14c 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
@@ -40,6 +40,43 @@ | |||
40 | */ | 40 | */ |
41 | 41 | ||
42 | /** | 42 | /** |
43 | * DOC: Frame transmission/registration support | ||
44 | * | ||
45 | * Frame transmission and registration support exists to allow userspace | ||
46 | * management entities such as wpa_supplicant react to management frames | ||
47 | * that are not being handled by the kernel. This includes, for example, | ||
48 | * certain classes of action frames that cannot be handled in the kernel | ||
49 | * for various reasons. | ||
50 | * | ||
51 | * Frame registration is done on a per-interface basis and registrations | ||
52 | * cannot be removed other than by closing the socket. It is possible to | ||
53 | * specify a registration filter to register, for example, only for a | ||
54 | * certain type of action frame. In particular with action frames, those | ||
55 | * that userspace registers for will not be returned as unhandled by the | ||
56 | * driver, so that the registered application has to take responsibility | ||
57 | * for doing that. | ||
58 | * | ||
59 | * The type of frame that can be registered for is also dependent on the | ||
60 | * driver and interface type. The frame types are advertised in wiphy | ||
61 | * attributes so applications know what to expect. | ||
62 | * | ||
63 | * NOTE: When an interface changes type while registrations are active, | ||
64 | * these registrations are ignored until the interface type is | ||
65 | * changed again. This means that changing the interface type can | ||
66 | * lead to a situation that couldn't otherwise be produced, but | ||
67 | * any such registrations will be dormant in the sense that they | ||
68 | * will not be serviced, i.e. they will not receive any frames. | ||
69 | * | ||
70 | * Frame transmission allows userspace to send for example the required | ||
71 | * responses to action frames. It is subject to some sanity checking, | ||
72 | * but many frames can be transmitted. When a frame was transmitted, its | ||
73 | * status is indicated to the sending socket. | ||
74 | * | ||
75 | * For more technical details, see the corresponding command descriptions | ||
76 | * below. | ||
77 | */ | ||
78 | |||
79 | /** | ||
43 | * enum nl80211_commands - supported nl80211 commands | 80 | * enum nl80211_commands - supported nl80211 commands |
44 | * | 81 | * |
45 | * @NL80211_CMD_UNSPEC: unspecified command to catch errors | 82 | * @NL80211_CMD_UNSPEC: unspecified command to catch errors |
@@ -258,7 +295,9 @@ | |||
258 | * auth and assoc steps. For this, you need to specify the SSID in a | 295 | * auth and assoc steps. For this, you need to specify the SSID in a |
259 | * %NL80211_ATTR_SSID attribute, and can optionally specify the association | 296 | * %NL80211_ATTR_SSID attribute, and can optionally specify the association |
260 | * IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC, | 297 | * IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC, |
261 | * %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_CONTROL_PORT. | 298 | * %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, |
299 | * %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and | ||
300 | * %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. | ||
262 | * It is also sent as an event, with the BSSID and response IEs when the | 301 | * It is also sent as an event, with the BSSID and response IEs when the |
263 | * connection is established or failed to be established. This can be | 302 | * connection is established or failed to be established. This can be |
264 | * determined by the STATUS_CODE attribute. | 303 | * determined by the STATUS_CODE attribute. |
@@ -276,8 +315,8 @@ | |||
276 | * channel for the specified amount of time. This can be used to do | 315 | * channel for the specified amount of time. This can be used to do |
277 | * off-channel operations like transmit a Public Action frame and wait for | 316 | * off-channel operations like transmit a Public Action frame and wait for |
278 | * a response while being associated to an AP on another channel. | 317 | * a response while being associated to an AP on another channel. |
279 | * %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify which | 318 | * %NL80211_ATTR_IFINDEX is used to specify which interface (and thus |
280 | * radio is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the | 319 | * radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the |
281 | * frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be | 320 | * frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be |
282 | * optionally used to specify additional channel parameters. | 321 | * optionally used to specify additional channel parameters. |
283 | * %NL80211_ATTR_DURATION is used to specify the duration in milliseconds | 322 | * %NL80211_ATTR_DURATION is used to specify the duration in milliseconds |
@@ -301,16 +340,20 @@ | |||
301 | * rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface | 340 | * rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface |
302 | * and @NL80211_ATTR_TX_RATES the set of allowed rates. | 341 | * and @NL80211_ATTR_TX_RATES the set of allowed rates. |
303 | * | 342 | * |
304 | * @NL80211_CMD_REGISTER_ACTION: Register for receiving certain action frames | 343 | * @NL80211_CMD_REGISTER_FRAME: Register for receiving certain mgmt frames |
305 | * (via @NL80211_CMD_ACTION) for processing in userspace. This command | 344 | * (via @NL80211_CMD_FRAME) for processing in userspace. This command |
306 | * requires an interface index and a match attribute containing the first | 345 | * requires an interface index, a frame type attribute (optional for |
307 | * few bytes of the frame that should match, e.g. a single byte for only | 346 | * backward compatibility reasons, if not given assumes action frames) |
308 | * a category match or four bytes for vendor frames including the OUI. | 347 | * and a match attribute containing the first few bytes of the frame |
309 | * The registration cannot be dropped, but is removed automatically | 348 | * that should match, e.g. a single byte for only a category match or |
310 | * when the netlink socket is closed. Multiple registrations can be made. | 349 | * four bytes for vendor frames including the OUI. The registration |
311 | * @NL80211_CMD_ACTION: Action frame TX request and RX notification. This | 350 | * cannot be dropped, but is removed automatically when the netlink |
312 | * command is used both as a request to transmit an Action frame and as an | 351 | * socket is closed. Multiple registrations can be made. |
313 | * event indicating reception of an Action frame that was not processed in | 352 | * @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for |
353 | * backward compatibility | ||
354 | * @NL80211_CMD_FRAME: Management frame TX request and RX notification. This | ||
355 | * command is used both as a request to transmit a management frame and | ||
356 | * as an event indicating reception of a frame that was not processed in | ||
314 | * kernel code, but is for us (i.e., which may need to be processed in a | 357 | * kernel code, but is for us (i.e., which may need to be processed in a |
315 | * user space application). %NL80211_ATTR_FRAME is used to specify the | 358 | * user space application). %NL80211_ATTR_FRAME is used to specify the |
316 | * frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and | 359 | * frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and |
@@ -320,11 +363,14 @@ | |||
320 | * operational channel). When called, this operation returns a cookie | 363 | * operational channel). When called, this operation returns a cookie |
321 | * (%NL80211_ATTR_COOKIE) that will be included with the TX status event | 364 | * (%NL80211_ATTR_COOKIE) that will be included with the TX status event |
322 | * pertaining to the TX request. | 365 | * pertaining to the TX request. |
323 | * @NL80211_CMD_ACTION_TX_STATUS: Report TX status of an Action frame | 366 | * @NL80211_CMD_ACTION: Alias for @NL80211_CMD_FRAME for backward compatibility. |
324 | * transmitted with %NL80211_CMD_ACTION. %NL80211_ATTR_COOKIE identifies | 367 | * @NL80211_CMD_FRAME_TX_STATUS: Report TX status of a management frame |
368 | * transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies | ||
325 | * the TX command and %NL80211_ATTR_FRAME includes the contents of the | 369 | * the TX command and %NL80211_ATTR_FRAME includes the contents of the |
326 | * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged | 370 | * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged |
327 | * the frame. | 371 | * the frame. |
372 | * @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for | ||
373 | * backward compatibility. | ||
328 | * @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command | 374 | * @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command |
329 | * is used to configure connection quality monitoring notification trigger | 375 | * is used to configure connection quality monitoring notification trigger |
330 | * levels. | 376 | * levels. |
@@ -341,6 +387,8 @@ | |||
341 | * of any other interfaces, and other interfaces will again take | 387 | * of any other interfaces, and other interfaces will again take |
342 | * precedence when they are used. | 388 | * precedence when they are used. |
343 | * | 389 | * |
390 | * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface. | ||
391 | * | ||
344 | * @NL80211_CMD_MAX: highest used command number | 392 | * @NL80211_CMD_MAX: highest used command number |
345 | * @__NL80211_CMD_AFTER_LAST: internal use | 393 | * @__NL80211_CMD_AFTER_LAST: internal use |
346 | */ | 394 | */ |
@@ -429,9 +477,12 @@ enum nl80211_commands { | |||
429 | 477 | ||
430 | NL80211_CMD_SET_TX_BITRATE_MASK, | 478 | NL80211_CMD_SET_TX_BITRATE_MASK, |
431 | 479 | ||
432 | NL80211_CMD_REGISTER_ACTION, | 480 | NL80211_CMD_REGISTER_FRAME, |
433 | NL80211_CMD_ACTION, | 481 | NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME, |
434 | NL80211_CMD_ACTION_TX_STATUS, | 482 | NL80211_CMD_FRAME, |
483 | NL80211_CMD_ACTION = NL80211_CMD_FRAME, | ||
484 | NL80211_CMD_FRAME_TX_STATUS, | ||
485 | NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS, | ||
435 | 486 | ||
436 | NL80211_CMD_SET_POWER_SAVE, | 487 | NL80211_CMD_SET_POWER_SAVE, |
437 | NL80211_CMD_GET_POWER_SAVE, | 488 | NL80211_CMD_GET_POWER_SAVE, |
@@ -440,6 +491,7 @@ enum nl80211_commands { | |||
440 | NL80211_CMD_NOTIFY_CQM, | 491 | NL80211_CMD_NOTIFY_CQM, |
441 | 492 | ||
442 | NL80211_CMD_SET_CHANNEL, | 493 | NL80211_CMD_SET_CHANNEL, |
494 | NL80211_CMD_SET_WDS_PEER, | ||
443 | 495 | ||
444 | /* add new commands above here */ | 496 | /* add new commands above here */ |
445 | 497 | ||
@@ -639,6 +691,15 @@ enum nl80211_commands { | |||
639 | * request, the driver will assume that the port is unauthorized until | 691 | * request, the driver will assume that the port is unauthorized until |
640 | * authorized by user space. Otherwise, port is marked authorized by | 692 | * authorized by user space. Otherwise, port is marked authorized by |
641 | * default in station mode. | 693 | * default in station mode. |
694 | * @NL80211_ATTR_CONTROL_PORT_ETHERTYPE: A 16-bit value indicating the | ||
695 | * ethertype that will be used for key negotiation. It can be | ||
696 | * specified with the associate and connect commands. If it is not | ||
697 | * specified, the value defaults to 0x888E (PAE, 802.1X). This | ||
698 | * attribute is also used as a flag in the wiphy information to | ||
699 | * indicate that protocols other than PAE are supported. | ||
700 | * @NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT: When included along with | ||
701 | * %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom | ||
702 | * ethertype frames used for key negotiation must not be encrypted. | ||
642 | * | 703 | * |
643 | * @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver. | 704 | * @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver. |
644 | * We recommend using nested, driver-specific attributes within this. | 705 | * We recommend using nested, driver-specific attributes within this. |
@@ -708,7 +769,16 @@ enum nl80211_commands { | |||
708 | * is used with %NL80211_CMD_SET_TX_BITRATE_MASK. | 769 | * is used with %NL80211_CMD_SET_TX_BITRATE_MASK. |
709 | * | 770 | * |
710 | * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain | 771 | * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain |
711 | * at least one byte, currently used with @NL80211_CMD_REGISTER_ACTION. | 772 | * at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME. |
773 | * @NL80211_ATTR_FRAME_TYPE: A u16 indicating the frame type/subtype for the | ||
774 | * @NL80211_CMD_REGISTER_FRAME command. | ||
775 | * @NL80211_ATTR_TX_FRAME_TYPES: wiphy capability attribute, which is a | ||
776 | * nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing | ||
777 | * information about which frame types can be transmitted with | ||
778 | * %NL80211_CMD_FRAME. | ||
779 | * @NL80211_ATTR_RX_FRAME_TYPES: wiphy capability attribute, which is a | ||
780 | * nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing | ||
781 | * information about which frame types can be registered for RX. | ||
712 | * | 782 | * |
713 | * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was | 783 | * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was |
714 | * acknowledged by the recipient. | 784 | * acknowledged by the recipient. |
@@ -731,6 +801,9 @@ enum nl80211_commands { | |||
731 | * This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING | 801 | * This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING |
732 | * for non-automatic settings. | 802 | * for non-automatic settings. |
733 | * | 803 | * |
804 | * @NL80211_ATTR_SUPPORT_IBSS_RSN: The device supports IBSS RSN, which mostly | ||
805 | * means support for per-station GTKs. | ||
806 | * | ||
734 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 807 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
735 | * @__NL80211_ATTR_AFTER_LAST: internal use | 808 | * @__NL80211_ATTR_AFTER_LAST: internal use |
736 | */ | 809 | */ |
@@ -891,6 +964,15 @@ enum nl80211_attrs { | |||
891 | NL80211_ATTR_WIPHY_TX_POWER_SETTING, | 964 | NL80211_ATTR_WIPHY_TX_POWER_SETTING, |
892 | NL80211_ATTR_WIPHY_TX_POWER_LEVEL, | 965 | NL80211_ATTR_WIPHY_TX_POWER_LEVEL, |
893 | 966 | ||
967 | NL80211_ATTR_TX_FRAME_TYPES, | ||
968 | NL80211_ATTR_RX_FRAME_TYPES, | ||
969 | NL80211_ATTR_FRAME_TYPE, | ||
970 | |||
971 | NL80211_ATTR_CONTROL_PORT_ETHERTYPE, | ||
972 | NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT, | ||
973 | |||
974 | NL80211_ATTR_SUPPORT_IBSS_RSN, | ||
975 | |||
894 | /* add attributes here, update the policy in nl80211.c */ | 976 | /* add attributes here, update the policy in nl80211.c */ |
895 | 977 | ||
896 | __NL80211_ATTR_AFTER_LAST, | 978 | __NL80211_ATTR_AFTER_LAST, |
@@ -946,8 +1028,10 @@ enum nl80211_attrs { | |||
946 | * @NL80211_IFTYPE_WDS: wireless distribution interface | 1028 | * @NL80211_IFTYPE_WDS: wireless distribution interface |
947 | * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames | 1029 | * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames |
948 | * @NL80211_IFTYPE_MESH_POINT: mesh point | 1030 | * @NL80211_IFTYPE_MESH_POINT: mesh point |
1031 | * @NL80211_IFTYPE_P2P_CLIENT: P2P client | ||
1032 | * @NL80211_IFTYPE_P2P_GO: P2P group owner | ||
949 | * @NL80211_IFTYPE_MAX: highest interface type number currently defined | 1033 | * @NL80211_IFTYPE_MAX: highest interface type number currently defined |
950 | * @__NL80211_IFTYPE_AFTER_LAST: internal use | 1034 | * @NUM_NL80211_IFTYPES: number of defined interface types |
951 | * | 1035 | * |
952 | * These values are used with the %NL80211_ATTR_IFTYPE | 1036 | * These values are used with the %NL80211_ATTR_IFTYPE |
953 | * to set the type of an interface. | 1037 | * to set the type of an interface. |
@@ -962,10 +1046,12 @@ enum nl80211_iftype { | |||
962 | NL80211_IFTYPE_WDS, | 1046 | NL80211_IFTYPE_WDS, |
963 | NL80211_IFTYPE_MONITOR, | 1047 | NL80211_IFTYPE_MONITOR, |
964 | NL80211_IFTYPE_MESH_POINT, | 1048 | NL80211_IFTYPE_MESH_POINT, |
1049 | NL80211_IFTYPE_P2P_CLIENT, | ||
1050 | NL80211_IFTYPE_P2P_GO, | ||
965 | 1051 | ||
966 | /* keep last */ | 1052 | /* keep last */ |
967 | __NL80211_IFTYPE_AFTER_LAST, | 1053 | NUM_NL80211_IFTYPES, |
968 | NL80211_IFTYPE_MAX = __NL80211_IFTYPE_AFTER_LAST - 1 | 1054 | NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 |
969 | }; | 1055 | }; |
970 | 1056 | ||
971 | /** | 1057 | /** |
@@ -974,11 +1060,14 @@ enum nl80211_iftype { | |||
974 | * Station flags. When a station is added to an AP interface, it is | 1060 | * Station flags. When a station is added to an AP interface, it is |
975 | * assumed to be already associated (and hence authenticated.) | 1061 | * assumed to be already associated (and hence authenticated.) |
976 | * | 1062 | * |
1063 | * @__NL80211_STA_FLAG_INVALID: attribute number 0 is reserved | ||
977 | * @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X) | 1064 | * @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X) |
978 | * @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames | 1065 | * @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames |
979 | * with short barker preamble | 1066 | * with short barker preamble |
980 | * @NL80211_STA_FLAG_WME: station is WME/QoS capable | 1067 | * @NL80211_STA_FLAG_WME: station is WME/QoS capable |
981 | * @NL80211_STA_FLAG_MFP: station uses management frame protection | 1068 | * @NL80211_STA_FLAG_MFP: station uses management frame protection |
1069 | * @NL80211_STA_FLAG_MAX: highest station flag number currently defined | ||
1070 | * @__NL80211_STA_FLAG_AFTER_LAST: internal use | ||
982 | */ | 1071 | */ |
983 | enum nl80211_sta_flags { | 1072 | enum nl80211_sta_flags { |
984 | __NL80211_STA_FLAG_INVALID, | 1073 | __NL80211_STA_FLAG_INVALID, |
@@ -1048,6 +1137,8 @@ enum nl80211_rate_info { | |||
1048 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) | 1137 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) |
1049 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this | 1138 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this |
1050 | * station) | 1139 | * station) |
1140 | * @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station) | ||
1141 | * @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station) | ||
1051 | */ | 1142 | */ |
1052 | enum nl80211_sta_info { | 1143 | enum nl80211_sta_info { |
1053 | __NL80211_STA_INFO_INVALID, | 1144 | __NL80211_STA_INFO_INVALID, |
@@ -1061,6 +1152,8 @@ enum nl80211_sta_info { | |||
1061 | NL80211_STA_INFO_TX_BITRATE, | 1152 | NL80211_STA_INFO_TX_BITRATE, |
1062 | NL80211_STA_INFO_RX_PACKETS, | 1153 | NL80211_STA_INFO_RX_PACKETS, |
1063 | NL80211_STA_INFO_TX_PACKETS, | 1154 | NL80211_STA_INFO_TX_PACKETS, |
1155 | NL80211_STA_INFO_TX_RETRIES, | ||
1156 | NL80211_STA_INFO_TX_FAILED, | ||
1064 | 1157 | ||
1065 | /* keep last */ | 1158 | /* keep last */ |
1066 | __NL80211_STA_INFO_AFTER_LAST, | 1159 | __NL80211_STA_INFO_AFTER_LAST, |
@@ -1091,14 +1184,17 @@ enum nl80211_mpath_flags { | |||
1091 | * information about a mesh path. | 1184 | * information about a mesh path. |
1092 | * | 1185 | * |
1093 | * @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved | 1186 | * @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved |
1094 | * @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination | 1187 | * @NL80211_MPATH_INFO_FRAME_QLEN: number of queued frames for this destination |
1095 | * @NL80211_ATTR_MPATH_SN: destination sequence number | 1188 | * @NL80211_MPATH_INFO_SN: destination sequence number |
1096 | * @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path | 1189 | * @NL80211_MPATH_INFO_METRIC: metric (cost) of this mesh path |
1097 | * @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now | 1190 | * @NL80211_MPATH_INFO_EXPTIME: expiration time for the path, in msec from now |
1098 | * @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in | 1191 | * @NL80211_MPATH_INFO_FLAGS: mesh path flags, enumerated in |
1099 | * &enum nl80211_mpath_flags; | 1192 | * &enum nl80211_mpath_flags; |
1100 | * @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec | 1193 | * @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec |
1101 | * @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries | 1194 | * @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries |
1195 | * @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number | ||
1196 | * currently defind | ||
1197 | * @__NL80211_MPATH_INFO_AFTER_LAST: internal use | ||
1102 | */ | 1198 | */ |
1103 | enum nl80211_mpath_info { | 1199 | enum nl80211_mpath_info { |
1104 | __NL80211_MPATH_INFO_INVALID, | 1200 | __NL80211_MPATH_INFO_INVALID, |
@@ -1127,6 +1223,8 @@ enum nl80211_mpath_info { | |||
1127 | * @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE | 1223 | * @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE |
1128 | * @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n | 1224 | * @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n |
1129 | * @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n | 1225 | * @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n |
1226 | * @NL80211_BAND_ATTR_MAX: highest band attribute currently defined | ||
1227 | * @__NL80211_BAND_ATTR_AFTER_LAST: internal use | ||
1130 | */ | 1228 | */ |
1131 | enum nl80211_band_attr { | 1229 | enum nl80211_band_attr { |
1132 | __NL80211_BAND_ATTR_INVALID, | 1230 | __NL80211_BAND_ATTR_INVALID, |
@@ -1147,6 +1245,7 @@ enum nl80211_band_attr { | |||
1147 | 1245 | ||
1148 | /** | 1246 | /** |
1149 | * enum nl80211_frequency_attr - frequency attributes | 1247 | * enum nl80211_frequency_attr - frequency attributes |
1248 | * @__NL80211_FREQUENCY_ATTR_INVALID: attribute number 0 is reserved | ||
1150 | * @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz | 1249 | * @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz |
1151 | * @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current | 1250 | * @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current |
1152 | * regulatory domain. | 1251 | * regulatory domain. |
@@ -1158,6 +1257,9 @@ enum nl80211_band_attr { | |||
1158 | * on this channel in current regulatory domain. | 1257 | * on this channel in current regulatory domain. |
1159 | * @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm | 1258 | * @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm |
1160 | * (100 * dBm). | 1259 | * (100 * dBm). |
1260 | * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number | ||
1261 | * currently defined | ||
1262 | * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use | ||
1161 | */ | 1263 | */ |
1162 | enum nl80211_frequency_attr { | 1264 | enum nl80211_frequency_attr { |
1163 | __NL80211_FREQUENCY_ATTR_INVALID, | 1265 | __NL80211_FREQUENCY_ATTR_INVALID, |
@@ -1177,9 +1279,13 @@ enum nl80211_frequency_attr { | |||
1177 | 1279 | ||
1178 | /** | 1280 | /** |
1179 | * enum nl80211_bitrate_attr - bitrate attributes | 1281 | * enum nl80211_bitrate_attr - bitrate attributes |
1282 | * @__NL80211_BITRATE_ATTR_INVALID: attribute number 0 is reserved | ||
1180 | * @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps | 1283 | * @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps |
1181 | * @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported | 1284 | * @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported |
1182 | * in 2.4 GHz band. | 1285 | * in 2.4 GHz band. |
1286 | * @NL80211_BITRATE_ATTR_MAX: highest bitrate attribute number | ||
1287 | * currently defined | ||
1288 | * @__NL80211_BITRATE_ATTR_AFTER_LAST: internal use | ||
1183 | */ | 1289 | */ |
1184 | enum nl80211_bitrate_attr { | 1290 | enum nl80211_bitrate_attr { |
1185 | __NL80211_BITRATE_ATTR_INVALID, | 1291 | __NL80211_BITRATE_ATTR_INVALID, |
@@ -1235,6 +1341,7 @@ enum nl80211_reg_type { | |||
1235 | 1341 | ||
1236 | /** | 1342 | /** |
1237 | * enum nl80211_reg_rule_attr - regulatory rule attributes | 1343 | * enum nl80211_reg_rule_attr - regulatory rule attributes |
1344 | * @__NL80211_REG_RULE_ATTR_INVALID: attribute number 0 is reserved | ||
1238 | * @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional | 1345 | * @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional |
1239 | * considerations for a given frequency range. These are the | 1346 | * considerations for a given frequency range. These are the |
1240 | * &enum nl80211_reg_rule_flags. | 1347 | * &enum nl80211_reg_rule_flags. |
@@ -1251,6 +1358,9 @@ enum nl80211_reg_type { | |||
1251 | * If you don't have one then don't send this. | 1358 | * If you don't have one then don't send this. |
1252 | * @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for | 1359 | * @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for |
1253 | * a given frequency range. The value is in mBm (100 * dBm). | 1360 | * a given frequency range. The value is in mBm (100 * dBm). |
1361 | * @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number | ||
1362 | * currently defined | ||
1363 | * @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use | ||
1254 | */ | 1364 | */ |
1255 | enum nl80211_reg_rule_attr { | 1365 | enum nl80211_reg_rule_attr { |
1256 | __NL80211_REG_RULE_ATTR_INVALID, | 1366 | __NL80211_REG_RULE_ATTR_INVALID, |
@@ -1302,11 +1412,31 @@ enum nl80211_reg_rule_flags { | |||
1302 | * @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved | 1412 | * @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved |
1303 | * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel | 1413 | * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel |
1304 | * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) | 1414 | * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) |
1415 | * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used | ||
1416 | * @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio | ||
1417 | * spent on this channel | ||
1418 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary | ||
1419 | * channel was sensed busy (either due to activity or energy detect) | ||
1420 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension | ||
1421 | * channel was sensed busy | ||
1422 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent | ||
1423 | * receiving data | ||
1424 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent | ||
1425 | * transmitting data | ||
1426 | * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number | ||
1427 | * currently defined | ||
1428 | * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use | ||
1305 | */ | 1429 | */ |
1306 | enum nl80211_survey_info { | 1430 | enum nl80211_survey_info { |
1307 | __NL80211_SURVEY_INFO_INVALID, | 1431 | __NL80211_SURVEY_INFO_INVALID, |
1308 | NL80211_SURVEY_INFO_FREQUENCY, | 1432 | NL80211_SURVEY_INFO_FREQUENCY, |
1309 | NL80211_SURVEY_INFO_NOISE, | 1433 | NL80211_SURVEY_INFO_NOISE, |
1434 | NL80211_SURVEY_INFO_IN_USE, | ||
1435 | NL80211_SURVEY_INFO_CHANNEL_TIME, | ||
1436 | NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY, | ||
1437 | NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY, | ||
1438 | NL80211_SURVEY_INFO_CHANNEL_TIME_RX, | ||
1439 | NL80211_SURVEY_INFO_CHANNEL_TIME_TX, | ||
1310 | 1440 | ||
1311 | /* keep last */ | 1441 | /* keep last */ |
1312 | __NL80211_SURVEY_INFO_AFTER_LAST, | 1442 | __NL80211_SURVEY_INFO_AFTER_LAST, |
@@ -1466,6 +1596,7 @@ enum nl80211_channel_type { | |||
1466 | * enum nl80211_bss - netlink attributes for a BSS | 1596 | * enum nl80211_bss - netlink attributes for a BSS |
1467 | * | 1597 | * |
1468 | * @__NL80211_BSS_INVALID: invalid | 1598 | * @__NL80211_BSS_INVALID: invalid |
1599 | * @NL80211_BSS_BSSID: BSSID of the BSS (6 octets) | ||
1469 | * @NL80211_BSS_FREQUENCY: frequency in MHz (u32) | 1600 | * @NL80211_BSS_FREQUENCY: frequency in MHz (u32) |
1470 | * @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64) | 1601 | * @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64) |
1471 | * @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16) | 1602 | * @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16) |
@@ -1509,6 +1640,12 @@ enum nl80211_bss { | |||
1509 | 1640 | ||
1510 | /** | 1641 | /** |
1511 | * enum nl80211_bss_status - BSS "status" | 1642 | * enum nl80211_bss_status - BSS "status" |
1643 | * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS. | ||
1644 | * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS. | ||
1645 | * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS. | ||
1646 | * | ||
1647 | * The BSS status is a BSS attribute in scan dumps, which | ||
1648 | * indicates the status the interface has wrt. this BSS. | ||
1512 | */ | 1649 | */ |
1513 | enum nl80211_bss_status { | 1650 | enum nl80211_bss_status { |
1514 | NL80211_BSS_STATUS_AUTHENTICATED, | 1651 | NL80211_BSS_STATUS_AUTHENTICATED, |
@@ -1546,11 +1683,14 @@ enum nl80211_auth_type { | |||
1546 | * @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key | 1683 | * @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key |
1547 | * @NL80211_KEYTYPE_PAIRWISE: Pairwise (unicast/individual) key | 1684 | * @NL80211_KEYTYPE_PAIRWISE: Pairwise (unicast/individual) key |
1548 | * @NL80211_KEYTYPE_PEERKEY: PeerKey (DLS) | 1685 | * @NL80211_KEYTYPE_PEERKEY: PeerKey (DLS) |
1686 | * @NUM_NL80211_KEYTYPES: number of defined key types | ||
1549 | */ | 1687 | */ |
1550 | enum nl80211_key_type { | 1688 | enum nl80211_key_type { |
1551 | NL80211_KEYTYPE_GROUP, | 1689 | NL80211_KEYTYPE_GROUP, |
1552 | NL80211_KEYTYPE_PAIRWISE, | 1690 | NL80211_KEYTYPE_PAIRWISE, |
1553 | NL80211_KEYTYPE_PEERKEY, | 1691 | NL80211_KEYTYPE_PEERKEY, |
1692 | |||
1693 | NUM_NL80211_KEYTYPES | ||
1554 | }; | 1694 | }; |
1555 | 1695 | ||
1556 | /** | 1696 | /** |
@@ -1581,6 +1721,9 @@ enum nl80211_wpa_versions { | |||
1581 | * CCMP keys, each six bytes in little endian | 1721 | * CCMP keys, each six bytes in little endian |
1582 | * @NL80211_KEY_DEFAULT: flag indicating default key | 1722 | * @NL80211_KEY_DEFAULT: flag indicating default key |
1583 | * @NL80211_KEY_DEFAULT_MGMT: flag indicating default management key | 1723 | * @NL80211_KEY_DEFAULT_MGMT: flag indicating default management key |
1724 | * @NL80211_KEY_TYPE: the key type from enum nl80211_key_type, if not | ||
1725 | * specified the default depends on whether a MAC address was | ||
1726 | * given with the command using the key or not (u32) | ||
1584 | * @__NL80211_KEY_AFTER_LAST: internal | 1727 | * @__NL80211_KEY_AFTER_LAST: internal |
1585 | * @NL80211_KEY_MAX: highest key attribute | 1728 | * @NL80211_KEY_MAX: highest key attribute |
1586 | */ | 1729 | */ |
@@ -1592,6 +1735,7 @@ enum nl80211_key_attributes { | |||
1592 | NL80211_KEY_SEQ, | 1735 | NL80211_KEY_SEQ, |
1593 | NL80211_KEY_DEFAULT, | 1736 | NL80211_KEY_DEFAULT, |
1594 | NL80211_KEY_DEFAULT_MGMT, | 1737 | NL80211_KEY_DEFAULT_MGMT, |
1738 | NL80211_KEY_TYPE, | ||
1595 | 1739 | ||
1596 | /* keep last */ | 1740 | /* keep last */ |
1597 | __NL80211_KEY_AFTER_LAST, | 1741 | __NL80211_KEY_AFTER_LAST, |
@@ -1619,8 +1763,8 @@ enum nl80211_tx_rate_attributes { | |||
1619 | 1763 | ||
1620 | /** | 1764 | /** |
1621 | * enum nl80211_band - Frequency band | 1765 | * enum nl80211_band - Frequency band |
1622 | * @NL80211_BAND_2GHZ - 2.4 GHz ISM band | 1766 | * @NL80211_BAND_2GHZ: 2.4 GHz ISM band |
1623 | * @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz) | 1767 | * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz) |
1624 | */ | 1768 | */ |
1625 | enum nl80211_band { | 1769 | enum nl80211_band { |
1626 | NL80211_BAND_2GHZ, | 1770 | NL80211_BAND_2GHZ, |
@@ -1658,9 +1802,9 @@ enum nl80211_attr_cqm { | |||
1658 | 1802 | ||
1659 | /** | 1803 | /** |
1660 | * enum nl80211_cqm_rssi_threshold_event - RSSI threshold event | 1804 | * enum nl80211_cqm_rssi_threshold_event - RSSI threshold event |
1661 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the | 1805 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW: The RSSI level is lower than the |
1662 | * configured threshold | 1806 | * configured threshold |
1663 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the | 1807 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the |
1664 | * configured threshold | 1808 | * configured threshold |
1665 | */ | 1809 | */ |
1666 | enum nl80211_cqm_rssi_threshold_event { | 1810 | enum nl80211_cqm_rssi_threshold_event { |
diff --git a/include/linux/notifier.h b/include/linux/notifier.h index b2f1a4d83550..2026f9e1ceb8 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h | |||
@@ -49,28 +49,28 @@ | |||
49 | 49 | ||
50 | struct notifier_block { | 50 | struct notifier_block { |
51 | int (*notifier_call)(struct notifier_block *, unsigned long, void *); | 51 | int (*notifier_call)(struct notifier_block *, unsigned long, void *); |
52 | struct notifier_block *next; | 52 | struct notifier_block __rcu *next; |
53 | int priority; | 53 | int priority; |
54 | }; | 54 | }; |
55 | 55 | ||
56 | struct atomic_notifier_head { | 56 | struct atomic_notifier_head { |
57 | spinlock_t lock; | 57 | spinlock_t lock; |
58 | struct notifier_block *head; | 58 | struct notifier_block __rcu *head; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | struct blocking_notifier_head { | 61 | struct blocking_notifier_head { |
62 | struct rw_semaphore rwsem; | 62 | struct rw_semaphore rwsem; |
63 | struct notifier_block *head; | 63 | struct notifier_block __rcu *head; |
64 | }; | 64 | }; |
65 | 65 | ||
66 | struct raw_notifier_head { | 66 | struct raw_notifier_head { |
67 | struct notifier_block *head; | 67 | struct notifier_block __rcu *head; |
68 | }; | 68 | }; |
69 | 69 | ||
70 | struct srcu_notifier_head { | 70 | struct srcu_notifier_head { |
71 | struct mutex mutex; | 71 | struct mutex mutex; |
72 | struct srcu_struct srcu; | 72 | struct srcu_struct srcu; |
73 | struct notifier_block *head; | 73 | struct notifier_block __rcu *head; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ | 76 | #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ |
diff --git a/include/linux/of_device.h b/include/linux/of_device.h index 835f85ecd2de..975d347079d9 100644 --- a/include/linux/of_device.h +++ b/include/linux/of_device.h | |||
@@ -27,20 +27,19 @@ static inline int of_driver_match_device(const struct device *dev, | |||
27 | extern struct platform_device *of_dev_get(struct platform_device *dev); | 27 | extern struct platform_device *of_dev_get(struct platform_device *dev); |
28 | extern void of_dev_put(struct platform_device *dev); | 28 | extern void of_dev_put(struct platform_device *dev); |
29 | 29 | ||
30 | extern int of_device_add(struct platform_device *pdev); | ||
30 | extern int of_device_register(struct platform_device *ofdev); | 31 | extern int of_device_register(struct platform_device *ofdev); |
31 | extern void of_device_unregister(struct platform_device *ofdev); | 32 | extern void of_device_unregister(struct platform_device *ofdev); |
32 | extern void of_release_dev(struct device *dev); | ||
33 | |||
34 | static inline void of_device_free(struct platform_device *dev) | ||
35 | { | ||
36 | of_release_dev(&dev->dev); | ||
37 | } | ||
38 | 33 | ||
39 | extern ssize_t of_device_get_modalias(struct device *dev, | 34 | extern ssize_t of_device_get_modalias(struct device *dev, |
40 | char *str, ssize_t len); | 35 | char *str, ssize_t len); |
41 | 36 | ||
42 | extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env); | 37 | extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env); |
43 | 38 | ||
39 | static inline void of_device_node_put(struct device *dev) | ||
40 | { | ||
41 | of_node_put(dev->of_node); | ||
42 | } | ||
44 | 43 | ||
45 | #else /* CONFIG_OF_DEVICE */ | 44 | #else /* CONFIG_OF_DEVICE */ |
46 | 45 | ||
@@ -56,6 +55,8 @@ static inline int of_device_uevent(struct device *dev, | |||
56 | return -ENODEV; | 55 | return -ENODEV; |
57 | } | 56 | } |
58 | 57 | ||
58 | static inline void of_device_node_put(struct device *dev) { } | ||
59 | |||
59 | #endif /* CONFIG_OF_DEVICE */ | 60 | #endif /* CONFIG_OF_DEVICE */ |
60 | 61 | ||
61 | #endif /* _LINUX_OF_DEVICE_H */ | 62 | #endif /* _LINUX_OF_DEVICE_H */ |
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index 71e1a916d3fa..7bbf5b328438 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h | |||
@@ -72,7 +72,7 @@ extern void *of_get_flat_dt_prop(unsigned long node, const char *name, | |||
72 | unsigned long *size); | 72 | unsigned long *size); |
73 | extern int of_flat_dt_is_compatible(unsigned long node, const char *name); | 73 | extern int of_flat_dt_is_compatible(unsigned long node, const char *name); |
74 | extern unsigned long of_get_flat_dt_root(void); | 74 | extern unsigned long of_get_flat_dt_root(void); |
75 | extern void early_init_dt_scan_chosen_arch(unsigned long node); | 75 | |
76 | extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, | 76 | extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, |
77 | int depth, void *data); | 77 | int depth, void *data); |
78 | extern void early_init_dt_check_for_initrd(unsigned long node); | 78 | extern void early_init_dt_check_for_initrd(unsigned long node); |
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h index 5929781c104d..109e013b1772 100644 --- a/include/linux/of_irq.h +++ b/include/linux/of_irq.h | |||
@@ -5,6 +5,7 @@ | |||
5 | struct of_irq; | 5 | struct of_irq; |
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | #include <linux/errno.h> | 7 | #include <linux/errno.h> |
8 | #include <linux/irq.h> | ||
8 | #include <linux/ioport.h> | 9 | #include <linux/ioport.h> |
9 | #include <linux/of.h> | 10 | #include <linux/of.h> |
10 | 11 | ||
@@ -64,6 +65,9 @@ extern unsigned int irq_create_of_mapping(struct device_node *controller, | |||
64 | unsigned int intsize); | 65 | unsigned int intsize); |
65 | extern int of_irq_to_resource(struct device_node *dev, int index, | 66 | extern int of_irq_to_resource(struct device_node *dev, int index, |
66 | struct resource *r); | 67 | struct resource *r); |
68 | extern int of_irq_count(struct device_node *dev); | ||
69 | extern int of_irq_to_resource_table(struct device_node *dev, | ||
70 | struct resource *res, int nr_irqs); | ||
67 | 71 | ||
68 | #endif /* CONFIG_OF_IRQ */ | 72 | #endif /* CONFIG_OF_IRQ */ |
69 | #endif /* CONFIG_OF */ | 73 | #endif /* CONFIG_OF */ |
diff --git a/include/linux/of_pdt.h b/include/linux/of_pdt.h new file mode 100644 index 000000000000..c65a18a0cfdf --- /dev/null +++ b/include/linux/of_pdt.h | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * Definitions for building a device tree by calling into the | ||
3 | * Open Firmware PROM. | ||
4 | * | ||
5 | * Copyright (C) 2010 Andres Salomon <dilinger@queued.net> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef _LINUX_OF_PDT_H | ||
14 | #define _LINUX_OF_PDT_H | ||
15 | |||
16 | /* overridable operations for calling into the PROM */ | ||
17 | struct of_pdt_ops { | ||
18 | /* | ||
19 | * buf should be 32 bytes; return 0 on success. | ||
20 | * If prev is NULL, the first property will be returned. | ||
21 | */ | ||
22 | int (*nextprop)(phandle node, char *prev, char *buf); | ||
23 | |||
24 | /* for both functions, return proplen on success; -1 on error */ | ||
25 | int (*getproplen)(phandle node, const char *prop); | ||
26 | int (*getproperty)(phandle node, const char *prop, char *buf, | ||
27 | int bufsize); | ||
28 | |||
29 | /* phandles are 0 if no child or sibling exists */ | ||
30 | phandle (*getchild)(phandle parent); | ||
31 | phandle (*getsibling)(phandle node); | ||
32 | |||
33 | /* return 0 on success; fill in 'len' with number of bytes in path */ | ||
34 | int (*pkg2path)(phandle node, char *buf, const int buflen, int *len); | ||
35 | }; | ||
36 | |||
37 | extern void *prom_early_alloc(unsigned long size); | ||
38 | |||
39 | /* for building the device tree */ | ||
40 | extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops); | ||
41 | |||
42 | extern void (*of_pdt_build_more)(struct device_node *dp, | ||
43 | struct device_node ***nextp); | ||
44 | |||
45 | #endif /* _LINUX_OF_PDT_H */ | ||
diff --git a/include/linux/opp.h b/include/linux/opp.h new file mode 100644 index 000000000000..5449945d589f --- /dev/null +++ b/include/linux/opp.h | |||
@@ -0,0 +1,105 @@ | |||
1 | /* | ||
2 | * Generic OPP Interface | ||
3 | * | ||
4 | * Copyright (C) 2009-2010 Texas Instruments Incorporated. | ||
5 | * Nishanth Menon | ||
6 | * Romit Dasgupta | ||
7 | * Kevin Hilman | ||
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 | #ifndef __LINUX_OPP_H__ | ||
15 | #define __LINUX_OPP_H__ | ||
16 | |||
17 | #include <linux/err.h> | ||
18 | #include <linux/cpufreq.h> | ||
19 | |||
20 | struct opp; | ||
21 | |||
22 | #if defined(CONFIG_PM_OPP) | ||
23 | |||
24 | unsigned long opp_get_voltage(struct opp *opp); | ||
25 | |||
26 | unsigned long opp_get_freq(struct opp *opp); | ||
27 | |||
28 | int opp_get_opp_count(struct device *dev); | ||
29 | |||
30 | struct opp *opp_find_freq_exact(struct device *dev, unsigned long freq, | ||
31 | bool available); | ||
32 | |||
33 | struct opp *opp_find_freq_floor(struct device *dev, unsigned long *freq); | ||
34 | |||
35 | struct opp *opp_find_freq_ceil(struct device *dev, unsigned long *freq); | ||
36 | |||
37 | int opp_add(struct device *dev, unsigned long freq, unsigned long u_volt); | ||
38 | |||
39 | int opp_enable(struct device *dev, unsigned long freq); | ||
40 | |||
41 | int opp_disable(struct device *dev, unsigned long freq); | ||
42 | |||
43 | #else | ||
44 | static inline unsigned long opp_get_voltage(struct opp *opp) | ||
45 | { | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | static inline unsigned long opp_get_freq(struct opp *opp) | ||
50 | { | ||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | static inline int opp_get_opp_count(struct device *dev) | ||
55 | { | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static inline struct opp *opp_find_freq_exact(struct device *dev, | ||
60 | unsigned long freq, bool available) | ||
61 | { | ||
62 | return ERR_PTR(-EINVAL); | ||
63 | } | ||
64 | |||
65 | static inline struct opp *opp_find_freq_floor(struct device *dev, | ||
66 | unsigned long *freq) | ||
67 | { | ||
68 | return ERR_PTR(-EINVAL); | ||
69 | } | ||
70 | |||
71 | static inline struct opp *opp_find_freq_ceil(struct device *dev, | ||
72 | unsigned long *freq) | ||
73 | { | ||
74 | return ERR_PTR(-EINVAL); | ||
75 | } | ||
76 | |||
77 | static inline int opp_add(struct device *dev, unsigned long freq, | ||
78 | unsigned long u_volt) | ||
79 | { | ||
80 | return -EINVAL; | ||
81 | } | ||
82 | |||
83 | static inline int opp_enable(struct device *dev, unsigned long freq) | ||
84 | { | ||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | static inline int opp_disable(struct device *dev, unsigned long freq) | ||
89 | { | ||
90 | return 0; | ||
91 | } | ||
92 | #endif /* CONFIG_PM */ | ||
93 | |||
94 | #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP) | ||
95 | int opp_init_cpufreq_table(struct device *dev, | ||
96 | struct cpufreq_frequency_table **table); | ||
97 | #else | ||
98 | static inline int opp_init_cpufreq_table(struct device *dev, | ||
99 | struct cpufreq_frequency_table **table) | ||
100 | { | ||
101 | return -EINVAL; | ||
102 | } | ||
103 | #endif /* CONFIG_CPU_FREQ */ | ||
104 | |||
105 | #endif /* __LINUX_OPP_H__ */ | ||
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 5171639ecf0f..32fb81212fd1 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
18 | #include <linux/init.h> | ||
18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
19 | 20 | ||
20 | /* Each escaped entry is prefixed by ESCAPE_CODE | 21 | /* Each escaped entry is prefixed by ESCAPE_CODE |
@@ -185,4 +186,10 @@ int oprofile_add_data(struct op_entry *entry, unsigned long val); | |||
185 | int oprofile_add_data64(struct op_entry *entry, u64 val); | 186 | int oprofile_add_data64(struct op_entry *entry, u64 val); |
186 | int oprofile_write_commit(struct op_entry *entry); | 187 | int oprofile_write_commit(struct op_entry *entry); |
187 | 188 | ||
189 | #ifdef CONFIG_PERF_EVENTS | ||
190 | int __init oprofile_perf_init(struct oprofile_operations *ops); | ||
191 | void oprofile_perf_exit(void); | ||
192 | char *op_name_from_perf_id(void); | ||
193 | #endif /* CONFIG_PERF_EVENTS */ | ||
194 | |||
188 | #endif /* OPROFILE_H */ | 195 | #endif /* OPROFILE_H */ |
diff --git a/include/linux/padata.h b/include/linux/padata.h index bdcd1e9eacea..4633b2f726b6 100644 --- a/include/linux/padata.h +++ b/include/linux/padata.h | |||
@@ -127,8 +127,8 @@ struct padata_cpumask { | |||
127 | */ | 127 | */ |
128 | struct parallel_data { | 128 | struct parallel_data { |
129 | struct padata_instance *pinst; | 129 | struct padata_instance *pinst; |
130 | struct padata_parallel_queue *pqueue; | 130 | struct padata_parallel_queue __percpu *pqueue; |
131 | struct padata_serial_queue *squeue; | 131 | struct padata_serial_queue __percpu *squeue; |
132 | atomic_t seq_nr; | 132 | atomic_t seq_nr; |
133 | atomic_t reorder_objects; | 133 | atomic_t reorder_objects; |
134 | atomic_t refcnt; | 134 | atomic_t refcnt; |
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 6fa317801e1c..5f38c460367e 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
@@ -310,7 +310,7 @@ static inline void SetPageUptodate(struct page *page) | |||
310 | { | 310 | { |
311 | #ifdef CONFIG_S390 | 311 | #ifdef CONFIG_S390 |
312 | if (!test_and_set_bit(PG_uptodate, &page->flags)) | 312 | if (!test_and_set_bit(PG_uptodate, &page->flags)) |
313 | page_clear_dirty(page); | 313 | page_clear_dirty(page, 0); |
314 | #else | 314 | #else |
315 | /* | 315 | /* |
316 | * Memory barrier must be issued before setting the PG_uptodate bit, | 316 | * Memory barrier must be issued before setting the PG_uptodate bit, |
diff --git a/include/linux/pageblock-flags.h b/include/linux/pageblock-flags.h index e8c06122be36..19ef95d293ae 100644 --- a/include/linux/pageblock-flags.h +++ b/include/linux/pageblock-flags.h | |||
@@ -67,7 +67,8 @@ void set_pageblock_flags_group(struct page *page, unsigned long flags, | |||
67 | 67 | ||
68 | #define get_pageblock_flags(page) \ | 68 | #define get_pageblock_flags(page) \ |
69 | get_pageblock_flags_group(page, 0, NR_PAGEBLOCK_BITS-1) | 69 | get_pageblock_flags_group(page, 0, NR_PAGEBLOCK_BITS-1) |
70 | #define set_pageblock_flags(page) \ | 70 | #define set_pageblock_flags(page, flags) \ |
71 | set_pageblock_flags_group(page, 0, NR_PAGEBLOCK_BITS-1) | 71 | set_pageblock_flags_group(page, flags, \ |
72 | 0, NR_PAGEBLOCK_BITS-1) | ||
72 | 73 | ||
73 | #endif /* PAGEBLOCK_FLAGS_H */ | 74 | #endif /* PAGEBLOCK_FLAGS_H */ |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index e12cdc6d79ee..2d1ffe3cf1ee 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -299,6 +299,8 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma, | |||
299 | extern void __lock_page(struct page *page); | 299 | extern void __lock_page(struct page *page); |
300 | extern int __lock_page_killable(struct page *page); | 300 | extern int __lock_page_killable(struct page *page); |
301 | extern void __lock_page_nosync(struct page *page); | 301 | extern void __lock_page_nosync(struct page *page); |
302 | extern int __lock_page_or_retry(struct page *page, struct mm_struct *mm, | ||
303 | unsigned int flags); | ||
302 | extern void unlock_page(struct page *page); | 304 | extern void unlock_page(struct page *page); |
303 | 305 | ||
304 | static inline void __set_page_locked(struct page *page) | 306 | static inline void __set_page_locked(struct page *page) |
@@ -351,6 +353,17 @@ static inline void lock_page_nosync(struct page *page) | |||
351 | } | 353 | } |
352 | 354 | ||
353 | /* | 355 | /* |
356 | * lock_page_or_retry - Lock the page, unless this would block and the | ||
357 | * caller indicated that it can handle a retry. | ||
358 | */ | ||
359 | static inline int lock_page_or_retry(struct page *page, struct mm_struct *mm, | ||
360 | unsigned int flags) | ||
361 | { | ||
362 | might_sleep(); | ||
363 | return trylock_page(page) || __lock_page_or_retry(page, mm, flags); | ||
364 | } | ||
365 | |||
366 | /* | ||
354 | * This is exported only for wait_on_page_locked/wait_on_page_writeback. | 367 | * This is exported only for wait_on_page_locked/wait_on_page_writeback. |
355 | * Never use this directly! | 368 | * Never use this directly! |
356 | */ | 369 | */ |
diff --git a/include/linux/pci.h b/include/linux/pci.h index c8d95e369ff4..7454408c41b6 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -541,7 +541,7 @@ struct pci_error_handlers { | |||
541 | struct module; | 541 | struct module; |
542 | struct pci_driver { | 542 | struct pci_driver { |
543 | struct list_head node; | 543 | struct list_head node; |
544 | char *name; | 544 | const char *name; |
545 | const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ | 545 | const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ |
546 | int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ | 546 | int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ |
547 | void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ | 547 | void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ |
@@ -819,6 +819,9 @@ pci_power_t pci_target_state(struct pci_dev *dev); | |||
819 | int pci_prepare_to_sleep(struct pci_dev *dev); | 819 | int pci_prepare_to_sleep(struct pci_dev *dev); |
820 | int pci_back_from_sleep(struct pci_dev *dev); | 820 | int pci_back_from_sleep(struct pci_dev *dev); |
821 | bool pci_dev_run_wake(struct pci_dev *dev); | 821 | bool pci_dev_run_wake(struct pci_dev *dev); |
822 | bool pci_check_pme_status(struct pci_dev *dev); | ||
823 | void pci_wakeup_event(struct pci_dev *dev); | ||
824 | void pci_pme_wakeup_bus(struct pci_bus *bus); | ||
822 | 825 | ||
823 | static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, | 826 | static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, |
824 | bool enable) | 827 | bool enable) |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 570fddeb0388..c6bcfe93b9ca 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -517,6 +517,7 @@ | |||
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_LANCE 0x2000 | 521 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 |
521 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 | 522 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 |
522 | #define PCI_DEVICE_ID_AMD_SCSI 0x2020 | 523 | #define PCI_DEVICE_ID_AMD_SCSI 0x2020 |
@@ -742,6 +743,7 @@ | |||
742 | #define PCI_DEVICE_ID_HP_CISSC 0x3230 | 743 | #define PCI_DEVICE_ID_HP_CISSC 0x3230 |
743 | #define PCI_DEVICE_ID_HP_CISSD 0x3238 | 744 | #define PCI_DEVICE_ID_HP_CISSD 0x3238 |
744 | #define PCI_DEVICE_ID_HP_CISSE 0x323a | 745 | #define PCI_DEVICE_ID_HP_CISSE 0x323a |
746 | #define PCI_DEVICE_ID_HP_CISSF 0x323b | ||
745 | #define PCI_DEVICE_ID_HP_ZX2_IOC 0x4031 | 747 | #define PCI_DEVICE_ID_HP_ZX2_IOC 0x4031 |
746 | 748 | ||
747 | #define PCI_VENDOR_ID_PCTECH 0x1042 | 749 | #define PCI_VENDOR_ID_PCTECH 0x1042 |
@@ -765,6 +767,8 @@ | |||
765 | #define PCI_DEVICE_ID_ELSA_MICROLINK 0x1000 | 767 | #define PCI_DEVICE_ID_ELSA_MICROLINK 0x1000 |
766 | #define PCI_DEVICE_ID_ELSA_QS3000 0x3000 | 768 | #define PCI_DEVICE_ID_ELSA_QS3000 0x3000 |
767 | 769 | ||
770 | #define PCI_VENDOR_ID_STMICRO 0x104A | ||
771 | |||
768 | #define PCI_VENDOR_ID_BUSLOGIC 0x104B | 772 | #define PCI_VENDOR_ID_BUSLOGIC 0x104B |
769 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140 | 773 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140 |
770 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER 0x1040 | 774 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER 0x1040 |
@@ -818,7 +822,7 @@ | |||
818 | 822 | ||
819 | #define PCI_VENDOR_ID_ANIGMA 0x1051 | 823 | #define PCI_VENDOR_ID_ANIGMA 0x1051 |
820 | #define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 | 824 | #define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 |
821 | 825 | ||
822 | #define PCI_VENDOR_ID_EFAR 0x1055 | 826 | #define PCI_VENDOR_ID_EFAR 0x1055 |
823 | #define PCI_DEVICE_ID_EFAR_SLC90E66_1 0x9130 | 827 | #define PCI_DEVICE_ID_EFAR_SLC90E66_1 0x9130 |
824 | #define PCI_DEVICE_ID_EFAR_SLC90E66_3 0x9463 | 828 | #define PCI_DEVICE_ID_EFAR_SLC90E66_3 0x9463 |
@@ -1249,6 +1253,8 @@ | |||
1249 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2 0x0348 | 1253 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2 0x0348 |
1250 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 0x034C | 1254 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 0x034C |
1251 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E | 1255 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E |
1256 | #define PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0 0x0360 | ||
1257 | #define PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4 0x0364 | ||
1252 | #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 | 1258 | #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 |
1253 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 | 1259 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 |
1254 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS 0x03EB | 1260 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS 0x03EB |
@@ -1449,7 +1455,7 @@ | |||
1449 | 1455 | ||
1450 | #define PCI_VENDOR_ID_ZIATECH 0x1138 | 1456 | #define PCI_VENDOR_ID_ZIATECH 0x1138 |
1451 | #define PCI_DEVICE_ID_ZIATECH_5550_HC 0x5550 | 1457 | #define PCI_DEVICE_ID_ZIATECH_5550_HC 0x5550 |
1452 | 1458 | ||
1453 | 1459 | ||
1454 | #define PCI_VENDOR_ID_SYSKONNECT 0x1148 | 1460 | #define PCI_VENDOR_ID_SYSKONNECT 0x1148 |
1455 | #define PCI_DEVICE_ID_SYSKONNECT_TR 0x4200 | 1461 | #define PCI_DEVICE_ID_SYSKONNECT_TR 0x4200 |
@@ -1603,8 +1609,8 @@ | |||
1603 | #define PCI_DEVICE_ID_RP8OCTA 0x0005 | 1609 | #define PCI_DEVICE_ID_RP8OCTA 0x0005 |
1604 | #define PCI_DEVICE_ID_RP8J 0x0006 | 1610 | #define PCI_DEVICE_ID_RP8J 0x0006 |
1605 | #define PCI_DEVICE_ID_RP4J 0x0007 | 1611 | #define PCI_DEVICE_ID_RP4J 0x0007 |
1606 | #define PCI_DEVICE_ID_RP8SNI 0x0008 | 1612 | #define PCI_DEVICE_ID_RP8SNI 0x0008 |
1607 | #define PCI_DEVICE_ID_RP16SNI 0x0009 | 1613 | #define PCI_DEVICE_ID_RP16SNI 0x0009 |
1608 | #define PCI_DEVICE_ID_RPP4 0x000A | 1614 | #define PCI_DEVICE_ID_RPP4 0x000A |
1609 | #define PCI_DEVICE_ID_RPP8 0x000B | 1615 | #define PCI_DEVICE_ID_RPP8 0x000B |
1610 | #define PCI_DEVICE_ID_RP4M 0x000D | 1616 | #define PCI_DEVICE_ID_RP4M 0x000D |
@@ -1614,9 +1620,9 @@ | |||
1614 | #define PCI_DEVICE_ID_URP8INTF 0x0802 | 1620 | #define PCI_DEVICE_ID_URP8INTF 0x0802 |
1615 | #define PCI_DEVICE_ID_URP16INTF 0x0803 | 1621 | #define PCI_DEVICE_ID_URP16INTF 0x0803 |
1616 | #define PCI_DEVICE_ID_URP8OCTA 0x0805 | 1622 | #define PCI_DEVICE_ID_URP8OCTA 0x0805 |
1617 | #define PCI_DEVICE_ID_UPCI_RM3_8PORT 0x080C | 1623 | #define PCI_DEVICE_ID_UPCI_RM3_8PORT 0x080C |
1618 | #define PCI_DEVICE_ID_UPCI_RM3_4PORT 0x080D | 1624 | #define PCI_DEVICE_ID_UPCI_RM3_4PORT 0x080D |
1619 | #define PCI_DEVICE_ID_CRP16INTF 0x0903 | 1625 | #define PCI_DEVICE_ID_CRP16INTF 0x0903 |
1620 | 1626 | ||
1621 | #define PCI_VENDOR_ID_CYCLADES 0x120e | 1627 | #define PCI_VENDOR_ID_CYCLADES 0x120e |
1622 | #define PCI_DEVICE_ID_CYCLOM_Y_Lo 0x0100 | 1628 | #define PCI_DEVICE_ID_CYCLOM_Y_Lo 0x0100 |
@@ -2142,7 +2148,7 @@ | |||
2142 | #define PCI_DEVICE_ID_RASTEL_2PORT 0x2000 | 2148 | #define PCI_DEVICE_ID_RASTEL_2PORT 0x2000 |
2143 | 2149 | ||
2144 | #define PCI_VENDOR_ID_ZOLTRIX 0x15b0 | 2150 | #define PCI_VENDOR_ID_ZOLTRIX 0x15b0 |
2145 | #define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 | 2151 | #define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 |
2146 | 2152 | ||
2147 | #define PCI_VENDOR_ID_MELLANOX 0x15b3 | 2153 | #define PCI_VENDOR_ID_MELLANOX 0x15b3 |
2148 | #define PCI_DEVICE_ID_MELLANOX_TAVOR 0x5a44 | 2154 | #define PCI_DEVICE_ID_MELLANOX_TAVOR 0x5a44 |
@@ -2192,6 +2198,9 @@ | |||
2192 | #define PCI_VENDOR_ID_ARIMA 0x161f | 2198 | #define PCI_VENDOR_ID_ARIMA 0x161f |
2193 | 2199 | ||
2194 | #define PCI_VENDOR_ID_BROCADE 0x1657 | 2200 | #define PCI_VENDOR_ID_BROCADE 0x1657 |
2201 | #define PCI_DEVICE_ID_BROCADE_CT 0x0014 | ||
2202 | #define PCI_DEVICE_ID_BROCADE_FC_8G1P 0x0017 | ||
2203 | #define PCI_DEVICE_ID_BROCADE_CT_FC 0x0021 | ||
2195 | 2204 | ||
2196 | #define PCI_VENDOR_ID_SIBYTE 0x166d | 2205 | #define PCI_VENDOR_ID_SIBYTE 0x166d |
2197 | #define PCI_DEVICE_ID_BCM1250_PCI 0x0001 | 2206 | #define PCI_DEVICE_ID_BCM1250_PCI 0x0001 |
@@ -2263,6 +2272,13 @@ | |||
2263 | 2272 | ||
2264 | #define PCI_VENDOR_ID_SILAN 0x1904 | 2273 | #define PCI_VENDOR_ID_SILAN 0x1904 |
2265 | 2274 | ||
2275 | #define PCI_VENDOR_ID_RENESAS 0x1912 | ||
2276 | #define PCI_DEVICE_ID_RENESAS_SH7781 0x0001 | ||
2277 | #define PCI_DEVICE_ID_RENESAS_SH7780 0x0002 | ||
2278 | #define PCI_DEVICE_ID_RENESAS_SH7763 0x0004 | ||
2279 | #define PCI_DEVICE_ID_RENESAS_SH7785 0x0007 | ||
2280 | #define PCI_DEVICE_ID_RENESAS_SH7786 0x0010 | ||
2281 | |||
2266 | #define PCI_VENDOR_ID_TDI 0x192E | 2282 | #define PCI_VENDOR_ID_TDI 0x192E |
2267 | #define PCI_DEVICE_ID_TDI_EHCI 0x0101 | 2283 | #define PCI_DEVICE_ID_TDI_EHCI 0x0101 |
2268 | 2284 | ||
@@ -2315,6 +2331,14 @@ | |||
2315 | #define PCI_DEVICE_ID_P4080 0x0401 | 2331 | #define PCI_DEVICE_ID_P4080 0x0401 |
2316 | #define PCI_DEVICE_ID_P4040E 0x0408 | 2332 | #define PCI_DEVICE_ID_P4040E 0x0408 |
2317 | #define PCI_DEVICE_ID_P4040 0x0409 | 2333 | #define PCI_DEVICE_ID_P4040 0x0409 |
2334 | #define PCI_DEVICE_ID_P2040E 0x0410 | ||
2335 | #define PCI_DEVICE_ID_P2040 0x0411 | ||
2336 | #define PCI_DEVICE_ID_P3041E 0x041E | ||
2337 | #define PCI_DEVICE_ID_P3041 0x041F | ||
2338 | #define PCI_DEVICE_ID_P5020E 0x0420 | ||
2339 | #define PCI_DEVICE_ID_P5020 0x0421 | ||
2340 | #define PCI_DEVICE_ID_P5010E 0x0428 | ||
2341 | #define PCI_DEVICE_ID_P5010 0x0429 | ||
2318 | #define PCI_DEVICE_ID_MPC8641 0x7010 | 2342 | #define PCI_DEVICE_ID_MPC8641 0x7010 |
2319 | #define PCI_DEVICE_ID_MPC8641D 0x7011 | 2343 | #define PCI_DEVICE_ID_MPC8641D 0x7011 |
2320 | #define PCI_DEVICE_ID_MPC8610 0x7018 | 2344 | #define PCI_DEVICE_ID_MPC8610 0x7018 |
@@ -2410,6 +2434,13 @@ | |||
2410 | #define PCI_DEVICE_ID_INTEL_82375 0x0482 | 2434 | #define PCI_DEVICE_ID_INTEL_82375 0x0482 |
2411 | #define PCI_DEVICE_ID_INTEL_82424 0x0483 | 2435 | #define PCI_DEVICE_ID_INTEL_82424 0x0483 |
2412 | #define PCI_DEVICE_ID_INTEL_82378 0x0484 | 2436 | #define PCI_DEVICE_ID_INTEL_82378 0x0484 |
2437 | #define PCI_DEVICE_ID_INTEL_MRST_SD0 0x0807 | ||
2438 | #define PCI_DEVICE_ID_INTEL_MRST_SD1 0x0808 | ||
2439 | #define PCI_DEVICE_ID_INTEL_MFD_SD 0x0820 | ||
2440 | #define PCI_DEVICE_ID_INTEL_MFD_SDIO1 0x0821 | ||
2441 | #define PCI_DEVICE_ID_INTEL_MFD_SDIO2 0x0822 | ||
2442 | #define PCI_DEVICE_ID_INTEL_MFD_EMMC0 0x0823 | ||
2443 | #define PCI_DEVICE_ID_INTEL_MFD_EMMC1 0x0824 | ||
2413 | #define PCI_DEVICE_ID_INTEL_I960 0x0960 | 2444 | #define PCI_DEVICE_ID_INTEL_I960 0x0960 |
2414 | #define PCI_DEVICE_ID_INTEL_I960RM 0x0962 | 2445 | #define PCI_DEVICE_ID_INTEL_I960RM 0x0962 |
2415 | #define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062 | 2446 | #define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062 |
@@ -2418,7 +2449,7 @@ | |||
2418 | #define PCI_DEVICE_ID_INTEL_82815_MC 0x1130 | 2449 | #define PCI_DEVICE_ID_INTEL_82815_MC 0x1130 |
2419 | #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132 | 2450 | #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132 |
2420 | #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 | 2451 | #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 |
2421 | #define PCI_DEVICE_ID_INTEL_7505_0 0x2550 | 2452 | #define PCI_DEVICE_ID_INTEL_7505_0 0x2550 |
2422 | #define PCI_DEVICE_ID_INTEL_7205_0 0x255d | 2453 | #define PCI_DEVICE_ID_INTEL_7205_0 0x255d |
2423 | #define PCI_DEVICE_ID_INTEL_82437 0x122d | 2454 | #define PCI_DEVICE_ID_INTEL_82437 0x122d |
2424 | #define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e | 2455 | #define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e |
@@ -2431,9 +2462,11 @@ | |||
2431 | #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 | 2462 | #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 |
2432 | #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 | 2463 | #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 |
2433 | #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 | 2464 | #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 |
2434 | #define PCI_DEVICE_ID_INTEL_CPT_SMBUS 0x1c22 | 2465 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 |
2435 | #define PCI_DEVICE_ID_INTEL_CPT_LPC_MIN 0x1c41 | 2466 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN 0x1c41 |
2436 | #define PCI_DEVICE_ID_INTEL_CPT_LPC_MAX 0x1c5f | 2467 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX 0x1c5f |
2468 | #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 | ||
2469 | #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC 0x1d40 | ||
2437 | #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 | 2470 | #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 |
2438 | #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 | 2471 | #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 |
2439 | #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 | 2472 | #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 |
@@ -2621,6 +2654,9 @@ | |||
2621 | #define PCI_DEVICE_ID_INTEL_MCH_PC 0x3599 | 2654 | #define PCI_DEVICE_ID_INTEL_MCH_PC 0x3599 |
2622 | #define PCI_DEVICE_ID_INTEL_MCH_PC1 0x359a | 2655 | #define PCI_DEVICE_ID_INTEL_MCH_PC1 0x359a |
2623 | #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e | 2656 | #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e |
2657 | #define PCI_DEVICE_ID_INTEL_I7300_MCH_ERR 0x360c | ||
2658 | #define PCI_DEVICE_ID_INTEL_I7300_MCH_FB0 0x360f | ||
2659 | #define PCI_DEVICE_ID_INTEL_I7300_MCH_FB1 0x3610 | ||
2624 | #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b | 2660 | #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b |
2625 | #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c | 2661 | #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c |
2626 | #define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 | 2662 | #define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 |
@@ -2639,9 +2675,9 @@ | |||
2639 | #define PCI_DEVICE_ID_INTEL_ICH10_3 0x3a1a | 2675 | #define PCI_DEVICE_ID_INTEL_ICH10_3 0x3a1a |
2640 | #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 | 2676 | #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 |
2641 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 | 2677 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 |
2642 | #define PCI_DEVICE_ID_INTEL_PCH_LPC_MIN 0x3b00 | 2678 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 |
2643 | #define PCI_DEVICE_ID_INTEL_PCH_LPC_MAX 0x3b1f | 2679 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f |
2644 | #define PCI_DEVICE_ID_INTEL_PCH_SMBUS 0x3b30 | 2680 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 |
2645 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f | 2681 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f |
2646 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 | 2682 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 |
2647 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 | 2683 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 |
@@ -2650,8 +2686,8 @@ | |||
2650 | #define PCI_DEVICE_ID_INTEL_5400_FBD0 0x4035 | 2686 | #define PCI_DEVICE_ID_INTEL_5400_FBD0 0x4035 |
2651 | #define PCI_DEVICE_ID_INTEL_5400_FBD1 0x4036 | 2687 | #define PCI_DEVICE_ID_INTEL_5400_FBD1 0x4036 |
2652 | #define PCI_DEVICE_ID_INTEL_IOAT_SCNB 0x65ff | 2688 | #define PCI_DEVICE_ID_INTEL_IOAT_SCNB 0x65ff |
2653 | #define PCI_DEVICE_ID_INTEL_TOLAPAI_0 0x5031 | 2689 | #define PCI_DEVICE_ID_INTEL_EP80579_0 0x5031 |
2654 | #define PCI_DEVICE_ID_INTEL_TOLAPAI_1 0x5032 | 2690 | #define PCI_DEVICE_ID_INTEL_EP80579_1 0x5032 |
2655 | #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 | 2691 | #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 |
2656 | #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 | 2692 | #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 |
2657 | #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 | 2693 | #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index 455b9ccdfca7..af83076c31a6 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
@@ -300,12 +300,14 @@ | |||
300 | #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ | 300 | #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ |
301 | #define PCI_MSI_MASK_64 16 /* Mask bits register for 64-bit devices */ | 301 | #define PCI_MSI_MASK_64 16 /* Mask bits register for 64-bit devices */ |
302 | 302 | ||
303 | /* MSI-X registers (these are at offset PCI_MSIX_FLAGS) */ | 303 | /* MSI-X registers */ |
304 | #define PCI_MSIX_FLAGS 2 | 304 | #define PCI_MSIX_FLAGS 2 |
305 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF | 305 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF |
306 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) | 306 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) |
307 | #define PCI_MSIX_FLAGS_MASKALL (1 << 14) | 307 | #define PCI_MSIX_FLAGS_MASKALL (1 << 14) |
308 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) | 308 | #define PCI_MSIX_TABLE 4 |
309 | #define PCI_MSIX_PBA 8 | ||
310 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) | ||
309 | 311 | ||
310 | /* CompactPCI Hotswap Register */ | 312 | /* CompactPCI Hotswap Register */ |
311 | 313 | ||
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h index ce2dc655cd1d..27ef6b190ea6 100644 --- a/include/linux/percpu-defs.h +++ b/include/linux/percpu-defs.h | |||
@@ -139,6 +139,15 @@ | |||
139 | __aligned(PAGE_SIZE) | 139 | __aligned(PAGE_SIZE) |
140 | 140 | ||
141 | /* | 141 | /* |
142 | * Declaration/definition used for per-CPU variables that must be read mostly. | ||
143 | */ | ||
144 | #define DECLARE_PER_CPU_READ_MOSTLY(type, name) \ | ||
145 | DECLARE_PER_CPU_SECTION(type, name, "..readmostly") | ||
146 | |||
147 | #define DEFINE_PER_CPU_READ_MOSTLY(type, name) \ | ||
148 | DEFINE_PER_CPU_SECTION(type, name, "..readmostly") | ||
149 | |||
150 | /* | ||
142 | * Intermodule exports for per-CPU variables. sparse forgets about | 151 | * Intermodule exports for per-CPU variables. sparse forgets about |
143 | * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to | 152 | * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to |
144 | * noop if __CHECKER__. | 153 | * noop if __CHECKER__. |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 49466b13c5c6..5095b834a6fb 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -39,10 +39,17 @@ | |||
39 | preempt_enable(); \ | 39 | preempt_enable(); \ |
40 | } while (0) | 40 | } while (0) |
41 | 41 | ||
42 | #ifdef CONFIG_SMP | 42 | #define get_cpu_ptr(var) ({ \ |
43 | preempt_disable(); \ | ||
44 | this_cpu_ptr(var); }) | ||
45 | |||
46 | #define put_cpu_ptr(var) do { \ | ||
47 | (void)(var); \ | ||
48 | preempt_enable(); \ | ||
49 | } while (0) | ||
43 | 50 | ||
44 | /* minimum unit size, also is the maximum supported allocation size */ | 51 | /* minimum unit size, also is the maximum supported allocation size */ |
45 | #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(64 << 10) | 52 | #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(32 << 10) |
46 | 53 | ||
47 | /* | 54 | /* |
48 | * Percpu allocator can serve percpu allocations before slab is | 55 | * Percpu allocator can serve percpu allocations before slab is |
@@ -137,37 +144,20 @@ extern int __init pcpu_page_first_chunk(size_t reserved_size, | |||
137 | * dynamically allocated. Non-atomic access to the current CPU's | 144 | * dynamically allocated. Non-atomic access to the current CPU's |
138 | * version should probably be combined with get_cpu()/put_cpu(). | 145 | * version should probably be combined with get_cpu()/put_cpu(). |
139 | */ | 146 | */ |
147 | #ifdef CONFIG_SMP | ||
140 | #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) | 148 | #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) |
149 | #else | ||
150 | #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); VERIFY_PERCPU_PTR((ptr)); }) | ||
151 | #endif | ||
141 | 152 | ||
142 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); | 153 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); |
143 | extern bool is_kernel_percpu_address(unsigned long addr); | 154 | extern bool is_kernel_percpu_address(unsigned long addr); |
144 | 155 | ||
145 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA | 156 | #if !defined(CONFIG_SMP) || !defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) |
146 | extern void __init setup_per_cpu_areas(void); | 157 | extern void __init setup_per_cpu_areas(void); |
147 | #endif | 158 | #endif |
148 | extern void __init percpu_init_late(void); | 159 | extern void __init percpu_init_late(void); |
149 | 160 | ||
150 | #else /* CONFIG_SMP */ | ||
151 | |||
152 | #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); VERIFY_PERCPU_PTR((ptr)); }) | ||
153 | |||
154 | /* can't distinguish from other static vars, always false */ | ||
155 | static inline bool is_kernel_percpu_address(unsigned long addr) | ||
156 | { | ||
157 | return false; | ||
158 | } | ||
159 | |||
160 | static inline void __init setup_per_cpu_areas(void) { } | ||
161 | |||
162 | static inline void __init percpu_init_late(void) { } | ||
163 | |||
164 | static inline void *pcpu_lpage_remapped(void *kaddr) | ||
165 | { | ||
166 | return NULL; | ||
167 | } | ||
168 | |||
169 | #endif /* CONFIG_SMP */ | ||
170 | |||
171 | extern void __percpu *__alloc_percpu(size_t size, size_t align); | 161 | extern void __percpu *__alloc_percpu(size_t size, size_t align); |
172 | extern void free_percpu(void __percpu *__pdata); | 162 | extern void free_percpu(void __percpu *__pdata); |
173 | extern phys_addr_t per_cpu_ptr_to_phys(void *addr); | 163 | extern phys_addr_t per_cpu_ptr_to_phys(void *addr); |
diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 8a7d510ffa9c..46f6ba56fa91 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h | |||
@@ -78,6 +78,11 @@ static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc) | |||
78 | return 1; | 78 | return 1; |
79 | } | 79 | } |
80 | 80 | ||
81 | static inline int percpu_counter_initialized(struct percpu_counter *fbc) | ||
82 | { | ||
83 | return (fbc->counters != NULL); | ||
84 | } | ||
85 | |||
81 | #else | 86 | #else |
82 | 87 | ||
83 | struct percpu_counter { | 88 | struct percpu_counter { |
@@ -143,6 +148,11 @@ static inline s64 percpu_counter_sum(struct percpu_counter *fbc) | |||
143 | return percpu_counter_read(fbc); | 148 | return percpu_counter_read(fbc); |
144 | } | 149 | } |
145 | 150 | ||
151 | static inline int percpu_counter_initialized(struct percpu_counter *fbc) | ||
152 | { | ||
153 | return 1; | ||
154 | } | ||
155 | |||
146 | #endif /* CONFIG_SMP */ | 156 | #endif /* CONFIG_SMP */ |
147 | 157 | ||
148 | static inline void percpu_counter_inc(struct percpu_counter *fbc) | 158 | static inline void percpu_counter_inc(struct percpu_counter *fbc) |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 716f99b682c1..40150f345982 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -486,6 +486,8 @@ struct perf_guest_info_callbacks { | |||
486 | #include <linux/workqueue.h> | 486 | #include <linux/workqueue.h> |
487 | #include <linux/ftrace.h> | 487 | #include <linux/ftrace.h> |
488 | #include <linux/cpu.h> | 488 | #include <linux/cpu.h> |
489 | #include <linux/irq_work.h> | ||
490 | #include <linux/jump_label_ref.h> | ||
489 | #include <asm/atomic.h> | 491 | #include <asm/atomic.h> |
490 | #include <asm/local.h> | 492 | #include <asm/local.h> |
491 | 493 | ||
@@ -529,16 +531,22 @@ struct hw_perf_event { | |||
529 | int last_cpu; | 531 | int last_cpu; |
530 | }; | 532 | }; |
531 | struct { /* software */ | 533 | struct { /* software */ |
532 | s64 remaining; | ||
533 | struct hrtimer hrtimer; | 534 | struct hrtimer hrtimer; |
534 | }; | 535 | }; |
535 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 536 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
536 | struct { /* breakpoint */ | 537 | struct { /* breakpoint */ |
537 | struct arch_hw_breakpoint info; | 538 | struct arch_hw_breakpoint info; |
538 | struct list_head bp_list; | 539 | struct list_head bp_list; |
540 | /* | ||
541 | * Crufty hack to avoid the chicken and egg | ||
542 | * problem hw_breakpoint has with context | ||
543 | * creation and event initalization. | ||
544 | */ | ||
545 | struct task_struct *bp_target; | ||
539 | }; | 546 | }; |
540 | #endif | 547 | #endif |
541 | }; | 548 | }; |
549 | int state; | ||
542 | local64_t prev_count; | 550 | local64_t prev_count; |
543 | u64 sample_period; | 551 | u64 sample_period; |
544 | u64 last_period; | 552 | u64 last_period; |
@@ -550,6 +558,13 @@ struct hw_perf_event { | |||
550 | #endif | 558 | #endif |
551 | }; | 559 | }; |
552 | 560 | ||
561 | /* | ||
562 | * hw_perf_event::state flags | ||
563 | */ | ||
564 | #define PERF_HES_STOPPED 0x01 /* the counter is stopped */ | ||
565 | #define PERF_HES_UPTODATE 0x02 /* event->count up-to-date */ | ||
566 | #define PERF_HES_ARCH 0x04 | ||
567 | |||
553 | struct perf_event; | 568 | struct perf_event; |
554 | 569 | ||
555 | /* | 570 | /* |
@@ -561,36 +576,70 @@ struct perf_event; | |||
561 | * struct pmu - generic performance monitoring unit | 576 | * struct pmu - generic performance monitoring unit |
562 | */ | 577 | */ |
563 | struct pmu { | 578 | struct pmu { |
564 | int (*enable) (struct perf_event *event); | 579 | struct list_head entry; |
565 | void (*disable) (struct perf_event *event); | 580 | |
566 | int (*start) (struct perf_event *event); | 581 | int * __percpu pmu_disable_count; |
567 | void (*stop) (struct perf_event *event); | 582 | struct perf_cpu_context * __percpu pmu_cpu_context; |
568 | void (*read) (struct perf_event *event); | 583 | int task_ctx_nr; |
569 | void (*unthrottle) (struct perf_event *event); | ||
570 | 584 | ||
571 | /* | 585 | /* |
572 | * Group events scheduling is treated as a transaction, add group | 586 | * Fully disable/enable this PMU, can be used to protect from the PMI |
573 | * events as a whole and perform one schedulability test. If the test | 587 | * as well as for lazy/batch writing of the MSRs. |
574 | * fails, roll back the whole group | ||
575 | */ | 588 | */ |
589 | void (*pmu_enable) (struct pmu *pmu); /* optional */ | ||
590 | void (*pmu_disable) (struct pmu *pmu); /* optional */ | ||
576 | 591 | ||
577 | /* | 592 | /* |
578 | * Start the transaction, after this ->enable() doesn't need | 593 | * Try and initialize the event for this PMU. |
579 | * to do schedulability tests. | 594 | * Should return -ENOENT when the @event doesn't match this PMU. |
580 | */ | 595 | */ |
581 | void (*start_txn) (const struct pmu *pmu); | 596 | int (*event_init) (struct perf_event *event); |
597 | |||
598 | #define PERF_EF_START 0x01 /* start the counter when adding */ | ||
599 | #define PERF_EF_RELOAD 0x02 /* reload the counter when starting */ | ||
600 | #define PERF_EF_UPDATE 0x04 /* update the counter when stopping */ | ||
601 | |||
582 | /* | 602 | /* |
583 | * If ->start_txn() disabled the ->enable() schedulability test | 603 | * Adds/Removes a counter to/from the PMU, can be done inside |
604 | * a transaction, see the ->*_txn() methods. | ||
605 | */ | ||
606 | int (*add) (struct perf_event *event, int flags); | ||
607 | void (*del) (struct perf_event *event, int flags); | ||
608 | |||
609 | /* | ||
610 | * Starts/Stops a counter present on the PMU. The PMI handler | ||
611 | * should stop the counter when perf_event_overflow() returns | ||
612 | * !0. ->start() will be used to continue. | ||
613 | */ | ||
614 | void (*start) (struct perf_event *event, int flags); | ||
615 | void (*stop) (struct perf_event *event, int flags); | ||
616 | |||
617 | /* | ||
618 | * Updates the counter value of the event. | ||
619 | */ | ||
620 | void (*read) (struct perf_event *event); | ||
621 | |||
622 | /* | ||
623 | * Group events scheduling is treated as a transaction, add | ||
624 | * group events as a whole and perform one schedulability test. | ||
625 | * If the test fails, roll back the whole group | ||
626 | * | ||
627 | * Start the transaction, after this ->add() doesn't need to | ||
628 | * do schedulability tests. | ||
629 | */ | ||
630 | void (*start_txn) (struct pmu *pmu); /* optional */ | ||
631 | /* | ||
632 | * If ->start_txn() disabled the ->add() schedulability test | ||
584 | * then ->commit_txn() is required to perform one. On success | 633 | * then ->commit_txn() is required to perform one. On success |
585 | * the transaction is closed. On error the transaction is kept | 634 | * the transaction is closed. On error the transaction is kept |
586 | * open until ->cancel_txn() is called. | 635 | * open until ->cancel_txn() is called. |
587 | */ | 636 | */ |
588 | int (*commit_txn) (const struct pmu *pmu); | 637 | int (*commit_txn) (struct pmu *pmu); /* optional */ |
589 | /* | 638 | /* |
590 | * Will cancel the transaction, assumes ->disable() is called for | 639 | * Will cancel the transaction, assumes ->del() is called |
591 | * each successfull ->enable() during the transaction. | 640 | * for each successfull ->add() during the transaction. |
592 | */ | 641 | */ |
593 | void (*cancel_txn) (const struct pmu *pmu); | 642 | void (*cancel_txn) (struct pmu *pmu); /* optional */ |
594 | }; | 643 | }; |
595 | 644 | ||
596 | /** | 645 | /** |
@@ -631,11 +680,6 @@ struct perf_buffer { | |||
631 | void *data_pages[0]; | 680 | void *data_pages[0]; |
632 | }; | 681 | }; |
633 | 682 | ||
634 | struct perf_pending_entry { | ||
635 | struct perf_pending_entry *next; | ||
636 | void (*func)(struct perf_pending_entry *); | ||
637 | }; | ||
638 | |||
639 | struct perf_sample_data; | 683 | struct perf_sample_data; |
640 | 684 | ||
641 | typedef void (*perf_overflow_handler_t)(struct perf_event *, int, | 685 | typedef void (*perf_overflow_handler_t)(struct perf_event *, int, |
@@ -656,6 +700,7 @@ struct swevent_hlist { | |||
656 | 700 | ||
657 | #define PERF_ATTACH_CONTEXT 0x01 | 701 | #define PERF_ATTACH_CONTEXT 0x01 |
658 | #define PERF_ATTACH_GROUP 0x02 | 702 | #define PERF_ATTACH_GROUP 0x02 |
703 | #define PERF_ATTACH_TASK 0x04 | ||
659 | 704 | ||
660 | /** | 705 | /** |
661 | * struct perf_event - performance event kernel representation: | 706 | * struct perf_event - performance event kernel representation: |
@@ -669,7 +714,7 @@ struct perf_event { | |||
669 | int nr_siblings; | 714 | int nr_siblings; |
670 | int group_flags; | 715 | int group_flags; |
671 | struct perf_event *group_leader; | 716 | struct perf_event *group_leader; |
672 | const struct pmu *pmu; | 717 | struct pmu *pmu; |
673 | 718 | ||
674 | enum perf_event_active_state state; | 719 | enum perf_event_active_state state; |
675 | unsigned int attach_state; | 720 | unsigned int attach_state; |
@@ -702,6 +747,16 @@ struct perf_event { | |||
702 | u64 tstamp_running; | 747 | u64 tstamp_running; |
703 | u64 tstamp_stopped; | 748 | u64 tstamp_stopped; |
704 | 749 | ||
750 | /* | ||
751 | * timestamp shadows the actual context timing but it can | ||
752 | * be safely used in NMI interrupt context. It reflects the | ||
753 | * context time as it was when the event was last scheduled in. | ||
754 | * | ||
755 | * ctx_time already accounts for ctx->timestamp. Therefore to | ||
756 | * compute ctx_time for a sample, simply add perf_clock(). | ||
757 | */ | ||
758 | u64 shadow_ctx_time; | ||
759 | |||
705 | struct perf_event_attr attr; | 760 | struct perf_event_attr attr; |
706 | struct hw_perf_event hw; | 761 | struct hw_perf_event hw; |
707 | 762 | ||
@@ -743,7 +798,7 @@ struct perf_event { | |||
743 | int pending_wakeup; | 798 | int pending_wakeup; |
744 | int pending_kill; | 799 | int pending_kill; |
745 | int pending_disable; | 800 | int pending_disable; |
746 | struct perf_pending_entry pending; | 801 | struct irq_work pending; |
747 | 802 | ||
748 | atomic_t event_limit; | 803 | atomic_t event_limit; |
749 | 804 | ||
@@ -763,12 +818,19 @@ struct perf_event { | |||
763 | #endif /* CONFIG_PERF_EVENTS */ | 818 | #endif /* CONFIG_PERF_EVENTS */ |
764 | }; | 819 | }; |
765 | 820 | ||
821 | enum perf_event_context_type { | ||
822 | task_context, | ||
823 | cpu_context, | ||
824 | }; | ||
825 | |||
766 | /** | 826 | /** |
767 | * struct perf_event_context - event context structure | 827 | * struct perf_event_context - event context structure |
768 | * | 828 | * |
769 | * Used as a container for task events and CPU events as well: | 829 | * Used as a container for task events and CPU events as well: |
770 | */ | 830 | */ |
771 | struct perf_event_context { | 831 | struct perf_event_context { |
832 | enum perf_event_context_type type; | ||
833 | struct pmu *pmu; | ||
772 | /* | 834 | /* |
773 | * Protect the states of the events in the list, | 835 | * Protect the states of the events in the list, |
774 | * nr_active, and the list: | 836 | * nr_active, and the list: |
@@ -808,6 +870,12 @@ struct perf_event_context { | |||
808 | struct rcu_head rcu_head; | 870 | struct rcu_head rcu_head; |
809 | }; | 871 | }; |
810 | 872 | ||
873 | /* | ||
874 | * Number of contexts where an event can trigger: | ||
875 | * task, softirq, hardirq, nmi. | ||
876 | */ | ||
877 | #define PERF_NR_CONTEXTS 4 | ||
878 | |||
811 | /** | 879 | /** |
812 | * struct perf_event_cpu_context - per cpu event context structure | 880 | * struct perf_event_cpu_context - per cpu event context structure |
813 | */ | 881 | */ |
@@ -815,18 +883,9 @@ struct perf_cpu_context { | |||
815 | struct perf_event_context ctx; | 883 | struct perf_event_context ctx; |
816 | struct perf_event_context *task_ctx; | 884 | struct perf_event_context *task_ctx; |
817 | int active_oncpu; | 885 | int active_oncpu; |
818 | int max_pertask; | ||
819 | int exclusive; | 886 | int exclusive; |
820 | struct swevent_hlist *swevent_hlist; | 887 | struct list_head rotation_list; |
821 | struct mutex hlist_mutex; | 888 | int jiffies_interval; |
822 | int hlist_refcount; | ||
823 | |||
824 | /* | ||
825 | * Recursion avoidance: | ||
826 | * | ||
827 | * task, softirq, irq, nmi context | ||
828 | */ | ||
829 | int recursion[4]; | ||
830 | }; | 889 | }; |
831 | 890 | ||
832 | struct perf_output_handle { | 891 | struct perf_output_handle { |
@@ -842,26 +901,34 @@ struct perf_output_handle { | |||
842 | 901 | ||
843 | #ifdef CONFIG_PERF_EVENTS | 902 | #ifdef CONFIG_PERF_EVENTS |
844 | 903 | ||
845 | /* | 904 | extern int perf_pmu_register(struct pmu *pmu); |
846 | * Set by architecture code: | 905 | extern void perf_pmu_unregister(struct pmu *pmu); |
847 | */ | 906 | |
848 | extern int perf_max_events; | 907 | extern int perf_num_counters(void); |
908 | extern const char *perf_pmu_name(void); | ||
909 | extern void __perf_event_task_sched_in(struct task_struct *task); | ||
910 | extern void __perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); | ||
849 | 911 | ||
850 | extern const struct pmu *hw_perf_event_init(struct perf_event *event); | 912 | extern atomic_t perf_task_events; |
913 | |||
914 | static inline void perf_event_task_sched_in(struct task_struct *task) | ||
915 | { | ||
916 | COND_STMT(&perf_task_events, __perf_event_task_sched_in(task)); | ||
917 | } | ||
918 | |||
919 | static inline | ||
920 | void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next) | ||
921 | { | ||
922 | COND_STMT(&perf_task_events, __perf_event_task_sched_out(task, next)); | ||
923 | } | ||
851 | 924 | ||
852 | extern void perf_event_task_sched_in(struct task_struct *task); | ||
853 | extern void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); | ||
854 | extern void perf_event_task_tick(struct task_struct *task); | ||
855 | extern int perf_event_init_task(struct task_struct *child); | 925 | extern int perf_event_init_task(struct task_struct *child); |
856 | extern void perf_event_exit_task(struct task_struct *child); | 926 | extern void perf_event_exit_task(struct task_struct *child); |
857 | extern void perf_event_free_task(struct task_struct *task); | 927 | extern void perf_event_free_task(struct task_struct *task); |
858 | extern void set_perf_event_pending(void); | 928 | extern void perf_event_delayed_put(struct task_struct *task); |
859 | extern void perf_event_do_pending(void); | ||
860 | extern void perf_event_print_debug(void); | 929 | extern void perf_event_print_debug(void); |
861 | extern void __perf_disable(void); | 930 | extern void perf_pmu_disable(struct pmu *pmu); |
862 | extern bool __perf_enable(void); | 931 | extern void perf_pmu_enable(struct pmu *pmu); |
863 | extern void perf_disable(void); | ||
864 | extern void perf_enable(void); | ||
865 | extern int perf_event_task_disable(void); | 932 | extern int perf_event_task_disable(void); |
866 | extern int perf_event_task_enable(void); | 933 | extern int perf_event_task_enable(void); |
867 | extern void perf_event_update_userpage(struct perf_event *event); | 934 | extern void perf_event_update_userpage(struct perf_event *event); |
@@ -869,7 +936,7 @@ extern int perf_event_release_kernel(struct perf_event *event); | |||
869 | extern struct perf_event * | 936 | extern struct perf_event * |
870 | perf_event_create_kernel_counter(struct perf_event_attr *attr, | 937 | perf_event_create_kernel_counter(struct perf_event_attr *attr, |
871 | int cpu, | 938 | int cpu, |
872 | pid_t pid, | 939 | struct task_struct *task, |
873 | perf_overflow_handler_t callback); | 940 | perf_overflow_handler_t callback); |
874 | extern u64 perf_event_read_value(struct perf_event *event, | 941 | extern u64 perf_event_read_value(struct perf_event *event, |
875 | u64 *enabled, u64 *running); | 942 | u64 *enabled, u64 *running); |
@@ -920,14 +987,7 @@ extern int perf_event_overflow(struct perf_event *event, int nmi, | |||
920 | */ | 987 | */ |
921 | static inline int is_software_event(struct perf_event *event) | 988 | static inline int is_software_event(struct perf_event *event) |
922 | { | 989 | { |
923 | switch (event->attr.type) { | 990 | return event->pmu->task_ctx_nr == perf_sw_context; |
924 | case PERF_TYPE_SOFTWARE: | ||
925 | case PERF_TYPE_TRACEPOINT: | ||
926 | /* for now the breakpoint stuff also works as software event */ | ||
927 | case PERF_TYPE_BREAKPOINT: | ||
928 | return 1; | ||
929 | } | ||
930 | return 0; | ||
931 | } | 991 | } |
932 | 992 | ||
933 | extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX]; | 993 | extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX]; |
@@ -954,18 +1014,20 @@ static inline void perf_fetch_caller_regs(struct pt_regs *regs) | |||
954 | perf_arch_fetch_caller_regs(regs, CALLER_ADDR0); | 1014 | perf_arch_fetch_caller_regs(regs, CALLER_ADDR0); |
955 | } | 1015 | } |
956 | 1016 | ||
957 | static inline void | 1017 | static __always_inline void |
958 | perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr) | 1018 | perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr) |
959 | { | 1019 | { |
960 | if (atomic_read(&perf_swevent_enabled[event_id])) { | 1020 | struct pt_regs hot_regs; |
961 | struct pt_regs hot_regs; | 1021 | |
962 | 1022 | JUMP_LABEL(&perf_swevent_enabled[event_id], have_event); | |
963 | if (!regs) { | 1023 | return; |
964 | perf_fetch_caller_regs(&hot_regs); | 1024 | |
965 | regs = &hot_regs; | 1025 | have_event: |
966 | } | 1026 | if (!regs) { |
967 | __perf_sw_event(event_id, nr, nmi, regs, addr); | 1027 | perf_fetch_caller_regs(&hot_regs); |
1028 | regs = &hot_regs; | ||
968 | } | 1029 | } |
1030 | __perf_sw_event(event_id, nr, nmi, regs, addr); | ||
969 | } | 1031 | } |
970 | 1032 | ||
971 | extern void perf_event_mmap(struct vm_area_struct *vma); | 1033 | extern void perf_event_mmap(struct vm_area_struct *vma); |
@@ -976,7 +1038,21 @@ extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks | |||
976 | extern void perf_event_comm(struct task_struct *tsk); | 1038 | extern void perf_event_comm(struct task_struct *tsk); |
977 | extern void perf_event_fork(struct task_struct *tsk); | 1039 | extern void perf_event_fork(struct task_struct *tsk); |
978 | 1040 | ||
979 | extern struct perf_callchain_entry *perf_callchain(struct pt_regs *regs); | 1041 | /* Callchains */ |
1042 | DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry); | ||
1043 | |||
1044 | extern void perf_callchain_user(struct perf_callchain_entry *entry, | ||
1045 | struct pt_regs *regs); | ||
1046 | extern void perf_callchain_kernel(struct perf_callchain_entry *entry, | ||
1047 | struct pt_regs *regs); | ||
1048 | |||
1049 | |||
1050 | static inline void | ||
1051 | perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) | ||
1052 | { | ||
1053 | if (entry->nr < PERF_MAX_STACK_DEPTH) | ||
1054 | entry->ip[entry->nr++] = ip; | ||
1055 | } | ||
980 | 1056 | ||
981 | extern int sysctl_perf_event_paranoid; | 1057 | extern int sysctl_perf_event_paranoid; |
982 | extern int sysctl_perf_event_mlock; | 1058 | extern int sysctl_perf_event_mlock; |
@@ -1019,21 +1095,18 @@ extern int perf_swevent_get_recursion_context(void); | |||
1019 | extern void perf_swevent_put_recursion_context(int rctx); | 1095 | extern void perf_swevent_put_recursion_context(int rctx); |
1020 | extern void perf_event_enable(struct perf_event *event); | 1096 | extern void perf_event_enable(struct perf_event *event); |
1021 | extern void perf_event_disable(struct perf_event *event); | 1097 | extern void perf_event_disable(struct perf_event *event); |
1098 | extern void perf_event_task_tick(void); | ||
1022 | #else | 1099 | #else |
1023 | static inline void | 1100 | static inline void |
1024 | perf_event_task_sched_in(struct task_struct *task) { } | 1101 | perf_event_task_sched_in(struct task_struct *task) { } |
1025 | static inline void | 1102 | static inline void |
1026 | perf_event_task_sched_out(struct task_struct *task, | 1103 | perf_event_task_sched_out(struct task_struct *task, |
1027 | struct task_struct *next) { } | 1104 | struct task_struct *next) { } |
1028 | static inline void | ||
1029 | perf_event_task_tick(struct task_struct *task) { } | ||
1030 | static inline int perf_event_init_task(struct task_struct *child) { return 0; } | 1105 | static inline int perf_event_init_task(struct task_struct *child) { return 0; } |
1031 | static inline void perf_event_exit_task(struct task_struct *child) { } | 1106 | static inline void perf_event_exit_task(struct task_struct *child) { } |
1032 | static inline void perf_event_free_task(struct task_struct *task) { } | 1107 | static inline void perf_event_free_task(struct task_struct *task) { } |
1033 | static inline void perf_event_do_pending(void) { } | 1108 | static inline void perf_event_delayed_put(struct task_struct *task) { } |
1034 | static inline void perf_event_print_debug(void) { } | 1109 | static inline void perf_event_print_debug(void) { } |
1035 | static inline void perf_disable(void) { } | ||
1036 | static inline void perf_enable(void) { } | ||
1037 | static inline int perf_event_task_disable(void) { return -EINVAL; } | 1110 | static inline int perf_event_task_disable(void) { return -EINVAL; } |
1038 | static inline int perf_event_task_enable(void) { return -EINVAL; } | 1111 | static inline int perf_event_task_enable(void) { return -EINVAL; } |
1039 | 1112 | ||
@@ -1056,6 +1129,7 @@ static inline int perf_swevent_get_recursion_context(void) { return -1; } | |||
1056 | static inline void perf_swevent_put_recursion_context(int rctx) { } | 1129 | static inline void perf_swevent_put_recursion_context(int rctx) { } |
1057 | static inline void perf_event_enable(struct perf_event *event) { } | 1130 | static inline void perf_event_enable(struct perf_event *event) { } |
1058 | static inline void perf_event_disable(struct perf_event *event) { } | 1131 | static inline void perf_event_disable(struct perf_event *event) { } |
1132 | static inline void perf_event_task_tick(void) { } | ||
1059 | #endif | 1133 | #endif |
1060 | 1134 | ||
1061 | #define perf_output_put(handle, x) \ | 1135 | #define perf_output_put(handle, x) \ |
diff --git a/include/linux/phonet.h b/include/linux/phonet.h index 76edadf046d3..26c8df786918 100644 --- a/include/linux/phonet.h +++ b/include/linux/phonet.h | |||
@@ -36,6 +36,9 @@ | |||
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 | ||
40 | #define PNPIPE_ENABLE 4 | ||
41 | /* unused slot */ | ||
39 | 42 | ||
40 | #define PNADDR_ANY 0 | 43 | #define PNADDR_ANY 0 |
41 | #define PNADDR_BROADCAST 0xFC | 44 | #define PNADDR_BROADCAST 0xFC |
@@ -47,6 +50,8 @@ | |||
47 | 50 | ||
48 | /* ioctls */ | 51 | /* ioctls */ |
49 | #define SIOCPNGETOBJECT (SIOCPROTOPRIVATE + 0) | 52 | #define SIOCPNGETOBJECT (SIOCPROTOPRIVATE + 0) |
53 | #define SIOCPNADDRESOURCE (SIOCPROTOPRIVATE + 14) | ||
54 | #define SIOCPNDELRESOURCE (SIOCPROTOPRIVATE + 15) | ||
50 | 55 | ||
51 | /* Phonet protocol header */ | 56 | /* Phonet protocol header */ |
52 | struct phonethdr { | 57 | struct phonethdr { |
diff --git a/include/linux/phy.h b/include/linux/phy.h index 6b0a782c6224..7da5fa845959 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
@@ -116,7 +116,7 @@ struct mii_bus { | |||
116 | /* list of all PHYs on bus */ | 116 | /* list of all PHYs on bus */ |
117 | struct phy_device *phy_map[PHY_MAX_ADDR]; | 117 | struct phy_device *phy_map[PHY_MAX_ADDR]; |
118 | 118 | ||
119 | /* Phy addresses to be ignored when probing */ | 119 | /* PHY addresses to be ignored when probing */ |
120 | u32 phy_mask; | 120 | u32 phy_mask; |
121 | 121 | ||
122 | /* | 122 | /* |
@@ -283,7 +283,7 @@ struct phy_device { | |||
283 | 283 | ||
284 | phy_interface_t interface; | 284 | phy_interface_t interface; |
285 | 285 | ||
286 | /* Bus address of the PHY (0-32) */ | 286 | /* Bus address of the PHY (0-31) */ |
287 | int addr; | 287 | int addr; |
288 | 288 | ||
289 | /* | 289 | /* |
@@ -472,11 +472,7 @@ static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) | |||
472 | int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); | 472 | int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); |
473 | struct phy_device* get_phy_device(struct mii_bus *bus, int addr); | 473 | struct phy_device* get_phy_device(struct mii_bus *bus, int addr); |
474 | int phy_device_register(struct phy_device *phy); | 474 | int phy_device_register(struct phy_device *phy); |
475 | int phy_clear_interrupt(struct phy_device *phydev); | ||
476 | int phy_config_interrupt(struct phy_device *phydev, u32 interrupts); | ||
477 | int phy_init_hw(struct phy_device *phydev); | 475 | int phy_init_hw(struct phy_device *phydev); |
478 | int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, | ||
479 | u32 flags, phy_interface_t interface); | ||
480 | struct phy_device * phy_attach(struct net_device *dev, | 476 | struct phy_device * phy_attach(struct net_device *dev, |
481 | const char *bus_id, u32 flags, phy_interface_t interface); | 477 | const char *bus_id, u32 flags, phy_interface_t interface); |
482 | struct phy_device *phy_find_first(struct mii_bus *bus); | 478 | struct phy_device *phy_find_first(struct mii_bus *bus); |
@@ -492,17 +488,12 @@ void phy_start(struct phy_device *phydev); | |||
492 | void phy_stop(struct phy_device *phydev); | 488 | void phy_stop(struct phy_device *phydev); |
493 | int phy_start_aneg(struct phy_device *phydev); | 489 | int phy_start_aneg(struct phy_device *phydev); |
494 | 490 | ||
495 | void phy_sanitize_settings(struct phy_device *phydev); | ||
496 | int phy_stop_interrupts(struct phy_device *phydev); | 491 | int phy_stop_interrupts(struct phy_device *phydev); |
497 | int phy_enable_interrupts(struct phy_device *phydev); | ||
498 | int phy_disable_interrupts(struct phy_device *phydev); | ||
499 | 492 | ||
500 | static inline int phy_read_status(struct phy_device *phydev) { | 493 | static inline int phy_read_status(struct phy_device *phydev) { |
501 | return phydev->drv->read_status(phydev); | 494 | return phydev->drv->read_status(phydev); |
502 | } | 495 | } |
503 | 496 | ||
504 | int genphy_config_advert(struct phy_device *phydev); | ||
505 | int genphy_setup_forced(struct phy_device *phydev); | ||
506 | int genphy_restart_aneg(struct phy_device *phydev); | 497 | int genphy_restart_aneg(struct phy_device *phydev); |
507 | int genphy_config_aneg(struct phy_device *phydev); | 498 | int genphy_config_aneg(struct phy_device *phydev); |
508 | int genphy_update_link(struct phy_device *phydev); | 499 | int genphy_update_link(struct phy_device *phydev); |
@@ -511,8 +502,6 @@ int genphy_suspend(struct phy_device *phydev); | |||
511 | int genphy_resume(struct phy_device *phydev); | 502 | int genphy_resume(struct phy_device *phydev); |
512 | void phy_driver_unregister(struct phy_driver *drv); | 503 | void phy_driver_unregister(struct phy_driver *drv); |
513 | int phy_driver_register(struct phy_driver *new_driver); | 504 | int phy_driver_register(struct phy_driver *new_driver); |
514 | void phy_prepare_link(struct phy_device *phydev, | ||
515 | void (*adjust_link)(struct net_device *)); | ||
516 | void phy_state_machine(struct work_struct *work); | 505 | void phy_state_machine(struct work_struct *work); |
517 | void phy_start_machine(struct phy_device *phydev, | 506 | void phy_start_machine(struct phy_device *phydev, |
518 | void (*handler)(struct net_device *)); | 507 | void (*handler)(struct net_device *)); |
@@ -523,7 +512,6 @@ int phy_mii_ioctl(struct phy_device *phydev, | |||
523 | struct ifreq *ifr, int cmd); | 512 | struct ifreq *ifr, int cmd); |
524 | int phy_start_interrupts(struct phy_device *phydev); | 513 | int phy_start_interrupts(struct phy_device *phydev); |
525 | void phy_print_status(struct phy_device *phydev); | 514 | void phy_print_status(struct phy_device *phydev); |
526 | struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id); | ||
527 | void phy_device_free(struct phy_device *phydev); | 515 | void phy_device_free(struct phy_device *phydev); |
528 | 516 | ||
529 | int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, | 517 | int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, |
diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h index 7f6ba8658abe..defbde203d07 100644 --- a/include/linux/pkt_cls.h +++ b/include/linux/pkt_cls.h | |||
@@ -332,6 +332,7 @@ enum { | |||
332 | FLOW_KEY_SKUID, | 332 | FLOW_KEY_SKUID, |
333 | FLOW_KEY_SKGID, | 333 | FLOW_KEY_SKGID, |
334 | FLOW_KEY_VLAN_TAG, | 334 | FLOW_KEY_VLAN_TAG, |
335 | FLOW_KEY_RXHASH, | ||
335 | __FLOW_KEY_MAX, | 336 | __FLOW_KEY_MAX, |
336 | }; | 337 | }; |
337 | 338 | ||
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index d7ecad0093bb..2e700ec0601f 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h | |||
@@ -138,6 +138,9 @@ extern struct platform_device *platform_create_bundle(struct platform_driver *dr | |||
138 | struct resource *res, unsigned int n_res, | 138 | struct resource *res, unsigned int n_res, |
139 | const void *data, size_t size); | 139 | const void *data, size_t size); |
140 | 140 | ||
141 | extern const struct dev_pm_ops * platform_bus_get_pm_ops(void); | ||
142 | extern void platform_bus_set_pm_ops(const struct dev_pm_ops *pm); | ||
143 | |||
141 | /* early platform driver interface */ | 144 | /* early platform driver interface */ |
142 | struct early_platform_driver { | 145 | struct early_platform_driver { |
143 | const char *class_str; | 146 | const char *class_str; |
diff --git a/include/linux/pm.h b/include/linux/pm.h index 52e8c55ff314..40f3f45702ba 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
@@ -41,6 +41,12 @@ extern void (*pm_power_off_prepare)(void); | |||
41 | 41 | ||
42 | struct device; | 42 | struct device; |
43 | 43 | ||
44 | #ifdef CONFIG_PM | ||
45 | extern const char power_group_name[]; /* = "power" */ | ||
46 | #else | ||
47 | #define power_group_name NULL | ||
48 | #endif | ||
49 | |||
44 | typedef struct pm_message { | 50 | typedef struct pm_message { |
45 | int event; | 51 | int event; |
46 | } pm_message_t; | 52 | } pm_message_t; |
@@ -438,6 +444,9 @@ enum rpm_status { | |||
438 | * | 444 | * |
439 | * RPM_REQ_SUSPEND Run the device bus type's ->runtime_suspend() callback | 445 | * RPM_REQ_SUSPEND Run the device bus type's ->runtime_suspend() callback |
440 | * | 446 | * |
447 | * RPM_REQ_AUTOSUSPEND Same as RPM_REQ_SUSPEND, but not until the device has | ||
448 | * been inactive for as long as power.autosuspend_delay | ||
449 | * | ||
441 | * RPM_REQ_RESUME Run the device bus type's ->runtime_resume() callback | 450 | * RPM_REQ_RESUME Run the device bus type's ->runtime_resume() callback |
442 | */ | 451 | */ |
443 | 452 | ||
@@ -445,26 +454,28 @@ enum rpm_request { | |||
445 | RPM_REQ_NONE = 0, | 454 | RPM_REQ_NONE = 0, |
446 | RPM_REQ_IDLE, | 455 | RPM_REQ_IDLE, |
447 | RPM_REQ_SUSPEND, | 456 | RPM_REQ_SUSPEND, |
457 | RPM_REQ_AUTOSUSPEND, | ||
448 | RPM_REQ_RESUME, | 458 | RPM_REQ_RESUME, |
449 | }; | 459 | }; |
450 | 460 | ||
461 | struct wakeup_source; | ||
462 | |||
451 | struct dev_pm_info { | 463 | struct dev_pm_info { |
452 | pm_message_t power_state; | 464 | pm_message_t power_state; |
453 | unsigned int can_wakeup:1; | 465 | unsigned int can_wakeup:1; |
454 | unsigned int should_wakeup:1; | ||
455 | unsigned async_suspend:1; | 466 | unsigned async_suspend:1; |
456 | enum dpm_state status; /* Owned by the PM core */ | 467 | enum dpm_state status; /* Owned by the PM core */ |
468 | spinlock_t lock; | ||
457 | #ifdef CONFIG_PM_SLEEP | 469 | #ifdef CONFIG_PM_SLEEP |
458 | struct list_head entry; | 470 | struct list_head entry; |
459 | struct completion completion; | 471 | struct completion completion; |
460 | unsigned long wakeup_count; | 472 | struct wakeup_source *wakeup; |
461 | #endif | 473 | #endif |
462 | #ifdef CONFIG_PM_RUNTIME | 474 | #ifdef CONFIG_PM_RUNTIME |
463 | struct timer_list suspend_timer; | 475 | struct timer_list suspend_timer; |
464 | unsigned long timer_expires; | 476 | unsigned long timer_expires; |
465 | struct work_struct work; | 477 | struct work_struct work; |
466 | wait_queue_head_t wait_queue; | 478 | wait_queue_head_t wait_queue; |
467 | spinlock_t lock; | ||
468 | atomic_t usage_count; | 479 | atomic_t usage_count; |
469 | atomic_t child_count; | 480 | atomic_t child_count; |
470 | unsigned int disable_depth:3; | 481 | unsigned int disable_depth:3; |
@@ -474,9 +485,14 @@ struct dev_pm_info { | |||
474 | unsigned int deferred_resume:1; | 485 | unsigned int deferred_resume:1; |
475 | unsigned int run_wake:1; | 486 | unsigned int run_wake:1; |
476 | unsigned int runtime_auto:1; | 487 | unsigned int runtime_auto:1; |
488 | unsigned int no_callbacks:1; | ||
489 | unsigned int use_autosuspend:1; | ||
490 | unsigned int timer_autosuspends:1; | ||
477 | enum rpm_request request; | 491 | enum rpm_request request; |
478 | enum rpm_status runtime_status; | 492 | enum rpm_status runtime_status; |
479 | int runtime_error; | 493 | int runtime_error; |
494 | int autosuspend_delay; | ||
495 | unsigned long last_busy; | ||
480 | unsigned long active_jiffies; | 496 | unsigned long active_jiffies; |
481 | unsigned long suspended_jiffies; | 497 | unsigned long suspended_jiffies; |
482 | unsigned long accounting_timestamp; | 498 | unsigned long accounting_timestamp; |
@@ -558,12 +574,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret); | |||
558 | __suspend_report_result(__func__, fn, ret); \ | 574 | __suspend_report_result(__func__, fn, ret); \ |
559 | } while (0) | 575 | } while (0) |
560 | 576 | ||
561 | extern void device_pm_wait_for_dev(struct device *sub, struct device *dev); | 577 | extern int device_pm_wait_for_dev(struct device *sub, struct device *dev); |
562 | |||
563 | /* drivers/base/power/wakeup.c */ | ||
564 | extern void pm_wakeup_event(struct device *dev, unsigned int msec); | ||
565 | extern void pm_stay_awake(struct device *dev); | ||
566 | extern void pm_relax(void); | ||
567 | #else /* !CONFIG_PM_SLEEP */ | 578 | #else /* !CONFIG_PM_SLEEP */ |
568 | 579 | ||
569 | #define device_pm_lock() do {} while (0) | 580 | #define device_pm_lock() do {} while (0) |
@@ -576,11 +587,10 @@ static inline int dpm_suspend_start(pm_message_t state) | |||
576 | 587 | ||
577 | #define suspend_report_result(fn, ret) do {} while (0) | 588 | #define suspend_report_result(fn, ret) do {} while (0) |
578 | 589 | ||
579 | static inline void device_pm_wait_for_dev(struct device *a, struct device *b) {} | 590 | static inline int device_pm_wait_for_dev(struct device *a, struct device *b) |
580 | 591 | { | |
581 | static inline void pm_wakeup_event(struct device *dev, unsigned int msec) {} | 592 | return 0; |
582 | static inline void pm_stay_awake(struct device *dev) {} | 593 | } |
583 | static inline void pm_relax(void) {} | ||
584 | #endif /* !CONFIG_PM_SLEEP */ | 594 | #endif /* !CONFIG_PM_SLEEP */ |
585 | 595 | ||
586 | /* How to reorder dpm_list after device_move() */ | 596 | /* How to reorder dpm_list after device_move() */ |
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 6e81888c6222..3ec2358f8692 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h | |||
@@ -12,18 +12,24 @@ | |||
12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
13 | #include <linux/pm.h> | 13 | #include <linux/pm.h> |
14 | 14 | ||
15 | #include <linux/jiffies.h> | ||
16 | |||
17 | /* Runtime PM flag argument bits */ | ||
18 | #define RPM_ASYNC 0x01 /* Request is asynchronous */ | ||
19 | #define RPM_NOWAIT 0x02 /* Don't wait for concurrent | ||
20 | state change */ | ||
21 | #define RPM_GET_PUT 0x04 /* Increment/decrement the | ||
22 | usage_count */ | ||
23 | #define RPM_AUTO 0x08 /* Use autosuspend_delay */ | ||
24 | |||
15 | #ifdef CONFIG_PM_RUNTIME | 25 | #ifdef CONFIG_PM_RUNTIME |
16 | 26 | ||
17 | extern struct workqueue_struct *pm_wq; | 27 | extern struct workqueue_struct *pm_wq; |
18 | 28 | ||
19 | extern int pm_runtime_idle(struct device *dev); | 29 | extern int __pm_runtime_idle(struct device *dev, int rpmflags); |
20 | extern int pm_runtime_suspend(struct device *dev); | 30 | extern int __pm_runtime_suspend(struct device *dev, int rpmflags); |
21 | extern int pm_runtime_resume(struct device *dev); | 31 | extern int __pm_runtime_resume(struct device *dev, int rpmflags); |
22 | extern int pm_request_idle(struct device *dev); | ||
23 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); | 32 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); |
24 | extern int pm_request_resume(struct device *dev); | ||
25 | extern int __pm_runtime_get(struct device *dev, bool sync); | ||
26 | extern int __pm_runtime_put(struct device *dev, bool sync); | ||
27 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); | 33 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); |
28 | extern int pm_runtime_barrier(struct device *dev); | 34 | extern int pm_runtime_barrier(struct device *dev); |
29 | extern void pm_runtime_enable(struct device *dev); | 35 | extern void pm_runtime_enable(struct device *dev); |
@@ -33,6 +39,10 @@ extern void pm_runtime_forbid(struct device *dev); | |||
33 | extern int pm_generic_runtime_idle(struct device *dev); | 39 | extern int pm_generic_runtime_idle(struct device *dev); |
34 | extern int pm_generic_runtime_suspend(struct device *dev); | 40 | extern int pm_generic_runtime_suspend(struct device *dev); |
35 | extern int pm_generic_runtime_resume(struct device *dev); | 41 | extern int pm_generic_runtime_resume(struct device *dev); |
42 | extern void pm_runtime_no_callbacks(struct device *dev); | ||
43 | extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); | ||
44 | extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); | ||
45 | extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev); | ||
36 | 46 | ||
37 | static inline bool pm_children_suspended(struct device *dev) | 47 | static inline bool pm_children_suspended(struct device *dev) |
38 | { | 48 | { |
@@ -70,19 +80,29 @@ static inline bool pm_runtime_suspended(struct device *dev) | |||
70 | return dev->power.runtime_status == RPM_SUSPENDED; | 80 | return dev->power.runtime_status == RPM_SUSPENDED; |
71 | } | 81 | } |
72 | 82 | ||
83 | static inline void pm_runtime_mark_last_busy(struct device *dev) | ||
84 | { | ||
85 | ACCESS_ONCE(dev->power.last_busy) = jiffies; | ||
86 | } | ||
87 | |||
73 | #else /* !CONFIG_PM_RUNTIME */ | 88 | #else /* !CONFIG_PM_RUNTIME */ |
74 | 89 | ||
75 | static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; } | 90 | static inline int __pm_runtime_idle(struct device *dev, int rpmflags) |
76 | static inline int pm_runtime_suspend(struct device *dev) { return -ENOSYS; } | 91 | { |
77 | static inline int pm_runtime_resume(struct device *dev) { return 0; } | 92 | return -ENOSYS; |
78 | static inline int pm_request_idle(struct device *dev) { return -ENOSYS; } | 93 | } |
94 | static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) | ||
95 | { | ||
96 | return -ENOSYS; | ||
97 | } | ||
98 | static inline int __pm_runtime_resume(struct device *dev, int rpmflags) | ||
99 | { | ||
100 | return 1; | ||
101 | } | ||
79 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) | 102 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) |
80 | { | 103 | { |
81 | return -ENOSYS; | 104 | return -ENOSYS; |
82 | } | 105 | } |
83 | static inline int pm_request_resume(struct device *dev) { return 0; } | ||
84 | static inline int __pm_runtime_get(struct device *dev, bool sync) { return 1; } | ||
85 | static inline int __pm_runtime_put(struct device *dev, bool sync) { return 0; } | ||
86 | static inline int __pm_runtime_set_status(struct device *dev, | 106 | static inline int __pm_runtime_set_status(struct device *dev, |
87 | unsigned int status) { return 0; } | 107 | unsigned int status) { return 0; } |
88 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } | 108 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } |
@@ -102,27 +122,82 @@ static inline bool pm_runtime_suspended(struct device *dev) { return false; } | |||
102 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } | 122 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } |
103 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } | 123 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } |
104 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } | 124 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } |
125 | static inline void pm_runtime_no_callbacks(struct device *dev) {} | ||
126 | |||
127 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} | ||
128 | static inline void __pm_runtime_use_autosuspend(struct device *dev, | ||
129 | bool use) {} | ||
130 | static inline void pm_runtime_set_autosuspend_delay(struct device *dev, | ||
131 | int delay) {} | ||
132 | static inline unsigned long pm_runtime_autosuspend_expiration( | ||
133 | struct device *dev) { return 0; } | ||
105 | 134 | ||
106 | #endif /* !CONFIG_PM_RUNTIME */ | 135 | #endif /* !CONFIG_PM_RUNTIME */ |
107 | 136 | ||
137 | static inline int pm_runtime_idle(struct device *dev) | ||
138 | { | ||
139 | return __pm_runtime_idle(dev, 0); | ||
140 | } | ||
141 | |||
142 | static inline int pm_runtime_suspend(struct device *dev) | ||
143 | { | ||
144 | return __pm_runtime_suspend(dev, 0); | ||
145 | } | ||
146 | |||
147 | static inline int pm_runtime_autosuspend(struct device *dev) | ||
148 | { | ||
149 | return __pm_runtime_suspend(dev, RPM_AUTO); | ||
150 | } | ||
151 | |||
152 | static inline int pm_runtime_resume(struct device *dev) | ||
153 | { | ||
154 | return __pm_runtime_resume(dev, 0); | ||
155 | } | ||
156 | |||
157 | static inline int pm_request_idle(struct device *dev) | ||
158 | { | ||
159 | return __pm_runtime_idle(dev, RPM_ASYNC); | ||
160 | } | ||
161 | |||
162 | static inline int pm_request_resume(struct device *dev) | ||
163 | { | ||
164 | return __pm_runtime_resume(dev, RPM_ASYNC); | ||
165 | } | ||
166 | |||
167 | static inline int pm_request_autosuspend(struct device *dev) | ||
168 | { | ||
169 | return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); | ||
170 | } | ||
171 | |||
108 | static inline int pm_runtime_get(struct device *dev) | 172 | static inline int pm_runtime_get(struct device *dev) |
109 | { | 173 | { |
110 | return __pm_runtime_get(dev, false); | 174 | return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); |
111 | } | 175 | } |
112 | 176 | ||
113 | static inline int pm_runtime_get_sync(struct device *dev) | 177 | static inline int pm_runtime_get_sync(struct device *dev) |
114 | { | 178 | { |
115 | return __pm_runtime_get(dev, true); | 179 | return __pm_runtime_resume(dev, RPM_GET_PUT); |
116 | } | 180 | } |
117 | 181 | ||
118 | static inline int pm_runtime_put(struct device *dev) | 182 | static inline int pm_runtime_put(struct device *dev) |
119 | { | 183 | { |
120 | return __pm_runtime_put(dev, false); | 184 | return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); |
185 | } | ||
186 | |||
187 | static inline int pm_runtime_put_autosuspend(struct device *dev) | ||
188 | { | ||
189 | return __pm_runtime_suspend(dev, | ||
190 | RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); | ||
121 | } | 191 | } |
122 | 192 | ||
123 | static inline int pm_runtime_put_sync(struct device *dev) | 193 | static inline int pm_runtime_put_sync(struct device *dev) |
124 | { | 194 | { |
125 | return __pm_runtime_put(dev, true); | 195 | return __pm_runtime_idle(dev, RPM_GET_PUT); |
196 | } | ||
197 | |||
198 | static inline int pm_runtime_put_sync_autosuspend(struct device *dev) | ||
199 | { | ||
200 | return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); | ||
126 | } | 201 | } |
127 | 202 | ||
128 | static inline int pm_runtime_set_active(struct device *dev) | 203 | static inline int pm_runtime_set_active(struct device *dev) |
@@ -140,4 +215,14 @@ static inline void pm_runtime_disable(struct device *dev) | |||
140 | __pm_runtime_disable(dev, true); | 215 | __pm_runtime_disable(dev, true); |
141 | } | 216 | } |
142 | 217 | ||
218 | static inline void pm_runtime_use_autosuspend(struct device *dev) | ||
219 | { | ||
220 | __pm_runtime_use_autosuspend(dev, true); | ||
221 | } | ||
222 | |||
223 | static inline void pm_runtime_dont_use_autosuspend(struct device *dev) | ||
224 | { | ||
225 | __pm_runtime_use_autosuspend(dev, false); | ||
226 | } | ||
227 | |||
143 | #endif | 228 | #endif |
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h index 76aca48722ae..9cff00dd6b63 100644 --- a/include/linux/pm_wakeup.h +++ b/include/linux/pm_wakeup.h | |||
@@ -2,6 +2,7 @@ | |||
2 | * pm_wakeup.h - Power management wakeup interface | 2 | * pm_wakeup.h - Power management wakeup interface |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Alan Stern | 4 | * Copyright (C) 2008 Alan Stern |
5 | * Copyright (C) 2010 Rafael J. Wysocki, Novell Inc. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * 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 | * it under the terms of the GNU General Public License as published by |
@@ -27,19 +28,77 @@ | |||
27 | 28 | ||
28 | #include <linux/types.h> | 29 | #include <linux/types.h> |
29 | 30 | ||
30 | #ifdef CONFIG_PM | 31 | /** |
31 | 32 | * struct wakeup_source - Representation of wakeup sources | |
32 | /* Changes to device_may_wakeup take effect on the next pm state change. | ||
33 | * | 33 | * |
34 | * By default, most devices should leave wakeup disabled. The exceptions | 34 | * @total_time: Total time this wakeup source has been active. |
35 | * are devices that everyone expects to be wakeup sources: keyboards, | 35 | * @max_time: Maximum time this wakeup source has been continuously active. |
36 | * power buttons, possibly network interfaces, etc. | 36 | * @last_time: Monotonic clock when the wakeup source's was activated last time. |
37 | * @event_count: Number of signaled wakeup events. | ||
38 | * @active_count: Number of times the wakeup sorce was activated. | ||
39 | * @relax_count: Number of times the wakeup sorce was deactivated. | ||
40 | * @hit_count: Number of times the wakeup sorce might abort system suspend. | ||
41 | * @active: Status of the wakeup source. | ||
37 | */ | 42 | */ |
38 | static inline void device_init_wakeup(struct device *dev, bool val) | 43 | struct wakeup_source { |
44 | char *name; | ||
45 | struct list_head entry; | ||
46 | spinlock_t lock; | ||
47 | struct timer_list timer; | ||
48 | unsigned long timer_expires; | ||
49 | ktime_t total_time; | ||
50 | ktime_t max_time; | ||
51 | ktime_t last_time; | ||
52 | unsigned long event_count; | ||
53 | unsigned long active_count; | ||
54 | unsigned long relax_count; | ||
55 | unsigned long hit_count; | ||
56 | unsigned int active:1; | ||
57 | }; | ||
58 | |||
59 | #ifdef CONFIG_PM_SLEEP | ||
60 | |||
61 | /* | ||
62 | * Changes to device_may_wakeup take effect on the next pm state change. | ||
63 | */ | ||
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) | ||
71 | { | ||
72 | return dev->power.can_wakeup; | ||
73 | } | ||
74 | |||
75 | |||
76 | |||
77 | static inline bool device_may_wakeup(struct device *dev) | ||
39 | { | 78 | { |
40 | dev->power.can_wakeup = dev->power.should_wakeup = val; | 79 | return dev->power.can_wakeup && !!dev->power.wakeup; |
41 | } | 80 | } |
42 | 81 | ||
82 | /* drivers/base/power/wakeup.c */ | ||
83 | extern struct wakeup_source *wakeup_source_create(const char *name); | ||
84 | extern void wakeup_source_destroy(struct wakeup_source *ws); | ||
85 | extern void wakeup_source_add(struct wakeup_source *ws); | ||
86 | extern void wakeup_source_remove(struct wakeup_source *ws); | ||
87 | extern struct wakeup_source *wakeup_source_register(const char *name); | ||
88 | extern void wakeup_source_unregister(struct wakeup_source *ws); | ||
89 | extern int device_wakeup_enable(struct device *dev); | ||
90 | extern int device_wakeup_disable(struct device *dev); | ||
91 | extern int device_init_wakeup(struct device *dev, bool val); | ||
92 | extern int device_set_wakeup_enable(struct device *dev, bool enable); | ||
93 | extern void __pm_stay_awake(struct wakeup_source *ws); | ||
94 | extern void pm_stay_awake(struct device *dev); | ||
95 | extern void __pm_relax(struct wakeup_source *ws); | ||
96 | extern void pm_relax(struct device *dev); | ||
97 | extern void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec); | ||
98 | extern void pm_wakeup_event(struct device *dev, unsigned int msec); | ||
99 | |||
100 | #else /* !CONFIG_PM_SLEEP */ | ||
101 | |||
43 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | 102 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) |
44 | { | 103 | { |
45 | dev->power.can_wakeup = capable; | 104 | dev->power.can_wakeup = capable; |
@@ -50,43 +109,63 @@ static inline bool device_can_wakeup(struct device *dev) | |||
50 | return dev->power.can_wakeup; | 109 | return dev->power.can_wakeup; |
51 | } | 110 | } |
52 | 111 | ||
53 | static inline void device_set_wakeup_enable(struct device *dev, bool enable) | 112 | static inline bool device_may_wakeup(struct device *dev) |
54 | { | 113 | { |
55 | dev->power.should_wakeup = enable; | 114 | return false; |
56 | } | 115 | } |
57 | 116 | ||
58 | static inline bool device_may_wakeup(struct device *dev) | 117 | static inline struct wakeup_source *wakeup_source_create(const char *name) |
59 | { | 118 | { |
60 | return dev->power.can_wakeup && dev->power.should_wakeup; | 119 | return NULL; |
61 | } | 120 | } |
62 | 121 | ||
63 | #else /* !CONFIG_PM */ | 122 | static inline void wakeup_source_destroy(struct wakeup_source *ws) {} |
123 | |||
124 | static inline void wakeup_source_add(struct wakeup_source *ws) {} | ||
64 | 125 | ||
65 | /* For some reason the following routines work even without CONFIG_PM */ | 126 | static inline void wakeup_source_remove(struct wakeup_source *ws) {} |
66 | static inline void device_init_wakeup(struct device *dev, bool val) | 127 | |
128 | static inline struct wakeup_source *wakeup_source_register(const char *name) | ||
67 | { | 129 | { |
68 | dev->power.can_wakeup = val; | 130 | return NULL; |
69 | } | 131 | } |
70 | 132 | ||
71 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | 133 | static inline void wakeup_source_unregister(struct wakeup_source *ws) {} |
134 | |||
135 | static inline int device_wakeup_enable(struct device *dev) | ||
72 | { | 136 | { |
73 | dev->power.can_wakeup = capable; | 137 | return -EINVAL; |
74 | } | 138 | } |
75 | 139 | ||
76 | static inline bool device_can_wakeup(struct device *dev) | 140 | static inline int device_wakeup_disable(struct device *dev) |
77 | { | 141 | { |
78 | return dev->power.can_wakeup; | 142 | return 0; |
79 | } | 143 | } |
80 | 144 | ||
81 | static inline void device_set_wakeup_enable(struct device *dev, bool enable) | 145 | static inline int device_init_wakeup(struct device *dev, bool val) |
82 | { | 146 | { |
147 | dev->power.can_wakeup = val; | ||
148 | return val ? -EINVAL : 0; | ||
83 | } | 149 | } |
84 | 150 | ||
85 | static inline bool device_may_wakeup(struct device *dev) | 151 | |
152 | static inline int device_set_wakeup_enable(struct device *dev, bool enable) | ||
86 | { | 153 | { |
87 | return false; | 154 | return -EINVAL; |
88 | } | 155 | } |
89 | 156 | ||
90 | #endif /* !CONFIG_PM */ | 157 | static inline void __pm_stay_awake(struct wakeup_source *ws) {} |
158 | |||
159 | static inline void pm_stay_awake(struct device *dev) {} | ||
160 | |||
161 | static inline void __pm_relax(struct wakeup_source *ws) {} | ||
162 | |||
163 | static inline void pm_relax(struct device *dev) {} | ||
164 | |||
165 | static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec) {} | ||
166 | |||
167 | static inline void pm_wakeup_event(struct device *dev, unsigned int msec) {} | ||
168 | |||
169 | #endif /* !CONFIG_PM_SLEEP */ | ||
91 | 170 | ||
92 | #endif /* _LINUX_PM_WAKEUP_H */ | 171 | #endif /* _LINUX_PM_WAKEUP_H */ |
diff --git a/include/linux/poll.h b/include/linux/poll.h index 600cc1fde64d..56e76af78102 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
@@ -73,6 +73,8 @@ extern void poll_initwait(struct poll_wqueues *pwq); | |||
73 | extern void poll_freewait(struct poll_wqueues *pwq); | 73 | extern void poll_freewait(struct poll_wqueues *pwq); |
74 | extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state, | 74 | extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state, |
75 | ktime_t *expires, unsigned long slack); | 75 | ktime_t *expires, unsigned long slack); |
76 | extern long select_estimate_accuracy(struct timespec *tv); | ||
77 | |||
76 | 78 | ||
77 | static inline int poll_schedule(struct poll_wqueues *pwq, int state) | 79 | static inline int poll_schedule(struct poll_wqueues *pwq, int state) |
78 | { | 80 | { |
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 30083a896f36..7d7325685c42 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h | |||
@@ -89,6 +89,7 @@ enum power_supply_property { | |||
89 | POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, | 89 | POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, |
90 | POWER_SUPPLY_PROP_VOLTAGE_NOW, | 90 | POWER_SUPPLY_PROP_VOLTAGE_NOW, |
91 | POWER_SUPPLY_PROP_VOLTAGE_AVG, | 91 | POWER_SUPPLY_PROP_VOLTAGE_AVG, |
92 | POWER_SUPPLY_PROP_CURRENT_MAX, | ||
92 | POWER_SUPPLY_PROP_CURRENT_NOW, | 93 | POWER_SUPPLY_PROP_CURRENT_NOW, |
93 | POWER_SUPPLY_PROP_CURRENT_AVG, | 94 | POWER_SUPPLY_PROP_CURRENT_AVG, |
94 | POWER_SUPPLY_PROP_POWER_NOW, | 95 | POWER_SUPPLY_PROP_POWER_NOW, |
@@ -125,7 +126,10 @@ enum power_supply_type { | |||
125 | POWER_SUPPLY_TYPE_BATTERY = 0, | 126 | POWER_SUPPLY_TYPE_BATTERY = 0, |
126 | POWER_SUPPLY_TYPE_UPS, | 127 | POWER_SUPPLY_TYPE_UPS, |
127 | POWER_SUPPLY_TYPE_MAINS, | 128 | POWER_SUPPLY_TYPE_MAINS, |
128 | POWER_SUPPLY_TYPE_USB, | 129 | POWER_SUPPLY_TYPE_USB, /* Standard Downstream Port */ |
130 | POWER_SUPPLY_TYPE_USB_DCP, /* Dedicated Charging Port */ | ||
131 | POWER_SUPPLY_TYPE_USB_CDP, /* Charging Downstream Port */ | ||
132 | POWER_SUPPLY_TYPE_USB_ACA, /* Accessory Charger Adapters */ | ||
129 | }; | 133 | }; |
130 | 134 | ||
131 | union power_supply_propval { | 135 | union power_supply_propval { |
diff --git a/include/linux/printk.h b/include/linux/printk.h new file mode 100644 index 000000000000..b772ca5fbdf0 --- /dev/null +++ b/include/linux/printk.h | |||
@@ -0,0 +1,248 @@ | |||
1 | #ifndef __KERNEL_PRINTK__ | ||
2 | #define __KERNEL_PRINTK__ | ||
3 | |||
4 | extern const char linux_banner[]; | ||
5 | extern const char linux_proc_banner[]; | ||
6 | |||
7 | #define KERN_EMERG "<0>" /* system is unusable */ | ||
8 | #define KERN_ALERT "<1>" /* action must be taken immediately */ | ||
9 | #define KERN_CRIT "<2>" /* critical conditions */ | ||
10 | #define KERN_ERR "<3>" /* error conditions */ | ||
11 | #define KERN_WARNING "<4>" /* warning conditions */ | ||
12 | #define KERN_NOTICE "<5>" /* normal but significant condition */ | ||
13 | #define KERN_INFO "<6>" /* informational */ | ||
14 | #define KERN_DEBUG "<7>" /* debug-level messages */ | ||
15 | |||
16 | /* Use the default kernel loglevel */ | ||
17 | #define KERN_DEFAULT "<d>" | ||
18 | /* | ||
19 | * Annotation for a "continued" line of log printout (only done after a | ||
20 | * line that had no enclosing \n). Only to be used by core/arch code | ||
21 | * during early bootup (a continued line is not SMP-safe otherwise). | ||
22 | */ | ||
23 | #define KERN_CONT "<c>" | ||
24 | |||
25 | extern int console_printk[]; | ||
26 | |||
27 | #define console_loglevel (console_printk[0]) | ||
28 | #define default_message_loglevel (console_printk[1]) | ||
29 | #define minimum_console_loglevel (console_printk[2]) | ||
30 | #define default_console_loglevel (console_printk[3]) | ||
31 | |||
32 | struct va_format { | ||
33 | const char *fmt; | ||
34 | va_list *va; | ||
35 | }; | ||
36 | |||
37 | /* | ||
38 | * FW_BUG | ||
39 | * Add this to a message where you are sure the firmware is buggy or behaves | ||
40 | * really stupid or out of spec. Be aware that the responsible BIOS developer | ||
41 | * should be able to fix this issue or at least get a concrete idea of the | ||
42 | * problem by reading your message without the need of looking at the kernel | ||
43 | * code. | ||
44 | * | ||
45 | * Use it for definite and high priority BIOS bugs. | ||
46 | * | ||
47 | * FW_WARN | ||
48 | * Use it for not that clear (e.g. could the kernel messed up things already?) | ||
49 | * and medium priority BIOS bugs. | ||
50 | * | ||
51 | * FW_INFO | ||
52 | * Use this one if you want to tell the user or vendor about something | ||
53 | * suspicious, but generally harmless related to the firmware. | ||
54 | * | ||
55 | * Use it for information or very low priority BIOS bugs. | ||
56 | */ | ||
57 | #define FW_BUG "[Firmware Bug]: " | ||
58 | #define FW_WARN "[Firmware Warn]: " | ||
59 | #define FW_INFO "[Firmware Info]: " | ||
60 | |||
61 | /* | ||
62 | * HW_ERR | ||
63 | * Add this to a message for hardware errors, so that user can report | ||
64 | * it to hardware vendor instead of LKML or software vendor. | ||
65 | */ | ||
66 | #define HW_ERR "[Hardware Error]: " | ||
67 | |||
68 | #ifdef CONFIG_PRINTK | ||
69 | asmlinkage int vprintk(const char *fmt, va_list args) | ||
70 | __attribute__ ((format (printf, 1, 0))); | ||
71 | asmlinkage int printk(const char * fmt, ...) | ||
72 | __attribute__ ((format (printf, 1, 2))) __cold; | ||
73 | |||
74 | /* | ||
75 | * Please don't use printk_ratelimit(), because it shares ratelimiting state | ||
76 | * with all other unrelated printk_ratelimit() callsites. Instead use | ||
77 | * printk_ratelimited() or plain old __ratelimit(). | ||
78 | */ | ||
79 | extern int __printk_ratelimit(const char *func); | ||
80 | #define printk_ratelimit() __printk_ratelimit(__func__) | ||
81 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, | ||
82 | unsigned int interval_msec); | ||
83 | |||
84 | extern int printk_delay_msec; | ||
85 | extern int dmesg_restrict; | ||
86 | |||
87 | /* | ||
88 | * Print a one-time message (analogous to WARN_ONCE() et al): | ||
89 | */ | ||
90 | #define printk_once(x...) ({ \ | ||
91 | static bool __print_once; \ | ||
92 | \ | ||
93 | if (!__print_once) { \ | ||
94 | __print_once = true; \ | ||
95 | printk(x); \ | ||
96 | } \ | ||
97 | }) | ||
98 | |||
99 | void log_buf_kexec_setup(void); | ||
100 | #else | ||
101 | static inline int vprintk(const char *s, va_list args) | ||
102 | __attribute__ ((format (printf, 1, 0))); | ||
103 | static inline int vprintk(const char *s, va_list args) { return 0; } | ||
104 | static inline int printk(const char *s, ...) | ||
105 | __attribute__ ((format (printf, 1, 2))); | ||
106 | static inline int __cold printk(const char *s, ...) { return 0; } | ||
107 | static inline int printk_ratelimit(void) { return 0; } | ||
108 | static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \ | ||
109 | unsigned int interval_msec) \ | ||
110 | { return false; } | ||
111 | |||
112 | /* No effect, but we still get type checking even in the !PRINTK case: */ | ||
113 | #define printk_once(x...) printk(x) | ||
114 | |||
115 | static inline void log_buf_kexec_setup(void) | ||
116 | { | ||
117 | } | ||
118 | #endif | ||
119 | |||
120 | /* | ||
121 | * Dummy printk for disabled debugging statements to use whilst maintaining | ||
122 | * gcc's format and side-effect checking. | ||
123 | */ | ||
124 | static inline __attribute__ ((format (printf, 1, 2))) | ||
125 | int no_printk(const char *s, ...) { return 0; } | ||
126 | |||
127 | extern int printk_needs_cpu(int cpu); | ||
128 | extern void printk_tick(void); | ||
129 | |||
130 | extern void asmlinkage __attribute__((format(printf, 1, 2))) | ||
131 | early_printk(const char *fmt, ...); | ||
132 | |||
133 | static inline void console_silent(void) | ||
134 | { | ||
135 | console_loglevel = 0; | ||
136 | } | ||
137 | |||
138 | static inline void console_verbose(void) | ||
139 | { | ||
140 | if (console_loglevel) | ||
141 | console_loglevel = 15; | ||
142 | } | ||
143 | |||
144 | extern void dump_stack(void) __cold; | ||
145 | |||
146 | enum { | ||
147 | DUMP_PREFIX_NONE, | ||
148 | DUMP_PREFIX_ADDRESS, | ||
149 | DUMP_PREFIX_OFFSET | ||
150 | }; | ||
151 | extern void hex_dump_to_buffer(const void *buf, size_t len, | ||
152 | int rowsize, int groupsize, | ||
153 | char *linebuf, size_t linebuflen, bool ascii); | ||
154 | extern void print_hex_dump(const char *level, const char *prefix_str, | ||
155 | int prefix_type, int rowsize, int groupsize, | ||
156 | const void *buf, size_t len, bool ascii); | ||
157 | extern void print_hex_dump_bytes(const char *prefix_str, int prefix_type, | ||
158 | const void *buf, size_t len); | ||
159 | |||
160 | #ifndef pr_fmt | ||
161 | #define pr_fmt(fmt) fmt | ||
162 | #endif | ||
163 | |||
164 | #define pr_emerg(fmt, ...) \ | ||
165 | printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) | ||
166 | #define pr_alert(fmt, ...) \ | ||
167 | printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) | ||
168 | #define pr_crit(fmt, ...) \ | ||
169 | printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) | ||
170 | #define pr_err(fmt, ...) \ | ||
171 | printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) | ||
172 | #define pr_warning(fmt, ...) \ | ||
173 | printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) | ||
174 | #define pr_warn pr_warning | ||
175 | #define pr_notice(fmt, ...) \ | ||
176 | printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) | ||
177 | #define pr_info(fmt, ...) \ | ||
178 | printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) | ||
179 | #define pr_cont(fmt, ...) \ | ||
180 | printk(KERN_CONT fmt, ##__VA_ARGS__) | ||
181 | |||
182 | /* pr_devel() should produce zero code unless DEBUG is defined */ | ||
183 | #ifdef DEBUG | ||
184 | #define pr_devel(fmt, ...) \ | ||
185 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
186 | #else | ||
187 | #define pr_devel(fmt, ...) \ | ||
188 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) | ||
189 | #endif | ||
190 | |||
191 | /* If you are writing a driver, please use dev_dbg instead */ | ||
192 | #if defined(DEBUG) | ||
193 | #define pr_debug(fmt, ...) \ | ||
194 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
195 | #elif defined(CONFIG_DYNAMIC_DEBUG) | ||
196 | /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */ | ||
197 | #define pr_debug(fmt, ...) \ | ||
198 | dynamic_pr_debug(fmt, ##__VA_ARGS__) | ||
199 | #else | ||
200 | #define pr_debug(fmt, ...) \ | ||
201 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) | ||
202 | #endif | ||
203 | |||
204 | /* | ||
205 | * ratelimited messages with local ratelimit_state, | ||
206 | * no local ratelimit_state used in the !PRINTK case | ||
207 | */ | ||
208 | #ifdef CONFIG_PRINTK | ||
209 | #define printk_ratelimited(fmt, ...) ({ \ | ||
210 | static DEFINE_RATELIMIT_STATE(_rs, \ | ||
211 | DEFAULT_RATELIMIT_INTERVAL, \ | ||
212 | DEFAULT_RATELIMIT_BURST); \ | ||
213 | \ | ||
214 | if (__ratelimit(&_rs)) \ | ||
215 | printk(fmt, ##__VA_ARGS__); \ | ||
216 | }) | ||
217 | #else | ||
218 | /* No effect, but we still get type checking even in the !PRINTK case: */ | ||
219 | #define printk_ratelimited printk | ||
220 | #endif | ||
221 | |||
222 | #define pr_emerg_ratelimited(fmt, ...) \ | ||
223 | printk_ratelimited(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) | ||
224 | #define pr_alert_ratelimited(fmt, ...) \ | ||
225 | printk_ratelimited(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) | ||
226 | #define pr_crit_ratelimited(fmt, ...) \ | ||
227 | printk_ratelimited(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) | ||
228 | #define pr_err_ratelimited(fmt, ...) \ | ||
229 | printk_ratelimited(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) | ||
230 | #define pr_warning_ratelimited(fmt, ...) \ | ||
231 | printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) | ||
232 | #define pr_warn_ratelimited pr_warning_ratelimited | ||
233 | #define pr_notice_ratelimited(fmt, ...) \ | ||
234 | printk_ratelimited(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) | ||
235 | #define pr_info_ratelimited(fmt, ...) \ | ||
236 | printk_ratelimited(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) | ||
237 | /* no pr_cont_ratelimited, don't do that... */ | ||
238 | /* If you are writing a driver, please use dev_dbg instead */ | ||
239 | #if defined(DEBUG) | ||
240 | #define pr_debug_ratelimited(fmt, ...) \ | ||
241 | printk_ratelimited(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
242 | #else | ||
243 | #define pr_debug_ratelimited(fmt, ...) \ | ||
244 | ({ if (0) printk_ratelimited(KERN_DEBUG pr_fmt(fmt), \ | ||
245 | ##__VA_ARGS__); 0; }) | ||
246 | #endif | ||
247 | |||
248 | #endif | ||
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 4272521e29e9..092a04f874a8 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
@@ -100,7 +100,8 @@ | |||
100 | #include <linux/sched.h> /* For struct task_struct. */ | 100 | #include <linux/sched.h> /* For struct task_struct. */ |
101 | 101 | ||
102 | 102 | ||
103 | extern long arch_ptrace(struct task_struct *child, long request, long addr, long data); | 103 | extern long arch_ptrace(struct task_struct *child, long request, |
104 | unsigned long addr, unsigned long data); | ||
104 | extern int ptrace_traceme(void); | 105 | extern int ptrace_traceme(void); |
105 | extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); | 106 | extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); |
106 | extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); | 107 | extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); |
@@ -108,7 +109,8 @@ extern int ptrace_attach(struct task_struct *tsk); | |||
108 | extern int ptrace_detach(struct task_struct *, unsigned int); | 109 | extern int ptrace_detach(struct task_struct *, unsigned int); |
109 | extern void ptrace_disable(struct task_struct *); | 110 | extern void ptrace_disable(struct task_struct *); |
110 | extern int ptrace_check_attach(struct task_struct *task, int kill); | 111 | extern int ptrace_check_attach(struct task_struct *task, int kill); |
111 | extern int ptrace_request(struct task_struct *child, long request, long addr, long data); | 112 | extern int ptrace_request(struct task_struct *child, long request, |
113 | unsigned long addr, unsigned long data); | ||
112 | extern void ptrace_notify(int exit_code); | 114 | extern void ptrace_notify(int exit_code); |
113 | extern void __ptrace_link(struct task_struct *child, | 115 | extern void __ptrace_link(struct task_struct *child, |
114 | struct task_struct *new_parent); | 116 | struct task_struct *new_parent); |
@@ -132,8 +134,10 @@ static inline void ptrace_unlink(struct task_struct *child) | |||
132 | __ptrace_unlink(child); | 134 | __ptrace_unlink(child); |
133 | } | 135 | } |
134 | 136 | ||
135 | int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data); | 137 | int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, |
136 | int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data); | 138 | unsigned long data); |
139 | int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, | ||
140 | unsigned long data); | ||
137 | 141 | ||
138 | /** | 142 | /** |
139 | * task_ptrace - return %PT_* flags that apply to a task | 143 | * task_ptrace - return %PT_* flags that apply to a task |
diff --git a/include/linux/pwm_backlight.h b/include/linux/pwm_backlight.h index 01b3d759f1fc..e031e1a486d9 100644 --- a/include/linux/pwm_backlight.h +++ b/include/linux/pwm_backlight.h | |||
@@ -8,6 +8,7 @@ struct platform_pwm_backlight_data { | |||
8 | int pwm_id; | 8 | int pwm_id; |
9 | unsigned int max_brightness; | 9 | unsigned int max_brightness; |
10 | unsigned int dft_brightness; | 10 | unsigned int dft_brightness; |
11 | unsigned int lth_brightness; | ||
11 | unsigned int pwm_period_ns; | 12 | unsigned int pwm_period_ns; |
12 | int (*init)(struct device *dev); | 13 | int (*init)(struct device *dev); |
13 | int (*notify)(struct device *dev, int brightness); | 14 | int (*notify)(struct device *dev, int brightness); |
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index 634b8e674ac5..ab2baa5c4884 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
@@ -34,19 +34,15 @@ | |||
34 | * needed for RCU lookups (because root->height is unreliable). The only | 34 | * needed for RCU lookups (because root->height is unreliable). The only |
35 | * time callers need worry about this is when doing a lookup_slot under | 35 | * time callers need worry about this is when doing a lookup_slot under |
36 | * RCU. | 36 | * RCU. |
37 | * | ||
38 | * Indirect pointer in fact is also used to tag the last pointer of a node | ||
39 | * when it is shrunk, before we rcu free the node. See shrink code for | ||
40 | * details. | ||
37 | */ | 41 | */ |
38 | #define RADIX_TREE_INDIRECT_PTR 1 | 42 | #define RADIX_TREE_INDIRECT_PTR 1 |
39 | #define RADIX_TREE_RETRY ((void *)-1UL) | ||
40 | 43 | ||
41 | static inline void *radix_tree_ptr_to_indirect(void *ptr) | 44 | #define radix_tree_indirect_to_ptr(ptr) \ |
42 | { | 45 | radix_tree_indirect_to_ptr((void __force *)(ptr)) |
43 | return (void *)((unsigned long)ptr | RADIX_TREE_INDIRECT_PTR); | ||
44 | } | ||
45 | |||
46 | static inline void *radix_tree_indirect_to_ptr(void *ptr) | ||
47 | { | ||
48 | return (void *)((unsigned long)ptr & ~RADIX_TREE_INDIRECT_PTR); | ||
49 | } | ||
50 | 46 | ||
51 | static inline int radix_tree_is_indirect_ptr(void *ptr) | 47 | static inline int radix_tree_is_indirect_ptr(void *ptr) |
52 | { | 48 | { |
@@ -61,7 +57,7 @@ static inline int radix_tree_is_indirect_ptr(void *ptr) | |||
61 | struct radix_tree_root { | 57 | struct radix_tree_root { |
62 | unsigned int height; | 58 | unsigned int height; |
63 | gfp_t gfp_mask; | 59 | gfp_t gfp_mask; |
64 | struct radix_tree_node *rnode; | 60 | struct radix_tree_node __rcu *rnode; |
65 | }; | 61 | }; |
66 | 62 | ||
67 | #define RADIX_TREE_INIT(mask) { \ | 63 | #define RADIX_TREE_INIT(mask) { \ |
@@ -138,16 +134,29 @@ do { \ | |||
138 | * removed. | 134 | * removed. |
139 | * | 135 | * |
140 | * For use with radix_tree_lookup_slot(). Caller must hold tree at least read | 136 | * For use with radix_tree_lookup_slot(). Caller must hold tree at least read |
141 | * locked across slot lookup and dereference. More likely, will be used with | 137 | * locked across slot lookup and dereference. Not required if write lock is |
142 | * radix_tree_replace_slot(), as well, so caller will hold tree write locked. | 138 | * held (ie. items cannot be concurrently inserted). |
139 | * | ||
140 | * radix_tree_deref_retry must be used to confirm validity of the pointer if | ||
141 | * only the read lock is held. | ||
143 | */ | 142 | */ |
144 | static inline void *radix_tree_deref_slot(void **pslot) | 143 | static inline void *radix_tree_deref_slot(void **pslot) |
145 | { | 144 | { |
146 | void *ret = rcu_dereference(*pslot); | 145 | return rcu_dereference(*pslot); |
147 | if (unlikely(radix_tree_is_indirect_ptr(ret))) | ||
148 | ret = RADIX_TREE_RETRY; | ||
149 | return ret; | ||
150 | } | 146 | } |
147 | |||
148 | /** | ||
149 | * radix_tree_deref_retry - check radix_tree_deref_slot | ||
150 | * @arg: pointer returned by radix_tree_deref_slot | ||
151 | * Returns: 0 if retry is not required, otherwise retry is required | ||
152 | * | ||
153 | * radix_tree_deref_retry must be used with radix_tree_deref_slot. | ||
154 | */ | ||
155 | static inline int radix_tree_deref_retry(void *arg) | ||
156 | { | ||
157 | return unlikely((unsigned long)arg & RADIX_TREE_INDIRECT_PTR); | ||
158 | } | ||
159 | |||
151 | /** | 160 | /** |
152 | * radix_tree_replace_slot - replace item in a slot | 161 | * radix_tree_replace_slot - replace item in a slot |
153 | * @pslot: pointer to slot, returned by radix_tree_lookup_slot | 162 | * @pslot: pointer to slot, returned by radix_tree_lookup_slot |
diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index e7320b5e82fb..3a8f0c9b2933 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h | |||
@@ -3,8 +3,8 @@ | |||
3 | 3 | ||
4 | struct inode *ramfs_get_inode(struct super_block *sb, const struct inode *dir, | 4 | struct inode *ramfs_get_inode(struct super_block *sb, const struct inode *dir, |
5 | int mode, dev_t dev); | 5 | int mode, dev_t dev); |
6 | extern int ramfs_get_sb(struct file_system_type *fs_type, | 6 | extern struct dentry *ramfs_mount(struct file_system_type *fs_type, |
7 | int flags, const char *dev_name, void *data, struct vfsmount *mnt); | 7 | int flags, const char *dev_name, void *data); |
8 | 8 | ||
9 | #ifndef CONFIG_MMU | 9 | #ifndef CONFIG_MMU |
10 | extern int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize); | 10 | extern int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize); |
diff --git a/include/linux/ramoops.h b/include/linux/ramoops.h new file mode 100644 index 000000000000..0ae68a2c1212 --- /dev/null +++ b/include/linux/ramoops.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef __RAMOOPS_H | ||
2 | #define __RAMOOPS_H | ||
3 | |||
4 | /* | ||
5 | * Ramoops platform data | ||
6 | * @mem_size memory size for ramoops | ||
7 | * @mem_address physical memory address to contain ramoops | ||
8 | */ | ||
9 | |||
10 | struct ramoops_platform_data { | ||
11 | unsigned long mem_size; | ||
12 | unsigned long mem_address; | ||
13 | }; | ||
14 | |||
15 | #endif | ||
diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h index 8f69d09a41a5..03ff67b0cdf5 100644 --- a/include/linux/ratelimit.h +++ b/include/linux/ratelimit.h | |||
@@ -36,6 +36,8 @@ static inline void ratelimit_state_init(struct ratelimit_state *rs, | |||
36 | rs->begin = 0; | 36 | rs->begin = 0; |
37 | } | 37 | } |
38 | 38 | ||
39 | extern struct ratelimit_state printk_ratelimit_state; | ||
40 | |||
39 | extern int ___ratelimit(struct ratelimit_state *rs, const char *func); | 41 | extern int ___ratelimit(struct ratelimit_state *rs, const char *func); |
40 | #define __ratelimit(state) ___ratelimit(state, __func__) | 42 | #define __ratelimit(state) ___ratelimit(state, __func__) |
41 | 43 | ||
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 4ec3b38ce9c5..f31ef61f1c65 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
@@ -10,6 +10,21 @@ | |||
10 | #include <linux/rcupdate.h> | 10 | #include <linux/rcupdate.h> |
11 | 11 | ||
12 | /* | 12 | /* |
13 | * Why is there no list_empty_rcu()? Because list_empty() serves this | ||
14 | * purpose. The list_empty() function fetches the RCU-protected pointer | ||
15 | * and compares it to the address of the list head, but neither dereferences | ||
16 | * this pointer itself nor provides this pointer to the caller. Therefore, | ||
17 | * it is not necessary to use rcu_dereference(), so that list_empty() can | ||
18 | * be used anywhere you would want to use a list_empty_rcu(). | ||
19 | */ | ||
20 | |||
21 | /* | ||
22 | * return the ->next pointer of a list_head in an rcu safe | ||
23 | * way, we must not access it directly | ||
24 | */ | ||
25 | #define list_next_rcu(list) (*((struct list_head __rcu **)(&(list)->next))) | ||
26 | |||
27 | /* | ||
13 | * Insert a new entry between two known consecutive entries. | 28 | * Insert a new entry between two known consecutive entries. |
14 | * | 29 | * |
15 | * This is only for internal list manipulation where we know | 30 | * This is only for internal list manipulation where we know |
@@ -20,7 +35,7 @@ static inline void __list_add_rcu(struct list_head *new, | |||
20 | { | 35 | { |
21 | new->next = next; | 36 | new->next = next; |
22 | new->prev = prev; | 37 | new->prev = prev; |
23 | rcu_assign_pointer(prev->next, new); | 38 | rcu_assign_pointer(list_next_rcu(prev), new); |
24 | next->prev = new; | 39 | next->prev = new; |
25 | } | 40 | } |
26 | 41 | ||
@@ -138,7 +153,7 @@ static inline void list_replace_rcu(struct list_head *old, | |||
138 | { | 153 | { |
139 | new->next = old->next; | 154 | new->next = old->next; |
140 | new->prev = old->prev; | 155 | new->prev = old->prev; |
141 | rcu_assign_pointer(new->prev->next, new); | 156 | rcu_assign_pointer(list_next_rcu(new->prev), new); |
142 | new->next->prev = new; | 157 | new->next->prev = new; |
143 | old->prev = LIST_POISON2; | 158 | old->prev = LIST_POISON2; |
144 | } | 159 | } |
@@ -193,7 +208,7 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
193 | */ | 208 | */ |
194 | 209 | ||
195 | last->next = at; | 210 | last->next = at; |
196 | rcu_assign_pointer(head->next, first); | 211 | rcu_assign_pointer(list_next_rcu(head), first); |
197 | first->prev = head; | 212 | first->prev = head; |
198 | at->prev = last; | 213 | at->prev = last; |
199 | } | 214 | } |
@@ -208,7 +223,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
208 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). | 223 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). |
209 | */ | 224 | */ |
210 | #define list_entry_rcu(ptr, type, member) \ | 225 | #define list_entry_rcu(ptr, type, member) \ |
211 | container_of(rcu_dereference_raw(ptr), type, member) | 226 | ({typeof (*ptr) __rcu *__ptr = (typeof (*ptr) __rcu __force *)ptr; \ |
227 | container_of((typeof(ptr))rcu_dereference_raw(__ptr), type, member); \ | ||
228 | }) | ||
212 | 229 | ||
213 | /** | 230 | /** |
214 | * list_first_entry_rcu - get the first element from a list | 231 | * list_first_entry_rcu - get the first element from a list |
@@ -225,9 +242,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
225 | list_entry_rcu((ptr)->next, type, member) | 242 | list_entry_rcu((ptr)->next, type, member) |
226 | 243 | ||
227 | #define __list_for_each_rcu(pos, head) \ | 244 | #define __list_for_each_rcu(pos, head) \ |
228 | for (pos = rcu_dereference_raw((head)->next); \ | 245 | for (pos = rcu_dereference_raw(list_next_rcu(head)); \ |
229 | pos != (head); \ | 246 | pos != (head); \ |
230 | pos = rcu_dereference_raw(pos->next)) | 247 | pos = rcu_dereference_raw(list_next_rcu((pos))) |
231 | 248 | ||
232 | /** | 249 | /** |
233 | * list_for_each_entry_rcu - iterate over rcu list of given type | 250 | * list_for_each_entry_rcu - iterate over rcu list of given type |
@@ -257,9 +274,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
257 | * as long as the traversal is guarded by rcu_read_lock(). | 274 | * as long as the traversal is guarded by rcu_read_lock(). |
258 | */ | 275 | */ |
259 | #define list_for_each_continue_rcu(pos, head) \ | 276 | #define list_for_each_continue_rcu(pos, head) \ |
260 | for ((pos) = rcu_dereference_raw((pos)->next); \ | 277 | for ((pos) = rcu_dereference_raw(list_next_rcu(pos)); \ |
261 | prefetch((pos)->next), (pos) != (head); \ | 278 | prefetch((pos)->next), (pos) != (head); \ |
262 | (pos) = rcu_dereference_raw((pos)->next)) | 279 | (pos) = rcu_dereference_raw(list_next_rcu(pos))) |
263 | 280 | ||
264 | /** | 281 | /** |
265 | * list_for_each_entry_continue_rcu - continue iteration over list of given type | 282 | * list_for_each_entry_continue_rcu - continue iteration over list of given type |
@@ -314,12 +331,19 @@ static inline void hlist_replace_rcu(struct hlist_node *old, | |||
314 | 331 | ||
315 | new->next = next; | 332 | new->next = next; |
316 | new->pprev = old->pprev; | 333 | new->pprev = old->pprev; |
317 | rcu_assign_pointer(*new->pprev, new); | 334 | rcu_assign_pointer(*(struct hlist_node __rcu **)new->pprev, new); |
318 | if (next) | 335 | if (next) |
319 | new->next->pprev = &new->next; | 336 | new->next->pprev = &new->next; |
320 | old->pprev = LIST_POISON2; | 337 | old->pprev = LIST_POISON2; |
321 | } | 338 | } |
322 | 339 | ||
340 | /* | ||
341 | * return the first or the next element in an RCU protected hlist | ||
342 | */ | ||
343 | #define hlist_first_rcu(head) (*((struct hlist_node __rcu **)(&(head)->first))) | ||
344 | #define hlist_next_rcu(node) (*((struct hlist_node __rcu **)(&(node)->next))) | ||
345 | #define hlist_pprev_rcu(node) (*((struct hlist_node __rcu **)((node)->pprev))) | ||
346 | |||
323 | /** | 347 | /** |
324 | * hlist_add_head_rcu | 348 | * hlist_add_head_rcu |
325 | * @n: the element to add to the hash list. | 349 | * @n: the element to add to the hash list. |
@@ -346,7 +370,7 @@ static inline void hlist_add_head_rcu(struct hlist_node *n, | |||
346 | 370 | ||
347 | n->next = first; | 371 | n->next = first; |
348 | n->pprev = &h->first; | 372 | n->pprev = &h->first; |
349 | rcu_assign_pointer(h->first, n); | 373 | rcu_assign_pointer(hlist_first_rcu(h), n); |
350 | if (first) | 374 | if (first) |
351 | first->pprev = &n->next; | 375 | first->pprev = &n->next; |
352 | } | 376 | } |
@@ -374,7 +398,7 @@ static inline void hlist_add_before_rcu(struct hlist_node *n, | |||
374 | { | 398 | { |
375 | n->pprev = next->pprev; | 399 | n->pprev = next->pprev; |
376 | n->next = next; | 400 | n->next = next; |
377 | rcu_assign_pointer(*(n->pprev), n); | 401 | rcu_assign_pointer(hlist_pprev_rcu(n), n); |
378 | next->pprev = &n->next; | 402 | next->pprev = &n->next; |
379 | } | 403 | } |
380 | 404 | ||
@@ -401,15 +425,15 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
401 | { | 425 | { |
402 | n->next = prev->next; | 426 | n->next = prev->next; |
403 | n->pprev = &prev->next; | 427 | n->pprev = &prev->next; |
404 | rcu_assign_pointer(prev->next, n); | 428 | rcu_assign_pointer(hlist_next_rcu(prev), n); |
405 | if (n->next) | 429 | if (n->next) |
406 | n->next->pprev = &n->next; | 430 | n->next->pprev = &n->next; |
407 | } | 431 | } |
408 | 432 | ||
409 | #define __hlist_for_each_rcu(pos, head) \ | 433 | #define __hlist_for_each_rcu(pos, head) \ |
410 | for (pos = rcu_dereference((head)->first); \ | 434 | for (pos = rcu_dereference(hlist_first_rcu(head)); \ |
411 | pos && ({ prefetch(pos->next); 1; }); \ | 435 | pos && ({ prefetch(pos->next); 1; }); \ |
412 | pos = rcu_dereference(pos->next)) | 436 | pos = rcu_dereference(hlist_next_rcu(pos))) |
413 | 437 | ||
414 | /** | 438 | /** |
415 | * hlist_for_each_entry_rcu - iterate over rcu list of given type | 439 | * hlist_for_each_entry_rcu - iterate over rcu list of given type |
@@ -422,11 +446,11 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
422 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() | 446 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() |
423 | * as long as the traversal is guarded by rcu_read_lock(). | 447 | * as long as the traversal is guarded by rcu_read_lock(). |
424 | */ | 448 | */ |
425 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ | 449 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ |
426 | for (pos = rcu_dereference_raw((head)->first); \ | 450 | for (pos = rcu_dereference_raw(hlist_first_rcu(head)); \ |
427 | pos && ({ prefetch(pos->next); 1; }) && \ | 451 | pos && ({ prefetch(pos->next); 1; }) && \ |
428 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | 452 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ |
429 | pos = rcu_dereference_raw(pos->next)) | 453 | pos = rcu_dereference_raw(hlist_next_rcu(pos))) |
430 | 454 | ||
431 | /** | 455 | /** |
432 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type | 456 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type |
diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h index b70ffe53cb9f..2ae13714828b 100644 --- a/include/linux/rculist_nulls.h +++ b/include/linux/rculist_nulls.h | |||
@@ -37,6 +37,12 @@ static inline void hlist_nulls_del_init_rcu(struct hlist_nulls_node *n) | |||
37 | } | 37 | } |
38 | } | 38 | } |
39 | 39 | ||
40 | #define hlist_nulls_first_rcu(head) \ | ||
41 | (*((struct hlist_nulls_node __rcu __force **)&(head)->first)) | ||
42 | |||
43 | #define hlist_nulls_next_rcu(node) \ | ||
44 | (*((struct hlist_nulls_node __rcu __force **)&(node)->next)) | ||
45 | |||
40 | /** | 46 | /** |
41 | * hlist_nulls_del_rcu - deletes entry from hash list without re-initialization | 47 | * hlist_nulls_del_rcu - deletes entry from hash list without re-initialization |
42 | * @n: the element to delete from the hash list. | 48 | * @n: the element to delete from the hash list. |
@@ -88,7 +94,7 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, | |||
88 | 94 | ||
89 | n->next = first; | 95 | n->next = first; |
90 | n->pprev = &h->first; | 96 | n->pprev = &h->first; |
91 | rcu_assign_pointer(h->first, n); | 97 | rcu_assign_pointer(hlist_nulls_first_rcu(h), n); |
92 | if (!is_a_nulls(first)) | 98 | if (!is_a_nulls(first)) |
93 | first->pprev = &n->next; | 99 | first->pprev = &n->next; |
94 | } | 100 | } |
@@ -100,11 +106,11 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, | |||
100 | * @member: the name of the hlist_nulls_node within the struct. | 106 | * @member: the name of the hlist_nulls_node within the struct. |
101 | * | 107 | * |
102 | */ | 108 | */ |
103 | #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ | 109 | #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ |
104 | for (pos = rcu_dereference_raw((head)->first); \ | 110 | for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \ |
105 | (!is_a_nulls(pos)) && \ | 111 | (!is_a_nulls(pos)) && \ |
106 | ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ | 112 | ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ |
107 | pos = rcu_dereference_raw(pos->next)) | 113 | pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos))) |
108 | 114 | ||
109 | #endif | 115 | #endif |
110 | #endif | 116 | #endif |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 83af1f8d8b74..03cda7bed985 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -41,11 +41,15 @@ | |||
41 | #include <linux/lockdep.h> | 41 | #include <linux/lockdep.h> |
42 | #include <linux/completion.h> | 42 | #include <linux/completion.h> |
43 | #include <linux/debugobjects.h> | 43 | #include <linux/debugobjects.h> |
44 | #include <linux/compiler.h> | ||
44 | 45 | ||
45 | #ifdef CONFIG_RCU_TORTURE_TEST | 46 | #ifdef CONFIG_RCU_TORTURE_TEST |
46 | extern int rcutorture_runnable; /* for sysctl */ | 47 | extern int rcutorture_runnable; /* for sysctl */ |
47 | #endif /* #ifdef CONFIG_RCU_TORTURE_TEST */ | 48 | #endif /* #ifdef CONFIG_RCU_TORTURE_TEST */ |
48 | 49 | ||
50 | #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b)) | ||
51 | #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b)) | ||
52 | |||
49 | /** | 53 | /** |
50 | * struct rcu_head - callback structure for use with RCU | 54 | * struct rcu_head - callback structure for use with RCU |
51 | * @next: next update requests in a list | 55 | * @next: next update requests in a list |
@@ -57,29 +61,94 @@ struct rcu_head { | |||
57 | }; | 61 | }; |
58 | 62 | ||
59 | /* Exported common interfaces */ | 63 | /* Exported common interfaces */ |
60 | extern void rcu_barrier(void); | 64 | extern void call_rcu_sched(struct rcu_head *head, |
65 | void (*func)(struct rcu_head *rcu)); | ||
66 | extern void synchronize_sched(void); | ||
61 | extern void rcu_barrier_bh(void); | 67 | extern void rcu_barrier_bh(void); |
62 | extern void rcu_barrier_sched(void); | 68 | extern void rcu_barrier_sched(void); |
63 | extern void synchronize_sched_expedited(void); | 69 | extern void synchronize_sched_expedited(void); |
64 | extern int sched_expedited_torture_stats(char *page); | 70 | extern int sched_expedited_torture_stats(char *page); |
65 | 71 | ||
72 | static inline void __rcu_read_lock_bh(void) | ||
73 | { | ||
74 | local_bh_disable(); | ||
75 | } | ||
76 | |||
77 | static inline void __rcu_read_unlock_bh(void) | ||
78 | { | ||
79 | local_bh_enable(); | ||
80 | } | ||
81 | |||
82 | #ifdef CONFIG_PREEMPT_RCU | ||
83 | |||
84 | extern void __rcu_read_lock(void); | ||
85 | extern void __rcu_read_unlock(void); | ||
86 | void synchronize_rcu(void); | ||
87 | |||
88 | /* | ||
89 | * Defined as a macro as it is a very low level header included from | ||
90 | * areas that don't even know about current. This gives the rcu_read_lock() | ||
91 | * nesting depth, but makes sense only if CONFIG_PREEMPT_RCU -- in other | ||
92 | * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. | ||
93 | */ | ||
94 | #define rcu_preempt_depth() (current->rcu_read_lock_nesting) | ||
95 | |||
96 | #else /* #ifdef CONFIG_PREEMPT_RCU */ | ||
97 | |||
98 | static inline void __rcu_read_lock(void) | ||
99 | { | ||
100 | preempt_disable(); | ||
101 | } | ||
102 | |||
103 | static inline void __rcu_read_unlock(void) | ||
104 | { | ||
105 | preempt_enable(); | ||
106 | } | ||
107 | |||
108 | static inline void synchronize_rcu(void) | ||
109 | { | ||
110 | synchronize_sched(); | ||
111 | } | ||
112 | |||
113 | static inline int rcu_preempt_depth(void) | ||
114 | { | ||
115 | return 0; | ||
116 | } | ||
117 | |||
118 | #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ | ||
119 | |||
66 | /* Internal to kernel */ | 120 | /* Internal to kernel */ |
67 | extern void rcu_init(void); | 121 | extern void rcu_init(void); |
122 | extern void rcu_sched_qs(int cpu); | ||
123 | extern void rcu_bh_qs(int cpu); | ||
124 | extern void rcu_check_callbacks(int cpu, int user); | ||
125 | struct notifier_block; | ||
126 | |||
127 | #ifdef CONFIG_NO_HZ | ||
128 | |||
129 | extern void rcu_enter_nohz(void); | ||
130 | extern void rcu_exit_nohz(void); | ||
131 | |||
132 | #else /* #ifdef CONFIG_NO_HZ */ | ||
133 | |||
134 | static inline void rcu_enter_nohz(void) | ||
135 | { | ||
136 | } | ||
137 | |||
138 | static inline void rcu_exit_nohz(void) | ||
139 | { | ||
140 | } | ||
141 | |||
142 | #endif /* #else #ifdef CONFIG_NO_HZ */ | ||
68 | 143 | ||
69 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) | 144 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) |
70 | #include <linux/rcutree.h> | 145 | #include <linux/rcutree.h> |
71 | #elif defined(CONFIG_TINY_RCU) | 146 | #elif defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) |
72 | #include <linux/rcutiny.h> | 147 | #include <linux/rcutiny.h> |
73 | #else | 148 | #else |
74 | #error "Unknown RCU implementation specified to kernel configuration" | 149 | #error "Unknown RCU implementation specified to kernel configuration" |
75 | #endif | 150 | #endif |
76 | 151 | ||
77 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } | ||
78 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT | ||
79 | #define INIT_RCU_HEAD(ptr) do { \ | ||
80 | (ptr)->next = NULL; (ptr)->func = NULL; \ | ||
81 | } while (0) | ||
82 | |||
83 | /* | 152 | /* |
84 | * init_rcu_head_on_stack()/destroy_rcu_head_on_stack() are needed for dynamic | 153 | * init_rcu_head_on_stack()/destroy_rcu_head_on_stack() are needed for dynamic |
85 | * initialization and destruction of rcu_head on the stack. rcu_head structures | 154 | * initialization and destruction of rcu_head on the stack. rcu_head structures |
@@ -120,14 +189,15 @@ extern struct lockdep_map rcu_sched_lock_map; | |||
120 | extern int debug_lockdep_rcu_enabled(void); | 189 | extern int debug_lockdep_rcu_enabled(void); |
121 | 190 | ||
122 | /** | 191 | /** |
123 | * rcu_read_lock_held - might we be in RCU read-side critical section? | 192 | * rcu_read_lock_held() - might we be in RCU read-side critical section? |
124 | * | 193 | * |
125 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU | 194 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU |
126 | * read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, | 195 | * read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, |
127 | * this assumes we are in an RCU read-side critical section unless it can | 196 | * this assumes we are in an RCU read-side critical section unless it can |
128 | * prove otherwise. | 197 | * prove otherwise. This is useful for debug checks in functions that |
198 | * require that they be called within an RCU read-side critical section. | ||
129 | * | 199 | * |
130 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot | 200 | * Checks debug_lockdep_rcu_enabled() to prevent false positives during boot |
131 | * and while lockdep is disabled. | 201 | * and while lockdep is disabled. |
132 | */ | 202 | */ |
133 | static inline int rcu_read_lock_held(void) | 203 | static inline int rcu_read_lock_held(void) |
@@ -144,14 +214,16 @@ static inline int rcu_read_lock_held(void) | |||
144 | extern int rcu_read_lock_bh_held(void); | 214 | extern int rcu_read_lock_bh_held(void); |
145 | 215 | ||
146 | /** | 216 | /** |
147 | * rcu_read_lock_sched_held - might we be in RCU-sched read-side critical section? | 217 | * rcu_read_lock_sched_held() - might we be in RCU-sched read-side critical section? |
148 | * | 218 | * |
149 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an | 219 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an |
150 | * RCU-sched read-side critical section. In absence of | 220 | * RCU-sched read-side critical section. In absence of |
151 | * CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side | 221 | * CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side |
152 | * critical section unless it can prove otherwise. Note that disabling | 222 | * critical section unless it can prove otherwise. Note that disabling |
153 | * of preemption (including disabling irqs) counts as an RCU-sched | 223 | * of preemption (including disabling irqs) counts as an RCU-sched |
154 | * read-side critical section. | 224 | * read-side critical section. This is useful for debug checks in functions |
225 | * that required that they be called within an RCU-sched read-side | ||
226 | * critical section. | ||
155 | * | 227 | * |
156 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot | 228 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot |
157 | * and while lockdep is disabled. | 229 | * and while lockdep is disabled. |
@@ -211,7 +283,11 @@ static inline int rcu_read_lock_sched_held(void) | |||
211 | 283 | ||
212 | extern int rcu_my_thread_group_empty(void); | 284 | extern int rcu_my_thread_group_empty(void); |
213 | 285 | ||
214 | #define __do_rcu_dereference_check(c) \ | 286 | /** |
287 | * rcu_lockdep_assert - emit lockdep splat if specified condition not met | ||
288 | * @c: condition to check | ||
289 | */ | ||
290 | #define rcu_lockdep_assert(c) \ | ||
215 | do { \ | 291 | do { \ |
216 | static bool __warned; \ | 292 | static bool __warned; \ |
217 | if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \ | 293 | if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \ |
@@ -220,41 +296,163 @@ extern int rcu_my_thread_group_empty(void); | |||
220 | } \ | 296 | } \ |
221 | } while (0) | 297 | } while (0) |
222 | 298 | ||
299 | #else /* #ifdef CONFIG_PROVE_RCU */ | ||
300 | |||
301 | #define rcu_lockdep_assert(c) do { } while (0) | ||
302 | |||
303 | #endif /* #else #ifdef CONFIG_PROVE_RCU */ | ||
304 | |||
305 | /* | ||
306 | * Helper functions for rcu_dereference_check(), rcu_dereference_protected() | ||
307 | * and rcu_assign_pointer(). Some of these could be folded into their | ||
308 | * callers, but they are left separate in order to ease introduction of | ||
309 | * multiple flavors of pointers to match the multiple flavors of RCU | ||
310 | * (e.g., __rcu_bh, * __rcu_sched, and __srcu), should this make sense in | ||
311 | * the future. | ||
312 | */ | ||
313 | |||
314 | #ifdef __CHECKER__ | ||
315 | #define rcu_dereference_sparse(p, space) \ | ||
316 | ((void)(((typeof(*p) space *)p) == p)) | ||
317 | #else /* #ifdef __CHECKER__ */ | ||
318 | #define rcu_dereference_sparse(p, space) | ||
319 | #endif /* #else #ifdef __CHECKER__ */ | ||
320 | |||
321 | #define __rcu_access_pointer(p, space) \ | ||
322 | ({ \ | ||
323 | typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ | ||
324 | rcu_dereference_sparse(p, space); \ | ||
325 | ((typeof(*p) __force __kernel *)(_________p1)); \ | ||
326 | }) | ||
327 | #define __rcu_dereference_check(p, c, space) \ | ||
328 | ({ \ | ||
329 | typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ | ||
330 | rcu_lockdep_assert(c); \ | ||
331 | rcu_dereference_sparse(p, space); \ | ||
332 | smp_read_barrier_depends(); \ | ||
333 | ((typeof(*p) __force __kernel *)(_________p1)); \ | ||
334 | }) | ||
335 | #define __rcu_dereference_protected(p, c, space) \ | ||
336 | ({ \ | ||
337 | rcu_lockdep_assert(c); \ | ||
338 | rcu_dereference_sparse(p, space); \ | ||
339 | ((typeof(*p) __force __kernel *)(p)); \ | ||
340 | }) | ||
341 | |||
342 | #define __rcu_dereference_index_check(p, c) \ | ||
343 | ({ \ | ||
344 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | ||
345 | rcu_lockdep_assert(c); \ | ||
346 | smp_read_barrier_depends(); \ | ||
347 | (_________p1); \ | ||
348 | }) | ||
349 | #define __rcu_assign_pointer(p, v, space) \ | ||
350 | ({ \ | ||
351 | if (!__builtin_constant_p(v) || \ | ||
352 | ((v) != NULL)) \ | ||
353 | smp_wmb(); \ | ||
354 | (p) = (typeof(*v) __force space *)(v); \ | ||
355 | }) | ||
356 | |||
357 | |||
358 | /** | ||
359 | * rcu_access_pointer() - fetch RCU pointer with no dereferencing | ||
360 | * @p: The pointer to read | ||
361 | * | ||
362 | * Return the value of the specified RCU-protected pointer, but omit the | ||
363 | * smp_read_barrier_depends() and keep the ACCESS_ONCE(). This is useful | ||
364 | * when the value of this pointer is accessed, but the pointer is not | ||
365 | * dereferenced, for example, when testing an RCU-protected pointer against | ||
366 | * NULL. Although rcu_access_pointer() may also be used in cases where | ||
367 | * update-side locks prevent the value of the pointer from changing, you | ||
368 | * should instead use rcu_dereference_protected() for this use case. | ||
369 | */ | ||
370 | #define rcu_access_pointer(p) __rcu_access_pointer((p), __rcu) | ||
371 | |||
223 | /** | 372 | /** |
224 | * rcu_dereference_check - rcu_dereference with debug checking | 373 | * rcu_dereference_check() - rcu_dereference with debug checking |
225 | * @p: The pointer to read, prior to dereferencing | 374 | * @p: The pointer to read, prior to dereferencing |
226 | * @c: The conditions under which the dereference will take place | 375 | * @c: The conditions under which the dereference will take place |
227 | * | 376 | * |
228 | * Do an rcu_dereference(), but check that the conditions under which the | 377 | * Do an rcu_dereference(), but check that the conditions under which the |
229 | * dereference will take place are correct. Typically the conditions indicate | 378 | * dereference will take place are correct. Typically the conditions |
230 | * the various locking conditions that should be held at that point. The check | 379 | * indicate the various locking conditions that should be held at that |
231 | * should return true if the conditions are satisfied. | 380 | * point. The check should return true if the conditions are satisfied. |
381 | * An implicit check for being in an RCU read-side critical section | ||
382 | * (rcu_read_lock()) is included. | ||
232 | * | 383 | * |
233 | * For example: | 384 | * For example: |
234 | * | 385 | * |
235 | * bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || | 386 | * bar = rcu_dereference_check(foo->bar, lockdep_is_held(&foo->lock)); |
236 | * lockdep_is_held(&foo->lock)); | ||
237 | * | 387 | * |
238 | * could be used to indicate to lockdep that foo->bar may only be dereferenced | 388 | * could be used to indicate to lockdep that foo->bar may only be dereferenced |
239 | * if either the RCU read lock is held, or that the lock required to replace | 389 | * if either rcu_read_lock() is held, or that the lock required to replace |
240 | * the bar struct at foo->bar is held. | 390 | * the bar struct at foo->bar is held. |
241 | * | 391 | * |
242 | * Note that the list of conditions may also include indications of when a lock | 392 | * Note that the list of conditions may also include indications of when a lock |
243 | * need not be held, for example during initialisation or destruction of the | 393 | * need not be held, for example during initialisation or destruction of the |
244 | * target struct: | 394 | * target struct: |
245 | * | 395 | * |
246 | * bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || | 396 | * bar = rcu_dereference_check(foo->bar, lockdep_is_held(&foo->lock) || |
247 | * lockdep_is_held(&foo->lock) || | ||
248 | * atomic_read(&foo->usage) == 0); | 397 | * atomic_read(&foo->usage) == 0); |
398 | * | ||
399 | * Inserts memory barriers on architectures that require them | ||
400 | * (currently only the Alpha), prevents the compiler from refetching | ||
401 | * (and from merging fetches), and, more importantly, documents exactly | ||
402 | * which pointers are protected by RCU and checks that the pointer is | ||
403 | * annotated as __rcu. | ||
249 | */ | 404 | */ |
250 | #define rcu_dereference_check(p, c) \ | 405 | #define rcu_dereference_check(p, c) \ |
251 | ({ \ | 406 | __rcu_dereference_check((p), rcu_read_lock_held() || (c), __rcu) |
252 | __do_rcu_dereference_check(c); \ | 407 | |
253 | rcu_dereference_raw(p); \ | 408 | /** |
254 | }) | 409 | * rcu_dereference_bh_check() - rcu_dereference_bh with debug checking |
410 | * @p: The pointer to read, prior to dereferencing | ||
411 | * @c: The conditions under which the dereference will take place | ||
412 | * | ||
413 | * This is the RCU-bh counterpart to rcu_dereference_check(). | ||
414 | */ | ||
415 | #define rcu_dereference_bh_check(p, c) \ | ||
416 | __rcu_dereference_check((p), rcu_read_lock_bh_held() || (c), __rcu) | ||
255 | 417 | ||
256 | /** | 418 | /** |
257 | * rcu_dereference_protected - fetch RCU pointer when updates prevented | 419 | * rcu_dereference_sched_check() - rcu_dereference_sched with debug checking |
420 | * @p: The pointer to read, prior to dereferencing | ||
421 | * @c: The conditions under which the dereference will take place | ||
422 | * | ||
423 | * This is the RCU-sched counterpart to rcu_dereference_check(). | ||
424 | */ | ||
425 | #define rcu_dereference_sched_check(p, c) \ | ||
426 | __rcu_dereference_check((p), rcu_read_lock_sched_held() || (c), \ | ||
427 | __rcu) | ||
428 | |||
429 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ | ||
430 | |||
431 | /** | ||
432 | * rcu_dereference_index_check() - rcu_dereference for indices with debug checking | ||
433 | * @p: The pointer to read, prior to dereferencing | ||
434 | * @c: The conditions under which the dereference will take place | ||
435 | * | ||
436 | * Similar to rcu_dereference_check(), but omits the sparse checking. | ||
437 | * This allows rcu_dereference_index_check() to be used on integers, | ||
438 | * which can then be used as array indices. Attempting to use | ||
439 | * rcu_dereference_check() on an integer will give compiler warnings | ||
440 | * because the sparse address-space mechanism relies on dereferencing | ||
441 | * the RCU-protected pointer. Dereferencing integers is not something | ||
442 | * that even gcc will put up with. | ||
443 | * | ||
444 | * Note that this function does not implicitly check for RCU read-side | ||
445 | * critical sections. If this function gains lots of uses, it might | ||
446 | * make sense to provide versions for each flavor of RCU, but it does | ||
447 | * not make sense as of early 2010. | ||
448 | */ | ||
449 | #define rcu_dereference_index_check(p, c) \ | ||
450 | __rcu_dereference_index_check((p), (c)) | ||
451 | |||
452 | /** | ||
453 | * rcu_dereference_protected() - fetch RCU pointer when updates prevented | ||
454 | * @p: The pointer to read, prior to dereferencing | ||
455 | * @c: The conditions under which the dereference will take place | ||
258 | * | 456 | * |
259 | * Return the value of the specified RCU-protected pointer, but omit | 457 | * Return the value of the specified RCU-protected pointer, but omit |
260 | * both the smp_read_barrier_depends() and the ACCESS_ONCE(). This | 458 | * both the smp_read_barrier_depends() and the ACCESS_ONCE(). This |
@@ -263,35 +461,61 @@ extern int rcu_my_thread_group_empty(void); | |||
263 | * prevent the compiler from repeating this reference or combining it | 461 | * prevent the compiler from repeating this reference or combining it |
264 | * with other references, so it should not be used without protection | 462 | * with other references, so it should not be used without protection |
265 | * of appropriate locks. | 463 | * of appropriate locks. |
464 | * | ||
465 | * This function is only for update-side use. Using this function | ||
466 | * when protected only by rcu_read_lock() will result in infrequent | ||
467 | * but very ugly failures. | ||
266 | */ | 468 | */ |
267 | #define rcu_dereference_protected(p, c) \ | 469 | #define rcu_dereference_protected(p, c) \ |
268 | ({ \ | 470 | __rcu_dereference_protected((p), (c), __rcu) |
269 | __do_rcu_dereference_check(c); \ | ||
270 | (p); \ | ||
271 | }) | ||
272 | 471 | ||
273 | #else /* #ifdef CONFIG_PROVE_RCU */ | 472 | /** |
473 | * rcu_dereference_bh_protected() - fetch RCU-bh pointer when updates prevented | ||
474 | * @p: The pointer to read, prior to dereferencing | ||
475 | * @c: The conditions under which the dereference will take place | ||
476 | * | ||
477 | * This is the RCU-bh counterpart to rcu_dereference_protected(). | ||
478 | */ | ||
479 | #define rcu_dereference_bh_protected(p, c) \ | ||
480 | __rcu_dereference_protected((p), (c), __rcu) | ||
274 | 481 | ||
275 | #define rcu_dereference_check(p, c) rcu_dereference_raw(p) | 482 | /** |
276 | #define rcu_dereference_protected(p, c) (p) | 483 | * rcu_dereference_sched_protected() - fetch RCU-sched pointer when updates prevented |
484 | * @p: The pointer to read, prior to dereferencing | ||
485 | * @c: The conditions under which the dereference will take place | ||
486 | * | ||
487 | * This is the RCU-sched counterpart to rcu_dereference_protected(). | ||
488 | */ | ||
489 | #define rcu_dereference_sched_protected(p, c) \ | ||
490 | __rcu_dereference_protected((p), (c), __rcu) | ||
277 | 491 | ||
278 | #endif /* #else #ifdef CONFIG_PROVE_RCU */ | ||
279 | 492 | ||
280 | /** | 493 | /** |
281 | * rcu_access_pointer - fetch RCU pointer with no dereferencing | 494 | * rcu_dereference() - fetch RCU-protected pointer for dereferencing |
495 | * @p: The pointer to read, prior to dereferencing | ||
282 | * | 496 | * |
283 | * Return the value of the specified RCU-protected pointer, but omit the | 497 | * This is a simple wrapper around rcu_dereference_check(). |
284 | * smp_read_barrier_depends() and keep the ACCESS_ONCE(). This is useful | 498 | */ |
285 | * when the value of this pointer is accessed, but the pointer is not | 499 | #define rcu_dereference(p) rcu_dereference_check(p, 0) |
286 | * dereferenced, for example, when testing an RCU-protected pointer against | 500 | |
287 | * NULL. This may also be used in cases where update-side locks prevent | 501 | /** |
288 | * the value of the pointer from changing, but rcu_dereference_protected() | 502 | * rcu_dereference_bh() - fetch an RCU-bh-protected pointer for dereferencing |
289 | * is a lighter-weight primitive for this use case. | 503 | * @p: The pointer to read, prior to dereferencing |
504 | * | ||
505 | * Makes rcu_dereference_check() do the dirty work. | ||
506 | */ | ||
507 | #define rcu_dereference_bh(p) rcu_dereference_bh_check(p, 0) | ||
508 | |||
509 | /** | ||
510 | * rcu_dereference_sched() - fetch RCU-sched-protected pointer for dereferencing | ||
511 | * @p: The pointer to read, prior to dereferencing | ||
512 | * | ||
513 | * Makes rcu_dereference_check() do the dirty work. | ||
290 | */ | 514 | */ |
291 | #define rcu_access_pointer(p) ACCESS_ONCE(p) | 515 | #define rcu_dereference_sched(p) rcu_dereference_sched_check(p, 0) |
292 | 516 | ||
293 | /** | 517 | /** |
294 | * rcu_read_lock - mark the beginning of an RCU read-side critical section. | 518 | * rcu_read_lock() - mark the beginning of an RCU read-side critical section |
295 | * | 519 | * |
296 | * When synchronize_rcu() is invoked on one CPU while other CPUs | 520 | * When synchronize_rcu() is invoked on one CPU while other CPUs |
297 | * are within RCU read-side critical sections, then the | 521 | * are within RCU read-side critical sections, then the |
@@ -302,7 +526,7 @@ extern int rcu_my_thread_group_empty(void); | |||
302 | * until after the all the other CPUs exit their critical sections. | 526 | * until after the all the other CPUs exit their critical sections. |
303 | * | 527 | * |
304 | * Note, however, that RCU callbacks are permitted to run concurrently | 528 | * Note, however, that RCU callbacks are permitted to run concurrently |
305 | * with RCU read-side critical sections. One way that this can happen | 529 | * with new RCU read-side critical sections. One way that this can happen |
306 | * is via the following sequence of events: (1) CPU 0 enters an RCU | 530 | * is via the following sequence of events: (1) CPU 0 enters an RCU |
307 | * read-side critical section, (2) CPU 1 invokes call_rcu() to register | 531 | * read-side critical section, (2) CPU 1 invokes call_rcu() to register |
308 | * an RCU callback, (3) CPU 0 exits the RCU read-side critical section, | 532 | * an RCU callback, (3) CPU 0 exits the RCU read-side critical section, |
@@ -317,7 +541,20 @@ extern int rcu_my_thread_group_empty(void); | |||
317 | * will be deferred until the outermost RCU read-side critical section | 541 | * will be deferred until the outermost RCU read-side critical section |
318 | * completes. | 542 | * completes. |
319 | * | 543 | * |
320 | * It is illegal to block while in an RCU read-side critical section. | 544 | * You can avoid reading and understanding the next paragraph by |
545 | * following this rule: don't put anything in an rcu_read_lock() RCU | ||
546 | * read-side critical section that would block in a !PREEMPT kernel. | ||
547 | * But if you want the full story, read on! | ||
548 | * | ||
549 | * In non-preemptible RCU implementations (TREE_RCU and TINY_RCU), it | ||
550 | * is illegal to block while in an RCU read-side critical section. In | ||
551 | * preemptible RCU implementations (TREE_PREEMPT_RCU and TINY_PREEMPT_RCU) | ||
552 | * in CONFIG_PREEMPT kernel builds, RCU read-side critical sections may | ||
553 | * be preempted, but explicit blocking is illegal. Finally, in preemptible | ||
554 | * RCU implementations in real-time (CONFIG_PREEMPT_RT) kernel builds, | ||
555 | * RCU read-side critical sections may be preempted and they may also | ||
556 | * block, but only when acquiring spinlocks that are subject to priority | ||
557 | * inheritance. | ||
321 | */ | 558 | */ |
322 | static inline void rcu_read_lock(void) | 559 | static inline void rcu_read_lock(void) |
323 | { | 560 | { |
@@ -337,7 +574,7 @@ static inline void rcu_read_lock(void) | |||
337 | */ | 574 | */ |
338 | 575 | ||
339 | /** | 576 | /** |
340 | * rcu_read_unlock - marks the end of an RCU read-side critical section. | 577 | * rcu_read_unlock() - marks the end of an RCU read-side critical section. |
341 | * | 578 | * |
342 | * See rcu_read_lock() for more information. | 579 | * See rcu_read_lock() for more information. |
343 | */ | 580 | */ |
@@ -349,15 +586,16 @@ static inline void rcu_read_unlock(void) | |||
349 | } | 586 | } |
350 | 587 | ||
351 | /** | 588 | /** |
352 | * rcu_read_lock_bh - mark the beginning of a softirq-only RCU critical section | 589 | * rcu_read_lock_bh() - mark the beginning of an RCU-bh critical section |
353 | * | 590 | * |
354 | * This is equivalent of rcu_read_lock(), but to be used when updates | 591 | * This is equivalent of rcu_read_lock(), but to be used when updates |
355 | * are being done using call_rcu_bh(). Since call_rcu_bh() callbacks | 592 | * are being done using call_rcu_bh() or synchronize_rcu_bh(). Since |
356 | * consider completion of a softirq handler to be a quiescent state, | 593 | * both call_rcu_bh() and synchronize_rcu_bh() consider completion of a |
357 | * a process in RCU read-side critical section must be protected by | 594 | * softirq handler to be a quiescent state, a process in RCU read-side |
358 | * disabling softirqs. Read-side critical sections in interrupt context | 595 | * critical section must be protected by disabling softirqs. Read-side |
359 | * can use just rcu_read_lock(). | 596 | * critical sections in interrupt context can use just rcu_read_lock(), |
360 | * | 597 | * though this should at least be commented to avoid confusing people |
598 | * reading the code. | ||
361 | */ | 599 | */ |
362 | static inline void rcu_read_lock_bh(void) | 600 | static inline void rcu_read_lock_bh(void) |
363 | { | 601 | { |
@@ -379,13 +617,12 @@ static inline void rcu_read_unlock_bh(void) | |||
379 | } | 617 | } |
380 | 618 | ||
381 | /** | 619 | /** |
382 | * rcu_read_lock_sched - mark the beginning of a RCU-classic critical section | 620 | * rcu_read_lock_sched() - mark the beginning of a RCU-sched critical section |
383 | * | 621 | * |
384 | * Should be used with either | 622 | * This is equivalent of rcu_read_lock(), but to be used when updates |
385 | * - synchronize_sched() | 623 | * are being done using call_rcu_sched() or synchronize_rcu_sched(). |
386 | * or | 624 | * Read-side critical sections can also be introduced by anything that |
387 | * - call_rcu_sched() and rcu_barrier_sched() | 625 | * disables preemption, including local_irq_disable() and friends. |
388 | * on the write-side to insure proper synchronization. | ||
389 | */ | 626 | */ |
390 | static inline void rcu_read_lock_sched(void) | 627 | static inline void rcu_read_lock_sched(void) |
391 | { | 628 | { |
@@ -420,54 +657,14 @@ static inline notrace void rcu_read_unlock_sched_notrace(void) | |||
420 | preempt_enable_notrace(); | 657 | preempt_enable_notrace(); |
421 | } | 658 | } |
422 | 659 | ||
423 | |||
424 | /** | 660 | /** |
425 | * rcu_dereference_raw - fetch an RCU-protected pointer | 661 | * rcu_assign_pointer() - assign to RCU-protected pointer |
662 | * @p: pointer to assign to | ||
663 | * @v: value to assign (publish) | ||
426 | * | 664 | * |
427 | * The caller must be within some flavor of RCU read-side critical | 665 | * Assigns the specified value to the specified RCU-protected |
428 | * section, or must be otherwise preventing the pointer from changing, | 666 | * pointer, ensuring that any concurrent RCU readers will see |
429 | * for example, by holding an appropriate lock. This pointer may later | 667 | * any prior initialization. Returns the value assigned. |
430 | * be safely dereferenced. It is the caller's responsibility to have | ||
431 | * done the right thing, as this primitive does no checking of any kind. | ||
432 | * | ||
433 | * Inserts memory barriers on architectures that require them | ||
434 | * (currently only the Alpha), and, more importantly, documents | ||
435 | * exactly which pointers are protected by RCU. | ||
436 | */ | ||
437 | #define rcu_dereference_raw(p) ({ \ | ||
438 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | ||
439 | smp_read_barrier_depends(); \ | ||
440 | (_________p1); \ | ||
441 | }) | ||
442 | |||
443 | /** | ||
444 | * rcu_dereference - fetch an RCU-protected pointer, checking for RCU | ||
445 | * | ||
446 | * Makes rcu_dereference_check() do the dirty work. | ||
447 | */ | ||
448 | #define rcu_dereference(p) \ | ||
449 | rcu_dereference_check(p, rcu_read_lock_held()) | ||
450 | |||
451 | /** | ||
452 | * rcu_dereference_bh - fetch an RCU-protected pointer, checking for RCU-bh | ||
453 | * | ||
454 | * Makes rcu_dereference_check() do the dirty work. | ||
455 | */ | ||
456 | #define rcu_dereference_bh(p) \ | ||
457 | rcu_dereference_check(p, rcu_read_lock_bh_held() || irqs_disabled()) | ||
458 | |||
459 | /** | ||
460 | * rcu_dereference_sched - fetch RCU-protected pointer, checking for RCU-sched | ||
461 | * | ||
462 | * Makes rcu_dereference_check() do the dirty work. | ||
463 | */ | ||
464 | #define rcu_dereference_sched(p) \ | ||
465 | rcu_dereference_check(p, rcu_read_lock_sched_held()) | ||
466 | |||
467 | /** | ||
468 | * rcu_assign_pointer - assign (publicize) a pointer to a newly | ||
469 | * initialized structure that will be dereferenced by RCU read-side | ||
470 | * critical sections. Returns the value assigned. | ||
471 | * | 668 | * |
472 | * Inserts memory barriers on architectures that require them | 669 | * Inserts memory barriers on architectures that require them |
473 | * (pretty much all of them other than x86), and also prevents | 670 | * (pretty much all of them other than x86), and also prevents |
@@ -476,14 +673,17 @@ static inline notrace void rcu_read_unlock_sched_notrace(void) | |||
476 | * call documents which pointers will be dereferenced by RCU read-side | 673 | * call documents which pointers will be dereferenced by RCU read-side |
477 | * code. | 674 | * code. |
478 | */ | 675 | */ |
479 | |||
480 | #define rcu_assign_pointer(p, v) \ | 676 | #define rcu_assign_pointer(p, v) \ |
481 | ({ \ | 677 | __rcu_assign_pointer((p), (v), __rcu) |
482 | if (!__builtin_constant_p(v) || \ | 678 | |
483 | ((v) != NULL)) \ | 679 | /** |
484 | smp_wmb(); \ | 680 | * RCU_INIT_POINTER() - initialize an RCU protected pointer |
485 | (p) = (v); \ | 681 | * |
486 | }) | 682 | * Initialize an RCU-protected pointer in such a way to avoid RCU-lockdep |
683 | * splats. | ||
684 | */ | ||
685 | #define RCU_INIT_POINTER(p, v) \ | ||
686 | p = (typeof(*v) __force __rcu *)(v) | ||
487 | 687 | ||
488 | /* Infrastructure to implement the synchronize_() primitives. */ | 688 | /* Infrastructure to implement the synchronize_() primitives. */ |
489 | 689 | ||
@@ -494,26 +694,37 @@ struct rcu_synchronize { | |||
494 | 694 | ||
495 | extern void wakeme_after_rcu(struct rcu_head *head); | 695 | extern void wakeme_after_rcu(struct rcu_head *head); |
496 | 696 | ||
697 | #ifdef CONFIG_PREEMPT_RCU | ||
698 | |||
497 | /** | 699 | /** |
498 | * call_rcu - Queue an RCU callback for invocation after a grace period. | 700 | * call_rcu() - Queue an RCU callback for invocation after a grace period. |
499 | * @head: structure to be used for queueing the RCU updates. | 701 | * @head: structure to be used for queueing the RCU updates. |
500 | * @func: actual update function to be invoked after the grace period | 702 | * @func: actual callback function to be invoked after the grace period |
501 | * | 703 | * |
502 | * The update function will be invoked some time after a full grace | 704 | * The callback function will be invoked some time after a full grace |
503 | * period elapses, in other words after all currently executing RCU | 705 | * period elapses, in other words after all pre-existing RCU read-side |
504 | * read-side critical sections have completed. RCU read-side critical | 706 | * critical sections have completed. However, the callback function |
707 | * might well execute concurrently with RCU read-side critical sections | ||
708 | * that started after call_rcu() was invoked. RCU read-side critical | ||
505 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | 709 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), |
506 | * and may be nested. | 710 | * and may be nested. |
507 | */ | 711 | */ |
508 | extern void call_rcu(struct rcu_head *head, | 712 | extern void call_rcu(struct rcu_head *head, |
509 | void (*func)(struct rcu_head *head)); | 713 | void (*func)(struct rcu_head *head)); |
510 | 714 | ||
715 | #else /* #ifdef CONFIG_PREEMPT_RCU */ | ||
716 | |||
717 | /* In classic RCU, call_rcu() is just call_rcu_sched(). */ | ||
718 | #define call_rcu call_rcu_sched | ||
719 | |||
720 | #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ | ||
721 | |||
511 | /** | 722 | /** |
512 | * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. | 723 | * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. |
513 | * @head: structure to be used for queueing the RCU updates. | 724 | * @head: structure to be used for queueing the RCU updates. |
514 | * @func: actual update function to be invoked after the grace period | 725 | * @func: actual callback function to be invoked after the grace period |
515 | * | 726 | * |
516 | * The update function will be invoked some time after a full grace | 727 | * The callback function will be invoked some time after a full grace |
517 | * period elapses, in other words after all currently executing RCU | 728 | * period elapses, in other words after all currently executing RCU |
518 | * read-side critical sections have completed. call_rcu_bh() assumes | 729 | * read-side critical sections have completed. call_rcu_bh() assumes |
519 | * that the read-side critical sections end on completion of a softirq | 730 | * that the read-side critical sections end on completion of a softirq |
@@ -566,37 +777,4 @@ static inline void debug_rcu_head_unqueue(struct rcu_head *head) | |||
566 | } | 777 | } |
567 | #endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | 778 | #endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ |
568 | 779 | ||
569 | #ifndef CONFIG_PROVE_RCU | ||
570 | #define __do_rcu_dereference_check(c) do { } while (0) | ||
571 | #endif /* #ifdef CONFIG_PROVE_RCU */ | ||
572 | |||
573 | #define __rcu_dereference_index_check(p, c) \ | ||
574 | ({ \ | ||
575 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | ||
576 | __do_rcu_dereference_check(c); \ | ||
577 | smp_read_barrier_depends(); \ | ||
578 | (_________p1); \ | ||
579 | }) | ||
580 | |||
581 | /** | ||
582 | * rcu_dereference_index_check() - rcu_dereference for indices with debug checking | ||
583 | * @p: The pointer to read, prior to dereferencing | ||
584 | * @c: The conditions under which the dereference will take place | ||
585 | * | ||
586 | * Similar to rcu_dereference_check(), but omits the sparse checking. | ||
587 | * This allows rcu_dereference_index_check() to be used on integers, | ||
588 | * which can then be used as array indices. Attempting to use | ||
589 | * rcu_dereference_check() on an integer will give compiler warnings | ||
590 | * because the sparse address-space mechanism relies on dereferencing | ||
591 | * the RCU-protected pointer. Dereferencing integers is not something | ||
592 | * that even gcc will put up with. | ||
593 | * | ||
594 | * Note that this function does not implicitly check for RCU read-side | ||
595 | * critical sections. If this function gains lots of uses, it might | ||
596 | * make sense to provide versions for each flavor of RCU, but it does | ||
597 | * not make sense as of early 2010. | ||
598 | */ | ||
599 | #define rcu_dereference_index_check(p, c) \ | ||
600 | __rcu_dereference_index_check((p), (c)) | ||
601 | |||
602 | #endif /* __LINUX_RCUPDATE_H */ | 780 | #endif /* __LINUX_RCUPDATE_H */ |
diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h index e2e893144a84..13877cb93a60 100644 --- a/include/linux/rcutiny.h +++ b/include/linux/rcutiny.h | |||
@@ -27,103 +27,101 @@ | |||
27 | 27 | ||
28 | #include <linux/cache.h> | 28 | #include <linux/cache.h> |
29 | 29 | ||
30 | void rcu_sched_qs(int cpu); | 30 | #define rcu_init_sched() do { } while (0) |
31 | void rcu_bh_qs(int cpu); | ||
32 | static inline void rcu_note_context_switch(int cpu) | ||
33 | { | ||
34 | rcu_sched_qs(cpu); | ||
35 | } | ||
36 | 31 | ||
37 | #define __rcu_read_lock() preempt_disable() | 32 | #ifdef CONFIG_TINY_RCU |
38 | #define __rcu_read_unlock() preempt_enable() | ||
39 | #define __rcu_read_lock_bh() local_bh_disable() | ||
40 | #define __rcu_read_unlock_bh() local_bh_enable() | ||
41 | #define call_rcu_sched call_rcu | ||
42 | 33 | ||
43 | #define rcu_init_sched() do { } while (0) | 34 | static inline void synchronize_rcu_expedited(void) |
44 | extern void rcu_check_callbacks(int cpu, int user); | 35 | { |
36 | synchronize_sched(); /* Only one CPU, so pretty fast anyway!!! */ | ||
37 | } | ||
45 | 38 | ||
46 | static inline int rcu_needs_cpu(int cpu) | 39 | static inline void rcu_barrier(void) |
47 | { | 40 | { |
48 | return 0; | 41 | rcu_barrier_sched(); /* Only one CPU, so only one list of callbacks! */ |
49 | } | 42 | } |
50 | 43 | ||
51 | /* | 44 | #else /* #ifdef CONFIG_TINY_RCU */ |
52 | * Return the number of grace periods. | 45 | |
53 | */ | 46 | void rcu_barrier(void); |
54 | static inline long rcu_batches_completed(void) | 47 | void synchronize_rcu_expedited(void); |
48 | |||
49 | #endif /* #else #ifdef CONFIG_TINY_RCU */ | ||
50 | |||
51 | static inline void synchronize_rcu_bh(void) | ||
55 | { | 52 | { |
56 | return 0; | 53 | synchronize_sched(); |
57 | } | 54 | } |
58 | 55 | ||
59 | /* | 56 | static inline void synchronize_rcu_bh_expedited(void) |
60 | * Return the number of bottom-half grace periods. | ||
61 | */ | ||
62 | static inline long rcu_batches_completed_bh(void) | ||
63 | { | 57 | { |
64 | return 0; | 58 | synchronize_sched(); |
65 | } | 59 | } |
66 | 60 | ||
67 | static inline void rcu_force_quiescent_state(void) | 61 | #ifdef CONFIG_TINY_RCU |
62 | |||
63 | static inline void rcu_preempt_note_context_switch(void) | ||
68 | { | 64 | { |
69 | } | 65 | } |
70 | 66 | ||
71 | static inline void rcu_bh_force_quiescent_state(void) | 67 | static inline void exit_rcu(void) |
72 | { | 68 | { |
73 | } | 69 | } |
74 | 70 | ||
75 | static inline void rcu_sched_force_quiescent_state(void) | 71 | static inline int rcu_needs_cpu(int cpu) |
76 | { | 72 | { |
73 | return 0; | ||
77 | } | 74 | } |
78 | 75 | ||
79 | extern void synchronize_sched(void); | 76 | #else /* #ifdef CONFIG_TINY_RCU */ |
77 | |||
78 | void rcu_preempt_note_context_switch(void); | ||
79 | extern void exit_rcu(void); | ||
80 | int rcu_preempt_needs_cpu(void); | ||
80 | 81 | ||
81 | static inline void synchronize_rcu(void) | 82 | static inline int rcu_needs_cpu(int cpu) |
82 | { | 83 | { |
83 | synchronize_sched(); | 84 | return rcu_preempt_needs_cpu(); |
84 | } | 85 | } |
85 | 86 | ||
86 | static inline void synchronize_rcu_bh(void) | 87 | #endif /* #else #ifdef CONFIG_TINY_RCU */ |
88 | |||
89 | static inline void rcu_note_context_switch(int cpu) | ||
87 | { | 90 | { |
88 | synchronize_sched(); | 91 | rcu_sched_qs(cpu); |
92 | rcu_preempt_note_context_switch(); | ||
89 | } | 93 | } |
90 | 94 | ||
91 | static inline void synchronize_rcu_expedited(void) | 95 | /* |
96 | * Return the number of grace periods. | ||
97 | */ | ||
98 | static inline long rcu_batches_completed(void) | ||
92 | { | 99 | { |
93 | synchronize_sched(); | 100 | return 0; |
94 | } | 101 | } |
95 | 102 | ||
96 | static inline void synchronize_rcu_bh_expedited(void) | 103 | /* |
104 | * Return the number of bottom-half grace periods. | ||
105 | */ | ||
106 | static inline long rcu_batches_completed_bh(void) | ||
97 | { | 107 | { |
98 | synchronize_sched(); | 108 | return 0; |
99 | } | 109 | } |
100 | 110 | ||
101 | struct notifier_block; | 111 | static inline void rcu_force_quiescent_state(void) |
102 | |||
103 | #ifdef CONFIG_NO_HZ | ||
104 | |||
105 | extern void rcu_enter_nohz(void); | ||
106 | extern void rcu_exit_nohz(void); | ||
107 | |||
108 | #else /* #ifdef CONFIG_NO_HZ */ | ||
109 | |||
110 | static inline void rcu_enter_nohz(void) | ||
111 | { | 112 | { |
112 | } | 113 | } |
113 | 114 | ||
114 | static inline void rcu_exit_nohz(void) | 115 | static inline void rcu_bh_force_quiescent_state(void) |
115 | { | 116 | { |
116 | } | 117 | } |
117 | 118 | ||
118 | #endif /* #else #ifdef CONFIG_NO_HZ */ | 119 | static inline void rcu_sched_force_quiescent_state(void) |
119 | |||
120 | static inline void exit_rcu(void) | ||
121 | { | 120 | { |
122 | } | 121 | } |
123 | 122 | ||
124 | static inline int rcu_preempt_depth(void) | 123 | static inline void rcu_cpu_stall_reset(void) |
125 | { | 124 | { |
126 | return 0; | ||
127 | } | 125 | } |
128 | 126 | ||
129 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 127 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index c0ed1c056f29..95518e628794 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h | |||
@@ -30,64 +30,23 @@ | |||
30 | #ifndef __LINUX_RCUTREE_H | 30 | #ifndef __LINUX_RCUTREE_H |
31 | #define __LINUX_RCUTREE_H | 31 | #define __LINUX_RCUTREE_H |
32 | 32 | ||
33 | struct notifier_block; | ||
34 | |||
35 | extern void rcu_sched_qs(int cpu); | ||
36 | extern void rcu_bh_qs(int cpu); | ||
37 | extern void rcu_note_context_switch(int cpu); | 33 | extern void rcu_note_context_switch(int cpu); |
38 | extern int rcu_needs_cpu(int cpu); | 34 | extern int rcu_needs_cpu(int cpu); |
35 | extern void rcu_cpu_stall_reset(void); | ||
39 | 36 | ||
40 | #ifdef CONFIG_TREE_PREEMPT_RCU | 37 | #ifdef CONFIG_TREE_PREEMPT_RCU |
41 | 38 | ||
42 | extern void __rcu_read_lock(void); | ||
43 | extern void __rcu_read_unlock(void); | ||
44 | extern void synchronize_rcu(void); | ||
45 | extern void exit_rcu(void); | 39 | extern void exit_rcu(void); |
46 | 40 | ||
47 | /* | ||
48 | * Defined as macro as it is a very low level header | ||
49 | * included from areas that don't even know about current | ||
50 | */ | ||
51 | #define rcu_preempt_depth() (current->rcu_read_lock_nesting) | ||
52 | |||
53 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 41 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
54 | 42 | ||
55 | static inline void __rcu_read_lock(void) | ||
56 | { | ||
57 | preempt_disable(); | ||
58 | } | ||
59 | |||
60 | static inline void __rcu_read_unlock(void) | ||
61 | { | ||
62 | preempt_enable(); | ||
63 | } | ||
64 | |||
65 | #define synchronize_rcu synchronize_sched | ||
66 | |||
67 | static inline void exit_rcu(void) | 43 | static inline void exit_rcu(void) |
68 | { | 44 | { |
69 | } | 45 | } |
70 | 46 | ||
71 | static inline int rcu_preempt_depth(void) | ||
72 | { | ||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ | 47 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ |
77 | 48 | ||
78 | static inline void __rcu_read_lock_bh(void) | ||
79 | { | ||
80 | local_bh_disable(); | ||
81 | } | ||
82 | static inline void __rcu_read_unlock_bh(void) | ||
83 | { | ||
84 | local_bh_enable(); | ||
85 | } | ||
86 | |||
87 | extern void call_rcu_sched(struct rcu_head *head, | ||
88 | void (*func)(struct rcu_head *rcu)); | ||
89 | extern void synchronize_rcu_bh(void); | 49 | extern void synchronize_rcu_bh(void); |
90 | extern void synchronize_sched(void); | ||
91 | extern void synchronize_rcu_expedited(void); | 50 | extern void synchronize_rcu_expedited(void); |
92 | 51 | ||
93 | static inline void synchronize_rcu_bh_expedited(void) | 52 | static inline void synchronize_rcu_bh_expedited(void) |
@@ -95,7 +54,7 @@ static inline void synchronize_rcu_bh_expedited(void) | |||
95 | synchronize_sched_expedited(); | 54 | synchronize_sched_expedited(); |
96 | } | 55 | } |
97 | 56 | ||
98 | extern void rcu_check_callbacks(int cpu, int user); | 57 | extern void rcu_barrier(void); |
99 | 58 | ||
100 | extern long rcu_batches_completed(void); | 59 | extern long rcu_batches_completed(void); |
101 | extern long rcu_batches_completed_bh(void); | 60 | extern long rcu_batches_completed_bh(void); |
@@ -104,18 +63,6 @@ extern void rcu_force_quiescent_state(void); | |||
104 | extern void rcu_bh_force_quiescent_state(void); | 63 | extern void rcu_bh_force_quiescent_state(void); |
105 | extern void rcu_sched_force_quiescent_state(void); | 64 | extern void rcu_sched_force_quiescent_state(void); |
106 | 65 | ||
107 | #ifdef CONFIG_NO_HZ | ||
108 | void rcu_enter_nohz(void); | ||
109 | void rcu_exit_nohz(void); | ||
110 | #else /* CONFIG_NO_HZ */ | ||
111 | static inline void rcu_enter_nohz(void) | ||
112 | { | ||
113 | } | ||
114 | static inline void rcu_exit_nohz(void) | ||
115 | { | ||
116 | } | ||
117 | #endif /* CONFIG_NO_HZ */ | ||
118 | |||
119 | /* A context switch is a grace period for RCU-sched and RCU-bh. */ | 66 | /* A context switch is a grace period for RCU-sched and RCU-bh. */ |
120 | static inline int rcu_blocking_is_gp(void) | 67 | static inline int rcu_blocking_is_gp(void) |
121 | { | 68 | { |
diff --git a/include/linux/rds.h b/include/linux/rds.h index 24bce3ded9ea..91950950aa59 100644 --- a/include/linux/rds.h +++ b/include/linux/rds.h | |||
@@ -36,15 +36,6 @@ | |||
36 | 36 | ||
37 | #include <linux/types.h> | 37 | #include <linux/types.h> |
38 | 38 | ||
39 | /* These sparse annotated types shouldn't be in any user | ||
40 | * visible header file. We should clean this up rather | ||
41 | * than kludging around them. */ | ||
42 | #ifndef __KERNEL__ | ||
43 | #define __be16 u_int16_t | ||
44 | #define __be32 u_int32_t | ||
45 | #define __be64 u_int64_t | ||
46 | #endif | ||
47 | |||
48 | #define RDS_IB_ABI_VERSION 0x301 | 39 | #define RDS_IB_ABI_VERSION 0x301 |
49 | 40 | ||
50 | /* | 41 | /* |
@@ -82,6 +73,10 @@ | |||
82 | #define RDS_CMSG_RDMA_MAP 3 | 73 | #define RDS_CMSG_RDMA_MAP 3 |
83 | #define RDS_CMSG_RDMA_STATUS 4 | 74 | #define RDS_CMSG_RDMA_STATUS 4 |
84 | #define RDS_CMSG_CONG_UPDATE 5 | 75 | #define RDS_CMSG_CONG_UPDATE 5 |
76 | #define RDS_CMSG_ATOMIC_FADD 6 | ||
77 | #define RDS_CMSG_ATOMIC_CSWP 7 | ||
78 | #define RDS_CMSG_MASKED_ATOMIC_FADD 8 | ||
79 | #define RDS_CMSG_MASKED_ATOMIC_CSWP 9 | ||
85 | 80 | ||
86 | #define RDS_INFO_FIRST 10000 | 81 | #define RDS_INFO_FIRST 10000 |
87 | #define RDS_INFO_COUNTERS 10000 | 82 | #define RDS_INFO_COUNTERS 10000 |
@@ -98,9 +93,9 @@ | |||
98 | #define RDS_INFO_LAST 10010 | 93 | #define RDS_INFO_LAST 10010 |
99 | 94 | ||
100 | struct rds_info_counter { | 95 | struct rds_info_counter { |
101 | u_int8_t name[32]; | 96 | uint8_t name[32]; |
102 | u_int64_t value; | 97 | uint64_t value; |
103 | } __packed; | 98 | } __attribute__((packed)); |
104 | 99 | ||
105 | #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 | 100 | #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 |
106 | #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 | 101 | #define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02 |
@@ -109,56 +104,48 @@ struct rds_info_counter { | |||
109 | #define TRANSNAMSIZ 16 | 104 | #define TRANSNAMSIZ 16 |
110 | 105 | ||
111 | struct rds_info_connection { | 106 | struct rds_info_connection { |
112 | u_int64_t next_tx_seq; | 107 | uint64_t next_tx_seq; |
113 | u_int64_t next_rx_seq; | 108 | uint64_t next_rx_seq; |
114 | __be32 laddr; | ||
115 | __be32 faddr; | ||
116 | u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ | ||
117 | u_int8_t flags; | ||
118 | } __packed; | ||
119 | |||
120 | struct rds_info_flow { | ||
121 | __be32 laddr; | 109 | __be32 laddr; |
122 | __be32 faddr; | 110 | __be32 faddr; |
123 | u_int32_t bytes; | 111 | uint8_t transport[TRANSNAMSIZ]; /* null term ascii */ |
124 | __be16 lport; | 112 | uint8_t flags; |
125 | __be16 fport; | 113 | } __attribute__((packed)); |
126 | } __packed; | ||
127 | 114 | ||
128 | #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 | 115 | #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 |
129 | #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 | 116 | #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 |
130 | 117 | ||
131 | struct rds_info_message { | 118 | struct rds_info_message { |
132 | u_int64_t seq; | 119 | uint64_t seq; |
133 | u_int32_t len; | 120 | uint32_t len; |
134 | __be32 laddr; | 121 | __be32 laddr; |
135 | __be32 faddr; | 122 | __be32 faddr; |
136 | __be16 lport; | 123 | __be16 lport; |
137 | __be16 fport; | 124 | __be16 fport; |
138 | u_int8_t flags; | 125 | uint8_t flags; |
139 | } __packed; | 126 | } __attribute__((packed)); |
140 | 127 | ||
141 | struct rds_info_socket { | 128 | struct rds_info_socket { |
142 | u_int32_t sndbuf; | 129 | uint32_t sndbuf; |
143 | __be32 bound_addr; | 130 | __be32 bound_addr; |
144 | __be32 connected_addr; | 131 | __be32 connected_addr; |
145 | __be16 bound_port; | 132 | __be16 bound_port; |
146 | __be16 connected_port; | 133 | __be16 connected_port; |
147 | u_int32_t rcvbuf; | 134 | uint32_t rcvbuf; |
148 | u_int64_t inum; | 135 | uint64_t inum; |
149 | } __packed; | 136 | } __attribute__((packed)); |
150 | 137 | ||
151 | struct rds_info_tcp_socket { | 138 | struct rds_info_tcp_socket { |
152 | __be32 local_addr; | 139 | __be32 local_addr; |
153 | __be16 local_port; | 140 | __be16 local_port; |
154 | __be32 peer_addr; | 141 | __be32 peer_addr; |
155 | __be16 peer_port; | 142 | __be16 peer_port; |
156 | u_int64_t hdr_rem; | 143 | uint64_t hdr_rem; |
157 | u_int64_t data_rem; | 144 | uint64_t data_rem; |
158 | u_int32_t last_sent_nxt; | 145 | uint32_t last_sent_nxt; |
159 | u_int32_t last_expected_una; | 146 | uint32_t last_expected_una; |
160 | u_int32_t last_seen_una; | 147 | uint32_t last_seen_una; |
161 | } __packed; | 148 | } __attribute__((packed)); |
162 | 149 | ||
163 | #define RDS_IB_GID_LEN 16 | 150 | #define RDS_IB_GID_LEN 16 |
164 | struct rds_info_rdma_connection { | 151 | struct rds_info_rdma_connection { |
@@ -212,42 +199,69 @@ struct rds_info_rdma_connection { | |||
212 | * (so that the application does not have to worry about | 199 | * (so that the application does not have to worry about |
213 | * alignment). | 200 | * alignment). |
214 | */ | 201 | */ |
215 | typedef u_int64_t rds_rdma_cookie_t; | 202 | typedef uint64_t rds_rdma_cookie_t; |
216 | 203 | ||
217 | struct rds_iovec { | 204 | struct rds_iovec { |
218 | u_int64_t addr; | 205 | uint64_t addr; |
219 | u_int64_t bytes; | 206 | uint64_t bytes; |
220 | }; | 207 | }; |
221 | 208 | ||
222 | struct rds_get_mr_args { | 209 | struct rds_get_mr_args { |
223 | struct rds_iovec vec; | 210 | struct rds_iovec vec; |
224 | u_int64_t cookie_addr; | 211 | uint64_t cookie_addr; |
225 | uint64_t flags; | 212 | uint64_t flags; |
226 | }; | 213 | }; |
227 | 214 | ||
228 | struct rds_get_mr_for_dest_args { | 215 | struct rds_get_mr_for_dest_args { |
229 | struct sockaddr_storage dest_addr; | 216 | struct sockaddr_storage dest_addr; |
230 | struct rds_iovec vec; | 217 | struct rds_iovec vec; |
231 | u_int64_t cookie_addr; | 218 | uint64_t cookie_addr; |
232 | uint64_t flags; | 219 | uint64_t flags; |
233 | }; | 220 | }; |
234 | 221 | ||
235 | struct rds_free_mr_args { | 222 | struct rds_free_mr_args { |
236 | rds_rdma_cookie_t cookie; | 223 | rds_rdma_cookie_t cookie; |
237 | u_int64_t flags; | 224 | uint64_t flags; |
238 | }; | 225 | }; |
239 | 226 | ||
240 | struct rds_rdma_args { | 227 | struct rds_rdma_args { |
241 | rds_rdma_cookie_t cookie; | 228 | rds_rdma_cookie_t cookie; |
242 | struct rds_iovec remote_vec; | 229 | struct rds_iovec remote_vec; |
243 | u_int64_t local_vec_addr; | 230 | uint64_t local_vec_addr; |
244 | u_int64_t nr_local; | 231 | uint64_t nr_local; |
245 | u_int64_t flags; | 232 | uint64_t flags; |
246 | u_int64_t user_token; | 233 | uint64_t user_token; |
234 | }; | ||
235 | |||
236 | struct rds_atomic_args { | ||
237 | rds_rdma_cookie_t cookie; | ||
238 | uint64_t local_addr; | ||
239 | uint64_t remote_addr; | ||
240 | union { | ||
241 | struct { | ||
242 | uint64_t compare; | ||
243 | uint64_t swap; | ||
244 | } cswp; | ||
245 | struct { | ||
246 | uint64_t add; | ||
247 | } fadd; | ||
248 | struct { | ||
249 | uint64_t compare; | ||
250 | uint64_t swap; | ||
251 | uint64_t compare_mask; | ||
252 | uint64_t swap_mask; | ||
253 | } m_cswp; | ||
254 | struct { | ||
255 | uint64_t add; | ||
256 | uint64_t nocarry_mask; | ||
257 | } m_fadd; | ||
258 | }; | ||
259 | uint64_t flags; | ||
260 | uint64_t user_token; | ||
247 | }; | 261 | }; |
248 | 262 | ||
249 | struct rds_rdma_notify { | 263 | struct rds_rdma_notify { |
250 | u_int64_t user_token; | 264 | uint64_t user_token; |
251 | int32_t status; | 265 | int32_t status; |
252 | }; | 266 | }; |
253 | 267 | ||
@@ -266,5 +280,6 @@ struct rds_rdma_notify { | |||
266 | #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ | 280 | #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ |
267 | #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ | 281 | #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ |
268 | #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ | 282 | #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ |
283 | #define RDS_RDMA_SILENT 0x0040 /* Do not interrupt remote */ | ||
269 | 284 | ||
270 | #endif /* IB_RDS_H */ | 285 | #endif /* IB_RDS_H */ |
diff --git a/include/linux/regulator/lp3972.h b/include/linux/regulator/lp3972.h new file mode 100644 index 000000000000..9bb7389b7a1e --- /dev/null +++ b/include/linux/regulator/lp3972.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * National Semiconductors LP3972 PMIC chip client interface | ||
3 | * | ||
4 | * Based on lp3971.h | ||
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_REGULATOR_LP3972_H | ||
22 | #define __LINUX_REGULATOR_LP3972_H | ||
23 | |||
24 | #include <linux/regulator/machine.h> | ||
25 | |||
26 | #define LP3972_LDO1 0 | ||
27 | #define LP3972_LDO2 1 | ||
28 | #define LP3972_LDO3 2 | ||
29 | #define LP3972_LDO4 3 | ||
30 | #define LP3972_LDO5 4 | ||
31 | |||
32 | #define LP3972_DCDC1 5 | ||
33 | #define LP3972_DCDC2 6 | ||
34 | #define LP3972_DCDC3 7 | ||
35 | |||
36 | #define LP3972_NUM_REGULATORS 8 | ||
37 | |||
38 | struct lp3972_regulator_subdev { | ||
39 | int id; | ||
40 | struct regulator_init_data *initdata; | ||
41 | }; | ||
42 | |||
43 | struct lp3972_platform_data { | ||
44 | int num_regulators; | ||
45 | struct lp3972_regulator_subdev *regulators; | ||
46 | }; | ||
47 | |||
48 | #endif | ||
diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index e2980287245e..761c745b9c24 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h | |||
@@ -189,10 +189,15 @@ int regulator_suspend_prepare(suspend_state_t state); | |||
189 | 189 | ||
190 | #ifdef CONFIG_REGULATOR | 190 | #ifdef CONFIG_REGULATOR |
191 | void regulator_has_full_constraints(void); | 191 | void regulator_has_full_constraints(void); |
192 | void regulator_use_dummy_regulator(void); | ||
192 | #else | 193 | #else |
193 | static inline void regulator_has_full_constraints(void) | 194 | static inline void regulator_has_full_constraints(void) |
194 | { | 195 | { |
195 | } | 196 | } |
197 | |||
198 | static inline void regulator_use_dummy_regulator(void) | ||
199 | { | ||
200 | } | ||
196 | #endif | 201 | #endif |
197 | 202 | ||
198 | #endif | 203 | #endif |
diff --git a/include/linux/regulator/max8952.h b/include/linux/regulator/max8952.h new file mode 100644 index 000000000000..45e42855ad05 --- /dev/null +++ b/include/linux/regulator/max8952.h | |||
@@ -0,0 +1,135 @@ | |||
1 | /* | ||
2 | * max8952.h - Voltage regulation for the Maxim 8952 | ||
3 | * | ||
4 | * Copyright (C) 2010 Samsung Electrnoics | ||
5 | * MyungJoo Ham <myungjoo.ham@samsung.com> | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
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 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #ifndef REGULATOR_MAX8952 | ||
23 | #define REGULATOR_MAX8952 | ||
24 | |||
25 | #include <linux/regulator/machine.h> | ||
26 | |||
27 | enum { | ||
28 | MAX8952_DVS_MODE0, | ||
29 | MAX8952_DVS_MODE1, | ||
30 | MAX8952_DVS_MODE2, | ||
31 | MAX8952_DVS_MODE3, | ||
32 | }; | ||
33 | |||
34 | enum { | ||
35 | MAX8952_DVS_770mV = 0, | ||
36 | MAX8952_DVS_780mV, | ||
37 | MAX8952_DVS_790mV, | ||
38 | MAX8952_DVS_800mV, | ||
39 | MAX8952_DVS_810mV, | ||
40 | MAX8952_DVS_820mV, | ||
41 | MAX8952_DVS_830mV, | ||
42 | MAX8952_DVS_840mV, | ||
43 | MAX8952_DVS_850mV, | ||
44 | MAX8952_DVS_860mV, | ||
45 | MAX8952_DVS_870mV, | ||
46 | MAX8952_DVS_880mV, | ||
47 | MAX8952_DVS_890mV, | ||
48 | MAX8952_DVS_900mV, | ||
49 | MAX8952_DVS_910mV, | ||
50 | MAX8952_DVS_920mV, | ||
51 | MAX8952_DVS_930mV, | ||
52 | MAX8952_DVS_940mV, | ||
53 | MAX8952_DVS_950mV, | ||
54 | MAX8952_DVS_960mV, | ||
55 | MAX8952_DVS_970mV, | ||
56 | MAX8952_DVS_980mV, | ||
57 | MAX8952_DVS_990mV, | ||
58 | MAX8952_DVS_1000mV, | ||
59 | MAX8952_DVS_1010mV, | ||
60 | MAX8952_DVS_1020mV, | ||
61 | MAX8952_DVS_1030mV, | ||
62 | MAX8952_DVS_1040mV, | ||
63 | MAX8952_DVS_1050mV, | ||
64 | MAX8952_DVS_1060mV, | ||
65 | MAX8952_DVS_1070mV, | ||
66 | MAX8952_DVS_1080mV, | ||
67 | MAX8952_DVS_1090mV, | ||
68 | MAX8952_DVS_1100mV, | ||
69 | MAX8952_DVS_1110mV, | ||
70 | MAX8952_DVS_1120mV, | ||
71 | MAX8952_DVS_1130mV, | ||
72 | MAX8952_DVS_1140mV, | ||
73 | MAX8952_DVS_1150mV, | ||
74 | MAX8952_DVS_1160mV, | ||
75 | MAX8952_DVS_1170mV, | ||
76 | MAX8952_DVS_1180mV, | ||
77 | MAX8952_DVS_1190mV, | ||
78 | MAX8952_DVS_1200mV, | ||
79 | MAX8952_DVS_1210mV, | ||
80 | MAX8952_DVS_1220mV, | ||
81 | MAX8952_DVS_1230mV, | ||
82 | MAX8952_DVS_1240mV, | ||
83 | MAX8952_DVS_1250mV, | ||
84 | MAX8952_DVS_1260mV, | ||
85 | MAX8952_DVS_1270mV, | ||
86 | MAX8952_DVS_1280mV, | ||
87 | MAX8952_DVS_1290mV, | ||
88 | MAX8952_DVS_1300mV, | ||
89 | MAX8952_DVS_1310mV, | ||
90 | MAX8952_DVS_1320mV, | ||
91 | MAX8952_DVS_1330mV, | ||
92 | MAX8952_DVS_1340mV, | ||
93 | MAX8952_DVS_1350mV, | ||
94 | MAX8952_DVS_1360mV, | ||
95 | MAX8952_DVS_1370mV, | ||
96 | MAX8952_DVS_1380mV, | ||
97 | MAX8952_DVS_1390mV, | ||
98 | MAX8952_DVS_1400mV, | ||
99 | }; | ||
100 | |||
101 | enum { | ||
102 | MAX8952_SYNC_FREQ_26MHZ, /* Default */ | ||
103 | MAX8952_SYNC_FREQ_13MHZ, | ||
104 | MAX8952_SYNC_FREQ_19_2MHZ, | ||
105 | }; | ||
106 | |||
107 | enum { | ||
108 | MAX8952_RAMP_32mV_us = 0, /* Default */ | ||
109 | MAX8952_RAMP_16mV_us, | ||
110 | MAX8952_RAMP_8mV_us, | ||
111 | MAX8952_RAMP_4mV_us, | ||
112 | MAX8952_RAMP_2mV_us, | ||
113 | MAX8952_RAMP_1mV_us, | ||
114 | MAX8952_RAMP_0_5mV_us, | ||
115 | MAX8952_RAMP_0_25mV_us, | ||
116 | }; | ||
117 | |||
118 | #define MAX8952_NUM_DVS_MODE 4 | ||
119 | |||
120 | struct max8952_platform_data { | ||
121 | int gpio_vid0; | ||
122 | int gpio_vid1; | ||
123 | int gpio_en; | ||
124 | |||
125 | u8 default_mode; | ||
126 | u8 dvs_mode[MAX8952_NUM_DVS_MODE]; /* MAX8952_DVS_MODEx_XXXXmV */ | ||
127 | |||
128 | u8 sync_freq; | ||
129 | u8 ramp_speed; | ||
130 | |||
131 | struct regulator_init_data reg_data; | ||
132 | }; | ||
133 | |||
134 | |||
135 | #endif /* REGULATOR_MAX8952 */ | ||
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 91a4177e60ce..5ca47e59b727 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h | |||
@@ -2072,6 +2072,8 @@ void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode); | |||
2072 | void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs); | 2072 | void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs); |
2073 | int reiserfs_setattr(struct dentry *dentry, struct iattr *attr); | 2073 | int reiserfs_setattr(struct dentry *dentry, struct iattr *attr); |
2074 | 2074 | ||
2075 | int __reiserfs_write_begin(struct page *page, unsigned from, unsigned len); | ||
2076 | |||
2075 | /* namei.c */ | 2077 | /* namei.c */ |
2076 | void set_de_name_and_namelen(struct reiserfs_dir_entry *de); | 2078 | void set_de_name_and_namelen(struct reiserfs_dir_entry *de); |
2077 | int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, | 2079 | int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, |
diff --git a/include/linux/resource.h b/include/linux/resource.h index 88d36f9145ba..d01c96c1966e 100644 --- a/include/linux/resource.h +++ b/include/linux/resource.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _LINUX_RESOURCE_H | 2 | #define _LINUX_RESOURCE_H |
3 | 3 | ||
4 | #include <linux/time.h> | 4 | #include <linux/time.h> |
5 | #include <linux/types.h> | ||
5 | 6 | ||
6 | /* | 7 | /* |
7 | * Resource control/accounting header file for linux | 8 | * Resource control/accounting header file for linux |
diff --git a/include/linux/resume-trace.h b/include/linux/resume-trace.h index bc8c3881c729..f31db2368782 100644 --- a/include/linux/resume-trace.h +++ b/include/linux/resume-trace.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #ifdef CONFIG_PM_TRACE | 4 | #ifdef CONFIG_PM_TRACE |
5 | #include <asm/resume-trace.h> | 5 | #include <asm/resume-trace.h> |
6 | #include <linux/types.h> | ||
6 | 7 | ||
7 | extern int pm_trace_enabled; | 8 | extern int pm_trace_enabled; |
8 | 9 | ||
@@ -14,6 +15,7 @@ static inline int pm_trace_is_enabled(void) | |||
14 | struct device; | 15 | struct device; |
15 | extern void set_trace_device(struct device *); | 16 | extern void set_trace_device(struct device *); |
16 | extern void generate_resume_trace(const void *tracedata, unsigned int user); | 17 | extern void generate_resume_trace(const void *tracedata, unsigned int user); |
18 | extern int show_trace_dev_match(char *buf, size_t size); | ||
17 | 19 | ||
18 | #define TRACE_DEVICE(dev) do { \ | 20 | #define TRACE_DEVICE(dev) do { \ |
19 | if (pm_trace_enabled) \ | 21 | if (pm_trace_enabled) \ |
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 25b4f686d918..8d3a2486544d 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
@@ -62,18 +62,6 @@ enum ring_buffer_type { | |||
62 | unsigned ring_buffer_event_length(struct ring_buffer_event *event); | 62 | unsigned ring_buffer_event_length(struct ring_buffer_event *event); |
63 | void *ring_buffer_event_data(struct ring_buffer_event *event); | 63 | void *ring_buffer_event_data(struct ring_buffer_event *event); |
64 | 64 | ||
65 | /** | ||
66 | * ring_buffer_event_time_delta - return the delta timestamp of the event | ||
67 | * @event: the event to get the delta timestamp of | ||
68 | * | ||
69 | * The delta timestamp is the 27 bit timestamp since the last event. | ||
70 | */ | ||
71 | static inline unsigned | ||
72 | ring_buffer_event_time_delta(struct ring_buffer_event *event) | ||
73 | { | ||
74 | return event->time_delta; | ||
75 | } | ||
76 | |||
77 | /* | 65 | /* |
78 | * ring_buffer_discard_commit will remove an event that has not | 66 | * ring_buffer_discard_commit will remove an event that has not |
79 | * ben committed yet. If this is used, then ring_buffer_unlock_commit | 67 | * ben committed yet. If this is used, then ring_buffer_unlock_commit |
diff --git a/include/linux/rio.h b/include/linux/rio.h index bd6eb0ed34a7..0bed941f9b13 100644 --- a/include/linux/rio.h +++ b/include/linux/rio.h | |||
@@ -67,6 +67,7 @@ | |||
67 | #define RIO_PW_MSG_SIZE 64 | 67 | #define RIO_PW_MSG_SIZE 64 |
68 | 68 | ||
69 | extern struct bus_type rio_bus_type; | 69 | extern struct bus_type rio_bus_type; |
70 | extern struct device rio_bus; | ||
70 | extern struct list_head rio_devices; /* list of all devices */ | 71 | extern struct list_head rio_devices; /* list of all devices */ |
71 | 72 | ||
72 | struct rio_mport; | 73 | struct rio_mport; |
@@ -98,6 +99,7 @@ union rio_pw_msg; | |||
98 | * @riores: RIO resources this device owns | 99 | * @riores: RIO resources this device owns |
99 | * @pwcback: port-write callback function for this device | 100 | * @pwcback: port-write callback function for this device |
100 | * @destid: Network destination ID | 101 | * @destid: Network destination ID |
102 | * @prev: Previous RIO device connected to the current one | ||
101 | */ | 103 | */ |
102 | struct rio_dev { | 104 | struct rio_dev { |
103 | struct list_head global_list; /* node in list of all RIO devices */ | 105 | struct list_head global_list; /* node in list of all RIO devices */ |
@@ -111,7 +113,7 @@ struct rio_dev { | |||
111 | u16 asm_rev; | 113 | u16 asm_rev; |
112 | u16 efptr; | 114 | u16 efptr; |
113 | u32 pef; | 115 | u32 pef; |
114 | u32 swpinfo; /* Only used for switches */ | 116 | u32 swpinfo; |
115 | u32 src_ops; | 117 | u32 src_ops; |
116 | u32 dst_ops; | 118 | u32 dst_ops; |
117 | u32 comp_tag; | 119 | u32 comp_tag; |
@@ -124,6 +126,7 @@ struct rio_dev { | |||
124 | struct resource riores[RIO_MAX_DEV_RESOURCES]; | 126 | struct resource riores[RIO_MAX_DEV_RESOURCES]; |
125 | int (*pwcback) (struct rio_dev *rdev, union rio_pw_msg *msg, int step); | 127 | int (*pwcback) (struct rio_dev *rdev, union rio_pw_msg *msg, int step); |
126 | u16 destid; | 128 | u16 destid; |
129 | struct rio_dev *prev; | ||
127 | }; | 130 | }; |
128 | 131 | ||
129 | #define rio_dev_g(n) list_entry(n, struct rio_dev, global_list) | 132 | #define rio_dev_g(n) list_entry(n, struct rio_dev, global_list) |
@@ -174,6 +177,7 @@ enum rio_phy_type { | |||
174 | * @index: Port index, unique among all port interfaces of the same type | 177 | * @index: Port index, unique among all port interfaces of the same type |
175 | * @sys_size: RapidIO common transport system size | 178 | * @sys_size: RapidIO common transport system size |
176 | * @phy_type: RapidIO phy type | 179 | * @phy_type: RapidIO phy type |
180 | * @phys_efptr: RIO port extended features pointer | ||
177 | * @name: Port name string | 181 | * @name: Port name string |
178 | * @priv: Master port private data | 182 | * @priv: Master port private data |
179 | */ | 183 | */ |
@@ -195,6 +199,7 @@ struct rio_mport { | |||
195 | * 1 - Large size, 65536 devices. | 199 | * 1 - Large size, 65536 devices. |
196 | */ | 200 | */ |
197 | enum rio_phy_type phy_type; /* RapidIO phy type */ | 201 | enum rio_phy_type phy_type; /* RapidIO phy type */ |
202 | u32 phys_efptr; | ||
198 | unsigned char name[40]; | 203 | unsigned char name[40]; |
199 | void *priv; /* Master port private data */ | 204 | void *priv; /* Master port private data */ |
200 | }; | 205 | }; |
@@ -215,9 +220,14 @@ struct rio_net { | |||
215 | unsigned char id; /* RIO network ID */ | 220 | unsigned char id; /* RIO network ID */ |
216 | }; | 221 | }; |
217 | 222 | ||
223 | /* Definitions used by switch sysfs initialization callback */ | ||
224 | #define RIO_SW_SYSFS_CREATE 1 /* Create switch attributes */ | ||
225 | #define RIO_SW_SYSFS_REMOVE 0 /* Remove switch attributes */ | ||
226 | |||
218 | /** | 227 | /** |
219 | * struct rio_switch - RIO switch info | 228 | * struct rio_switch - RIO switch info |
220 | * @node: Node in global list of switches | 229 | * @node: Node in global list of switches |
230 | * @rdev: Associated RIO device structure | ||
221 | * @switchid: Switch ID that is unique across a network | 231 | * @switchid: Switch ID that is unique across a network |
222 | * @hopcount: Hopcount to this switch | 232 | * @hopcount: Hopcount to this switch |
223 | * @destid: Associated destid in the path | 233 | * @destid: Associated destid in the path |
@@ -230,9 +240,12 @@ struct rio_net { | |||
230 | * @get_domain: Callback for switch-specific domain get function | 240 | * @get_domain: Callback for switch-specific domain get function |
231 | * @em_init: Callback for switch-specific error management initialization function | 241 | * @em_init: Callback for switch-specific error management initialization function |
232 | * @em_handle: Callback for switch-specific error management handler function | 242 | * @em_handle: Callback for switch-specific error management handler function |
243 | * @sw_sysfs: Callback that initializes switch-specific sysfs attributes | ||
244 | * @nextdev: Array of per-port pointers to the next attached device | ||
233 | */ | 245 | */ |
234 | struct rio_switch { | 246 | struct rio_switch { |
235 | struct list_head node; | 247 | struct list_head node; |
248 | struct rio_dev *rdev; | ||
236 | u16 switchid; | 249 | u16 switchid; |
237 | u16 hopcount; | 250 | u16 hopcount; |
238 | u16 destid; | 251 | u16 destid; |
@@ -250,6 +263,8 @@ struct rio_switch { | |||
250 | u8 *sw_domain); | 263 | u8 *sw_domain); |
251 | int (*em_init) (struct rio_dev *dev); | 264 | int (*em_init) (struct rio_dev *dev); |
252 | int (*em_handle) (struct rio_dev *dev, u8 swport); | 265 | int (*em_handle) (struct rio_dev *dev, u8 swport); |
266 | int (*sw_sysfs) (struct rio_dev *dev, int create); | ||
267 | struct rio_dev *nextdev[0]; | ||
253 | }; | 268 | }; |
254 | 269 | ||
255 | /* Low-level architecture-dependent routines */ | 270 | /* Low-level architecture-dependent routines */ |
diff --git a/include/linux/rio_ids.h b/include/linux/rio_ids.h index db50e1c288b7..ee7b6ada188f 100644 --- a/include/linux/rio_ids.h +++ b/include/linux/rio_ids.h | |||
@@ -34,5 +34,7 @@ | |||
34 | #define RIO_DID_IDTCPS16 0x035b | 34 | #define RIO_DID_IDTCPS16 0x035b |
35 | #define RIO_DID_IDTCPS6Q 0x035f | 35 | #define RIO_DID_IDTCPS6Q 0x035f |
36 | #define RIO_DID_IDTCPS10Q 0x035e | 36 | #define RIO_DID_IDTCPS10Q 0x035e |
37 | #define RIO_DID_IDTCPS1848 0x0374 | ||
38 | #define RIO_DID_IDTCPS1616 0x0379 | ||
37 | 39 | ||
38 | #endif /* LINUX_RIO_IDS_H */ | 40 | #endif /* LINUX_RIO_IDS_H */ |
diff --git a/include/linux/rio_regs.h b/include/linux/rio_regs.h index aedee0489fb4..d63dcbaea169 100644 --- a/include/linux/rio_regs.h +++ b/include/linux/rio_regs.h | |||
@@ -33,6 +33,7 @@ | |||
33 | #define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */ | 33 | #define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */ |
34 | #define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */ | 34 | #define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */ |
35 | #define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */ | 35 | #define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */ |
36 | #define RIO_PEF_MULTIPORT 0x08000000 /* [VI, 2.1] Multiport */ | ||
36 | #define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */ | 37 | #define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */ |
37 | #define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */ | 38 | #define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */ |
38 | #define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */ | 39 | #define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */ |
@@ -51,6 +52,7 @@ | |||
51 | #define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */ | 52 | #define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */ |
52 | #define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */ | 53 | #define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */ |
53 | #define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8) | 54 | #define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8) |
55 | #define RIO_GET_PORT_NUM(x) (x & RIO_SWP_INFO_PORT_NUM_MASK) | ||
54 | 56 | ||
55 | #define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */ | 57 | #define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */ |
56 | #define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */ | 58 | #define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */ |
@@ -159,6 +161,7 @@ | |||
159 | #define RIO_COMPONENT_TAG_CSR 0x6c /* [III] Component Tag CSR */ | 161 | #define RIO_COMPONENT_TAG_CSR 0x6c /* [III] Component Tag CSR */ |
160 | 162 | ||
161 | #define RIO_STD_RTE_CONF_DESTID_SEL_CSR 0x70 | 163 | #define RIO_STD_RTE_CONF_DESTID_SEL_CSR 0x70 |
164 | #define RIO_STD_RTE_CONF_EXTCFGEN 0x80000000 | ||
162 | #define RIO_STD_RTE_CONF_PORT_SEL_CSR 0x74 | 165 | #define RIO_STD_RTE_CONF_PORT_SEL_CSR 0x74 |
163 | #define RIO_STD_RTE_DEFAULT_PORT 0x78 | 166 | #define RIO_STD_RTE_DEFAULT_PORT 0x78 |
164 | 167 | ||
@@ -222,15 +225,17 @@ | |||
222 | #define RIO_PORT_GEN_MASTER 0x40000000 | 225 | #define RIO_PORT_GEN_MASTER 0x40000000 |
223 | #define RIO_PORT_GEN_DISCOVERED 0x20000000 | 226 | #define RIO_PORT_GEN_DISCOVERED 0x20000000 |
224 | #define RIO_PORT_N_MNT_REQ_CSR(x) (0x0040 + x*0x20) /* 0x0002 */ | 227 | #define RIO_PORT_N_MNT_REQ_CSR(x) (0x0040 + x*0x20) /* 0x0002 */ |
228 | #define RIO_MNT_REQ_CMD_RD 0x03 /* Reset-device command */ | ||
229 | #define RIO_MNT_REQ_CMD_IS 0x04 /* Input-status command */ | ||
225 | #define RIO_PORT_N_MNT_RSP_CSR(x) (0x0044 + x*0x20) /* 0x0002 */ | 230 | #define RIO_PORT_N_MNT_RSP_CSR(x) (0x0044 + x*0x20) /* 0x0002 */ |
226 | #define RIO_PORT_N_MNT_RSP_RVAL 0x80000000 /* Response Valid */ | 231 | #define RIO_PORT_N_MNT_RSP_RVAL 0x80000000 /* Response Valid */ |
227 | #define RIO_PORT_N_MNT_RSP_ASTAT 0x000003e0 /* ackID Status */ | 232 | #define RIO_PORT_N_MNT_RSP_ASTAT 0x000007e0 /* ackID Status */ |
228 | #define RIO_PORT_N_MNT_RSP_LSTAT 0x0000001f /* Link Status */ | 233 | #define RIO_PORT_N_MNT_RSP_LSTAT 0x0000001f /* Link Status */ |
229 | #define RIO_PORT_N_ACK_STS_CSR(x) (0x0048 + x*0x20) /* 0x0002 */ | 234 | #define RIO_PORT_N_ACK_STS_CSR(x) (0x0048 + x*0x20) /* 0x0002 */ |
230 | #define RIO_PORT_N_ACK_CLEAR 0x80000000 | 235 | #define RIO_PORT_N_ACK_CLEAR 0x80000000 |
231 | #define RIO_PORT_N_ACK_INBOUND 0x1f000000 | 236 | #define RIO_PORT_N_ACK_INBOUND 0x3f000000 |
232 | #define RIO_PORT_N_ACK_OUTSTAND 0x00001f00 | 237 | #define RIO_PORT_N_ACK_OUTSTAND 0x00003f00 |
233 | #define RIO_PORT_N_ACK_OUTBOUND 0x0000001f | 238 | #define RIO_PORT_N_ACK_OUTBOUND 0x0000003f |
234 | #define RIO_PORT_N_ERR_STS_CSR(x) (0x0058 + x*0x20) | 239 | #define RIO_PORT_N_ERR_STS_CSR(x) (0x0058 + x*0x20) |
235 | #define RIO_PORT_N_ERR_STS_PW_OUT_ES 0x00010000 /* Output Error-stopped */ | 240 | #define RIO_PORT_N_ERR_STS_PW_OUT_ES 0x00010000 /* Output Error-stopped */ |
236 | #define RIO_PORT_N_ERR_STS_PW_INP_ES 0x00000100 /* Input Error-stopped */ | 241 | #define RIO_PORT_N_ERR_STS_PW_INP_ES 0x00000100 /* Input Error-stopped */ |
@@ -238,7 +243,6 @@ | |||
238 | #define RIO_PORT_N_ERR_STS_PORT_ERR 0x00000004 | 243 | #define RIO_PORT_N_ERR_STS_PORT_ERR 0x00000004 |
239 | #define RIO_PORT_N_ERR_STS_PORT_OK 0x00000002 | 244 | #define RIO_PORT_N_ERR_STS_PORT_OK 0x00000002 |
240 | #define RIO_PORT_N_ERR_STS_PORT_UNINIT 0x00000001 | 245 | #define RIO_PORT_N_ERR_STS_PORT_UNINIT 0x00000001 |
241 | #define RIO_PORT_N_ERR_STS_CLR_MASK 0x07120204 | ||
242 | #define RIO_PORT_N_CTL_CSR(x) (0x005c + x*0x20) | 246 | #define RIO_PORT_N_CTL_CSR(x) (0x005c + x*0x20) |
243 | #define RIO_PORT_N_CTL_PWIDTH 0xc0000000 | 247 | #define RIO_PORT_N_CTL_PWIDTH 0xc0000000 |
244 | #define RIO_PORT_N_CTL_PWIDTH_1 0x00000000 | 248 | #define RIO_PORT_N_CTL_PWIDTH_1 0x00000000 |
@@ -261,6 +265,10 @@ | |||
261 | #define RIO_EM_EFB_HEADER 0x000 /* Error Management Extensions Block Header */ | 265 | #define RIO_EM_EFB_HEADER 0x000 /* Error Management Extensions Block Header */ |
262 | #define RIO_EM_LTL_ERR_DETECT 0x008 /* Logical/Transport Layer Error Detect CSR */ | 266 | #define RIO_EM_LTL_ERR_DETECT 0x008 /* Logical/Transport Layer Error Detect CSR */ |
263 | #define RIO_EM_LTL_ERR_EN 0x00c /* Logical/Transport Layer Error Enable CSR */ | 267 | #define RIO_EM_LTL_ERR_EN 0x00c /* Logical/Transport Layer Error Enable CSR */ |
268 | #define REM_LTL_ERR_ILLTRAN 0x08000000 /* Illegal Transaction decode */ | ||
269 | #define REM_LTL_ERR_UNSOLR 0x00800000 /* Unsolicited Response */ | ||
270 | #define REM_LTL_ERR_UNSUPTR 0x00400000 /* Unsupported Transaction */ | ||
271 | #define REM_LTL_ERR_IMPSPEC 0x000000ff /* Implementation Specific */ | ||
264 | #define RIO_EM_LTL_HIADDR_CAP 0x010 /* Logical/Transport Layer High Address Capture CSR */ | 272 | #define RIO_EM_LTL_HIADDR_CAP 0x010 /* Logical/Transport Layer High Address Capture CSR */ |
265 | #define RIO_EM_LTL_ADDR_CAP 0x014 /* Logical/Transport Layer Address Capture CSR */ | 273 | #define RIO_EM_LTL_ADDR_CAP 0x014 /* Logical/Transport Layer Address Capture CSR */ |
266 | #define RIO_EM_LTL_DEVID_CAP 0x018 /* Logical/Transport Layer Device ID Capture CSR */ | 274 | #define RIO_EM_LTL_DEVID_CAP 0x018 /* Logical/Transport Layer Device ID Capture CSR */ |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index 31b2fd75dcba..bb83c0da2071 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
@@ -25,8 +25,8 @@ | |||
25 | * pointing to this anon_vma once its vma list is empty. | 25 | * pointing to this anon_vma once its vma list is empty. |
26 | */ | 26 | */ |
27 | struct anon_vma { | 27 | struct anon_vma { |
28 | spinlock_t lock; /* Serialize access to vma list */ | ||
29 | 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 */ | ||
30 | #if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) | 30 | #if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) |
31 | 31 | ||
32 | /* | 32 | /* |
@@ -205,9 +205,20 @@ int try_to_unmap_one(struct page *, struct vm_area_struct *, | |||
205 | /* | 205 | /* |
206 | * Called from mm/filemap_xip.c to unmap empty zero page | 206 | * Called from mm/filemap_xip.c to unmap empty zero page |
207 | */ | 207 | */ |
208 | pte_t *page_check_address(struct page *, struct mm_struct *, | 208 | pte_t *__page_check_address(struct page *, struct mm_struct *, |
209 | unsigned long, spinlock_t **, int); | 209 | unsigned long, spinlock_t **, int); |
210 | 210 | ||
211 | static inline pte_t *page_check_address(struct page *page, struct mm_struct *mm, | ||
212 | unsigned long address, | ||
213 | spinlock_t **ptlp, int sync) | ||
214 | { | ||
215 | pte_t *ptep; | ||
216 | |||
217 | __cond_lock(*ptlp, ptep = __page_check_address(page, mm, address, | ||
218 | ptlp, sync)); | ||
219 | return ptep; | ||
220 | } | ||
221 | |||
211 | /* | 222 | /* |
212 | * Used by swapoff to help locate where page is expected in vma. | 223 | * Used by swapoff to help locate where page is expected in vma. |
213 | */ | 224 | */ |
@@ -230,7 +241,20 @@ int try_to_munlock(struct page *); | |||
230 | /* | 241 | /* |
231 | * Called by memory-failure.c to kill processes. | 242 | * Called by memory-failure.c to kill processes. |
232 | */ | 243 | */ |
233 | struct anon_vma *page_lock_anon_vma(struct page *page); | 244 | struct anon_vma *__page_lock_anon_vma(struct page *page); |
245 | |||
246 | static inline struct anon_vma *page_lock_anon_vma(struct page *page) | ||
247 | { | ||
248 | struct anon_vma *anon_vma; | ||
249 | |||
250 | __cond_lock(RCU, anon_vma = __page_lock_anon_vma(page)); | ||
251 | |||
252 | /* (void) is needed to make gcc happy */ | ||
253 | (void) __cond_lock(&anon_vma->root->lock, anon_vma); | ||
254 | |||
255 | return anon_vma; | ||
256 | } | ||
257 | |||
234 | void page_unlock_anon_vma(struct anon_vma *anon_vma); | 258 | void page_unlock_anon_vma(struct anon_vma *anon_vma); |
235 | int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma); | 259 | int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma); |
236 | 260 | ||
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 58d44491880f..d42f274418b8 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/if_link.h> | 6 | #include <linux/if_link.h> |
7 | #include <linux/if_addr.h> | 7 | #include <linux/if_addr.h> |
8 | #include <linux/neighbour.h> | 8 | #include <linux/neighbour.h> |
9 | #include <linux/netdevice.h> | ||
9 | 10 | ||
10 | /* rtnetlink families. Values up to 127 are reserved for real address | 11 | /* rtnetlink families. Values up to 127 are reserved for real address |
11 | * families, values above 128 may be used arbitrarily. | 12 | * families, values above 128 may be used arbitrarily. |
@@ -749,6 +750,35 @@ extern int rtnl_is_locked(void); | |||
749 | extern int lockdep_rtnl_is_held(void); | 750 | extern int lockdep_rtnl_is_held(void); |
750 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ | 751 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ |
751 | 752 | ||
753 | /** | ||
754 | * rcu_dereference_rtnl - rcu_dereference with debug checking | ||
755 | * @p: The pointer to read, prior to dereferencing | ||
756 | * | ||
757 | * Do an rcu_dereference(p), but check caller either holds rcu_read_lock() | ||
758 | * or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference() | ||
759 | */ | ||
760 | #define rcu_dereference_rtnl(p) \ | ||
761 | rcu_dereference_check(p, rcu_read_lock_held() || \ | ||
762 | lockdep_rtnl_is_held()) | ||
763 | |||
764 | /** | ||
765 | * rtnl_dereference - fetch RCU pointer when updates are prevented by RTNL | ||
766 | * @p: The pointer to read, prior to dereferencing | ||
767 | * | ||
768 | * Return the value of the specified RCU-protected pointer, but omit | ||
769 | * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because | ||
770 | * caller holds RTNL. | ||
771 | */ | ||
772 | #define rtnl_dereference(p) \ | ||
773 | rcu_dereference_protected(p, lockdep_rtnl_is_held()) | ||
774 | |||
775 | static inline struct netdev_queue *dev_ingress_queue(struct net_device *dev) | ||
776 | { | ||
777 | return rtnl_dereference(dev->ingress_queue); | ||
778 | } | ||
779 | |||
780 | extern struct netdev_queue *dev_ingress_queue_create(struct net_device *dev); | ||
781 | |||
752 | extern void rtnetlink_init(void); | 782 | extern void rtnetlink_init(void); |
753 | extern void __rtnl_unlock(void); | 783 | extern void __rtnl_unlock(void); |
754 | 784 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index 1e2a6db2d7dd..d0036e52a24a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -336,6 +336,9 @@ extern unsigned long sysctl_hung_task_warnings; | |||
336 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, | 336 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, |
337 | void __user *buffer, | 337 | void __user *buffer, |
338 | size_t *lenp, loff_t *ppos); | 338 | size_t *lenp, loff_t *ppos); |
339 | #else | ||
340 | /* Avoid need for ifdefs elsewhere in the code */ | ||
341 | enum { sysctl_hung_task_timeout_secs = 0 }; | ||
339 | #endif | 342 | #endif |
340 | 343 | ||
341 | /* Attach to any functions which should be ignored in wchan output. */ | 344 | /* Attach to any functions which should be ignored in wchan output. */ |
@@ -623,6 +626,10 @@ struct signal_struct { | |||
623 | 626 | ||
624 | int oom_adj; /* OOM kill score adjustment (bit shift) */ | 627 | int oom_adj; /* OOM kill score adjustment (bit shift) */ |
625 | int oom_score_adj; /* OOM kill score adjustment */ | 628 | int oom_score_adj; /* OOM kill score adjustment */ |
629 | |||
630 | struct mutex cred_guard_mutex; /* guard against foreign influences on | ||
631 | * credential calculations | ||
632 | * (notably. ptrace) */ | ||
626 | }; | 633 | }; |
627 | 634 | ||
628 | /* Context switch must be unlocked if interrupts are to be enabled */ | 635 | /* Context switch must be unlocked if interrupts are to be enabled */ |
@@ -665,6 +672,9 @@ struct user_struct { | |||
665 | atomic_t inotify_watches; /* How many inotify watches does this user have? */ | 672 | atomic_t inotify_watches; /* How many inotify watches does this user have? */ |
666 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ | 673 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ |
667 | #endif | 674 | #endif |
675 | #ifdef CONFIG_FANOTIFY | ||
676 | atomic_t fanotify_listeners; | ||
677 | #endif | ||
668 | #ifdef CONFIG_EPOLL | 678 | #ifdef CONFIG_EPOLL |
669 | atomic_t epoll_watches; /* The number of file descriptors currently watched */ | 679 | atomic_t epoll_watches; /* The number of file descriptors currently watched */ |
670 | #endif | 680 | #endif |
@@ -875,6 +885,7 @@ enum sched_domain_level { | |||
875 | SD_LV_NONE = 0, | 885 | SD_LV_NONE = 0, |
876 | SD_LV_SIBLING, | 886 | SD_LV_SIBLING, |
877 | SD_LV_MC, | 887 | SD_LV_MC, |
888 | SD_LV_BOOK, | ||
878 | SD_LV_CPU, | 889 | SD_LV_CPU, |
879 | SD_LV_NODE, | 890 | SD_LV_NODE, |
880 | SD_LV_ALLNODES, | 891 | SD_LV_ALLNODES, |
@@ -1072,7 +1083,7 @@ struct sched_class { | |||
1072 | struct task_struct *task); | 1083 | struct task_struct *task); |
1073 | 1084 | ||
1074 | #ifdef CONFIG_FAIR_GROUP_SCHED | 1085 | #ifdef CONFIG_FAIR_GROUP_SCHED |
1075 | void (*moved_group) (struct task_struct *p, int on_rq); | 1086 | void (*task_move_group) (struct task_struct *p, int on_rq); |
1076 | #endif | 1087 | #endif |
1077 | }; | 1088 | }; |
1078 | 1089 | ||
@@ -1160,6 +1171,13 @@ struct sched_rt_entity { | |||
1160 | 1171 | ||
1161 | struct rcu_node; | 1172 | struct rcu_node; |
1162 | 1173 | ||
1174 | enum perf_event_task_context { | ||
1175 | perf_invalid_context = -1, | ||
1176 | perf_hw_context = 0, | ||
1177 | perf_sw_context, | ||
1178 | perf_nr_task_contexts, | ||
1179 | }; | ||
1180 | |||
1163 | struct task_struct { | 1181 | struct task_struct { |
1164 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ | 1182 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ |
1165 | void *stack; | 1183 | void *stack; |
@@ -1202,11 +1220,13 @@ struct task_struct { | |||
1202 | unsigned int policy; | 1220 | unsigned int policy; |
1203 | cpumask_t cpus_allowed; | 1221 | cpumask_t cpus_allowed; |
1204 | 1222 | ||
1205 | #ifdef CONFIG_TREE_PREEMPT_RCU | 1223 | #ifdef CONFIG_PREEMPT_RCU |
1206 | int rcu_read_lock_nesting; | 1224 | int rcu_read_lock_nesting; |
1207 | char rcu_read_unlock_special; | 1225 | char rcu_read_unlock_special; |
1208 | struct rcu_node *rcu_blocked_node; | ||
1209 | struct list_head rcu_node_entry; | 1226 | struct list_head rcu_node_entry; |
1227 | #endif /* #ifdef CONFIG_PREEMPT_RCU */ | ||
1228 | #ifdef CONFIG_TREE_PREEMPT_RCU | ||
1229 | struct rcu_node *rcu_blocked_node; | ||
1210 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 1230 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
1211 | 1231 | ||
1212 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) | 1232 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) |
@@ -1288,13 +1308,10 @@ struct task_struct { | |||
1288 | struct list_head cpu_timers[3]; | 1308 | struct list_head cpu_timers[3]; |
1289 | 1309 | ||
1290 | /* process credentials */ | 1310 | /* process credentials */ |
1291 | const struct cred *real_cred; /* objective and real subjective task | 1311 | const struct cred __rcu *real_cred; /* objective and real subjective task |
1292 | * credentials (COW) */ | 1312 | * credentials (COW) */ |
1293 | const struct cred *cred; /* effective (overridable) subjective task | 1313 | const struct cred __rcu *cred; /* effective (overridable) subjective task |
1294 | * credentials (COW) */ | 1314 | * credentials (COW) */ |
1295 | struct mutex cred_guard_mutex; /* guard against foreign influences on | ||
1296 | * credential calculations | ||
1297 | * (notably. ptrace) */ | ||
1298 | struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */ | 1315 | struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */ |
1299 | 1316 | ||
1300 | char comm[TASK_COMM_LEN]; /* executable name excluding path | 1317 | char comm[TASK_COMM_LEN]; /* executable name excluding path |
@@ -1418,7 +1435,7 @@ struct task_struct { | |||
1418 | #endif | 1435 | #endif |
1419 | #ifdef CONFIG_CGROUPS | 1436 | #ifdef CONFIG_CGROUPS |
1420 | /* Control Group info protected by css_set_lock */ | 1437 | /* Control Group info protected by css_set_lock */ |
1421 | struct css_set *cgroups; | 1438 | struct css_set __rcu *cgroups; |
1422 | /* cg_list protected by css_set_lock and tsk->alloc_lock */ | 1439 | /* cg_list protected by css_set_lock and tsk->alloc_lock */ |
1423 | struct list_head cg_list; | 1440 | struct list_head cg_list; |
1424 | #endif | 1441 | #endif |
@@ -1431,7 +1448,7 @@ struct task_struct { | |||
1431 | struct futex_pi_state *pi_state_cache; | 1448 | struct futex_pi_state *pi_state_cache; |
1432 | #endif | 1449 | #endif |
1433 | #ifdef CONFIG_PERF_EVENTS | 1450 | #ifdef CONFIG_PERF_EVENTS |
1434 | struct perf_event_context *perf_event_ctxp; | 1451 | struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts]; |
1435 | struct mutex perf_event_mutex; | 1452 | struct mutex perf_event_mutex; |
1436 | struct list_head perf_event_list; | 1453 | struct list_head perf_event_list; |
1437 | #endif | 1454 | #endif |
@@ -1681,8 +1698,7 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
1681 | /* | 1698 | /* |
1682 | * Per process flags | 1699 | * Per process flags |
1683 | */ | 1700 | */ |
1684 | #define PF_ALIGNWARN 0x00000001 /* Print alignment warning msgs */ | 1701 | #define PF_KSOFTIRQD 0x00000001 /* I am ksoftirqd */ |
1685 | /* Not implemented yet, only for 486*/ | ||
1686 | #define PF_STARTING 0x00000002 /* being created */ | 1702 | #define PF_STARTING 0x00000002 /* being created */ |
1687 | #define PF_EXITING 0x00000004 /* getting shut down */ | 1703 | #define PF_EXITING 0x00000004 /* getting shut down */ |
1688 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ | 1704 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ |
@@ -1694,7 +1710,6 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
1694 | #define PF_DUMPCORE 0x00000200 /* dumped core */ | 1710 | #define PF_DUMPCORE 0x00000200 /* dumped core */ |
1695 | #define PF_SIGNALED 0x00000400 /* killed by a signal */ | 1711 | #define PF_SIGNALED 0x00000400 /* killed by a signal */ |
1696 | #define PF_MEMALLOC 0x00000800 /* Allocating memory */ | 1712 | #define PF_MEMALLOC 0x00000800 /* Allocating memory */ |
1697 | #define PF_FLUSHER 0x00001000 /* responsible for disk writeback */ | ||
1698 | #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ | 1713 | #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ |
1699 | #define PF_FREEZING 0x00004000 /* freeze in progress. do not account to load */ | 1714 | #define PF_FREEZING 0x00004000 /* freeze in progress. do not account to load */ |
1700 | #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ | 1715 | #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ |
@@ -1740,7 +1755,7 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
1740 | #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) | 1755 | #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) |
1741 | #define used_math() tsk_used_math(current) | 1756 | #define used_math() tsk_used_math(current) |
1742 | 1757 | ||
1743 | #ifdef CONFIG_TREE_PREEMPT_RCU | 1758 | #ifdef CONFIG_PREEMPT_RCU |
1744 | 1759 | ||
1745 | #define RCU_READ_UNLOCK_BLOCKED (1 << 0) /* blocked while in RCU read-side. */ | 1760 | #define RCU_READ_UNLOCK_BLOCKED (1 << 0) /* blocked while in RCU read-side. */ |
1746 | #define RCU_READ_UNLOCK_NEED_QS (1 << 1) /* RCU core needs CPU response. */ | 1761 | #define RCU_READ_UNLOCK_NEED_QS (1 << 1) /* RCU core needs CPU response. */ |
@@ -1749,7 +1764,9 @@ static inline void rcu_copy_process(struct task_struct *p) | |||
1749 | { | 1764 | { |
1750 | p->rcu_read_lock_nesting = 0; | 1765 | p->rcu_read_lock_nesting = 0; |
1751 | p->rcu_read_unlock_special = 0; | 1766 | p->rcu_read_unlock_special = 0; |
1767 | #ifdef CONFIG_TREE_PREEMPT_RCU | ||
1752 | p->rcu_blocked_node = NULL; | 1768 | p->rcu_blocked_node = NULL; |
1769 | #endif | ||
1753 | INIT_LIST_HEAD(&p->rcu_node_entry); | 1770 | INIT_LIST_HEAD(&p->rcu_node_entry); |
1754 | } | 1771 | } |
1755 | 1772 | ||
@@ -1826,6 +1843,19 @@ extern void sched_clock_idle_sleep_event(void); | |||
1826 | extern void sched_clock_idle_wakeup_event(u64 delta_ns); | 1843 | extern void sched_clock_idle_wakeup_event(u64 delta_ns); |
1827 | #endif | 1844 | #endif |
1828 | 1845 | ||
1846 | #ifdef CONFIG_IRQ_TIME_ACCOUNTING | ||
1847 | /* | ||
1848 | * An i/f to runtime opt-in for irq time accounting based off of sched_clock. | ||
1849 | * The reason for this explicit opt-in is not to have perf penalty with | ||
1850 | * slow sched_clocks. | ||
1851 | */ | ||
1852 | extern void enable_sched_clock_irqtime(void); | ||
1853 | extern void disable_sched_clock_irqtime(void); | ||
1854 | #else | ||
1855 | static inline void enable_sched_clock_irqtime(void) {} | ||
1856 | static inline void disable_sched_clock_irqtime(void) {} | ||
1857 | #endif | ||
1858 | |||
1829 | extern unsigned long long | 1859 | extern unsigned long long |
1830 | task_sched_runtime(struct task_struct *task); | 1860 | task_sched_runtime(struct task_struct *task); |
1831 | extern unsigned long long thread_group_sched_runtime(struct task_struct *task); | 1861 | extern unsigned long long thread_group_sched_runtime(struct task_struct *task); |
@@ -2210,9 +2240,16 @@ static inline void task_unlock(struct task_struct *p) | |||
2210 | spin_unlock(&p->alloc_lock); | 2240 | spin_unlock(&p->alloc_lock); |
2211 | } | 2241 | } |
2212 | 2242 | ||
2213 | extern struct sighand_struct *lock_task_sighand(struct task_struct *tsk, | 2243 | extern struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, |
2214 | unsigned long *flags); | 2244 | unsigned long *flags); |
2215 | 2245 | ||
2246 | #define lock_task_sighand(tsk, flags) \ | ||
2247 | ({ struct sighand_struct *__ss; \ | ||
2248 | __cond_lock(&(tsk)->sighand->siglock, \ | ||
2249 | (__ss = __lock_task_sighand(tsk, flags))); \ | ||
2250 | __ss; \ | ||
2251 | }) \ | ||
2252 | |||
2216 | static inline void unlock_task_sighand(struct task_struct *tsk, | 2253 | static inline void unlock_task_sighand(struct task_struct *tsk, |
2217 | unsigned long *flags) | 2254 | unsigned long *flags) |
2218 | { | 2255 | { |
@@ -2367,9 +2404,9 @@ extern int __cond_resched_lock(spinlock_t *lock); | |||
2367 | 2404 | ||
2368 | extern int __cond_resched_softirq(void); | 2405 | extern int __cond_resched_softirq(void); |
2369 | 2406 | ||
2370 | #define cond_resched_softirq() ({ \ | 2407 | #define cond_resched_softirq() ({ \ |
2371 | __might_sleep(__FILE__, __LINE__, SOFTIRQ_OFFSET); \ | 2408 | __might_sleep(__FILE__, __LINE__, SOFTIRQ_DISABLE_OFFSET); \ |
2372 | __cond_resched_softirq(); \ | 2409 | __cond_resched_softirq(); \ |
2373 | }) | 2410 | }) |
2374 | 2411 | ||
2375 | /* | 2412 | /* |
diff --git a/include/linux/security.h b/include/linux/security.h index a22219afff09..fd4d55fb8845 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -74,10 +74,9 @@ extern int cap_file_mmap(struct file *file, unsigned long reqprot, | |||
74 | extern int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags); | 74 | extern int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags); |
75 | extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, | 75 | extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, |
76 | unsigned long arg4, unsigned long arg5); | 76 | unsigned long arg4, unsigned long arg5); |
77 | extern int cap_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp); | 77 | extern int cap_task_setscheduler(struct task_struct *p); |
78 | extern int cap_task_setioprio(struct task_struct *p, int ioprio); | 78 | extern int cap_task_setioprio(struct task_struct *p, int ioprio); |
79 | extern int cap_task_setnice(struct task_struct *p, int nice); | 79 | extern int cap_task_setnice(struct task_struct *p, int nice); |
80 | extern int cap_syslog(int type, bool from_file); | ||
81 | extern int cap_vm_enough_memory(struct mm_struct *mm, long pages); | 80 | extern int cap_vm_enough_memory(struct mm_struct *mm, long pages); |
82 | 81 | ||
83 | struct msghdr; | 82 | struct msghdr; |
@@ -959,6 +958,12 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
959 | * Sets the new child socket's sid to the openreq sid. | 958 | * Sets the new child socket's sid to the openreq sid. |
960 | * @inet_conn_established: | 959 | * @inet_conn_established: |
961 | * Sets the connection's peersid to the secmark on skb. | 960 | * Sets the connection's peersid to the secmark on skb. |
961 | * @secmark_relabel_packet: | ||
962 | * check if the process should be allowed to relabel packets to the given secid | ||
963 | * @security_secmark_refcount_inc | ||
964 | * tells the LSM to increment the number of secmark labeling rules loaded | ||
965 | * @security_secmark_refcount_dec | ||
966 | * tells the LSM to decrement the number of secmark labeling rules loaded | ||
962 | * @req_classify_flow: | 967 | * @req_classify_flow: |
963 | * Sets the flow's sid to the openreq sid. | 968 | * Sets the flow's sid to the openreq sid. |
964 | * @tun_dev_create: | 969 | * @tun_dev_create: |
@@ -1279,9 +1284,13 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
1279 | * Return 0 if permission is granted. | 1284 | * Return 0 if permission is granted. |
1280 | * | 1285 | * |
1281 | * @secid_to_secctx: | 1286 | * @secid_to_secctx: |
1282 | * Convert secid to security context. | 1287 | * Convert secid to security context. If secdata is NULL the length of |
1288 | * the result will be returned in seclen, but no secdata will be returned. | ||
1289 | * This does mean that the length could change between calls to check the | ||
1290 | * length and the next call which actually allocates and returns the secdata. | ||
1283 | * @secid contains the security ID. | 1291 | * @secid contains the security ID. |
1284 | * @secdata contains the pointer that stores the converted security context. | 1292 | * @secdata contains the pointer that stores the converted security context. |
1293 | * @seclen pointer which contains the length of the data | ||
1285 | * @secctx_to_secid: | 1294 | * @secctx_to_secid: |
1286 | * Convert security context to secid. | 1295 | * Convert security context to secid. |
1287 | * @secid contains the pointer to the generated security ID. | 1296 | * @secid contains the pointer to the generated security ID. |
@@ -1378,7 +1387,7 @@ struct security_operations { | |||
1378 | int (*sysctl) (struct ctl_table *table, int op); | 1387 | int (*sysctl) (struct ctl_table *table, int op); |
1379 | 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); |
1380 | int (*quota_on) (struct dentry *dentry); | 1389 | int (*quota_on) (struct dentry *dentry); |
1381 | int (*syslog) (int type, bool from_file); | 1390 | int (*syslog) (int type); |
1382 | int (*settime) (struct timespec *ts, struct timezone *tz); | 1391 | int (*settime) (struct timespec *ts, struct timezone *tz); |
1383 | int (*vm_enough_memory) (struct mm_struct *mm, long pages); | 1392 | int (*vm_enough_memory) (struct mm_struct *mm, long pages); |
1384 | 1393 | ||
@@ -1501,8 +1510,7 @@ struct security_operations { | |||
1501 | int (*task_getioprio) (struct task_struct *p); | 1510 | int (*task_getioprio) (struct task_struct *p); |
1502 | int (*task_setrlimit) (struct task_struct *p, unsigned int resource, | 1511 | int (*task_setrlimit) (struct task_struct *p, unsigned int resource, |
1503 | struct rlimit *new_rlim); | 1512 | struct rlimit *new_rlim); |
1504 | int (*task_setscheduler) (struct task_struct *p, int policy, | 1513 | int (*task_setscheduler) (struct task_struct *p); |
1505 | struct sched_param *lp); | ||
1506 | int (*task_getscheduler) (struct task_struct *p); | 1514 | int (*task_getscheduler) (struct task_struct *p); |
1507 | int (*task_movememory) (struct task_struct *p); | 1515 | int (*task_movememory) (struct task_struct *p); |
1508 | int (*task_kill) (struct task_struct *p, | 1516 | int (*task_kill) (struct task_struct *p, |
@@ -1594,6 +1602,9 @@ struct security_operations { | |||
1594 | struct request_sock *req); | 1602 | struct request_sock *req); |
1595 | void (*inet_csk_clone) (struct sock *newsk, const struct request_sock *req); | 1603 | void (*inet_csk_clone) (struct sock *newsk, const struct request_sock *req); |
1596 | void (*inet_conn_established) (struct sock *sk, struct sk_buff *skb); | 1604 | void (*inet_conn_established) (struct sock *sk, struct sk_buff *skb); |
1605 | int (*secmark_relabel_packet) (u32 secid); | ||
1606 | void (*secmark_refcount_inc) (void); | ||
1607 | void (*secmark_refcount_dec) (void); | ||
1597 | void (*req_classify_flow) (const struct request_sock *req, struct flowi *fl); | 1608 | void (*req_classify_flow) (const struct request_sock *req, struct flowi *fl); |
1598 | int (*tun_dev_create)(void); | 1609 | int (*tun_dev_create)(void); |
1599 | void (*tun_dev_post_create)(struct sock *sk); | 1610 | void (*tun_dev_post_create)(struct sock *sk); |
@@ -1659,7 +1670,7 @@ int security_real_capable_noaudit(struct task_struct *tsk, int cap); | |||
1659 | int security_sysctl(struct ctl_table *table, int op); | 1670 | int security_sysctl(struct ctl_table *table, int op); |
1660 | 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); |
1661 | int security_quota_on(struct dentry *dentry); | 1672 | int security_quota_on(struct dentry *dentry); |
1662 | int security_syslog(int type, bool from_file); | 1673 | int security_syslog(int type); |
1663 | int security_settime(struct timespec *ts, struct timezone *tz); | 1674 | int security_settime(struct timespec *ts, struct timezone *tz); |
1664 | int security_vm_enough_memory(long pages); | 1675 | int security_vm_enough_memory(long pages); |
1665 | 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); |
@@ -1752,8 +1763,7 @@ int security_task_setioprio(struct task_struct *p, int ioprio); | |||
1752 | int security_task_getioprio(struct task_struct *p); | 1763 | int security_task_getioprio(struct task_struct *p); |
1753 | int security_task_setrlimit(struct task_struct *p, unsigned int resource, | 1764 | int security_task_setrlimit(struct task_struct *p, unsigned int resource, |
1754 | struct rlimit *new_rlim); | 1765 | struct rlimit *new_rlim); |
1755 | int security_task_setscheduler(struct task_struct *p, | 1766 | int security_task_setscheduler(struct task_struct *p); |
1756 | int policy, struct sched_param *lp); | ||
1757 | int security_task_getscheduler(struct task_struct *p); | 1767 | int security_task_getscheduler(struct task_struct *p); |
1758 | int security_task_movememory(struct task_struct *p); | 1768 | int security_task_movememory(struct task_struct *p); |
1759 | int security_task_kill(struct task_struct *p, struct siginfo *info, | 1769 | int security_task_kill(struct task_struct *p, struct siginfo *info, |
@@ -1890,9 +1900,9 @@ static inline int security_quota_on(struct dentry *dentry) | |||
1890 | return 0; | 1900 | return 0; |
1891 | } | 1901 | } |
1892 | 1902 | ||
1893 | static inline int security_syslog(int type, bool from_file) | 1903 | static inline int security_syslog(int type) |
1894 | { | 1904 | { |
1895 | return cap_syslog(type, from_file); | 1905 | return 0; |
1896 | } | 1906 | } |
1897 | 1907 | ||
1898 | static inline int security_settime(struct timespec *ts, struct timezone *tz) | 1908 | static inline int security_settime(struct timespec *ts, struct timezone *tz) |
@@ -2320,11 +2330,9 @@ static inline int security_task_setrlimit(struct task_struct *p, | |||
2320 | return 0; | 2330 | return 0; |
2321 | } | 2331 | } |
2322 | 2332 | ||
2323 | static inline int security_task_setscheduler(struct task_struct *p, | 2333 | static inline int security_task_setscheduler(struct task_struct *p) |
2324 | int policy, | ||
2325 | struct sched_param *lp) | ||
2326 | { | 2334 | { |
2327 | return cap_task_setscheduler(p, policy, lp); | 2335 | return cap_task_setscheduler(p); |
2328 | } | 2336 | } |
2329 | 2337 | ||
2330 | static inline int security_task_getscheduler(struct task_struct *p) | 2338 | static inline int security_task_getscheduler(struct task_struct *p) |
@@ -2551,6 +2559,9 @@ void security_inet_csk_clone(struct sock *newsk, | |||
2551 | const struct request_sock *req); | 2559 | const struct request_sock *req); |
2552 | void security_inet_conn_established(struct sock *sk, | 2560 | void security_inet_conn_established(struct sock *sk, |
2553 | struct sk_buff *skb); | 2561 | struct sk_buff *skb); |
2562 | int security_secmark_relabel_packet(u32 secid); | ||
2563 | void security_secmark_refcount_inc(void); | ||
2564 | void security_secmark_refcount_dec(void); | ||
2554 | int security_tun_dev_create(void); | 2565 | int security_tun_dev_create(void); |
2555 | void security_tun_dev_post_create(struct sock *sk); | 2566 | void security_tun_dev_post_create(struct sock *sk); |
2556 | int security_tun_dev_attach(struct sock *sk); | 2567 | int security_tun_dev_attach(struct sock *sk); |
@@ -2705,6 +2716,19 @@ static inline void security_inet_conn_established(struct sock *sk, | |||
2705 | { | 2716 | { |
2706 | } | 2717 | } |
2707 | 2718 | ||
2719 | static inline int security_secmark_relabel_packet(u32 secid) | ||
2720 | { | ||
2721 | return 0; | ||
2722 | } | ||
2723 | |||
2724 | static inline void security_secmark_refcount_inc(void) | ||
2725 | { | ||
2726 | } | ||
2727 | |||
2728 | static inline void security_secmark_refcount_dec(void) | ||
2729 | { | ||
2730 | } | ||
2731 | |||
2708 | static inline int security_tun_dev_create(void) | 2732 | static inline int security_tun_dev_create(void) |
2709 | { | 2733 | { |
2710 | return 0; | 2734 | return 0; |
diff --git a/include/linux/selection.h b/include/linux/selection.h index 8cdaa1151d2e..85193aa8c1e3 100644 --- a/include/linux/selection.h +++ b/include/linux/selection.h | |||
@@ -39,5 +39,6 @@ extern void putconsxy(struct vc_data *vc, unsigned char *p); | |||
39 | 39 | ||
40 | extern u16 vcs_scr_readw(struct vc_data *vc, const u16 *org); | 40 | extern u16 vcs_scr_readw(struct vc_data *vc, const u16 *org); |
41 | extern void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org); | 41 | extern void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org); |
42 | extern void vcs_scr_updated(struct vc_data *vc); | ||
42 | 43 | ||
43 | #endif | 44 | #endif |
diff --git a/include/linux/selinux.h b/include/linux/selinux.h index 82e0f26a1299..44f459612690 100644 --- a/include/linux/selinux.h +++ b/include/linux/selinux.h | |||
@@ -21,74 +21,11 @@ struct kern_ipc_perm; | |||
21 | #ifdef CONFIG_SECURITY_SELINUX | 21 | #ifdef CONFIG_SECURITY_SELINUX |
22 | 22 | ||
23 | /** | 23 | /** |
24 | * selinux_string_to_sid - map a security context string to a security ID | ||
25 | * @str: the security context string to be mapped | ||
26 | * @sid: ID value returned via this. | ||
27 | * | ||
28 | * Returns 0 if successful, with the SID stored in sid. A value | ||
29 | * of zero for sid indicates no SID could be determined (but no error | ||
30 | * occurred). | ||
31 | */ | ||
32 | int selinux_string_to_sid(char *str, u32 *sid); | ||
33 | |||
34 | /** | ||
35 | * selinux_secmark_relabel_packet_permission - secmark permission check | ||
36 | * @sid: SECMARK ID value to be applied to network packet | ||
37 | * | ||
38 | * Returns 0 if the current task is allowed to set the SECMARK label of | ||
39 | * packets with the supplied security ID. Note that it is implicit that | ||
40 | * the packet is always being relabeled from the default unlabeled value, | ||
41 | * and that the access control decision is made in the AVC. | ||
42 | */ | ||
43 | int selinux_secmark_relabel_packet_permission(u32 sid); | ||
44 | |||
45 | /** | ||
46 | * selinux_secmark_refcount_inc - increments the secmark use counter | ||
47 | * | ||
48 | * SELinux keeps track of the current SECMARK targets in use so it knows | ||
49 | * when to apply SECMARK label access checks to network packets. This | ||
50 | * function incements this reference count to indicate that a new SECMARK | ||
51 | * target has been configured. | ||
52 | */ | ||
53 | void selinux_secmark_refcount_inc(void); | ||
54 | |||
55 | /** | ||
56 | * selinux_secmark_refcount_dec - decrements the secmark use counter | ||
57 | * | ||
58 | * SELinux keeps track of the current SECMARK targets in use so it knows | ||
59 | * when to apply SECMARK label access checks to network packets. This | ||
60 | * function decements this reference count to indicate that one of the | ||
61 | * existing SECMARK targets has been removed/flushed. | ||
62 | */ | ||
63 | void selinux_secmark_refcount_dec(void); | ||
64 | |||
65 | /** | ||
66 | * selinux_is_enabled - is SELinux enabled? | 24 | * selinux_is_enabled - is SELinux enabled? |
67 | */ | 25 | */ |
68 | bool selinux_is_enabled(void); | 26 | bool selinux_is_enabled(void); |
69 | #else | 27 | #else |
70 | 28 | ||
71 | static inline int selinux_string_to_sid(const char *str, u32 *sid) | ||
72 | { | ||
73 | *sid = 0; | ||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static inline int selinux_secmark_relabel_packet_permission(u32 sid) | ||
78 | { | ||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | static inline void selinux_secmark_refcount_inc(void) | ||
83 | { | ||
84 | return; | ||
85 | } | ||
86 | |||
87 | static inline void selinux_secmark_refcount_dec(void) | ||
88 | { | ||
89 | return; | ||
90 | } | ||
91 | |||
92 | static inline bool selinux_is_enabled(void) | 29 | static inline bool selinux_is_enabled(void) |
93 | { | 30 | { |
94 | return false; | 31 | return false; |
diff --git a/include/linux/semaphore.h b/include/linux/semaphore.h index 5310d27abd2a..39fa04966aa8 100644 --- a/include/linux/semaphore.h +++ b/include/linux/semaphore.h | |||
@@ -29,9 +29,6 @@ struct semaphore { | |||
29 | #define DEFINE_SEMAPHORE(name) \ | 29 | #define DEFINE_SEMAPHORE(name) \ |
30 | struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1) | 30 | struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1) |
31 | 31 | ||
32 | #define DECLARE_MUTEX(name) \ | ||
33 | struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1) | ||
34 | |||
35 | static inline void sema_init(struct semaphore *sem, int val) | 32 | static inline void sema_init(struct semaphore *sem, int val) |
36 | { | 33 | { |
37 | static struct lock_class_key __key; | 34 | static struct lock_class_key __key; |
@@ -39,9 +36,6 @@ static inline void sema_init(struct semaphore *sem, int val) | |||
39 | lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0); | 36 | lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0); |
40 | } | 37 | } |
41 | 38 | ||
42 | #define init_MUTEX(sem) sema_init(sem, 1) | ||
43 | #define init_MUTEX_LOCKED(sem) sema_init(sem, 0) | ||
44 | |||
45 | extern void down(struct semaphore *sem); | 39 | extern void down(struct semaphore *sem); |
46 | extern int __must_check down_interruptible(struct semaphore *sem); | 40 | extern int __must_check down_interruptible(struct semaphore *sem); |
47 | extern int __must_check down_killable(struct semaphore *sem); | 41 | extern int __must_check down_killable(struct semaphore *sem); |
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 7638deaaba65..97f5b45bbc07 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
@@ -35,6 +35,8 @@ struct plat_serial8250_port { | |||
35 | void (*set_termios)(struct uart_port *, | 35 | void (*set_termios)(struct uart_port *, |
36 | struct ktermios *new, | 36 | struct ktermios *new, |
37 | struct ktermios *old); | 37 | struct ktermios *old); |
38 | void (*pm)(struct uart_port *, unsigned int state, | ||
39 | unsigned old); | ||
38 | }; | 40 | }; |
39 | 41 | ||
40 | /* | 42 | /* |
@@ -76,5 +78,11 @@ extern int serial8250_find_port_for_earlycon(void); | |||
76 | extern int setup_early_serial8250_console(char *cmdline); | 78 | extern int setup_early_serial8250_console(char *cmdline); |
77 | extern void serial8250_do_set_termios(struct uart_port *port, | 79 | extern void serial8250_do_set_termios(struct uart_port *port, |
78 | struct ktermios *termios, struct ktermios *old); | 80 | struct ktermios *termios, struct ktermios *old); |
81 | extern void serial8250_do_pm(struct uart_port *port, unsigned int state, | ||
82 | unsigned int oldstate); | ||
83 | |||
84 | extern void serial8250_set_isa_configurator(void (*v) | ||
85 | (int port, struct uart_port *up, | ||
86 | unsigned short *capabilities)); | ||
79 | 87 | ||
80 | #endif | 88 | #endif |
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 563e23400913..212eb4c67797 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
@@ -196,6 +196,9 @@ | |||
196 | /* High Speed UART for Medfield */ | 196 | /* High Speed UART for Medfield */ |
197 | #define PORT_MFD 95 | 197 | #define PORT_MFD 95 |
198 | 198 | ||
199 | /* TI OMAP-UART */ | ||
200 | #define PORT_OMAP 96 | ||
201 | |||
199 | #ifdef __KERNEL__ | 202 | #ifdef __KERNEL__ |
200 | 203 | ||
201 | #include <linux/compiler.h> | 204 | #include <linux/compiler.h> |
@@ -289,6 +292,8 @@ struct uart_port { | |||
289 | void (*set_termios)(struct uart_port *, | 292 | void (*set_termios)(struct uart_port *, |
290 | struct ktermios *new, | 293 | struct ktermios *new, |
291 | struct ktermios *old); | 294 | struct ktermios *old); |
295 | void (*pm)(struct uart_port *, unsigned int state, | ||
296 | unsigned int old); | ||
292 | unsigned int irq; /* irq number */ | 297 | unsigned int irq; /* irq number */ |
293 | unsigned long irqflags; /* irq flags */ | 298 | unsigned long irqflags; /* irq flags */ |
294 | unsigned int uartclk; /* base uart clock */ | 299 | unsigned int uartclk; /* base uart clock */ |
@@ -411,6 +416,14 @@ unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios | |||
411 | unsigned int max); | 416 | unsigned int max); |
412 | unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud); | 417 | unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud); |
413 | 418 | ||
419 | /* Base timer interval for polling */ | ||
420 | static inline int uart_poll_timeout(struct uart_port *port) | ||
421 | { | ||
422 | int timeout = port->timeout; | ||
423 | |||
424 | return timeout > 6 ? (timeout / 2 - 2) : 1; | ||
425 | } | ||
426 | |||
414 | /* | 427 | /* |
415 | * Console helpers. | 428 | * Console helpers. |
416 | */ | 429 | */ |
diff --git a/include/linux/serio.h b/include/linux/serio.h index b5552568178d..e26f4788845f 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
@@ -41,7 +41,9 @@ struct serio { | |||
41 | int (*start)(struct serio *); | 41 | int (*start)(struct serio *); |
42 | void (*stop)(struct serio *); | 42 | void (*stop)(struct serio *); |
43 | 43 | ||
44 | struct serio *parent, *child; | 44 | struct serio *parent; |
45 | struct list_head child_node; /* Entry in parent->children list */ | ||
46 | struct list_head children; | ||
45 | unsigned int depth; /* level of nesting in serio hierarchy */ | 47 | unsigned int depth; /* level of nesting in serio hierarchy */ |
46 | 48 | ||
47 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ | 49 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ |
@@ -54,10 +56,9 @@ struct serio { | |||
54 | #define to_serio_port(d) container_of(d, struct serio, dev) | 56 | #define to_serio_port(d) container_of(d, struct serio, dev) |
55 | 57 | ||
56 | struct serio_driver { | 58 | struct serio_driver { |
57 | void *private; | 59 | const char *description; |
58 | char *description; | ||
59 | 60 | ||
60 | struct serio_device_id *id_table; | 61 | const struct serio_device_id *id_table; |
61 | bool manual_bind; | 62 | bool manual_bind; |
62 | 63 | ||
63 | void (*write_wakeup)(struct serio *); | 64 | void (*write_wakeup)(struct serio *); |
@@ -197,5 +198,6 @@ static inline void serio_continue_rx(struct serio *serio) | |||
197 | #define SERIO_W8001 0x39 | 198 | #define SERIO_W8001 0x39 |
198 | #define SERIO_DYNAPRO 0x3a | 199 | #define SERIO_DYNAPRO 0x3a |
199 | #define SERIO_HAMPSHIRE 0x3b | 200 | #define SERIO_HAMPSHIRE 0x3b |
201 | #define SERIO_PS2MULT 0x3c | ||
200 | 202 | ||
201 | #endif | 203 | #endif |
diff --git a/include/linux/sfi.h b/include/linux/sfi.h index 0299b4ce63db..7f770c638e99 100644 --- a/include/linux/sfi.h +++ b/include/linux/sfi.h | |||
@@ -70,9 +70,6 @@ | |||
70 | #define SFI_SIG_APIC "APIC" | 70 | #define SFI_SIG_APIC "APIC" |
71 | #define SFI_SIG_XSDT "XSDT" | 71 | #define SFI_SIG_XSDT "XSDT" |
72 | #define SFI_SIG_WAKE "WAKE" | 72 | #define SFI_SIG_WAKE "WAKE" |
73 | #define SFI_SIG_SPIB "SPIB" | ||
74 | #define SFI_SIG_I2CB "I2CB" | ||
75 | #define SFI_SIG_GPEM "GPEM" | ||
76 | #define SFI_SIG_DEVS "DEVS" | 73 | #define SFI_SIG_DEVS "DEVS" |
77 | #define SFI_SIG_GPIO "GPIO" | 74 | #define SFI_SIG_GPIO "GPIO" |
78 | 75 | ||
@@ -168,27 +165,6 @@ struct sfi_gpio_table_entry { | |||
168 | char pin_name[16]; | 165 | char pin_name[16]; |
169 | } __packed; | 166 | } __packed; |
170 | 167 | ||
171 | struct sfi_spi_table_entry { | ||
172 | u16 host_num; /* attached to host 0, 1...*/ | ||
173 | u16 cs; /* chip select */ | ||
174 | u16 irq_info; | ||
175 | char name[16]; | ||
176 | u8 dev_info[10]; | ||
177 | } __packed; | ||
178 | |||
179 | struct sfi_i2c_table_entry { | ||
180 | u16 host_num; | ||
181 | u16 addr; /* slave addr */ | ||
182 | u16 irq_info; | ||
183 | char name[16]; | ||
184 | u8 dev_info[10]; | ||
185 | } __packed; | ||
186 | |||
187 | struct sfi_gpe_table_entry { | ||
188 | u16 logical_id; /* logical id */ | ||
189 | u16 phys_id; /* physical GPE id */ | ||
190 | } __packed; | ||
191 | |||
192 | typedef int (*sfi_table_handler) (struct sfi_table_header *table); | 168 | typedef int (*sfi_table_handler) (struct sfi_table_header *table); |
193 | 169 | ||
194 | #ifdef CONFIG_SFI | 170 | #ifdef CONFIG_SFI |
diff --git a/include/linux/sh_clk.h b/include/linux/sh_clk.h index 875ce50719a9..cea0c38e7a63 100644 --- a/include/linux/sh_clk.h +++ b/include/linux/sh_clk.h | |||
@@ -4,11 +4,20 @@ | |||
4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
5 | #include <linux/seq_file.h> | 5 | #include <linux/seq_file.h> |
6 | #include <linux/cpufreq.h> | 6 | #include <linux/cpufreq.h> |
7 | #include <linux/types.h> | ||
8 | #include <linux/kref.h> | ||
7 | #include <linux/clk.h> | 9 | #include <linux/clk.h> |
8 | #include <linux/err.h> | 10 | #include <linux/err.h> |
9 | 11 | ||
10 | struct clk; | 12 | struct clk; |
11 | 13 | ||
14 | struct clk_mapping { | ||
15 | phys_addr_t phys; | ||
16 | void __iomem *base; | ||
17 | unsigned long len; | ||
18 | struct kref ref; | ||
19 | }; | ||
20 | |||
12 | struct clk_ops { | 21 | struct clk_ops { |
13 | void (*init)(struct clk *clk); | 22 | void (*init)(struct clk *clk); |
14 | int (*enable)(struct clk *clk); | 23 | int (*enable)(struct clk *clk); |
@@ -21,9 +30,6 @@ struct clk_ops { | |||
21 | 30 | ||
22 | struct clk { | 31 | struct clk { |
23 | struct list_head node; | 32 | struct list_head node; |
24 | const char *name; | ||
25 | int id; | ||
26 | |||
27 | struct clk *parent; | 33 | struct clk *parent; |
28 | struct clk **parent_table; /* list of parents to */ | 34 | struct clk **parent_table; /* list of parents to */ |
29 | unsigned short parent_num; /* choose between */ | 35 | unsigned short parent_num; /* choose between */ |
@@ -45,7 +51,9 @@ struct clk { | |||
45 | unsigned long arch_flags; | 51 | unsigned long arch_flags; |
46 | void *priv; | 52 | void *priv; |
47 | struct dentry *dentry; | 53 | struct dentry *dentry; |
54 | struct clk_mapping *mapping; | ||
48 | struct cpufreq_frequency_table *freq_table; | 55 | struct cpufreq_frequency_table *freq_table; |
56 | unsigned int nr_freqs; | ||
49 | }; | 57 | }; |
50 | 58 | ||
51 | #define CLK_ENABLE_ON_INIT (1 << 0) | 59 | #define CLK_ENABLE_ON_INIT (1 << 0) |
@@ -111,6 +119,13 @@ int clk_rate_table_find(struct clk *clk, | |||
111 | struct cpufreq_frequency_table *freq_table, | 119 | struct cpufreq_frequency_table *freq_table, |
112 | unsigned long rate); | 120 | unsigned long rate); |
113 | 121 | ||
122 | long clk_rate_div_range_round(struct clk *clk, unsigned int div_min, | ||
123 | unsigned int div_max, unsigned long rate); | ||
124 | |||
125 | long clk_round_parent(struct clk *clk, unsigned long target, | ||
126 | unsigned long *best_freq, unsigned long *parent_freq, | ||
127 | unsigned int div_min, unsigned int div_max); | ||
128 | |||
114 | #define SH_CLK_MSTP32(_parent, _enable_reg, _enable_bit, _flags) \ | 129 | #define SH_CLK_MSTP32(_parent, _enable_reg, _enable_bit, _flags) \ |
115 | { \ | 130 | { \ |
116 | .parent = _parent, \ | 131 | .parent = _parent, \ |
diff --git a/include/linux/sh_intc.h b/include/linux/sh_intc.h index 0d6cd38e673d..5812fefbcedf 100644 --- a/include/linux/sh_intc.h +++ b/include/linux/sh_intc.h | |||
@@ -20,6 +20,12 @@ struct intc_group { | |||
20 | 20 | ||
21 | #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } | 21 | #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } |
22 | 22 | ||
23 | struct intc_subgroup { | ||
24 | unsigned long reg, reg_width; | ||
25 | intc_enum parent_id; | ||
26 | intc_enum enum_ids[32]; | ||
27 | }; | ||
28 | |||
23 | struct intc_mask_reg { | 29 | struct intc_mask_reg { |
24 | unsigned long set_reg, clr_reg, reg_width; | 30 | unsigned long set_reg, clr_reg, reg_width; |
25 | intc_enum enum_ids[32]; | 31 | intc_enum enum_ids[32]; |
@@ -69,9 +75,12 @@ struct intc_hw_desc { | |||
69 | unsigned int nr_sense_regs; | 75 | unsigned int nr_sense_regs; |
70 | struct intc_mask_reg *ack_regs; | 76 | struct intc_mask_reg *ack_regs; |
71 | unsigned int nr_ack_regs; | 77 | unsigned int nr_ack_regs; |
78 | struct intc_subgroup *subgroups; | ||
79 | unsigned int nr_subgroups; | ||
72 | }; | 80 | }; |
73 | 81 | ||
74 | #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) | 82 | #define _INTC_ARRAY(a) a, __same_type(a, NULL) ? 0 : sizeof(a)/sizeof(*a) |
83 | |||
75 | #define INTC_HW_DESC(vectors, groups, mask_regs, \ | 84 | #define INTC_HW_DESC(vectors, groups, mask_regs, \ |
76 | prio_regs, sense_regs, ack_regs) \ | 85 | prio_regs, sense_regs, ack_regs) \ |
77 | { \ | 86 | { \ |
@@ -105,8 +114,11 @@ struct intc_desc symbol __initdata = { \ | |||
105 | prio_regs, sense_regs, ack_regs), \ | 114 | prio_regs, sense_regs, ack_regs), \ |
106 | } | 115 | } |
107 | 116 | ||
108 | int __init register_intc_controller(struct intc_desc *desc); | 117 | int register_intc_controller(struct intc_desc *desc); |
118 | void reserve_intc_vectors(struct intc_vect *vectors, unsigned int nr_vecs); | ||
109 | int intc_set_priority(unsigned int irq, unsigned int prio); | 119 | int intc_set_priority(unsigned int irq, unsigned int prio); |
120 | int intc_irq_lookup(const char *chipname, intc_enum enum_id); | ||
121 | void intc_finalize(void); | ||
110 | 122 | ||
111 | #ifdef CONFIG_INTC_USERIMASK | 123 | #ifdef CONFIG_INTC_USERIMASK |
112 | int register_intc_userimask(unsigned long addr); | 124 | int register_intc_userimask(unsigned long addr); |
@@ -117,7 +129,4 @@ static inline int register_intc_userimask(unsigned long addr) | |||
117 | } | 129 | } |
118 | #endif | 130 | #endif |
119 | 131 | ||
120 | int reserve_irq_vector(unsigned int irq); | ||
121 | void reserve_irq_legacy(void); | ||
122 | |||
123 | #endif /* __SH_INTC_H */ | 132 | #endif /* __SH_INTC_H */ |
diff --git a/include/linux/sh_pfc.h b/include/linux/sh_pfc.h index 07c08af9f8f6..30cae70874f4 100644 --- a/include/linux/sh_pfc.h +++ b/include/linux/sh_pfc.h | |||
@@ -92,5 +92,6 @@ struct pinmux_info { | |||
92 | }; | 92 | }; |
93 | 93 | ||
94 | int register_pinmux(struct pinmux_info *pip); | 94 | int register_pinmux(struct pinmux_info *pip); |
95 | int unregister_pinmux(struct pinmux_info *pip); | ||
95 | 96 | ||
96 | #endif /* __SH_PFC_H */ | 97 | #endif /* __SH_PFC_H */ |
diff --git a/include/linux/sh_timer.h b/include/linux/sh_timer.h index 864bd56bd3b0..4d9dcd138315 100644 --- a/include/linux/sh_timer.h +++ b/include/linux/sh_timer.h | |||
@@ -5,7 +5,6 @@ struct sh_timer_config { | |||
5 | char *name; | 5 | char *name; |
6 | long channel_offset; | 6 | long channel_offset; |
7 | int timer_bit; | 7 | int timer_bit; |
8 | char *clk; | ||
9 | unsigned long clockevent_rating; | 8 | unsigned long clockevent_rating; |
10 | unsigned long clocksource_rating; | 9 | unsigned long clocksource_rating; |
11 | }; | 10 | }; |
diff --git a/include/linux/signalfd.h b/include/linux/signalfd.h index b363b916c909..3ff4961da9b5 100644 --- a/include/linux/signalfd.h +++ b/include/linux/signalfd.h | |||
@@ -33,6 +33,7 @@ struct signalfd_siginfo { | |||
33 | __u64 ssi_utime; | 33 | __u64 ssi_utime; |
34 | __u64 ssi_stime; | 34 | __u64 ssi_stime; |
35 | __u64 ssi_addr; | 35 | __u64 ssi_addr; |
36 | __u16 ssi_addr_lsb; | ||
36 | 37 | ||
37 | /* | 38 | /* |
38 | * Pad strcture to 128 bytes. Remember to update the | 39 | * Pad strcture to 128 bytes. Remember to update the |
@@ -43,7 +44,7 @@ struct signalfd_siginfo { | |||
43 | * comes out of a read(2) and we really don't want to have | 44 | * comes out of a read(2) and we really don't want to have |
44 | * a compat on read(2). | 45 | * a compat on read(2). |
45 | */ | 46 | */ |
46 | __u8 __pad[48]; | 47 | __u8 __pad[46]; |
47 | }; | 48 | }; |
48 | 49 | ||
49 | 50 | ||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 77eb60d2b496..e6ba898de61c 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -129,8 +129,13 @@ typedef struct skb_frag_struct skb_frag_t; | |||
129 | 129 | ||
130 | struct skb_frag_struct { | 130 | struct skb_frag_struct { |
131 | struct page *page; | 131 | struct page *page; |
132 | #if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536) | ||
132 | __u32 page_offset; | 133 | __u32 page_offset; |
133 | __u32 size; | 134 | __u32 size; |
135 | #else | ||
136 | __u16 page_offset; | ||
137 | __u16 size; | ||
138 | #endif | ||
134 | }; | 139 | }; |
135 | 140 | ||
136 | #define HAVE_HW_TIME_STAMP | 141 | #define HAVE_HW_TIME_STAMP |
@@ -163,26 +168,19 @@ struct skb_shared_hwtstamps { | |||
163 | ktime_t syststamp; | 168 | ktime_t syststamp; |
164 | }; | 169 | }; |
165 | 170 | ||
166 | /** | 171 | /* Definitions for tx_flags in struct skb_shared_info */ |
167 | * struct skb_shared_tx - instructions for time stamping of outgoing packets | 172 | enum { |
168 | * @hardware: generate hardware time stamp | 173 | /* generate hardware time stamp */ |
169 | * @software: generate software time stamp | 174 | SKBTX_HW_TSTAMP = 1 << 0, |
170 | * @in_progress: device driver is going to provide | 175 | |
171 | * hardware time stamp | 176 | /* generate software time stamp */ |
172 | * @prevent_sk_orphan: make sk reference available on driver level | 177 | SKBTX_SW_TSTAMP = 1 << 1, |
173 | * @flags: all shared_tx flags | 178 | |
174 | * | 179 | /* device driver is going to provide hardware time stamp */ |
175 | * These flags are attached to packets as part of the | 180 | SKBTX_IN_PROGRESS = 1 << 2, |
176 | * &skb_shared_info. Use skb_tx() to get a pointer. | 181 | |
177 | */ | 182 | /* ensure the originating sk reference is available on driver level */ |
178 | union skb_shared_tx { | 183 | SKBTX_DRV_NEEDS_SK_REF = 1 << 3, |
179 | struct { | ||
180 | __u8 hardware:1, | ||
181 | software:1, | ||
182 | in_progress:1, | ||
183 | prevent_sk_orphan:1; | ||
184 | }; | ||
185 | __u8 flags; | ||
186 | }; | 184 | }; |
187 | 185 | ||
188 | /* This data is invariant across clones and lives at | 186 | /* This data is invariant across clones and lives at |
@@ -195,7 +193,7 @@ struct skb_shared_info { | |||
195 | unsigned short gso_segs; | 193 | unsigned short gso_segs; |
196 | unsigned short gso_type; | 194 | unsigned short gso_type; |
197 | __be32 ip6_frag_id; | 195 | __be32 ip6_frag_id; |
198 | union skb_shared_tx tx_flags; | 196 | __u8 tx_flags; |
199 | struct sk_buff *frag_list; | 197 | struct sk_buff *frag_list; |
200 | struct skb_shared_hwtstamps hwtstamps; | 198 | struct skb_shared_hwtstamps hwtstamps; |
201 | 199 | ||
@@ -462,19 +460,7 @@ static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | |||
462 | skb->_skb_refdst = (unsigned long)dst; | 460 | skb->_skb_refdst = (unsigned long)dst; |
463 | } | 461 | } |
464 | 462 | ||
465 | /** | 463 | extern void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst); |
466 | * skb_dst_set_noref - sets skb dst, without a reference | ||
467 | * @skb: buffer | ||
468 | * @dst: dst entry | ||
469 | * | ||
470 | * Sets skb dst, assuming a reference was not taken on dst | ||
471 | * skb_dst_drop() should not dst_release() this dst | ||
472 | */ | ||
473 | static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst) | ||
474 | { | ||
475 | WARN_ON(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); | ||
476 | skb->_skb_refdst = (unsigned long)dst | SKB_DST_NOREF; | ||
477 | } | ||
478 | 464 | ||
479 | /** | 465 | /** |
480 | * skb_dst_is_noref - Test if skb dst isnt refcounted | 466 | * skb_dst_is_noref - Test if skb dst isnt refcounted |
@@ -498,13 +484,13 @@ extern struct sk_buff *__alloc_skb(unsigned int size, | |||
498 | static inline struct sk_buff *alloc_skb(unsigned int size, | 484 | static inline struct sk_buff *alloc_skb(unsigned int size, |
499 | gfp_t priority) | 485 | gfp_t priority) |
500 | { | 486 | { |
501 | return __alloc_skb(size, priority, 0, -1); | 487 | return __alloc_skb(size, priority, 0, NUMA_NO_NODE); |
502 | } | 488 | } |
503 | 489 | ||
504 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, | 490 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, |
505 | gfp_t priority) | 491 | gfp_t priority) |
506 | { | 492 | { |
507 | return __alloc_skb(size, priority, 1, -1); | 493 | return __alloc_skb(size, priority, 1, NUMA_NO_NODE); |
508 | } | 494 | } |
509 | 495 | ||
510 | extern bool skb_recycle_check(struct sk_buff *skb, int skb_size); | 496 | extern bool skb_recycle_check(struct sk_buff *skb, int skb_size); |
@@ -558,6 +544,15 @@ extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, | |||
558 | unsigned int to, struct ts_config *config, | 544 | unsigned int to, struct ts_config *config, |
559 | struct ts_state *state); | 545 | struct ts_state *state); |
560 | 546 | ||
547 | extern __u32 __skb_get_rxhash(struct sk_buff *skb); | ||
548 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) | ||
549 | { | ||
550 | if (!skb->rxhash) | ||
551 | skb->rxhash = __skb_get_rxhash(skb); | ||
552 | |||
553 | return skb->rxhash; | ||
554 | } | ||
555 | |||
561 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 556 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
562 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) | 557 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) |
563 | { | 558 | { |
@@ -578,11 +573,6 @@ static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb) | |||
578 | return &skb_shinfo(skb)->hwtstamps; | 573 | return &skb_shinfo(skb)->hwtstamps; |
579 | } | 574 | } |
580 | 575 | ||
581 | static inline union skb_shared_tx *skb_tx(struct sk_buff *skb) | ||
582 | { | ||
583 | return &skb_shinfo(skb)->tx_flags; | ||
584 | } | ||
585 | |||
586 | /** | 576 | /** |
587 | * skb_queue_empty - check if a queue is empty | 577 | * skb_queue_empty - check if a queue is empty |
588 | * @list: queue head | 578 | * @list: queue head |
@@ -604,7 +594,7 @@ static inline int skb_queue_empty(const struct sk_buff_head *list) | |||
604 | static inline bool skb_queue_is_last(const struct sk_buff_head *list, | 594 | static inline bool skb_queue_is_last(const struct sk_buff_head *list, |
605 | const struct sk_buff *skb) | 595 | const struct sk_buff *skb) |
606 | { | 596 | { |
607 | return (skb->next == (struct sk_buff *) list); | 597 | return skb->next == (struct sk_buff *)list; |
608 | } | 598 | } |
609 | 599 | ||
610 | /** | 600 | /** |
@@ -617,7 +607,7 @@ static inline bool skb_queue_is_last(const struct sk_buff_head *list, | |||
617 | static inline bool skb_queue_is_first(const struct sk_buff_head *list, | 607 | static inline bool skb_queue_is_first(const struct sk_buff_head *list, |
618 | const struct sk_buff *skb) | 608 | const struct sk_buff *skb) |
619 | { | 609 | { |
620 | return (skb->prev == (struct sk_buff *) list); | 610 | return skb->prev == (struct sk_buff *)list; |
621 | } | 611 | } |
622 | 612 | ||
623 | /** | 613 | /** |
@@ -1123,7 +1113,7 @@ extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | |||
1123 | int off, int size); | 1113 | int off, int size); |
1124 | 1114 | ||
1125 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 1115 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) |
1126 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frags(skb)) | 1116 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb)) |
1127 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 1117 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
1128 | 1118 | ||
1129 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1119 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
@@ -1561,13 +1551,25 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev, | |||
1561 | return skb; | 1551 | return skb; |
1562 | } | 1552 | } |
1563 | 1553 | ||
1564 | extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask); | 1554 | /** |
1555 | * __netdev_alloc_page - allocate a page for ps-rx on a specific device | ||
1556 | * @dev: network device to receive on | ||
1557 | * @gfp_mask: alloc_pages_node mask | ||
1558 | * | ||
1559 | * Allocate a new page. dev currently unused. | ||
1560 | * | ||
1561 | * %NULL is returned if there is no free memory. | ||
1562 | */ | ||
1563 | static inline struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask) | ||
1564 | { | ||
1565 | return alloc_pages_node(NUMA_NO_NODE, gfp_mask, 0); | ||
1566 | } | ||
1565 | 1567 | ||
1566 | /** | 1568 | /** |
1567 | * netdev_alloc_page - allocate a page for ps-rx on a specific device | 1569 | * netdev_alloc_page - allocate a page for ps-rx on a specific device |
1568 | * @dev: network device to receive on | 1570 | * @dev: network device to receive on |
1569 | * | 1571 | * |
1570 | * Allocate a new page node local to the specified device. | 1572 | * Allocate a new page. dev currently unused. |
1571 | * | 1573 | * |
1572 | * %NULL is returned if there is no free memory. | 1574 | * %NULL is returned if there is no free memory. |
1573 | */ | 1575 | */ |
@@ -1787,7 +1789,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1787 | skb = skb->prev) | 1789 | skb = skb->prev) |
1788 | 1790 | ||
1789 | 1791 | ||
1790 | static inline bool skb_has_frags(const struct sk_buff *skb) | 1792 | static inline bool skb_has_frag_list(const struct sk_buff *skb) |
1791 | { | 1793 | { |
1792 | return skb_shinfo(skb)->frag_list != NULL; | 1794 | return skb_shinfo(skb)->frag_list != NULL; |
1793 | } | 1795 | } |
@@ -1987,8 +1989,8 @@ extern void skb_tstamp_tx(struct sk_buff *orig_skb, | |||
1987 | 1989 | ||
1988 | static inline void sw_tx_timestamp(struct sk_buff *skb) | 1990 | static inline void sw_tx_timestamp(struct sk_buff *skb) |
1989 | { | 1991 | { |
1990 | union skb_shared_tx *shtx = skb_tx(skb); | 1992 | if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP && |
1991 | if (shtx->software && !shtx->in_progress) | 1993 | !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) |
1992 | skb_tstamp_tx(skb, NULL); | 1994 | skb_tstamp_tx(skb, NULL); |
1993 | } | 1995 | } |
1994 | 1996 | ||
@@ -2159,7 +2161,7 @@ static inline u16 skb_get_rx_queue(const struct sk_buff *skb) | |||
2159 | 2161 | ||
2160 | static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) | 2162 | static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) |
2161 | { | 2163 | { |
2162 | return (skb->queue_mapping != 0); | 2164 | return skb->queue_mapping != 0; |
2163 | } | 2165 | } |
2164 | 2166 | ||
2165 | extern u16 skb_tx_hash(const struct net_device *dev, | 2167 | extern u16 skb_tx_hash(const struct net_device *dev, |
@@ -2209,6 +2211,21 @@ static inline void skb_forward_csum(struct sk_buff *skb) | |||
2209 | skb->ip_summed = CHECKSUM_NONE; | 2211 | skb->ip_summed = CHECKSUM_NONE; |
2210 | } | 2212 | } |
2211 | 2213 | ||
2214 | /** | ||
2215 | * skb_checksum_none_assert - make sure skb ip_summed is CHECKSUM_NONE | ||
2216 | * @skb: skb to check | ||
2217 | * | ||
2218 | * fresh skbs have their ip_summed set to CHECKSUM_NONE. | ||
2219 | * Instead of forcing ip_summed to CHECKSUM_NONE, we can | ||
2220 | * use this helper, to document places where we make this assertion. | ||
2221 | */ | ||
2222 | static inline void skb_checksum_none_assert(struct sk_buff *skb) | ||
2223 | { | ||
2224 | #ifdef DEBUG | ||
2225 | BUG_ON(skb->ip_summed != CHECKSUM_NONE); | ||
2226 | #endif | ||
2227 | } | ||
2228 | |||
2212 | bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); | 2229 | bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); |
2213 | #endif /* __KERNEL__ */ | 2230 | #endif /* __KERNEL__ */ |
2214 | #endif /* _LINUX_SKBUFF_H */ | 2231 | #endif /* _LINUX_SKBUFF_H */ |
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 9f63538928c0..e4f5ed180b9b 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
@@ -87,7 +87,7 @@ struct kmem_cache { | |||
87 | unsigned long min_partial; | 87 | unsigned long min_partial; |
88 | const char *name; /* Name (only for display!) */ | 88 | const char *name; /* Name (only for display!) */ |
89 | struct list_head list; /* List of slab caches */ | 89 | struct list_head list; /* List of slab caches */ |
90 | #ifdef CONFIG_SLUB_DEBUG | 90 | #ifdef CONFIG_SYSFS |
91 | struct kobject kobj; /* For sysfs */ | 91 | struct kobject kobj; /* For sysfs */ |
92 | #endif | 92 | #endif |
93 | 93 | ||
@@ -96,11 +96,8 @@ struct kmem_cache { | |||
96 | * Defragmentation by allocating from a remote node. | 96 | * Defragmentation by allocating from a remote node. |
97 | */ | 97 | */ |
98 | int remote_node_defrag_ratio; | 98 | int remote_node_defrag_ratio; |
99 | struct kmem_cache_node *node[MAX_NUMNODES]; | ||
100 | #else | ||
101 | /* Avoid an extra cache line for UP */ | ||
102 | struct kmem_cache_node local_node; | ||
103 | #endif | 99 | #endif |
100 | struct kmem_cache_node *node[MAX_NUMNODES]; | ||
104 | }; | 101 | }; |
105 | 102 | ||
106 | /* | 103 | /* |
@@ -139,19 +136,16 @@ struct kmem_cache { | |||
139 | 136 | ||
140 | #ifdef CONFIG_ZONE_DMA | 137 | #ifdef CONFIG_ZONE_DMA |
141 | #define SLUB_DMA __GFP_DMA | 138 | #define SLUB_DMA __GFP_DMA |
142 | /* Reserve extra caches for potential DMA use */ | ||
143 | #define KMALLOC_CACHES (2 * SLUB_PAGE_SHIFT) | ||
144 | #else | 139 | #else |
145 | /* Disable DMA functionality */ | 140 | /* Disable DMA functionality */ |
146 | #define SLUB_DMA (__force gfp_t)0 | 141 | #define SLUB_DMA (__force gfp_t)0 |
147 | #define KMALLOC_CACHES SLUB_PAGE_SHIFT | ||
148 | #endif | 142 | #endif |
149 | 143 | ||
150 | /* | 144 | /* |
151 | * We keep the general caches in an array of slab caches that are used for | 145 | * We keep the general caches in an array of slab caches that are used for |
152 | * 2^x bytes of allocations. | 146 | * 2^x bytes of allocations. |
153 | */ | 147 | */ |
154 | extern struct kmem_cache kmalloc_caches[KMALLOC_CACHES]; | 148 | extern struct kmem_cache *kmalloc_caches[SLUB_PAGE_SHIFT]; |
155 | 149 | ||
156 | /* | 150 | /* |
157 | * Sorry that the following has to be that ugly but some versions of GCC | 151 | * Sorry that the following has to be that ugly but some versions of GCC |
@@ -216,7 +210,7 @@ static __always_inline struct kmem_cache *kmalloc_slab(size_t size) | |||
216 | if (index == 0) | 210 | if (index == 0) |
217 | return NULL; | 211 | return NULL; |
218 | 212 | ||
219 | return &kmalloc_caches[index]; | 213 | return kmalloc_caches[index]; |
220 | } | 214 | } |
221 | 215 | ||
222 | void *kmem_cache_alloc(struct kmem_cache *, gfp_t); | 216 | void *kmem_cache_alloc(struct kmem_cache *, gfp_t); |
diff --git a/include/linux/smb.h b/include/linux/smb.h deleted file mode 100644 index 82fefddc5987..000000000000 --- a/include/linux/smb.h +++ /dev/null | |||
@@ -1,118 +0,0 @@ | |||
1 | /* | ||
2 | * smb.h | ||
3 | * | ||
4 | * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke | ||
5 | * Copyright (C) 1997 by Volker Lendecke | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _LINUX_SMB_H | ||
10 | #define _LINUX_SMB_H | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | #include <linux/magic.h> | ||
14 | #ifdef __KERNEL__ | ||
15 | #include <linux/time.h> | ||
16 | #endif | ||
17 | |||
18 | enum smb_protocol { | ||
19 | SMB_PROTOCOL_NONE, | ||
20 | SMB_PROTOCOL_CORE, | ||
21 | SMB_PROTOCOL_COREPLUS, | ||
22 | SMB_PROTOCOL_LANMAN1, | ||
23 | SMB_PROTOCOL_LANMAN2, | ||
24 | SMB_PROTOCOL_NT1 | ||
25 | }; | ||
26 | |||
27 | enum smb_case_hndl { | ||
28 | SMB_CASE_DEFAULT, | ||
29 | SMB_CASE_LOWER, | ||
30 | SMB_CASE_UPPER | ||
31 | }; | ||
32 | |||
33 | struct smb_dskattr { | ||
34 | __u16 total; | ||
35 | __u16 allocblocks; | ||
36 | __u16 blocksize; | ||
37 | __u16 free; | ||
38 | }; | ||
39 | |||
40 | struct smb_conn_opt { | ||
41 | |||
42 | /* The socket */ | ||
43 | unsigned int fd; | ||
44 | |||
45 | enum smb_protocol protocol; | ||
46 | enum smb_case_hndl case_handling; | ||
47 | |||
48 | /* Connection-Options */ | ||
49 | |||
50 | __u32 max_xmit; | ||
51 | __u16 server_uid; | ||
52 | __u16 tid; | ||
53 | |||
54 | /* The following are LANMAN 1.0 options */ | ||
55 | __u16 secmode; | ||
56 | __u16 maxmux; | ||
57 | __u16 maxvcs; | ||
58 | __u16 rawmode; | ||
59 | __u32 sesskey; | ||
60 | |||
61 | /* The following are NT LM 0.12 options */ | ||
62 | __u32 maxraw; | ||
63 | __u32 capabilities; | ||
64 | __s16 serverzone; | ||
65 | }; | ||
66 | |||
67 | #ifdef __KERNEL__ | ||
68 | |||
69 | #define SMB_NLS_MAXNAMELEN 20 | ||
70 | struct smb_nls_codepage { | ||
71 | char local_name[SMB_NLS_MAXNAMELEN]; | ||
72 | char remote_name[SMB_NLS_MAXNAMELEN]; | ||
73 | }; | ||
74 | |||
75 | |||
76 | #define SMB_MAXNAMELEN 255 | ||
77 | #define SMB_MAXPATHLEN 1024 | ||
78 | |||
79 | /* | ||
80 | * Contains all relevant data on a SMB networked file. | ||
81 | */ | ||
82 | struct smb_fattr { | ||
83 | __u16 attr; | ||
84 | |||
85 | unsigned long f_ino; | ||
86 | umode_t f_mode; | ||
87 | nlink_t f_nlink; | ||
88 | uid_t f_uid; | ||
89 | gid_t f_gid; | ||
90 | dev_t f_rdev; | ||
91 | loff_t f_size; | ||
92 | struct timespec f_atime; | ||
93 | struct timespec f_mtime; | ||
94 | struct timespec f_ctime; | ||
95 | unsigned long f_blocks; | ||
96 | int f_unix; | ||
97 | }; | ||
98 | |||
99 | enum smb_conn_state { | ||
100 | CONN_VALID, /* everything's fine */ | ||
101 | CONN_INVALID, /* Something went wrong, but did not | ||
102 | try to reconnect yet. */ | ||
103 | CONN_RETRIED, /* Tried a reconnection, but was refused */ | ||
104 | CONN_RETRYING /* Currently trying to reconnect */ | ||
105 | }; | ||
106 | |||
107 | #define SMB_HEADER_LEN 37 /* includes everything up to, but not | ||
108 | * including smb_bcc */ | ||
109 | |||
110 | #define SMB_INITIAL_PACKET_SIZE 4000 | ||
111 | #define SMB_MAX_PACKET_SIZE 32768 | ||
112 | |||
113 | /* reserve this much space for trans2 parameters. Shouldn't have to be more | ||
114 | than 10 or so, but OS/2 seems happier like this. */ | ||
115 | #define SMB_TRANS2_MAX_PARAM 64 | ||
116 | |||
117 | #endif | ||
118 | #endif | ||
diff --git a/include/linux/smb_fs.h b/include/linux/smb_fs.h deleted file mode 100644 index 923cd8a247b1..000000000000 --- a/include/linux/smb_fs.h +++ /dev/null | |||
@@ -1,153 +0,0 @@ | |||
1 | /* | ||
2 | * smb_fs.h | ||
3 | * | ||
4 | * Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke | ||
5 | * Copyright (C) 1997 by Volker Lendecke | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _LINUX_SMB_FS_H | ||
10 | #define _LINUX_SMB_FS_H | ||
11 | |||
12 | #include <linux/smb.h> | ||
13 | |||
14 | /* | ||
15 | * ioctl commands | ||
16 | */ | ||
17 | #define SMB_IOC_GETMOUNTUID _IOR('u', 1, __kernel_old_uid_t) | ||
18 | #define SMB_IOC_NEWCONN _IOW('u', 2, struct smb_conn_opt) | ||
19 | |||
20 | /* __kernel_uid_t can never change, so we have to use __kernel_uid32_t */ | ||
21 | #define SMB_IOC_GETMOUNTUID32 _IOR('u', 3, __kernel_uid32_t) | ||
22 | |||
23 | |||
24 | #ifdef __KERNEL__ | ||
25 | #include <linux/smb_fs_i.h> | ||
26 | #include <linux/smb_fs_sb.h> | ||
27 | |||
28 | #include <linux/fs.h> | ||
29 | #include <linux/pagemap.h> | ||
30 | #include <linux/vmalloc.h> | ||
31 | #include <linux/smb_mount.h> | ||
32 | #include <linux/jiffies.h> | ||
33 | #include <asm/unaligned.h> | ||
34 | |||
35 | static inline struct smb_sb_info *SMB_SB(struct super_block *sb) | ||
36 | { | ||
37 | return sb->s_fs_info; | ||
38 | } | ||
39 | |||
40 | static inline struct smb_inode_info *SMB_I(struct inode *inode) | ||
41 | { | ||
42 | return container_of(inode, struct smb_inode_info, vfs_inode); | ||
43 | } | ||
44 | |||
45 | /* macro names are short for word, double-word, long value (?) */ | ||
46 | #define WVAL(buf, pos) (get_unaligned_le16((u8 *)(buf) + (pos))) | ||
47 | #define DVAL(buf, pos) (get_unaligned_le32((u8 *)(buf) + (pos))) | ||
48 | #define LVAL(buf, pos) (get_unaligned_le64((u8 *)(buf) + (pos))) | ||
49 | |||
50 | #define WSET(buf, pos, val) put_unaligned_le16((val), (u8 *)(buf) + (pos)) | ||
51 | #define DSET(buf, pos, val) put_unaligned_le32((val), (u8 *)(buf) + (pos)) | ||
52 | #define LSET(buf, pos, val) put_unaligned_le64((val), (u8 *)(buf) + (pos)) | ||
53 | |||
54 | /* where to find the base of the SMB packet proper */ | ||
55 | #define smb_base(buf) ((u8 *)(((u8 *)(buf))+4)) | ||
56 | |||
57 | /* | ||
58 | * Flags for the in-memory inode | ||
59 | */ | ||
60 | #define SMB_F_LOCALWRITE 0x02 /* file modified locally */ | ||
61 | |||
62 | |||
63 | /* NT1 protocol capability bits */ | ||
64 | #define SMB_CAP_RAW_MODE 0x00000001 | ||
65 | #define SMB_CAP_MPX_MODE 0x00000002 | ||
66 | #define SMB_CAP_UNICODE 0x00000004 | ||
67 | #define SMB_CAP_LARGE_FILES 0x00000008 | ||
68 | #define SMB_CAP_NT_SMBS 0x00000010 | ||
69 | #define SMB_CAP_RPC_REMOTE_APIS 0x00000020 | ||
70 | #define SMB_CAP_STATUS32 0x00000040 | ||
71 | #define SMB_CAP_LEVEL_II_OPLOCKS 0x00000080 | ||
72 | #define SMB_CAP_LOCK_AND_READ 0x00000100 | ||
73 | #define SMB_CAP_NT_FIND 0x00000200 | ||
74 | #define SMB_CAP_DFS 0x00001000 | ||
75 | #define SMB_CAP_LARGE_READX 0x00004000 | ||
76 | #define SMB_CAP_LARGE_WRITEX 0x00008000 | ||
77 | #define SMB_CAP_UNIX 0x00800000 /* unofficial ... */ | ||
78 | |||
79 | |||
80 | /* | ||
81 | * This is the time we allow an inode, dentry or dir cache to live. It is bad | ||
82 | * for performance to have shorter ttl on an inode than on the cache. It can | ||
83 | * cause refresh on each inode for a dir listing ... one-by-one | ||
84 | */ | ||
85 | #define SMB_MAX_AGE(server) (((server)->mnt->ttl * HZ) / 1000) | ||
86 | |||
87 | static inline void | ||
88 | smb_age_dentry(struct smb_sb_info *server, struct dentry *dentry) | ||
89 | { | ||
90 | dentry->d_time = jiffies - SMB_MAX_AGE(server); | ||
91 | } | ||
92 | |||
93 | struct smb_cache_head { | ||
94 | time_t mtime; /* unused */ | ||
95 | unsigned long time; /* cache age */ | ||
96 | unsigned long end; /* last valid fpos in cache */ | ||
97 | int eof; | ||
98 | }; | ||
99 | |||
100 | #define SMB_DIRCACHE_SIZE ((int)(PAGE_CACHE_SIZE/sizeof(struct dentry *))) | ||
101 | union smb_dir_cache { | ||
102 | struct smb_cache_head head; | ||
103 | struct dentry *dentry[SMB_DIRCACHE_SIZE]; | ||
104 | }; | ||
105 | |||
106 | #define SMB_FIRSTCACHE_SIZE ((int)((SMB_DIRCACHE_SIZE * \ | ||
107 | sizeof(struct dentry *) - sizeof(struct smb_cache_head)) / \ | ||
108 | sizeof(struct dentry *))) | ||
109 | |||
110 | #define SMB_DIRCACHE_START (SMB_DIRCACHE_SIZE - SMB_FIRSTCACHE_SIZE) | ||
111 | |||
112 | struct smb_cache_control { | ||
113 | struct smb_cache_head head; | ||
114 | struct page *page; | ||
115 | union smb_dir_cache *cache; | ||
116 | unsigned long fpos, ofs; | ||
117 | int filled, valid, idx; | ||
118 | }; | ||
119 | |||
120 | #define SMB_OPS_NUM_STATIC 5 | ||
121 | struct smb_ops { | ||
122 | int (*read)(struct inode *inode, loff_t offset, int count, | ||
123 | char *data); | ||
124 | int (*write)(struct inode *inode, loff_t offset, int count, const | ||
125 | char *data); | ||
126 | int (*readdir)(struct file *filp, void *dirent, filldir_t filldir, | ||
127 | struct smb_cache_control *ctl); | ||
128 | |||
129 | int (*getattr)(struct smb_sb_info *server, struct dentry *dir, | ||
130 | struct smb_fattr *fattr); | ||
131 | /* int (*setattr)(...); */ /* setattr is really icky! */ | ||
132 | |||
133 | int (*truncate)(struct inode *inode, loff_t length); | ||
134 | |||
135 | |||
136 | /* --- --- --- end of "static" entries --- --- --- */ | ||
137 | |||
138 | int (*convert)(unsigned char *output, int olen, | ||
139 | const unsigned char *input, int ilen, | ||
140 | struct nls_table *nls_from, | ||
141 | struct nls_table *nls_to); | ||
142 | }; | ||
143 | |||
144 | static inline int | ||
145 | smb_is_open(struct inode *i) | ||
146 | { | ||
147 | return (SMB_I(i)->open == server_from_inode(i)->generation); | ||
148 | } | ||
149 | |||
150 | extern void smb_install_null_ops(struct smb_ops *); | ||
151 | #endif /* __KERNEL__ */ | ||
152 | |||
153 | #endif /* _LINUX_SMB_FS_H */ | ||
diff --git a/include/linux/smb_fs_i.h b/include/linux/smb_fs_i.h deleted file mode 100644 index 8ccf4eca2c3d..000000000000 --- a/include/linux/smb_fs_i.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * smb_fs_i.h | ||
3 | * | ||
4 | * Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke | ||
5 | * Copyright (C) 1997 by Volker Lendecke | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _LINUX_SMB_FS_I | ||
10 | #define _LINUX_SMB_FS_I | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | #include <linux/fs.h> | ||
14 | |||
15 | /* | ||
16 | * smb fs inode data (in memory only) | ||
17 | */ | ||
18 | struct smb_inode_info { | ||
19 | |||
20 | /* | ||
21 | * file handles are local to a connection. A file is open if | ||
22 | * (open == generation). | ||
23 | */ | ||
24 | unsigned int open; /* open generation */ | ||
25 | __u16 fileid; /* What id to handle a file with? */ | ||
26 | __u16 attr; /* Attribute fields, DOS value */ | ||
27 | |||
28 | __u16 access; /* Access mode */ | ||
29 | __u16 flags; | ||
30 | unsigned long oldmtime; /* last time refreshed */ | ||
31 | unsigned long closed; /* timestamp when closed */ | ||
32 | unsigned openers; /* number of fileid users */ | ||
33 | |||
34 | struct inode vfs_inode; /* must be at the end */ | ||
35 | }; | ||
36 | |||
37 | #endif | ||
diff --git a/include/linux/smb_fs_sb.h b/include/linux/smb_fs_sb.h deleted file mode 100644 index bb947dd1fba9..000000000000 --- a/include/linux/smb_fs_sb.h +++ /dev/null | |||
@@ -1,100 +0,0 @@ | |||
1 | /* | ||
2 | * smb_fs_sb.h | ||
3 | * | ||
4 | * Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke | ||
5 | * Copyright (C) 1997 by Volker Lendecke | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _SMB_FS_SB | ||
10 | #define _SMB_FS_SB | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | #include <linux/backing-dev.h> | ||
14 | #include <linux/smb.h> | ||
15 | |||
16 | /* | ||
17 | * Upper limit on the total number of active smb_request structs. | ||
18 | */ | ||
19 | #define MAX_REQUEST_HARD 256 | ||
20 | |||
21 | enum smb_receive_state { | ||
22 | SMB_RECV_START, /* No data read, looking for length + sig */ | ||
23 | SMB_RECV_HEADER, /* Reading the header data */ | ||
24 | SMB_RECV_HCOMPLETE, /* Done with the header */ | ||
25 | SMB_RECV_PARAM, /* Reading parameter words */ | ||
26 | SMB_RECV_DATA, /* Reading data bytes */ | ||
27 | SMB_RECV_END, /* End of request */ | ||
28 | SMB_RECV_DROP, /* Dropping this SMB */ | ||
29 | SMB_RECV_REQUEST, /* Received a request and not a reply */ | ||
30 | }; | ||
31 | |||
32 | /* structure access macros */ | ||
33 | #define server_from_inode(inode) SMB_SB((inode)->i_sb) | ||
34 | #define server_from_dentry(dentry) SMB_SB((dentry)->d_sb) | ||
35 | #define SB_of(server) ((server)->super_block) | ||
36 | |||
37 | struct smb_sb_info { | ||
38 | /* List of all smbfs superblocks */ | ||
39 | struct list_head entry; | ||
40 | |||
41 | enum smb_conn_state state; | ||
42 | struct file * sock_file; | ||
43 | int conn_error; | ||
44 | enum smb_receive_state rstate; | ||
45 | |||
46 | atomic_t nr_requests; | ||
47 | struct list_head xmitq; | ||
48 | struct list_head recvq; | ||
49 | u16 mid; | ||
50 | |||
51 | struct smb_mount_data_kernel *mnt; | ||
52 | |||
53 | /* Connections are counted. Each time a new socket arrives, | ||
54 | * generation is incremented. | ||
55 | */ | ||
56 | unsigned int generation; | ||
57 | struct pid *conn_pid; | ||
58 | struct smb_conn_opt opt; | ||
59 | wait_queue_head_t conn_wq; | ||
60 | int conn_complete; | ||
61 | struct semaphore sem; | ||
62 | |||
63 | unsigned char header[SMB_HEADER_LEN + 20*2 + 2]; | ||
64 | u32 header_len; | ||
65 | u32 smb_len; | ||
66 | u32 smb_read; | ||
67 | |||
68 | /* We use our own data_ready callback, but need the original one */ | ||
69 | void *data_ready; | ||
70 | |||
71 | /* nls pointers for codepage conversions */ | ||
72 | struct nls_table *remote_nls; | ||
73 | struct nls_table *local_nls; | ||
74 | |||
75 | struct smb_ops *ops; | ||
76 | |||
77 | struct super_block *super_block; | ||
78 | |||
79 | struct backing_dev_info bdi; | ||
80 | }; | ||
81 | |||
82 | static inline int | ||
83 | smb_lock_server_interruptible(struct smb_sb_info *server) | ||
84 | { | ||
85 | return down_interruptible(&(server->sem)); | ||
86 | } | ||
87 | |||
88 | static inline void | ||
89 | smb_lock_server(struct smb_sb_info *server) | ||
90 | { | ||
91 | down(&(server->sem)); | ||
92 | } | ||
93 | |||
94 | static inline void | ||
95 | smb_unlock_server(struct smb_sb_info *server) | ||
96 | { | ||
97 | up(&(server->sem)); | ||
98 | } | ||
99 | |||
100 | #endif | ||
diff --git a/include/linux/smb_mount.h b/include/linux/smb_mount.h deleted file mode 100644 index d10f00cb5703..000000000000 --- a/include/linux/smb_mount.h +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | /* | ||
2 | * smb_mount.h | ||
3 | * | ||
4 | * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke | ||
5 | * Copyright (C) 1997 by Volker Lendecke | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _LINUX_SMB_MOUNT_H | ||
10 | #define _LINUX_SMB_MOUNT_H | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | |||
14 | #define SMB_MOUNT_VERSION 6 | ||
15 | |||
16 | struct smb_mount_data { | ||
17 | int version; | ||
18 | __kernel_uid_t mounted_uid; /* Who may umount() this filesystem? */ | ||
19 | __kernel_uid_t uid; | ||
20 | __kernel_gid_t gid; | ||
21 | __kernel_mode_t file_mode; | ||
22 | __kernel_mode_t dir_mode; | ||
23 | }; | ||
24 | |||
25 | |||
26 | #ifdef __KERNEL__ | ||
27 | |||
28 | /* "vers" in big-endian */ | ||
29 | #define SMB_MOUNT_ASCII 0x76657273 | ||
30 | |||
31 | #define SMB_MOUNT_OLDVERSION 6 | ||
32 | #undef SMB_MOUNT_VERSION | ||
33 | #define SMB_MOUNT_VERSION 7 | ||
34 | |||
35 | /* flags */ | ||
36 | #define SMB_MOUNT_WIN95 0x0001 /* Win 95 server */ | ||
37 | #define SMB_MOUNT_OLDATTR 0x0002 /* Use core getattr (Win 95 speedup) */ | ||
38 | #define SMB_MOUNT_DIRATTR 0x0004 /* Use find_first for getattr */ | ||
39 | #define SMB_MOUNT_CASE 0x0008 /* Be case sensitive */ | ||
40 | #define SMB_MOUNT_UNICODE 0x0010 /* Server talks unicode */ | ||
41 | #define SMB_MOUNT_UID 0x0020 /* Use user specified uid */ | ||
42 | #define SMB_MOUNT_GID 0x0040 /* Use user specified gid */ | ||
43 | #define SMB_MOUNT_FMODE 0x0080 /* Use user specified file mode */ | ||
44 | #define SMB_MOUNT_DMODE 0x0100 /* Use user specified dir mode */ | ||
45 | |||
46 | struct smb_mount_data_kernel { | ||
47 | int version; | ||
48 | |||
49 | uid_t mounted_uid; /* Who may umount() this filesystem? */ | ||
50 | uid_t uid; | ||
51 | gid_t gid; | ||
52 | mode_t file_mode; | ||
53 | mode_t dir_mode; | ||
54 | |||
55 | u32 flags; | ||
56 | |||
57 | /* maximum age in jiffies (inode, dentry and dircache) */ | ||
58 | int ttl; | ||
59 | |||
60 | struct smb_nls_codepage codepage; | ||
61 | }; | ||
62 | |||
63 | #endif | ||
64 | |||
65 | #endif | ||
diff --git a/include/linux/smbno.h b/include/linux/smbno.h deleted file mode 100644 index f99e02d9ffe2..000000000000 --- a/include/linux/smbno.h +++ /dev/null | |||
@@ -1,363 +0,0 @@ | |||
1 | #ifndef _SMBNO_H_ | ||
2 | #define _SMBNO_H_ | ||
3 | |||
4 | /* these define the attribute byte as seen by DOS */ | ||
5 | #define aRONLY (1L<<0) | ||
6 | #define aHIDDEN (1L<<1) | ||
7 | #define aSYSTEM (1L<<2) | ||
8 | #define aVOLID (1L<<3) | ||
9 | #define aDIR (1L<<4) | ||
10 | #define aARCH (1L<<5) | ||
11 | |||
12 | /* error classes */ | ||
13 | #define SUCCESS 0 /* The request was successful. */ | ||
14 | #define ERRDOS 0x01 /* Error is from the core DOS operating system set. */ | ||
15 | #define ERRSRV 0x02 /* Error is generated by the server network file manager.*/ | ||
16 | #define ERRHRD 0x03 /* Error is an hardware error. */ | ||
17 | #define ERRCMD 0xFF /* Command was not in the "SMB" format. */ | ||
18 | |||
19 | /* SMB X/Open error codes for the ERRdos error class */ | ||
20 | |||
21 | #define ERRbadfunc 1 /* Invalid function (or system call) */ | ||
22 | #define ERRbadfile 2 /* File not found (pathname error) */ | ||
23 | #define ERRbadpath 3 /* Directory not found */ | ||
24 | #define ERRnofids 4 /* Too many open files */ | ||
25 | #define ERRnoaccess 5 /* Access denied */ | ||
26 | #define ERRbadfid 6 /* Invalid fid */ | ||
27 | #define ERRbadmcb 7 /* Memory control blocks destroyed */ | ||
28 | #define ERRnomem 8 /* Out of memory */ | ||
29 | #define ERRbadmem 9 /* Invalid memory block address */ | ||
30 | #define ERRbadenv 10 /* Invalid environment */ | ||
31 | #define ERRbadformat 11 /* Invalid format */ | ||
32 | #define ERRbadaccess 12 /* Invalid open mode */ | ||
33 | #define ERRbaddata 13 /* Invalid data (only from ioctl call) */ | ||
34 | #define ERRres 14 /* reserved */ | ||
35 | #define ERRbaddrive 15 /* Invalid drive */ | ||
36 | #define ERRremcd 16 /* Attempt to delete current directory */ | ||
37 | #define ERRdiffdevice 17 /* rename/move across different filesystems */ | ||
38 | #define ERRnofiles 18 /* no more files found in file search */ | ||
39 | #define ERRbadshare 32 /* Share mode on file conflict with open mode */ | ||
40 | #define ERRlock 33 /* Lock request conflicts with existing lock */ | ||
41 | #define ERRfilexists 80 /* File in operation already exists */ | ||
42 | #define ERRbadpipe 230 /* Named pipe invalid */ | ||
43 | #define ERRpipebusy 231 /* All instances of pipe are busy */ | ||
44 | #define ERRpipeclosing 232 /* named pipe close in progress */ | ||
45 | #define ERRnotconnected 233 /* No process on other end of named pipe */ | ||
46 | #define ERRmoredata 234 /* More data to be returned */ | ||
47 | |||
48 | #define ERROR_INVALID_PARAMETER 87 | ||
49 | #define ERROR_DISK_FULL 112 | ||
50 | #define ERROR_INVALID_NAME 123 | ||
51 | #define ERROR_DIR_NOT_EMPTY 145 | ||
52 | #define ERROR_NOT_LOCKED 158 | ||
53 | #define ERROR_ALREADY_EXISTS 183 /* see also 80 ? */ | ||
54 | #define ERROR_EAS_DIDNT_FIT 275 /* Extended attributes didn't fit */ | ||
55 | #define ERROR_EAS_NOT_SUPPORTED 282 /* Extended attributes not supported */ | ||
56 | |||
57 | /* Error codes for the ERRSRV class */ | ||
58 | |||
59 | #define ERRerror 1 /* Non specific error code */ | ||
60 | #define ERRbadpw 2 /* Bad password */ | ||
61 | #define ERRbadtype 3 /* reserved */ | ||
62 | #define ERRaccess 4 /* No permissions to do the requested operation */ | ||
63 | #define ERRinvnid 5 /* tid invalid */ | ||
64 | #define ERRinvnetname 6 /* Invalid servername */ | ||
65 | #define ERRinvdevice 7 /* Invalid device */ | ||
66 | #define ERRqfull 49 /* Print queue full */ | ||
67 | #define ERRqtoobig 50 /* Queued item too big */ | ||
68 | #define ERRinvpfid 52 /* Invalid print file in smb_fid */ | ||
69 | #define ERRsmbcmd 64 /* Unrecognised command */ | ||
70 | #define ERRsrverror 65 /* smb server internal error */ | ||
71 | #define ERRfilespecs 67 /* fid and pathname invalid combination */ | ||
72 | #define ERRbadlink 68 /* reserved */ | ||
73 | #define ERRbadpermits 69 /* Access specified for a file is not valid */ | ||
74 | #define ERRbadpid 70 /* reserved */ | ||
75 | #define ERRsetattrmode 71 /* attribute mode invalid */ | ||
76 | #define ERRpaused 81 /* Message server paused */ | ||
77 | #define ERRmsgoff 82 /* Not receiving messages */ | ||
78 | #define ERRnoroom 83 /* No room for message */ | ||
79 | #define ERRrmuns 87 /* too many remote usernames */ | ||
80 | #define ERRtimeout 88 /* operation timed out */ | ||
81 | #define ERRnoresource 89 /* No resources currently available for request. */ | ||
82 | #define ERRtoomanyuids 90 /* too many userids */ | ||
83 | #define ERRbaduid 91 /* bad userid */ | ||
84 | #define ERRuseMPX 250 /* temporarily unable to use raw mode, use MPX mode */ | ||
85 | #define ERRuseSTD 251 /* temporarily unable to use raw mode, use std.mode */ | ||
86 | #define ERRcontMPX 252 /* resume MPX mode */ | ||
87 | #define ERRbadPW /* reserved */ | ||
88 | #define ERRnosupport 0xFFFF | ||
89 | |||
90 | /* Error codes for the ERRHRD class */ | ||
91 | |||
92 | #define ERRnowrite 19 /* read only media */ | ||
93 | #define ERRbadunit 20 /* Unknown device */ | ||
94 | #define ERRnotready 21 /* Drive not ready */ | ||
95 | #define ERRbadcmd 22 /* Unknown command */ | ||
96 | #define ERRdata 23 /* Data (CRC) error */ | ||
97 | #define ERRbadreq 24 /* Bad request structure length */ | ||
98 | #define ERRseek 25 | ||
99 | #define ERRbadmedia 26 | ||
100 | #define ERRbadsector 27 | ||
101 | #define ERRnopaper 28 | ||
102 | #define ERRwrite 29 /* write fault */ | ||
103 | #define ERRread 30 /* read fault */ | ||
104 | #define ERRgeneral 31 /* General hardware failure */ | ||
105 | #define ERRwrongdisk 34 | ||
106 | #define ERRFCBunavail 35 | ||
107 | #define ERRsharebufexc 36 /* share buffer exceeded */ | ||
108 | #define ERRdiskfull 39 | ||
109 | |||
110 | /* | ||
111 | * Access modes when opening a file | ||
112 | */ | ||
113 | #define SMB_ACCMASK 0x0003 | ||
114 | #define SMB_O_RDONLY 0x0000 | ||
115 | #define SMB_O_WRONLY 0x0001 | ||
116 | #define SMB_O_RDWR 0x0002 | ||
117 | |||
118 | /* offsets into message for common items */ | ||
119 | #define smb_com 8 | ||
120 | #define smb_rcls 9 | ||
121 | #define smb_reh 10 | ||
122 | #define smb_err 11 | ||
123 | #define smb_flg 13 | ||
124 | #define smb_flg2 14 | ||
125 | #define smb_reb 13 | ||
126 | #define smb_tid 28 | ||
127 | #define smb_pid 30 | ||
128 | #define smb_uid 32 | ||
129 | #define smb_mid 34 | ||
130 | #define smb_wct 36 | ||
131 | #define smb_vwv 37 | ||
132 | #define smb_vwv0 37 | ||
133 | #define smb_vwv1 39 | ||
134 | #define smb_vwv2 41 | ||
135 | #define smb_vwv3 43 | ||
136 | #define smb_vwv4 45 | ||
137 | #define smb_vwv5 47 | ||
138 | #define smb_vwv6 49 | ||
139 | #define smb_vwv7 51 | ||
140 | #define smb_vwv8 53 | ||
141 | #define smb_vwv9 55 | ||
142 | #define smb_vwv10 57 | ||
143 | #define smb_vwv11 59 | ||
144 | #define smb_vwv12 61 | ||
145 | #define smb_vwv13 63 | ||
146 | #define smb_vwv14 65 | ||
147 | |||
148 | /* these are the trans2 sub fields for primary requests */ | ||
149 | #define smb_tpscnt smb_vwv0 | ||
150 | #define smb_tdscnt smb_vwv1 | ||
151 | #define smb_mprcnt smb_vwv2 | ||
152 | #define smb_mdrcnt smb_vwv3 | ||
153 | #define smb_msrcnt smb_vwv4 | ||
154 | #define smb_flags smb_vwv5 | ||
155 | #define smb_timeout smb_vwv6 | ||
156 | #define smb_pscnt smb_vwv9 | ||
157 | #define smb_psoff smb_vwv10 | ||
158 | #define smb_dscnt smb_vwv11 | ||
159 | #define smb_dsoff smb_vwv12 | ||
160 | #define smb_suwcnt smb_vwv13 | ||
161 | #define smb_setup smb_vwv14 | ||
162 | #define smb_setup0 smb_setup | ||
163 | #define smb_setup1 (smb_setup+2) | ||
164 | #define smb_setup2 (smb_setup+4) | ||
165 | |||
166 | /* these are for the secondary requests */ | ||
167 | #define smb_spscnt smb_vwv2 | ||
168 | #define smb_spsoff smb_vwv3 | ||
169 | #define smb_spsdisp smb_vwv4 | ||
170 | #define smb_sdscnt smb_vwv5 | ||
171 | #define smb_sdsoff smb_vwv6 | ||
172 | #define smb_sdsdisp smb_vwv7 | ||
173 | #define smb_sfid smb_vwv8 | ||
174 | |||
175 | /* and these for responses */ | ||
176 | #define smb_tprcnt smb_vwv0 | ||
177 | #define smb_tdrcnt smb_vwv1 | ||
178 | #define smb_prcnt smb_vwv3 | ||
179 | #define smb_proff smb_vwv4 | ||
180 | #define smb_prdisp smb_vwv5 | ||
181 | #define smb_drcnt smb_vwv6 | ||
182 | #define smb_droff smb_vwv7 | ||
183 | #define smb_drdisp smb_vwv8 | ||
184 | |||
185 | /* the complete */ | ||
186 | #define SMBmkdir 0x00 /* create directory */ | ||
187 | #define SMBrmdir 0x01 /* delete directory */ | ||
188 | #define SMBopen 0x02 /* open file */ | ||
189 | #define SMBcreate 0x03 /* create file */ | ||
190 | #define SMBclose 0x04 /* close file */ | ||
191 | #define SMBflush 0x05 /* flush file */ | ||
192 | #define SMBunlink 0x06 /* delete file */ | ||
193 | #define SMBmv 0x07 /* rename file */ | ||
194 | #define SMBgetatr 0x08 /* get file attributes */ | ||
195 | #define SMBsetatr 0x09 /* set file attributes */ | ||
196 | #define SMBread 0x0A /* read from file */ | ||
197 | #define SMBwrite 0x0B /* write to file */ | ||
198 | #define SMBlock 0x0C /* lock byte range */ | ||
199 | #define SMBunlock 0x0D /* unlock byte range */ | ||
200 | #define SMBctemp 0x0E /* create temporary file */ | ||
201 | #define SMBmknew 0x0F /* make new file */ | ||
202 | #define SMBchkpth 0x10 /* check directory path */ | ||
203 | #define SMBexit 0x11 /* process exit */ | ||
204 | #define SMBlseek 0x12 /* seek */ | ||
205 | #define SMBtcon 0x70 /* tree connect */ | ||
206 | #define SMBtconX 0x75 /* tree connect and X*/ | ||
207 | #define SMBtdis 0x71 /* tree disconnect */ | ||
208 | #define SMBnegprot 0x72 /* negotiate protocol */ | ||
209 | #define SMBdskattr 0x80 /* get disk attributes */ | ||
210 | #define SMBsearch 0x81 /* search directory */ | ||
211 | #define SMBsplopen 0xC0 /* open print spool file */ | ||
212 | #define SMBsplwr 0xC1 /* write to print spool file */ | ||
213 | #define SMBsplclose 0xC2 /* close print spool file */ | ||
214 | #define SMBsplretq 0xC3 /* return print queue */ | ||
215 | #define SMBsends 0xD0 /* send single block message */ | ||
216 | #define SMBsendb 0xD1 /* send broadcast message */ | ||
217 | #define SMBfwdname 0xD2 /* forward user name */ | ||
218 | #define SMBcancelf 0xD3 /* cancel forward */ | ||
219 | #define SMBgetmac 0xD4 /* get machine name */ | ||
220 | #define SMBsendstrt 0xD5 /* send start of multi-block message */ | ||
221 | #define SMBsendend 0xD6 /* send end of multi-block message */ | ||
222 | #define SMBsendtxt 0xD7 /* send text of multi-block message */ | ||
223 | |||
224 | /* Core+ protocol */ | ||
225 | #define SMBlockread 0x13 /* Lock a range and read */ | ||
226 | #define SMBwriteunlock 0x14 /* Unlock a range then write */ | ||
227 | #define SMBreadbraw 0x1a /* read a block of data with no smb header */ | ||
228 | #define SMBwritebraw 0x1d /* write a block of data with no smb header */ | ||
229 | #define SMBwritec 0x20 /* secondary write request */ | ||
230 | #define SMBwriteclose 0x2c /* write a file then close it */ | ||
231 | |||
232 | /* dos extended protocol */ | ||
233 | #define SMBreadBraw 0x1A /* read block raw */ | ||
234 | #define SMBreadBmpx 0x1B /* read block multiplexed */ | ||
235 | #define SMBreadBs 0x1C /* read block (secondary response) */ | ||
236 | #define SMBwriteBraw 0x1D /* write block raw */ | ||
237 | #define SMBwriteBmpx 0x1E /* write block multiplexed */ | ||
238 | #define SMBwriteBs 0x1F /* write block (secondary request) */ | ||
239 | #define SMBwriteC 0x20 /* write complete response */ | ||
240 | #define SMBsetattrE 0x22 /* set file attributes expanded */ | ||
241 | #define SMBgetattrE 0x23 /* get file attributes expanded */ | ||
242 | #define SMBlockingX 0x24 /* lock/unlock byte ranges and X */ | ||
243 | #define SMBtrans 0x25 /* transaction - name, bytes in/out */ | ||
244 | #define SMBtranss 0x26 /* transaction (secondary request/response) */ | ||
245 | #define SMBioctl 0x27 /* IOCTL */ | ||
246 | #define SMBioctls 0x28 /* IOCTL (secondary request/response) */ | ||
247 | #define SMBcopy 0x29 /* copy */ | ||
248 | #define SMBmove 0x2A /* move */ | ||
249 | #define SMBecho 0x2B /* echo */ | ||
250 | #define SMBopenX 0x2D /* open and X */ | ||
251 | #define SMBreadX 0x2E /* read and X */ | ||
252 | #define SMBwriteX 0x2F /* write and X */ | ||
253 | #define SMBsesssetupX 0x73 /* Session Set Up & X (including User Logon) */ | ||
254 | #define SMBtconX 0x75 /* tree connect and X */ | ||
255 | #define SMBffirst 0x82 /* find first */ | ||
256 | #define SMBfunique 0x83 /* find unique */ | ||
257 | #define SMBfclose 0x84 /* find close */ | ||
258 | #define SMBinvalid 0xFE /* invalid command */ | ||
259 | |||
260 | |||
261 | /* Extended 2.0 protocol */ | ||
262 | #define SMBtrans2 0x32 /* TRANS2 protocol set */ | ||
263 | #define SMBtranss2 0x33 /* TRANS2 protocol set, secondary command */ | ||
264 | #define SMBfindclose 0x34 /* Terminate a TRANSACT2_FINDFIRST */ | ||
265 | #define SMBfindnclose 0x35 /* Terminate a TRANSACT2_FINDNOTIFYFIRST */ | ||
266 | #define SMBulogoffX 0x74 /* user logoff */ | ||
267 | |||
268 | /* these are the TRANS2 sub commands */ | ||
269 | #define TRANSACT2_OPEN 0 | ||
270 | #define TRANSACT2_FINDFIRST 1 | ||
271 | #define TRANSACT2_FINDNEXT 2 | ||
272 | #define TRANSACT2_QFSINFO 3 | ||
273 | #define TRANSACT2_SETFSINFO 4 | ||
274 | #define TRANSACT2_QPATHINFO 5 | ||
275 | #define TRANSACT2_SETPATHINFO 6 | ||
276 | #define TRANSACT2_QFILEINFO 7 | ||
277 | #define TRANSACT2_SETFILEINFO 8 | ||
278 | #define TRANSACT2_FSCTL 9 | ||
279 | #define TRANSACT2_IOCTL 10 | ||
280 | #define TRANSACT2_FINDNOTIFYFIRST 11 | ||
281 | #define TRANSACT2_FINDNOTIFYNEXT 12 | ||
282 | #define TRANSACT2_MKDIR 13 | ||
283 | |||
284 | /* Information Levels - Shared? */ | ||
285 | #define SMB_INFO_STANDARD 1 | ||
286 | #define SMB_INFO_QUERY_EA_SIZE 2 | ||
287 | #define SMB_INFO_QUERY_EAS_FROM_LIST 3 | ||
288 | #define SMB_INFO_QUERY_ALL_EAS 4 | ||
289 | #define SMB_INFO_IS_NAME_VALID 6 | ||
290 | |||
291 | /* Information Levels - TRANSACT2_FINDFIRST */ | ||
292 | #define SMB_FIND_FILE_DIRECTORY_INFO 0x101 | ||
293 | #define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102 | ||
294 | #define SMB_FIND_FILE_NAMES_INFO 0x103 | ||
295 | #define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104 | ||
296 | |||
297 | /* Information Levels - TRANSACT2_QPATHINFO */ | ||
298 | #define SMB_QUERY_FILE_BASIC_INFO 0x101 | ||
299 | #define SMB_QUERY_FILE_STANDARD_INFO 0x102 | ||
300 | #define SMB_QUERY_FILE_EA_INFO 0x103 | ||
301 | #define SMB_QUERY_FILE_NAME_INFO 0x104 | ||
302 | #define SMB_QUERY_FILE_ALL_INFO 0x107 | ||
303 | #define SMB_QUERY_FILE_ALT_NAME_INFO 0x108 | ||
304 | #define SMB_QUERY_FILE_STREAM_INFO 0x109 | ||
305 | #define SMB_QUERY_FILE_COMPRESSION_INFO 0x10b | ||
306 | |||
307 | /* Information Levels - TRANSACT2_SETFILEINFO */ | ||
308 | #define SMB_SET_FILE_BASIC_INFO 0x101 | ||
309 | #define SMB_SET_FILE_DISPOSITION_INFO 0x102 | ||
310 | #define SMB_SET_FILE_ALLOCATION_INFO 0x103 | ||
311 | #define SMB_SET_FILE_END_OF_FILE_INFO 0x104 | ||
312 | |||
313 | /* smb_flg field flags */ | ||
314 | #define SMB_FLAGS_SUPPORT_LOCKREAD 0x01 | ||
315 | #define SMB_FLAGS_CLIENT_BUF_AVAIL 0x02 | ||
316 | #define SMB_FLAGS_RESERVED 0x04 | ||
317 | #define SMB_FLAGS_CASELESS_PATHNAMES 0x08 | ||
318 | #define SMB_FLAGS_CANONICAL_PATHNAMES 0x10 | ||
319 | #define SMB_FLAGS_REQUEST_OPLOCK 0x20 | ||
320 | #define SMB_FLAGS_REQUEST_BATCH_OPLOCK 0x40 | ||
321 | #define SMB_FLAGS_REPLY 0x80 | ||
322 | |||
323 | /* smb_flg2 field flags (samba-2.2.0/source/include/smb.h) */ | ||
324 | #define SMB_FLAGS2_LONG_PATH_COMPONENTS 0x0001 | ||
325 | #define SMB_FLAGS2_EXTENDED_ATTRIBUTES 0x0002 | ||
326 | #define SMB_FLAGS2_DFS_PATHNAMES 0x1000 | ||
327 | #define SMB_FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000 | ||
328 | #define SMB_FLAGS2_32_BIT_ERROR_CODES 0x4000 | ||
329 | #define SMB_FLAGS2_UNICODE_STRINGS 0x8000 | ||
330 | |||
331 | |||
332 | /* | ||
333 | * UNIX stuff (from samba trans2.h) | ||
334 | */ | ||
335 | #define MIN_UNIX_INFO_LEVEL 0x200 | ||
336 | #define MAX_UNIX_INFO_LEVEL 0x2FF | ||
337 | #define SMB_FIND_FILE_UNIX 0x202 | ||
338 | #define SMB_QUERY_FILE_UNIX_BASIC 0x200 | ||
339 | #define SMB_QUERY_FILE_UNIX_LINK 0x201 | ||
340 | #define SMB_QUERY_FILE_UNIX_HLINK 0x202 | ||
341 | #define SMB_SET_FILE_UNIX_BASIC 0x200 | ||
342 | #define SMB_SET_FILE_UNIX_LINK 0x201 | ||
343 | #define SMB_SET_FILE_UNIX_HLINK 0x203 | ||
344 | #define SMB_QUERY_CIFS_UNIX_INFO 0x200 | ||
345 | |||
346 | /* values which means "don't change it" */ | ||
347 | #define SMB_MODE_NO_CHANGE 0xFFFFFFFF | ||
348 | #define SMB_UID_NO_CHANGE 0xFFFFFFFF | ||
349 | #define SMB_GID_NO_CHANGE 0xFFFFFFFF | ||
350 | #define SMB_TIME_NO_CHANGE 0xFFFFFFFFFFFFFFFFULL | ||
351 | #define SMB_SIZE_NO_CHANGE 0xFFFFFFFFFFFFFFFFULL | ||
352 | |||
353 | /* UNIX filetype mappings. */ | ||
354 | #define UNIX_TYPE_FILE 0 | ||
355 | #define UNIX_TYPE_DIR 1 | ||
356 | #define UNIX_TYPE_SYMLINK 2 | ||
357 | #define UNIX_TYPE_CHARDEV 3 | ||
358 | #define UNIX_TYPE_BLKDEV 4 | ||
359 | #define UNIX_TYPE_FIFO 5 | ||
360 | #define UNIX_TYPE_SOCKET 6 | ||
361 | #define UNIX_TYPE_UNKNOWN 0xFFFFFFFF | ||
362 | |||
363 | #endif /* _SMBNO_H_ */ | ||
diff --git a/include/linux/smp.h b/include/linux/smp.h index cfa2d20e35f1..6dc95cac6b3d 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
@@ -13,9 +13,10 @@ | |||
13 | 13 | ||
14 | extern void cpu_idle(void); | 14 | extern void cpu_idle(void); |
15 | 15 | ||
16 | typedef void (*smp_call_func_t)(void *info); | ||
16 | struct call_single_data { | 17 | struct call_single_data { |
17 | struct list_head list; | 18 | struct list_head list; |
18 | void (*func) (void *info); | 19 | smp_call_func_t func; |
19 | void *info; | 20 | void *info; |
20 | u16 flags; | 21 | u16 flags; |
21 | u16 priv; | 22 | u16 priv; |
@@ -24,8 +25,8 @@ struct call_single_data { | |||
24 | /* total number of cpus in this system (may exceed NR_CPUS) */ | 25 | /* total number of cpus in this system (may exceed NR_CPUS) */ |
25 | extern unsigned int total_cpus; | 26 | extern unsigned int total_cpus; |
26 | 27 | ||
27 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, | 28 | int smp_call_function_single(int cpuid, smp_call_func_t func, void *info, |
28 | int wait); | 29 | int wait); |
29 | 30 | ||
30 | #ifdef CONFIG_SMP | 31 | #ifdef CONFIG_SMP |
31 | 32 | ||
@@ -69,15 +70,15 @@ extern void smp_cpus_done(unsigned int max_cpus); | |||
69 | /* | 70 | /* |
70 | * Call a function on all other processors | 71 | * Call a function on all other processors |
71 | */ | 72 | */ |
72 | int smp_call_function(void(*func)(void *info), void *info, int wait); | 73 | int smp_call_function(smp_call_func_t func, void *info, int wait); |
73 | void smp_call_function_many(const struct cpumask *mask, | 74 | void smp_call_function_many(const struct cpumask *mask, |
74 | void (*func)(void *info), void *info, bool wait); | 75 | smp_call_func_t func, void *info, bool wait); |
75 | 76 | ||
76 | void __smp_call_function_single(int cpuid, struct call_single_data *data, | 77 | void __smp_call_function_single(int cpuid, struct call_single_data *data, |
77 | int wait); | 78 | int wait); |
78 | 79 | ||
79 | int smp_call_function_any(const struct cpumask *mask, | 80 | int smp_call_function_any(const struct cpumask *mask, |
80 | void (*func)(void *info), void *info, int wait); | 81 | smp_call_func_t func, void *info, int wait); |
81 | 82 | ||
82 | /* | 83 | /* |
83 | * Generic and arch helpers | 84 | * Generic and arch helpers |
@@ -94,7 +95,7 @@ void ipi_call_unlock_irq(void); | |||
94 | /* | 95 | /* |
95 | * Call a function on all processors | 96 | * Call a function on all processors |
96 | */ | 97 | */ |
97 | int on_each_cpu(void (*func) (void *info), void *info, int wait); | 98 | int on_each_cpu(smp_call_func_t func, void *info, int wait); |
98 | 99 | ||
99 | #define MSG_ALL_BUT_SELF 0x8000 /* Assume <32768 CPU's */ | 100 | #define MSG_ALL_BUT_SELF 0x8000 /* Assume <32768 CPU's */ |
100 | #define MSG_ALL 0x8001 | 101 | #define MSG_ALL 0x8001 |
@@ -122,7 +123,7 @@ static inline void smp_send_stop(void) { } | |||
122 | * These macros fold the SMP functionality into a single CPU system | 123 | * These macros fold the SMP functionality into a single CPU system |
123 | */ | 124 | */ |
124 | #define raw_smp_processor_id() 0 | 125 | #define raw_smp_processor_id() 0 |
125 | static inline int up_smp_call_function(void (*func)(void *), void *info) | 126 | static inline int up_smp_call_function(smp_call_func_t func, void *info) |
126 | { | 127 | { |
127 | return 0; | 128 | return 0; |
128 | } | 129 | } |
@@ -143,7 +144,7 @@ static inline void smp_send_reschedule(int cpu) { } | |||
143 | static inline void init_call_single_data(void) { } | 144 | static inline void init_call_single_data(void) { } |
144 | 145 | ||
145 | static inline int | 146 | static inline int |
146 | smp_call_function_any(const struct cpumask *mask, void (*func)(void *info), | 147 | smp_call_function_any(const struct cpumask *mask, smp_call_func_t func, |
147 | void *info, int wait) | 148 | void *info, int wait) |
148 | { | 149 | { |
149 | return smp_call_function_single(0, func, info, wait); | 150 | return smp_call_function_single(0, func, info, wait); |
diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h index 2ea1dd1ba21c..291f721144c2 100644 --- a/include/linux/smp_lock.h +++ b/include/linux/smp_lock.h | |||
@@ -54,12 +54,15 @@ static inline void cycle_kernel_lock(void) | |||
54 | 54 | ||
55 | #else | 55 | #else |
56 | 56 | ||
57 | #ifdef CONFIG_BKL /* provoke build bug if not set */ | ||
57 | #define lock_kernel() | 58 | #define lock_kernel() |
58 | #define unlock_kernel() | 59 | #define unlock_kernel() |
59 | #define release_kernel_lock(task) do { } while(0) | ||
60 | #define cycle_kernel_lock() do { } while(0) | 60 | #define cycle_kernel_lock() do { } while(0) |
61 | #define reacquire_kernel_lock(task) 0 | ||
62 | #define kernel_locked() 1 | 61 | #define kernel_locked() 1 |
62 | #endif /* CONFIG_BKL */ | ||
63 | |||
64 | #define release_kernel_lock(task) do { } while(0) | ||
65 | #define reacquire_kernel_lock(task) 0 | ||
63 | 66 | ||
64 | #endif /* CONFIG_LOCK_KERNEL */ | 67 | #endif /* CONFIG_LOCK_KERNEL */ |
65 | #endif /* __LINUX_SMPLOCK_H */ | 68 | #endif /* __LINUX_SMPLOCK_H */ |
diff --git a/include/linux/socket.h b/include/linux/socket.h index a8f56e1ec760..86b652fabf6e 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
@@ -322,11 +322,10 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata, | |||
322 | int offset, | 322 | int offset, |
323 | unsigned int len, __wsum *csump); | 323 | unsigned int len, __wsum *csump); |
324 | 324 | ||
325 | extern long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); | 325 | extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); |
326 | extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len); | 326 | extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len); |
327 | extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, | 327 | extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, |
328 | int offset, int len); | 328 | int offset, int len); |
329 | extern int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr, int __user *ulen); | ||
330 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr); | 329 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr); |
331 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); | 330 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); |
332 | 331 | ||
diff --git a/include/linux/spi/74x164.h b/include/linux/spi/74x164.h new file mode 100644 index 000000000000..d85c52f294a0 --- /dev/null +++ b/include/linux/spi/74x164.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef LINUX_SPI_74X164_H | ||
2 | #define LINUX_SPI_74X164_H | ||
3 | |||
4 | #define GEN_74X164_DRIVER_NAME "74x164" | ||
5 | |||
6 | struct gen_74x164_chip_platform_data { | ||
7 | /* number assigned to the first GPIO */ | ||
8 | unsigned base; | ||
9 | }; | ||
10 | |||
11 | #endif | ||
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 92e52a1e6af3..b4d7710bc38d 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -204,6 +204,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
204 | /** | 204 | /** |
205 | * struct spi_master - interface to SPI master controller | 205 | * struct spi_master - interface to SPI master controller |
206 | * @dev: device interface to this driver | 206 | * @dev: device interface to this driver |
207 | * @list: link with the global spi_master list | ||
207 | * @bus_num: board-specific (and often SOC-specific) identifier for a | 208 | * @bus_num: board-specific (and often SOC-specific) identifier for a |
208 | * given SPI controller. | 209 | * given SPI controller. |
209 | * @num_chipselect: chipselects are used to distinguish individual | 210 | * @num_chipselect: chipselects are used to distinguish individual |
@@ -238,6 +239,8 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
238 | struct spi_master { | 239 | struct spi_master { |
239 | struct device dev; | 240 | struct device dev; |
240 | 241 | ||
242 | struct list_head list; | ||
243 | |||
241 | /* other than negative (== assign one dynamically), bus_num is fully | 244 | /* other than negative (== assign one dynamically), bus_num is fully |
242 | * board-specific. usually that simplifies to being SOC-specific. | 245 | * board-specific. usually that simplifies to being SOC-specific. |
243 | * example: one SOC has three SPI controllers, numbered 0..2, | 246 | * example: one SOC has three SPI controllers, numbered 0..2, |
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index f8854655860e..80e535897de6 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <linux/preempt.h> | 50 | #include <linux/preempt.h> |
51 | #include <linux/linkage.h> | 51 | #include <linux/linkage.h> |
52 | #include <linux/compiler.h> | 52 | #include <linux/compiler.h> |
53 | #include <linux/irqflags.h> | ||
53 | #include <linux/thread_info.h> | 54 | #include <linux/thread_info.h> |
54 | #include <linux/kernel.h> | 55 | #include <linux/kernel.h> |
55 | #include <linux/stringify.h> | 56 | #include <linux/stringify.h> |
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index 4d5d2f546dbf..58971e891f48 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h | |||
@@ -108,19 +108,43 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp) | |||
108 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | 108 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ |
109 | 109 | ||
110 | /** | 110 | /** |
111 | * srcu_dereference - fetch SRCU-protected pointer with checking | 111 | * srcu_dereference_check - fetch SRCU-protected pointer for later dereferencing |
112 | * @p: the pointer to fetch and protect for later dereferencing | ||
113 | * @sp: pointer to the srcu_struct, which is used to check that we | ||
114 | * really are in an SRCU read-side critical section. | ||
115 | * @c: condition to check for update-side use | ||
112 | * | 116 | * |
113 | * Makes rcu_dereference_check() do the dirty work. | 117 | * If PROVE_RCU is enabled, invoking this outside of an RCU read-side |
118 | * critical section will result in an RCU-lockdep splat, unless @c evaluates | ||
119 | * to 1. The @c argument will normally be a logical expression containing | ||
120 | * lockdep_is_held() calls. | ||
114 | */ | 121 | */ |
115 | #define srcu_dereference(p, sp) \ | 122 | #define srcu_dereference_check(p, sp, c) \ |
116 | rcu_dereference_check(p, srcu_read_lock_held(sp)) | 123 | __rcu_dereference_check((p), srcu_read_lock_held(sp) || (c), __rcu) |
124 | |||
125 | /** | ||
126 | * srcu_dereference - fetch SRCU-protected pointer for later dereferencing | ||
127 | * @p: the pointer to fetch and protect for later dereferencing | ||
128 | * @sp: pointer to the srcu_struct, which is used to check that we | ||
129 | * really are in an SRCU read-side critical section. | ||
130 | * | ||
131 | * Makes rcu_dereference_check() do the dirty work. If PROVE_RCU | ||
132 | * is enabled, invoking this outside of an RCU read-side critical | ||
133 | * section will result in an RCU-lockdep splat. | ||
134 | */ | ||
135 | #define srcu_dereference(p, sp) srcu_dereference_check((p), (sp), 0) | ||
117 | 136 | ||
118 | /** | 137 | /** |
119 | * srcu_read_lock - register a new reader for an SRCU-protected structure. | 138 | * srcu_read_lock - register a new reader for an SRCU-protected structure. |
120 | * @sp: srcu_struct in which to register the new reader. | 139 | * @sp: srcu_struct in which to register the new reader. |
121 | * | 140 | * |
122 | * Enter an SRCU read-side critical section. Note that SRCU read-side | 141 | * Enter an SRCU read-side critical section. Note that SRCU read-side |
123 | * critical sections may be nested. | 142 | * critical sections may be nested. However, it is illegal to |
143 | * call anything that waits on an SRCU grace period for the same | ||
144 | * srcu_struct, whether directly or indirectly. Please note that | ||
145 | * one way to indirectly wait on an SRCU grace period is to acquire | ||
146 | * a mutex that is held elsewhere while calling synchronize_srcu() or | ||
147 | * synchronize_srcu_expedited(). | ||
124 | */ | 148 | */ |
125 | static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) | 149 | static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) |
126 | { | 150 | { |
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index a6d5225b9275..11daf9c140e7 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h | |||
@@ -97,6 +97,7 @@ | |||
97 | #define SSB_TMSLOW_RESET 0x00000001 /* Reset */ | 97 | #define SSB_TMSLOW_RESET 0x00000001 /* Reset */ |
98 | #define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ | 98 | #define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ |
99 | #define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ | 99 | #define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ |
100 | #define SSB_TMSLOW_PHYCLK 0x00000010 /* MAC PHY Clock Control Enable */ | ||
100 | #define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ | 101 | #define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ |
101 | #define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ | 102 | #define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ |
102 | #define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ | 103 | #define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ |
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index 632ff7c03280..d66c61774d95 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h | |||
@@ -32,10 +32,14 @@ | |||
32 | struct plat_stmmacenet_data { | 32 | struct plat_stmmacenet_data { |
33 | int bus_id; | 33 | int bus_id; |
34 | int pbl; | 34 | int pbl; |
35 | int clk_csr; | ||
35 | int has_gmac; | 36 | int has_gmac; |
36 | int enh_desc; | 37 | int enh_desc; |
38 | int tx_coe; | ||
39 | int bugged_jumbo; | ||
40 | int pmt; | ||
37 | void (*fix_mac_speed)(void *priv, unsigned int speed); | 41 | void (*fix_mac_speed)(void *priv, unsigned int speed); |
38 | void (*bus_setup)(unsigned long ioaddr); | 42 | void (*bus_setup)(void __iomem *ioaddr); |
39 | #ifdef CONFIG_STM_DRIVERS | 43 | #ifdef CONFIG_STM_DRIVERS |
40 | struct stm_pad_config *pad_config; | 44 | struct stm_pad_config *pad_config; |
41 | #endif | 45 | #endif |
diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index 6b524a0d02e4..1808960c5059 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h | |||
@@ -126,8 +126,8 @@ int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); | |||
126 | 126 | ||
127 | #else /* CONFIG_STOP_MACHINE && CONFIG_SMP */ | 127 | #else /* CONFIG_STOP_MACHINE && CONFIG_SMP */ |
128 | 128 | ||
129 | static inline int stop_machine(int (*fn)(void *), void *data, | 129 | static inline int __stop_machine(int (*fn)(void *), void *data, |
130 | const struct cpumask *cpus) | 130 | const struct cpumask *cpus) |
131 | { | 131 | { |
132 | int ret; | 132 | int ret; |
133 | local_irq_disable(); | 133 | local_irq_disable(); |
@@ -136,5 +136,11 @@ static inline int stop_machine(int (*fn)(void *), void *data, | |||
136 | return ret; | 136 | return ret; |
137 | } | 137 | } |
138 | 138 | ||
139 | static inline int stop_machine(int (*fn)(void *), void *data, | ||
140 | const struct cpumask *cpus) | ||
141 | { | ||
142 | return __stop_machine(fn, data, cpus); | ||
143 | } | ||
144 | |||
139 | #endif /* CONFIG_STOP_MACHINE && CONFIG_SMP */ | 145 | #endif /* CONFIG_STOP_MACHINE && CONFIG_SMP */ |
140 | #endif /* _LINUX_STOP_MACHINE */ | 146 | #endif /* _LINUX_STOP_MACHINE */ |
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index 5bbc447175dc..b2024757edd5 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
@@ -122,8 +122,8 @@ extern const struct rpc_authops authnull_ops; | |||
122 | int __init rpc_init_authunix(void); | 122 | int __init rpc_init_authunix(void); |
123 | int __init rpc_init_generic_auth(void); | 123 | int __init rpc_init_generic_auth(void); |
124 | int __init rpcauth_init_module(void); | 124 | int __init rpcauth_init_module(void); |
125 | void __exit rpcauth_remove_module(void); | 125 | void rpcauth_remove_module(void); |
126 | void __exit rpc_destroy_generic_auth(void); | 126 | void rpc_destroy_generic_auth(void); |
127 | void rpc_destroy_authunix(void); | 127 | void rpc_destroy_authunix(void); |
128 | 128 | ||
129 | struct rpc_cred * rpc_lookup_cred(void); | 129 | struct rpc_cred * rpc_lookup_cred(void); |
diff --git a/include/linux/sunrpc/auth_gss.h b/include/linux/sunrpc/auth_gss.h index 671538d25bc1..8eee9dbbfe7a 100644 --- a/include/linux/sunrpc/auth_gss.h +++ b/include/linux/sunrpc/auth_gss.h | |||
@@ -69,7 +69,7 @@ struct gss_cl_ctx { | |||
69 | enum rpc_gss_proc gc_proc; | 69 | enum rpc_gss_proc gc_proc; |
70 | u32 gc_seq; | 70 | u32 gc_seq; |
71 | spinlock_t gc_seq_lock; | 71 | spinlock_t gc_seq_lock; |
72 | struct gss_ctx *gc_gss_ctx; | 72 | struct gss_ctx __rcu *gc_gss_ctx; |
73 | struct xdr_netobj gc_wire_ctx; | 73 | struct xdr_netobj gc_wire_ctx; |
74 | u32 gc_win; | 74 | u32 gc_win; |
75 | unsigned long gc_expiry; | 75 | unsigned long gc_expiry; |
@@ -80,7 +80,7 @@ struct gss_upcall_msg; | |||
80 | struct gss_cred { | 80 | struct gss_cred { |
81 | struct rpc_cred gc_base; | 81 | struct rpc_cred gc_base; |
82 | enum rpc_gss_svc gc_service; | 82 | enum rpc_gss_svc gc_service; |
83 | struct gss_cl_ctx *gc_ctx; | 83 | struct gss_cl_ctx __rcu *gc_ctx; |
84 | struct gss_upcall_msg *gc_upcall; | 84 | struct gss_upcall_msg *gc_upcall; |
85 | unsigned long gc_upcall_timestamp; | 85 | unsigned long gc_upcall_timestamp; |
86 | unsigned char gc_machine_cred : 1; | 86 | unsigned char gc_machine_cred : 1; |
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 7bf3e84b92f4..6950c981882d 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h | |||
@@ -125,12 +125,15 @@ struct cache_detail { | |||
125 | */ | 125 | */ |
126 | struct cache_req { | 126 | struct cache_req { |
127 | struct cache_deferred_req *(*defer)(struct cache_req *req); | 127 | struct cache_deferred_req *(*defer)(struct cache_req *req); |
128 | int thread_wait; /* How long (jiffies) we can block the | ||
129 | * current thread to wait for updates. | ||
130 | */ | ||
128 | }; | 131 | }; |
129 | /* this must be embedded in a deferred_request that is being | 132 | /* this must be embedded in a deferred_request that is being |
130 | * delayed awaiting cache-fill | 133 | * delayed awaiting cache-fill |
131 | */ | 134 | */ |
132 | struct cache_deferred_req { | 135 | struct cache_deferred_req { |
133 | struct list_head hash; /* on hash chain */ | 136 | struct hlist_node hash; /* on hash chain */ |
134 | struct list_head recent; /* on fifo */ | 137 | struct list_head recent; /* on fifo */ |
135 | struct cache_head *item; /* cache item we wait on */ | 138 | struct cache_head *item; /* cache item we wait on */ |
136 | void *owner; /* we might need to discard all defered requests | 139 | void *owner; /* we might need to discard all defered requests |
@@ -194,7 +197,9 @@ extern void cache_purge(struct cache_detail *detail); | |||
194 | #define NEVER (0x7FFFFFFF) | 197 | #define NEVER (0x7FFFFFFF) |
195 | extern void __init cache_initialize(void); | 198 | extern void __init cache_initialize(void); |
196 | extern int cache_register(struct cache_detail *cd); | 199 | extern int cache_register(struct cache_detail *cd); |
200 | extern int cache_register_net(struct cache_detail *cd, struct net *net); | ||
197 | extern void cache_unregister(struct cache_detail *cd); | 201 | extern void cache_unregister(struct cache_detail *cd); |
202 | extern void cache_unregister_net(struct cache_detail *cd, struct net *net); | ||
198 | 203 | ||
199 | extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, | 204 | extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, |
200 | mode_t, struct cache_detail *); | 205 | mode_t, struct cache_detail *); |
@@ -218,14 +223,42 @@ static inline int get_int(char **bpp, int *anint) | |||
218 | return 0; | 223 | return 0; |
219 | } | 224 | } |
220 | 225 | ||
226 | /* | ||
227 | * timestamps kept in the cache are expressed in seconds | ||
228 | * since boot. This is the best for measuring differences in | ||
229 | * real time. | ||
230 | */ | ||
231 | static inline time_t seconds_since_boot(void) | ||
232 | { | ||
233 | struct timespec boot; | ||
234 | getboottime(&boot); | ||
235 | return get_seconds() - boot.tv_sec; | ||
236 | } | ||
237 | |||
238 | static inline time_t convert_to_wallclock(time_t sinceboot) | ||
239 | { | ||
240 | struct timespec boot; | ||
241 | getboottime(&boot); | ||
242 | return boot.tv_sec + sinceboot; | ||
243 | } | ||
244 | |||
221 | static inline time_t get_expiry(char **bpp) | 245 | static inline time_t get_expiry(char **bpp) |
222 | { | 246 | { |
223 | int rv; | 247 | int rv; |
248 | struct timespec boot; | ||
249 | |||
224 | if (get_int(bpp, &rv)) | 250 | if (get_int(bpp, &rv)) |
225 | return 0; | 251 | return 0; |
226 | if (rv < 0) | 252 | if (rv < 0) |
227 | return 0; | 253 | return 0; |
228 | return rv; | 254 | getboottime(&boot); |
255 | return rv - boot.tv_sec; | ||
229 | } | 256 | } |
230 | 257 | ||
258 | static inline void sunrpc_invalidate(struct cache_head *h, | ||
259 | struct cache_detail *detail) | ||
260 | { | ||
261 | h->expiry_time = seconds_since_boot() - 1; | ||
262 | detail->nextcheck = seconds_since_boot(); | ||
263 | } | ||
231 | #endif /* _LINUX_SUNRPC_CACHE_H_ */ | 264 | #endif /* _LINUX_SUNRPC_CACHE_H_ */ |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 85f38a63f098..a5a55f284b7d 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -102,6 +102,7 @@ struct rpc_procinfo { | |||
102 | #ifdef __KERNEL__ | 102 | #ifdef __KERNEL__ |
103 | 103 | ||
104 | struct rpc_create_args { | 104 | struct rpc_create_args { |
105 | struct net *net; | ||
105 | int protocol; | 106 | int protocol; |
106 | struct sockaddr *address; | 107 | struct sockaddr *address; |
107 | size_t addrsize; | 108 | size_t addrsize; |
@@ -137,7 +138,6 @@ int rpcb_register(u32, u32, int, unsigned short); | |||
137 | int rpcb_v4_register(const u32 program, const u32 version, | 138 | int rpcb_v4_register(const u32 program, const u32 version, |
138 | const struct sockaddr *address, | 139 | const struct sockaddr *address, |
139 | const char *netid); | 140 | const char *netid); |
140 | int rpcb_getport_sync(struct sockaddr_in *, u32, u32, int); | ||
141 | void rpcb_getport_async(struct rpc_task *); | 141 | void rpcb_getport_async(struct rpc_task *); |
142 | 142 | ||
143 | void rpc_call_start(struct rpc_task *); | 143 | void rpc_call_start(struct rpc_task *); |
diff --git a/include/linux/sunrpc/gss_spkm3.h b/include/linux/sunrpc/gss_spkm3.h deleted file mode 100644 index e3e6a3437f8b..000000000000 --- a/include/linux/sunrpc/gss_spkm3.h +++ /dev/null | |||
@@ -1,55 +0,0 @@ | |||
1 | /* | ||
2 | * linux/include/linux/sunrpc/gss_spkm3.h | ||
3 | * | ||
4 | * Copyright (c) 2000 The Regents of the University of Michigan. | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Andy Adamson <andros@umich.edu> | ||
8 | */ | ||
9 | |||
10 | #include <linux/sunrpc/auth_gss.h> | ||
11 | #include <linux/sunrpc/gss_err.h> | ||
12 | #include <linux/sunrpc/gss_asn1.h> | ||
13 | |||
14 | struct spkm3_ctx { | ||
15 | struct xdr_netobj ctx_id; /* per message context id */ | ||
16 | int endtime; /* endtime of the context */ | ||
17 | struct xdr_netobj mech_used; | ||
18 | unsigned int ret_flags ; | ||
19 | struct xdr_netobj conf_alg; | ||
20 | struct xdr_netobj derived_conf_key; | ||
21 | struct xdr_netobj intg_alg; | ||
22 | struct xdr_netobj derived_integ_key; | ||
23 | }; | ||
24 | |||
25 | /* OIDs declarations for K-ALG, I-ALG, C-ALG, and OWF-ALG */ | ||
26 | extern const struct xdr_netobj hmac_md5_oid; | ||
27 | extern const struct xdr_netobj cast5_cbc_oid; | ||
28 | |||
29 | /* SPKM InnerContext Token types */ | ||
30 | |||
31 | #define SPKM_ERROR_TOK 3 | ||
32 | #define SPKM_MIC_TOK 4 | ||
33 | #define SPKM_WRAP_TOK 5 | ||
34 | #define SPKM_DEL_TOK 6 | ||
35 | |||
36 | u32 spkm3_make_token(struct spkm3_ctx *ctx, struct xdr_buf * text, struct xdr_netobj * token, int toktype); | ||
37 | |||
38 | u32 spkm3_read_token(struct spkm3_ctx *ctx, struct xdr_netobj *read_token, struct xdr_buf *message_buffer, int toktype); | ||
39 | |||
40 | #define CKSUMTYPE_RSA_MD5 0x0007 | ||
41 | #define CKSUMTYPE_HMAC_MD5 0x0008 | ||
42 | |||
43 | s32 make_spkm3_checksum(s32 cksumtype, struct xdr_netobj *key, char *header, | ||
44 | unsigned int hdrlen, struct xdr_buf *body, | ||
45 | unsigned int body_offset, struct xdr_netobj *cksum); | ||
46 | void asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits); | ||
47 | int decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, | ||
48 | int explen); | ||
49 | void spkm3_mic_header(unsigned char **hdrbuf, unsigned int *hdrlen, | ||
50 | unsigned char *ctxhdr, int elen, int zbit); | ||
51 | void spkm3_make_mic_token(unsigned char **tokp, int toklen, | ||
52 | struct xdr_netobj *mic_hdr, | ||
53 | struct xdr_netobj *md5cksum, int md5elen, int md5zbit); | ||
54 | u32 spkm3_verify_mic_token(unsigned char **tokp, int *mic_hdrlen, | ||
55 | unsigned char **cksum); | ||
diff --git a/include/linux/sunrpc/stats.h b/include/linux/sunrpc/stats.h index 5fa0f2084307..680471d1f28a 100644 --- a/include/linux/sunrpc/stats.h +++ b/include/linux/sunrpc/stats.h | |||
@@ -38,8 +38,21 @@ struct svc_stat { | |||
38 | rpcbadclnt; | 38 | rpcbadclnt; |
39 | }; | 39 | }; |
40 | 40 | ||
41 | void rpc_proc_init(void); | 41 | struct net; |
42 | void rpc_proc_exit(void); | 42 | #ifdef CONFIG_PROC_FS |
43 | int rpc_proc_init(struct net *); | ||
44 | void rpc_proc_exit(struct net *); | ||
45 | #else | ||
46 | static inline int rpc_proc_init(struct net *net) | ||
47 | { | ||
48 | return 0; | ||
49 | } | ||
50 | |||
51 | static inline void rpc_proc_exit(struct net *net) | ||
52 | { | ||
53 | } | ||
54 | #endif | ||
55 | |||
43 | #ifdef MODULE | 56 | #ifdef MODULE |
44 | void rpc_modcount(struct inode *, int); | 57 | void rpc_modcount(struct inode *, int); |
45 | #endif | 58 | #endif |
@@ -54,9 +67,6 @@ void svc_proc_unregister(const char *); | |||
54 | 67 | ||
55 | void svc_seq_show(struct seq_file *, | 68 | void svc_seq_show(struct seq_file *, |
56 | const struct svc_stat *); | 69 | const struct svc_stat *); |
57 | |||
58 | extern struct proc_dir_entry *proc_net_rpc; | ||
59 | |||
60 | #else | 70 | #else |
61 | 71 | ||
62 | static inline struct proc_dir_entry *rpc_proc_register(struct rpc_stat *s) { return NULL; } | 72 | static inline struct proc_dir_entry *rpc_proc_register(struct rpc_stat *s) { return NULL; } |
@@ -69,9 +79,6 @@ static inline void svc_proc_unregister(const char *p) {} | |||
69 | 79 | ||
70 | static inline void svc_seq_show(struct seq_file *seq, | 80 | static inline void svc_seq_show(struct seq_file *seq, |
71 | const struct svc_stat *st) {} | 81 | const struct svc_stat *st) {} |
72 | |||
73 | #define proc_net_rpc NULL | ||
74 | |||
75 | #endif | 82 | #endif |
76 | 83 | ||
77 | #endif /* _LINUX_SUNRPC_STATS_H */ | 84 | #endif /* _LINUX_SUNRPC_STATS_H */ |
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index 5f4e18b3ce73..aea0d438e3c7 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | struct svc_xprt_ops { | 13 | struct svc_xprt_ops { |
14 | struct svc_xprt *(*xpo_create)(struct svc_serv *, | 14 | struct svc_xprt *(*xpo_create)(struct svc_serv *, |
15 | struct net *net, | ||
15 | struct sockaddr *, int, | 16 | struct sockaddr *, int, |
16 | int); | 17 | int); |
17 | struct svc_xprt *(*xpo_accept)(struct svc_xprt *); | 18 | struct svc_xprt *(*xpo_accept)(struct svc_xprt *); |
@@ -32,6 +33,16 @@ struct svc_xprt_class { | |||
32 | u32 xcl_max_payload; | 33 | u32 xcl_max_payload; |
33 | }; | 34 | }; |
34 | 35 | ||
36 | /* | ||
37 | * This is embedded in an object that wants a callback before deleting | ||
38 | * an xprt; intended for use by NFSv4.1, which needs to know when a | ||
39 | * client's tcp connection (and hence possibly a backchannel) goes away. | ||
40 | */ | ||
41 | struct svc_xpt_user { | ||
42 | struct list_head list; | ||
43 | void (*callback)(struct svc_xpt_user *); | ||
44 | }; | ||
45 | |||
35 | struct svc_xprt { | 46 | struct svc_xprt { |
36 | struct svc_xprt_class *xpt_class; | 47 | struct svc_xprt_class *xpt_class; |
37 | struct svc_xprt_ops *xpt_ops; | 48 | struct svc_xprt_ops *xpt_ops; |
@@ -66,14 +77,41 @@ struct svc_xprt { | |||
66 | struct sockaddr_storage xpt_remote; /* remote peer's address */ | 77 | struct sockaddr_storage xpt_remote; /* remote peer's address */ |
67 | size_t xpt_remotelen; /* length of address */ | 78 | size_t xpt_remotelen; /* length of address */ |
68 | struct rpc_wait_queue xpt_bc_pending; /* backchannel wait queue */ | 79 | struct rpc_wait_queue xpt_bc_pending; /* backchannel wait queue */ |
80 | struct list_head xpt_users; /* callbacks on free */ | ||
81 | |||
82 | struct net *xpt_net; | ||
69 | }; | 83 | }; |
70 | 84 | ||
85 | static inline void unregister_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) | ||
86 | { | ||
87 | spin_lock(&xpt->xpt_lock); | ||
88 | list_del_init(&u->list); | ||
89 | spin_unlock(&xpt->xpt_lock); | ||
90 | } | ||
91 | |||
92 | static inline int register_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) | ||
93 | { | ||
94 | spin_lock(&xpt->xpt_lock); | ||
95 | if (test_bit(XPT_CLOSE, &xpt->xpt_flags)) { | ||
96 | /* | ||
97 | * The connection is about to be deleted soon (or, | ||
98 | * worse, may already be deleted--in which case we've | ||
99 | * already notified the xpt_users). | ||
100 | */ | ||
101 | spin_unlock(&xpt->xpt_lock); | ||
102 | return -ENOTCONN; | ||
103 | } | ||
104 | list_add(&u->list, &xpt->xpt_users); | ||
105 | spin_unlock(&xpt->xpt_lock); | ||
106 | return 0; | ||
107 | } | ||
108 | |||
71 | int svc_reg_xprt_class(struct svc_xprt_class *); | 109 | int svc_reg_xprt_class(struct svc_xprt_class *); |
72 | void svc_unreg_xprt_class(struct svc_xprt_class *); | 110 | void svc_unreg_xprt_class(struct svc_xprt_class *); |
73 | void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *, | 111 | void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *, |
74 | struct svc_serv *); | 112 | struct svc_serv *); |
75 | int svc_create_xprt(struct svc_serv *, const char *, const int, | 113 | int svc_create_xprt(struct svc_serv *, const char *, struct net *, |
76 | const unsigned short, int); | 114 | const int, const unsigned short, int); |
77 | void svc_xprt_enqueue(struct svc_xprt *xprt); | 115 | void svc_xprt_enqueue(struct svc_xprt *xprt); |
78 | void svc_xprt_received(struct svc_xprt *); | 116 | void svc_xprt_received(struct svc_xprt *); |
79 | void svc_xprt_put(struct svc_xprt *xprt); | 117 | void svc_xprt_put(struct svc_xprt *xprt); |
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h index d39dbdc7b10f..25d333c1b571 100644 --- a/include/linux/sunrpc/svcauth.h +++ b/include/linux/sunrpc/svcauth.h | |||
@@ -108,10 +108,15 @@ struct auth_ops { | |||
108 | #define SVC_NEGATIVE 4 | 108 | #define SVC_NEGATIVE 4 |
109 | #define SVC_OK 5 | 109 | #define SVC_OK 5 |
110 | #define SVC_DROP 6 | 110 | #define SVC_DROP 6 |
111 | #define SVC_DENIED 7 | 111 | #define SVC_CLOSE 7 /* Like SVC_DROP, but request is definitely |
112 | #define SVC_PENDING 8 | 112 | * lost so if there is a tcp connection, it |
113 | #define SVC_COMPLETE 9 | 113 | * should be closed |
114 | */ | ||
115 | #define SVC_DENIED 8 | ||
116 | #define SVC_PENDING 9 | ||
117 | #define SVC_COMPLETE 10 | ||
114 | 118 | ||
119 | struct svc_xprt; | ||
115 | 120 | ||
116 | extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp); | 121 | extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp); |
117 | extern int svc_authorise(struct svc_rqst *rqstp); | 122 | extern int svc_authorise(struct svc_rqst *rqstp); |
@@ -121,13 +126,13 @@ extern void svc_auth_unregister(rpc_authflavor_t flavor); | |||
121 | 126 | ||
122 | extern struct auth_domain *unix_domain_find(char *name); | 127 | extern struct auth_domain *unix_domain_find(char *name); |
123 | extern void auth_domain_put(struct auth_domain *item); | 128 | extern void auth_domain_put(struct auth_domain *item); |
124 | extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain *dom); | 129 | extern int auth_unix_add_addr(struct net *net, struct in6_addr *addr, struct auth_domain *dom); |
125 | extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new); | 130 | extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new); |
126 | extern struct auth_domain *auth_domain_find(char *name); | 131 | extern struct auth_domain *auth_domain_find(char *name); |
127 | extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr); | 132 | extern struct auth_domain *auth_unix_lookup(struct net *net, struct in6_addr *addr); |
128 | extern int auth_unix_forget_old(struct auth_domain *dom); | 133 | extern int auth_unix_forget_old(struct auth_domain *dom); |
129 | extern void svcauth_unix_purge(void); | 134 | extern void svcauth_unix_purge(void); |
130 | extern void svcauth_unix_info_release(void *); | 135 | extern void svcauth_unix_info_release(struct svc_xprt *xpt); |
131 | extern int svcauth_unix_set_client(struct svc_rqst *rqstp); | 136 | extern int svcauth_unix_set_client(struct svc_rqst *rqstp); |
132 | 137 | ||
133 | static inline unsigned long hash_str(char *name, int bits) | 138 | static inline unsigned long hash_str(char *name, int bits) |
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 35cf2e8cd7c6..498ab93a81e4 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h | |||
@@ -108,6 +108,7 @@ void xdr_encode_pages(struct xdr_buf *, struct page **, unsigned int, | |||
108 | unsigned int); | 108 | unsigned int); |
109 | void xdr_inline_pages(struct xdr_buf *, unsigned int, | 109 | void xdr_inline_pages(struct xdr_buf *, unsigned int, |
110 | struct page **, unsigned int, unsigned int); | 110 | struct page **, unsigned int, unsigned int); |
111 | void xdr_terminate_string(struct xdr_buf *, const u32); | ||
111 | 112 | ||
112 | static inline __be32 *xdr_encode_array(__be32 *p, const void *s, unsigned int len) | 113 | static inline __be32 *xdr_encode_array(__be32 *p, const void *s, unsigned int len) |
113 | { | 114 | { |
@@ -131,6 +132,13 @@ xdr_decode_hyper(__be32 *p, __u64 *valp) | |||
131 | return p + 2; | 132 | return p + 2; |
132 | } | 133 | } |
133 | 134 | ||
135 | static inline __be32 * | ||
136 | xdr_decode_opaque_fixed(__be32 *p, void *ptr, unsigned int len) | ||
137 | { | ||
138 | memcpy(ptr, p, len); | ||
139 | return p + XDR_QUADLEN(len); | ||
140 | } | ||
141 | |||
134 | /* | 142 | /* |
135 | * Adjust kvec to reflect end of xdr'ed data (RPC client XDR) | 143 | * Adjust kvec to reflect end of xdr'ed data (RPC client XDR) |
136 | */ | 144 | */ |
@@ -200,6 +208,7 @@ extern __be32 *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes); | |||
200 | extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, | 208 | extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, |
201 | unsigned int base, unsigned int len); | 209 | unsigned int base, unsigned int len); |
202 | extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p); | 210 | extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p); |
211 | extern __be32 *xdr_inline_peek(struct xdr_stream *xdr, size_t nbytes); | ||
203 | extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); | 212 | extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); |
204 | extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len); | 213 | extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len); |
205 | extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); | 214 | extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index ff5a77b28c50..89d10d279a20 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -224,6 +224,7 @@ struct rpc_xprt { | |||
224 | bklog_u; /* backlog queue utilization */ | 224 | bklog_u; /* backlog queue utilization */ |
225 | } stat; | 225 | } stat; |
226 | 226 | ||
227 | struct net *xprt_net; | ||
227 | const char *address_strings[RPC_DISPLAY_MAX]; | 228 | const char *address_strings[RPC_DISPLAY_MAX]; |
228 | }; | 229 | }; |
229 | 230 | ||
@@ -249,6 +250,7 @@ static inline int bc_prealloc(struct rpc_rqst *req) | |||
249 | 250 | ||
250 | struct xprt_create { | 251 | struct xprt_create { |
251 | int ident; /* XPRT_TRANSPORT identifier */ | 252 | int ident; /* XPRT_TRANSPORT identifier */ |
253 | struct net * net; | ||
252 | struct sockaddr * srcaddr; /* optional local address */ | 254 | struct sockaddr * srcaddr; /* optional local address */ |
253 | struct sockaddr * dstaddr; /* remote peer address */ | 255 | struct sockaddr * dstaddr; /* remote peer address */ |
254 | size_t addrlen; | 256 | size_t addrlen; |
@@ -280,6 +282,8 @@ void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | |||
280 | void xprt_release(struct rpc_task *task); | 282 | void xprt_release(struct rpc_task *task); |
281 | struct rpc_xprt * xprt_get(struct rpc_xprt *xprt); | 283 | struct rpc_xprt * xprt_get(struct rpc_xprt *xprt); |
282 | void xprt_put(struct rpc_xprt *xprt); | 284 | void xprt_put(struct rpc_xprt *xprt); |
285 | struct rpc_xprt * xprt_alloc(struct net *net, int size, int max_req); | ||
286 | void xprt_free(struct rpc_xprt *); | ||
283 | 287 | ||
284 | static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) | 288 | static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) |
285 | { | 289 | { |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 4af270ec2204..26697514c5ec 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
@@ -293,8 +293,8 @@ extern int unregister_pm_notifier(struct notifier_block *nb); | |||
293 | extern bool events_check_enabled; | 293 | extern bool events_check_enabled; |
294 | 294 | ||
295 | extern bool pm_check_wakeup_events(void); | 295 | extern bool pm_check_wakeup_events(void); |
296 | extern bool pm_get_wakeup_count(unsigned long *count); | 296 | extern bool pm_get_wakeup_count(unsigned int *count); |
297 | extern bool pm_save_wakeup_count(unsigned long count); | 297 | extern bool pm_save_wakeup_count(unsigned int count); |
298 | #else /* !CONFIG_PM_SLEEP */ | 298 | #else /* !CONFIG_PM_SLEEP */ |
299 | 299 | ||
300 | static inline int register_pm_notifier(struct notifier_block *nb) | 300 | static inline int register_pm_notifier(struct notifier_block *nb) |
@@ -308,6 +308,8 @@ static inline int unregister_pm_notifier(struct notifier_block *nb) | |||
308 | } | 308 | } |
309 | 309 | ||
310 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) | 310 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) |
311 | |||
312 | static inline bool pm_check_wakeup_events(void) { return true; } | ||
311 | #endif /* !CONFIG_PM_SLEEP */ | 313 | #endif /* !CONFIG_PM_SLEEP */ |
312 | 314 | ||
313 | extern struct mutex pm_mutex; | 315 | extern struct mutex pm_mutex; |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 7cdd63366f88..eba53e71d2cc 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -271,8 +271,18 @@ extern void scan_mapping_unevictable_pages(struct address_space *); | |||
271 | extern unsigned long scan_unevictable_pages; | 271 | extern unsigned long scan_unevictable_pages; |
272 | extern int scan_unevictable_handler(struct ctl_table *, int, | 272 | extern int scan_unevictable_handler(struct ctl_table *, int, |
273 | void __user *, size_t *, loff_t *); | 273 | void __user *, size_t *, loff_t *); |
274 | #ifdef CONFIG_NUMA | ||
274 | extern int scan_unevictable_register_node(struct node *node); | 275 | extern int scan_unevictable_register_node(struct node *node); |
275 | extern void scan_unevictable_unregister_node(struct node *node); | 276 | extern void scan_unevictable_unregister_node(struct node *node); |
277 | #else | ||
278 | static inline int scan_unevictable_register_node(struct node *node) | ||
279 | { | ||
280 | return 0; | ||
281 | } | ||
282 | static inline void scan_unevictable_unregister_node(struct node *node) | ||
283 | { | ||
284 | } | ||
285 | #endif | ||
276 | 286 | ||
277 | extern int kswapd_run(int nid); | 287 | extern int kswapd_run(int nid); |
278 | extern void kswapd_stop(int nid); | 288 | extern void kswapd_stop(int nid); |
diff --git a/include/linux/synclink.h b/include/linux/synclink.h index 0ff2779c44d0..2e7d81c4e5ad 100644 --- a/include/linux/synclink.h +++ b/include/linux/synclink.h | |||
@@ -126,6 +126,7 @@ | |||
126 | #define MGSL_MODE_BISYNC 4 | 126 | #define MGSL_MODE_BISYNC 4 |
127 | #define MGSL_MODE_RAW 6 | 127 | #define MGSL_MODE_RAW 6 |
128 | #define MGSL_MODE_BASE_CLOCK 7 | 128 | #define MGSL_MODE_BASE_CLOCK 7 |
129 | #define MGSL_MODE_XSYNC 8 | ||
129 | 130 | ||
130 | #define MGSL_BUS_TYPE_ISA 1 | 131 | #define MGSL_BUS_TYPE_ISA 1 |
131 | #define MGSL_BUS_TYPE_EISA 2 | 132 | #define MGSL_BUS_TYPE_EISA 2 |
@@ -290,6 +291,10 @@ struct gpio_desc { | |||
290 | #define MGSL_IOCSGPIO _IOW(MGSL_MAGIC_IOC,16,struct gpio_desc) | 291 | #define MGSL_IOCSGPIO _IOW(MGSL_MAGIC_IOC,16,struct gpio_desc) |
291 | #define MGSL_IOCGGPIO _IOR(MGSL_MAGIC_IOC,17,struct gpio_desc) | 292 | #define MGSL_IOCGGPIO _IOR(MGSL_MAGIC_IOC,17,struct gpio_desc) |
292 | #define MGSL_IOCWAITGPIO _IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc) | 293 | #define MGSL_IOCWAITGPIO _IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc) |
294 | #define MGSL_IOCSXSYNC _IO(MGSL_MAGIC_IOC, 19) | ||
295 | #define MGSL_IOCGXSYNC _IO(MGSL_MAGIC_IOC, 20) | ||
296 | #define MGSL_IOCSXCTRL _IO(MGSL_MAGIC_IOC, 21) | ||
297 | #define MGSL_IOCGXCTRL _IO(MGSL_MAGIC_IOC, 22) | ||
293 | 298 | ||
294 | #ifdef __KERNEL__ | 299 | #ifdef __KERNEL__ |
295 | /* provide 32 bit ioctl compatibility on 64 bit systems */ | 300 | /* provide 32 bit ioctl compatibility on 64 bit systems */ |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index e6319d18a55d..cacc27a0e285 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -701,7 +701,8 @@ asmlinkage long sys_nfsservctl(int cmd, | |||
701 | asmlinkage long sys_syslog(int type, char __user *buf, int len); | 701 | asmlinkage long sys_syslog(int type, char __user *buf, int len); |
702 | asmlinkage long sys_uselib(const char __user *library); | 702 | asmlinkage long sys_uselib(const char __user *library); |
703 | asmlinkage long sys_ni_syscall(void); | 703 | asmlinkage long sys_ni_syscall(void); |
704 | asmlinkage long sys_ptrace(long request, long pid, long addr, long data); | 704 | asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, |
705 | unsigned long data); | ||
705 | 706 | ||
706 | asmlinkage long sys_add_key(const char __user *_type, | 707 | asmlinkage long sys_add_key(const char __user *_type, |
707 | const char __user *_description, | 708 | const char __user *_description, |
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index 96eb576d82fd..30b881555fa5 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h | |||
@@ -164,6 +164,10 @@ int sysfs_add_file_to_group(struct kobject *kobj, | |||
164 | const struct attribute *attr, const char *group); | 164 | const struct attribute *attr, const char *group); |
165 | void sysfs_remove_file_from_group(struct kobject *kobj, | 165 | void sysfs_remove_file_from_group(struct kobject *kobj, |
166 | const struct attribute *attr, const char *group); | 166 | const struct attribute *attr, const char *group); |
167 | int sysfs_merge_group(struct kobject *kobj, | ||
168 | const struct attribute_group *grp); | ||
169 | void sysfs_unmerge_group(struct kobject *kobj, | ||
170 | const struct attribute_group *grp); | ||
167 | 171 | ||
168 | void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); | 172 | void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); |
169 | void sysfs_notify_dirent(struct sysfs_dirent *sd); | 173 | void sysfs_notify_dirent(struct sysfs_dirent *sd); |
@@ -302,6 +306,17 @@ static inline void sysfs_remove_file_from_group(struct kobject *kobj, | |||
302 | { | 306 | { |
303 | } | 307 | } |
304 | 308 | ||
309 | static inline int sysfs_merge_group(struct kobject *kobj, | ||
310 | const struct attribute_group *grp) | ||
311 | { | ||
312 | return 0; | ||
313 | } | ||
314 | |||
315 | static inline void sysfs_unmerge_group(struct kobject *kobj, | ||
316 | const struct attribute_group *grp) | ||
317 | { | ||
318 | } | ||
319 | |||
305 | static inline void sysfs_notify(struct kobject *kobj, const char *dir, | 320 | static inline void sysfs_notify(struct kobject *kobj, const char *dir, |
306 | const char *attr) | 321 | const char *attr) |
307 | { | 322 | { |
diff --git a/include/linux/tc_act/Kbuild b/include/linux/tc_act/Kbuild index 76990937f4c9..67b501c302b2 100644 --- a/include/linux/tc_act/Kbuild +++ b/include/linux/tc_act/Kbuild | |||
@@ -4,3 +4,4 @@ header-y += tc_mirred.h | |||
4 | header-y += tc_pedit.h | 4 | header-y += tc_pedit.h |
5 | header-y += tc_nat.h | 5 | header-y += tc_nat.h |
6 | header-y += tc_skbedit.h | 6 | header-y += tc_skbedit.h |
7 | header-y += tc_csum.h | ||
diff --git a/include/linux/tc_act/tc_csum.h b/include/linux/tc_act/tc_csum.h new file mode 100644 index 000000000000..a047c49a3153 --- /dev/null +++ b/include/linux/tc_act/tc_csum.h | |||
@@ -0,0 +1,32 @@ | |||
1 | #ifndef __LINUX_TC_CSUM_H | ||
2 | #define __LINUX_TC_CSUM_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <linux/pkt_cls.h> | ||
6 | |||
7 | #define TCA_ACT_CSUM 16 | ||
8 | |||
9 | enum { | ||
10 | TCA_CSUM_UNSPEC, | ||
11 | TCA_CSUM_PARMS, | ||
12 | TCA_CSUM_TM, | ||
13 | __TCA_CSUM_MAX | ||
14 | }; | ||
15 | #define TCA_CSUM_MAX (__TCA_CSUM_MAX - 1) | ||
16 | |||
17 | enum { | ||
18 | TCA_CSUM_UPDATE_FLAG_IPV4HDR = 1, | ||
19 | TCA_CSUM_UPDATE_FLAG_ICMP = 2, | ||
20 | TCA_CSUM_UPDATE_FLAG_IGMP = 4, | ||
21 | TCA_CSUM_UPDATE_FLAG_TCP = 8, | ||
22 | TCA_CSUM_UPDATE_FLAG_UDP = 16, | ||
23 | TCA_CSUM_UPDATE_FLAG_UDPLITE = 32 | ||
24 | }; | ||
25 | |||
26 | struct tc_csum { | ||
27 | tc_gen; | ||
28 | |||
29 | __u32 update_flags; | ||
30 | }; | ||
31 | |||
32 | #endif /* __LINUX_TC_CSUM_H */ | ||
diff --git a/include/linux/tc_ematch/tc_em_meta.h b/include/linux/tc_ematch/tc_em_meta.h index 0864206ec1a3..7138962664f8 100644 --- a/include/linux/tc_ematch/tc_em_meta.h +++ b/include/linux/tc_ematch/tc_em_meta.h | |||
@@ -79,6 +79,7 @@ enum { | |||
79 | TCF_META_ID_SK_SENDMSG_OFF, | 79 | TCF_META_ID_SK_SENDMSG_OFF, |
80 | TCF_META_ID_SK_WRITE_PENDING, | 80 | TCF_META_ID_SK_WRITE_PENDING, |
81 | TCF_META_ID_VLAN_TAG, | 81 | TCF_META_ID_VLAN_TAG, |
82 | TCF_META_ID_RXHASH, | ||
82 | __TCF_META_ID_MAX | 83 | __TCF_META_ID_MAX |
83 | }; | 84 | }; |
84 | #define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1) | 85 | #define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1) |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index a778ee024590..e64f4c67d0ef 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -105,6 +105,7 @@ enum { | |||
105 | #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ | 105 | #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ |
106 | #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ | 106 | #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ |
107 | #define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ | 107 | #define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ |
108 | #define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ | ||
108 | 109 | ||
109 | /* for TCP_INFO socket option */ | 110 | /* for TCP_INFO socket option */ |
110 | #define TCPI_OPT_TIMESTAMPS 1 | 111 | #define TCPI_OPT_TIMESTAMPS 1 |
diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index a8cc4e13434c..c90696544176 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h | |||
@@ -23,12 +23,12 @@ struct restart_block { | |||
23 | }; | 23 | }; |
24 | /* For futex_wait and futex_wait_requeue_pi */ | 24 | /* For futex_wait and futex_wait_requeue_pi */ |
25 | struct { | 25 | struct { |
26 | u32 *uaddr; | 26 | u32 __user *uaddr; |
27 | u32 val; | 27 | u32 val; |
28 | u32 flags; | 28 | u32 flags; |
29 | u32 bitset; | 29 | u32 bitset; |
30 | u64 time; | 30 | u64 time; |
31 | u32 *uaddr2; | 31 | u32 __user *uaddr2; |
32 | } futex; | 32 | } futex; |
33 | /* For nanosleep */ | 33 | /* For nanosleep */ |
34 | struct { | 34 | struct { |
diff --git a/include/linux/ti_wilink_st.h b/include/linux/ti_wilink_st.h new file mode 100644 index 000000000000..4c7be2263011 --- /dev/null +++ b/include/linux/ti_wilink_st.h | |||
@@ -0,0 +1,400 @@ | |||
1 | /* | ||
2 | * Shared Transport Header file | ||
3 | * To be included by the protocol stack drivers for | ||
4 | * Texas Instruments BT,FM and GPS combo chip drivers | ||
5 | * and also serves the sub-modules of the shared transport driver. | ||
6 | * | ||
7 | * Copyright (C) 2009-2010 Texas Instruments | ||
8 | * Author: Pavan Savoy <pavan_savoy@ti.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #ifndef TI_WILINK_ST_H | ||
26 | #define TI_WILINK_ST_H | ||
27 | |||
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 | ||
39 | * common physical interface like UART. | ||
40 | */ | ||
41 | enum proto_type { | ||
42 | ST_BT, | ||
43 | ST_FM, | ||
44 | ST_GPS, | ||
45 | ST_MAX, | ||
46 | }; | ||
47 | |||
48 | /** | ||
49 | * struct st_proto_s - Per Protocol structure from BT/FM/GPS to ST | ||
50 | * @type: type of the protocol being registered among the | ||
51 | * available proto_type(BT, FM, GPS the protocol which share TTY). | ||
52 | * @recv: the receiver callback pointing to a function in the | ||
53 | * protocol drivers called by the ST driver upon receiving | ||
54 | * relevant data. | ||
55 | * @match_packet: reserved for future use, to make ST more generic | ||
56 | * @reg_complete_cb: callback handler pointing to a function in protocol | ||
57 | * handler called by ST when the pending registrations are complete. | ||
58 | * The registrations are marked pending, in situations when fw | ||
59 | * download is in progress. | ||
60 | * @write: pointer to function in ST provided to protocol drivers from ST, | ||
61 | * to be made use when protocol drivers have data to send to TTY. | ||
62 | * @priv_data: privdate data holder for the protocol drivers, sent | ||
63 | * from the protocol drivers during registration, and sent back on | ||
64 | * reg_complete_cb and recv. | ||
65 | */ | ||
66 | struct st_proto_s { | ||
67 | enum proto_type type; | ||
68 | long (*recv) (void *, struct sk_buff *); | ||
69 | unsigned char (*match_packet) (const unsigned char *data); | ||
70 | void (*reg_complete_cb) (void *, char data); | ||
71 | long (*write) (struct sk_buff *skb); | ||
72 | void *priv_data; | ||
73 | }; | ||
74 | |||
75 | extern long st_register(struct st_proto_s *); | ||
76 | extern long st_unregister(enum proto_type); | ||
77 | |||
78 | |||
79 | /* | ||
80 | * header information used by st_core.c | ||
81 | */ | ||
82 | |||
83 | /* states of protocol list */ | ||
84 | #define ST_NOTEMPTY 1 | ||
85 | #define ST_EMPTY 0 | ||
86 | |||
87 | /* | ||
88 | * possible st_states | ||
89 | */ | ||
90 | #define ST_INITIALIZING 1 | ||
91 | #define ST_REG_IN_PROGRESS 2 | ||
92 | #define ST_REG_PENDING 3 | ||
93 | #define ST_WAITING_FOR_RESP 4 | ||
94 | |||
95 | /** | ||
96 | * struct st_data_s - ST core internal structure | ||
97 | * @st_state: different states of ST like initializing, registration | ||
98 | * in progress, this is mainly used to return relevant err codes | ||
99 | * when protocol drivers are registering. It is also used to track | ||
100 | * the recv function, as in during fw download only HCI events | ||
101 | * can occur , where as during other times other events CH8, CH9 | ||
102 | * can occur. | ||
103 | * @tty: tty provided by the TTY core for line disciplines. | ||
104 | * @tx_skb: If for some reason the tty's write returns lesser bytes written | ||
105 | * then to maintain the rest of data to be written on next instance. | ||
106 | * This needs to be protected, hence the lock inside wakeup func. | ||
107 | * @tx_state: if the data is being written onto the TTY and protocol driver | ||
108 | * wants to send more, queue up data and mark that there is | ||
109 | * more data to send. | ||
110 | * @list: the list of protocols registered, only MAX can exist, one protocol | ||
111 | * can register only once. | ||
112 | * @rx_state: states to be maintained inside st's tty receive | ||
113 | * @rx_count: count to be maintained inside st's tty receieve | ||
114 | * @rx_skb: the skb where all data for a protocol gets accumulated, | ||
115 | * since tty might not call receive when a complete event packet | ||
116 | * is received, the states, count and the skb needs to be maintained. | ||
117 | * @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 | ||
119 | * up in here, PM(WAKEUP_IND) data needs to be sent and then the skbs | ||
120 | * from waitq can be moved onto the txq. | ||
121 | * Needs locking too. | ||
122 | * @lock: the lock to protect skbs, queues, and ST states. | ||
123 | * @protos_registered: count of the protocols registered, also when 0 the | ||
124 | * chip enable gpio can be toggled, and when it changes to 1 the fw | ||
125 | * needs to be downloaded to initialize chip side ST. | ||
126 | * @ll_state: the various PM states the chip can be, the states are notified | ||
127 | * to us, when the chip sends relevant PM packets(SLEEP_IND, WAKE_IND). | ||
128 | * @kim_data: reference to the parent encapsulating structure. | ||
129 | * | ||
130 | */ | ||
131 | struct st_data_s { | ||
132 | unsigned long st_state; | ||
133 | struct tty_struct *tty; | ||
134 | struct sk_buff *tx_skb; | ||
135 | #define ST_TX_SENDING 1 | ||
136 | #define ST_TX_WAKEUP 2 | ||
137 | unsigned long tx_state; | ||
138 | struct st_proto_s *list[ST_MAX]; | ||
139 | unsigned long rx_state; | ||
140 | unsigned long rx_count; | ||
141 | struct sk_buff *rx_skb; | ||
142 | struct sk_buff_head txq, tx_waitq; | ||
143 | spinlock_t lock; | ||
144 | unsigned char protos_registered; | ||
145 | unsigned long ll_state; | ||
146 | void *kim_data; | ||
147 | }; | ||
148 | |||
149 | /** | ||
150 | * st_int_write - | ||
151 | * point this to tty->driver->write or tty->ops->write | ||
152 | * depending upon the kernel version | ||
153 | */ | ||
154 | int st_int_write(struct st_data_s*, const unsigned char*, int); | ||
155 | |||
156 | /** | ||
157 | * st_write - | ||
158 | * internal write function, passed onto protocol drivers | ||
159 | * via the write function ptr of protocol struct | ||
160 | */ | ||
161 | long st_write(struct sk_buff *); | ||
162 | |||
163 | /* function to be called from ST-LL */ | ||
164 | void st_ll_send_frame(enum proto_type, struct sk_buff *); | ||
165 | |||
166 | /* internal wake up function */ | ||
167 | void st_tx_wakeup(struct st_data_s *st_data); | ||
168 | |||
169 | /* init, exit entry funcs called from KIM */ | ||
170 | int st_core_init(struct st_data_s **); | ||
171 | void st_core_exit(struct st_data_s *); | ||
172 | |||
173 | /* ask for reference from KIM */ | ||
174 | void st_kim_ref(struct st_data_s **, int); | ||
175 | |||
176 | #define GPS_STUB_TEST | ||
177 | #ifdef GPS_STUB_TEST | ||
178 | int gps_chrdrv_stub_write(const unsigned char*, int); | ||
179 | void gps_chrdrv_stub_init(void); | ||
180 | #endif | ||
181 | |||
182 | /* | ||
183 | * header information used by st_kim.c | ||
184 | */ | ||
185 | |||
186 | /* time in msec to wait for | ||
187 | * line discipline to be installed | ||
188 | */ | ||
189 | #define LDISC_TIME 500 | ||
190 | #define CMD_RESP_TIME 500 | ||
191 | #define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) \ | ||
192 | | ((unsigned short)((unsigned char)(b))) << 8)) | ||
193 | |||
194 | #define GPIO_HIGH 1 | ||
195 | #define GPIO_LOW 0 | ||
196 | |||
197 | /* the Power-On-Reset logic, requires to attempt | ||
198 | * to download firmware onto chip more than once | ||
199 | * since the self-test for chip takes a while | ||
200 | */ | ||
201 | #define POR_RETRY_COUNT 5 | ||
202 | |||
203 | /** | ||
204 | * struct chip_version - save the chip version | ||
205 | */ | ||
206 | struct chip_version { | ||
207 | unsigned short full; | ||
208 | unsigned short chip; | ||
209 | unsigned short min_ver; | ||
210 | unsigned short maj_ver; | ||
211 | }; | ||
212 | |||
213 | /** | ||
214 | * struct kim_data_s - the KIM internal data, embedded as the | ||
215 | * platform's drv data. One for each ST device in the system. | ||
216 | * @uim_pid: KIM needs to communicate with UIM to request to install | ||
217 | * the ldisc by opening UART when protocol drivers register. | ||
218 | * @kim_pdev: the platform device added in one of the board-XX.c file | ||
219 | * in arch/XX/ directory, 1 for each ST device. | ||
220 | * @kim_rcvd: completion handler to notify when data was received, | ||
221 | * mainly used during fw download, which involves multiple send/wait | ||
222 | * for each of the HCI-VS commands. | ||
223 | * @ldisc_installed: completion handler to notify that the UIM accepted | ||
224 | * the request to install ldisc, notify from tty_open which suggests | ||
225 | * the ldisc was properly installed. | ||
226 | * @resp_buffer: data buffer for the .bts fw file name. | ||
227 | * @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. | ||
230 | * @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 | ||
232 | * whole of the fw response, only HCI_EVENTs and hence diff from ST's | ||
233 | * 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 | ||
237 | * @version: chip version available via a sysfs entry. | ||
238 | * | ||
239 | */ | ||
240 | struct kim_data_s { | ||
241 | long uim_pid; | ||
242 | struct platform_device *kim_pdev; | ||
243 | struct completion kim_rcvd, ldisc_installed; | ||
244 | char resp_buffer[30]; | ||
245 | const struct firmware *fw_entry; | ||
246 | long gpios[ST_MAX]; | ||
247 | unsigned long rx_state; | ||
248 | unsigned long rx_count; | ||
249 | 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; | ||
253 | struct chip_version version; | ||
254 | }; | ||
255 | |||
256 | /** | ||
257 | * functions called when 1 of the protocol drivers gets | ||
258 | * registered, these need to communicate with UIM to request | ||
259 | * ldisc installed, read chip_version, download relevant fw | ||
260 | */ | ||
261 | long st_kim_start(void *); | ||
262 | long st_kim_stop(void *); | ||
263 | |||
264 | 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 *); | ||
267 | void kim_st_list_protocols(struct st_data_s *, void *); | ||
268 | |||
269 | /* | ||
270 | * BTS headers | ||
271 | */ | ||
272 | #define ACTION_SEND_COMMAND 1 | ||
273 | #define ACTION_WAIT_EVENT 2 | ||
274 | #define ACTION_SERIAL 3 | ||
275 | #define ACTION_DELAY 4 | ||
276 | #define ACTION_RUN_SCRIPT 5 | ||
277 | #define ACTION_REMARKS 6 | ||
278 | |||
279 | /** | ||
280 | * struct bts_header - the fw file is NOT binary which can | ||
281 | * be sent onto TTY as is. The .bts is more a script | ||
282 | * file which has different types of actions. | ||
283 | * Each such action needs to be parsed by the KIM and | ||
284 | * relevant procedure to be called. | ||
285 | */ | ||
286 | struct bts_header { | ||
287 | u32 magic; | ||
288 | u32 version; | ||
289 | u8 future[24]; | ||
290 | u8 actions[0]; | ||
291 | } __attribute__ ((packed)); | ||
292 | |||
293 | /** | ||
294 | * struct bts_action - Each .bts action has its own type of | ||
295 | * data. | ||
296 | */ | ||
297 | struct bts_action { | ||
298 | u16 type; | ||
299 | u16 size; | ||
300 | u8 data[0]; | ||
301 | } __attribute__ ((packed)); | ||
302 | |||
303 | struct bts_action_send { | ||
304 | u8 data[0]; | ||
305 | } __attribute__ ((packed)); | ||
306 | |||
307 | struct bts_action_wait { | ||
308 | u32 msec; | ||
309 | u32 size; | ||
310 | u8 data[0]; | ||
311 | } __attribute__ ((packed)); | ||
312 | |||
313 | struct bts_action_delay { | ||
314 | u32 msec; | ||
315 | } __attribute__ ((packed)); | ||
316 | |||
317 | struct bts_action_serial { | ||
318 | u32 baud; | ||
319 | u32 flow_control; | ||
320 | } __attribute__ ((packed)); | ||
321 | |||
322 | /** | ||
323 | * struct hci_command - the HCI-VS for intrepreting | ||
324 | * the change baud rate of host-side UART, which | ||
325 | * needs to be ignored, since UIM would do that | ||
326 | * when it receives request from KIM for ldisc installation. | ||
327 | */ | ||
328 | struct hci_command { | ||
329 | u8 prefix; | ||
330 | u16 opcode; | ||
331 | u8 plen; | ||
332 | u32 speed; | ||
333 | } __attribute__ ((packed)); | ||
334 | |||
335 | /* | ||
336 | * header information used by st_ll.c | ||
337 | */ | ||
338 | |||
339 | /* ST LL receiver states */ | ||
340 | #define ST_W4_PACKET_TYPE 0 | ||
341 | #define ST_BT_W4_EVENT_HDR 1 | ||
342 | #define ST_BT_W4_ACL_HDR 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 | |||
348 | /* ST LL state machines */ | ||
349 | #define ST_LL_ASLEEP 0 | ||
350 | #define ST_LL_ASLEEP_TO_AWAKE 1 | ||
351 | #define ST_LL_AWAKE 2 | ||
352 | #define ST_LL_AWAKE_TO_ASLEEP 3 | ||
353 | #define ST_LL_INVALID 4 | ||
354 | |||
355 | /* different PM notifications coming from chip */ | ||
356 | #define LL_SLEEP_IND 0x30 | ||
357 | #define LL_SLEEP_ACK 0x31 | ||
358 | #define LL_WAKE_UP_IND 0x32 | ||
359 | #define LL_WAKE_UP_ACK 0x33 | ||
360 | |||
361 | /* initialize and de-init ST LL */ | ||
362 | long st_ll_init(struct st_data_s *); | ||
363 | long st_ll_deinit(struct st_data_s *); | ||
364 | |||
365 | /** | ||
366 | * enable/disable ST LL along with KIM start/stop | ||
367 | * called by ST Core | ||
368 | */ | ||
369 | void st_ll_enable(struct st_data_s *); | ||
370 | void st_ll_disable(struct st_data_s *); | ||
371 | |||
372 | /** | ||
373 | * various funcs used by ST core to set/get the various PM states | ||
374 | * of the chip. | ||
375 | */ | ||
376 | unsigned long st_ll_getstate(struct st_data_s *); | ||
377 | unsigned long st_ll_sleep_state(struct st_data_s *, unsigned char); | ||
378 | void st_ll_wakeup(struct st_data_s *); | ||
379 | |||
380 | /* | ||
381 | * header information used by st_core.c for FM and GPS | ||
382 | * packet parsing, the bluetooth headers are already available | ||
383 | * at net/bluetooth/ | ||
384 | */ | ||
385 | |||
386 | struct fm_event_hdr { | ||
387 | u8 plen; | ||
388 | } __attribute__ ((packed)); | ||
389 | |||
390 | #define FM_MAX_FRAME_SIZE 0xFF /* TODO: */ | ||
391 | #define FM_EVENT_HDR_SIZE 1 /* size of fm_event_hdr */ | ||
392 | #define ST_FM_CH8_PKT 0x8 | ||
393 | |||
394 | /* gps stuff */ | ||
395 | struct gps_event_hdr { | ||
396 | u8 opcode; | ||
397 | u16 plen; | ||
398 | } __attribute__ ((packed)); | ||
399 | |||
400 | #endif /* TI_WILINK_ST_H */ | ||
diff --git a/include/linux/tipc.h b/include/linux/tipc.h index 181c8d0e6f73..d10614b29d59 100644 --- a/include/linux/tipc.h +++ b/include/linux/tipc.h | |||
@@ -127,17 +127,23 @@ static inline unsigned int tipc_node(__u32 addr) | |||
127 | * TIPC topology subscription service definitions | 127 | * TIPC topology subscription service definitions |
128 | */ | 128 | */ |
129 | 129 | ||
130 | #define TIPC_SUB_SERVICE 0x00 /* Filter for service availability */ | 130 | #define TIPC_SUB_PORTS 0x01 /* filter for port availability */ |
131 | #define TIPC_SUB_PORTS 0x01 /* Filter for port 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 | ||
133 | 139 | ||
134 | #define TIPC_WAIT_FOREVER ~0 /* timeout for permanent subscription */ | 140 | #define TIPC_WAIT_FOREVER ~0 /* timeout for permanent subscription */ |
135 | 141 | ||
136 | struct tipc_subscr { | 142 | struct tipc_subscr { |
137 | struct tipc_name_seq seq; /* NBO. Name sequence of interest */ | 143 | struct tipc_name_seq seq; /* name sequence of interest */ |
138 | __u32 timeout; /* NBO. Subscription duration (in ms) */ | 144 | __u32 timeout; /* subscription duration (in ms) */ |
139 | __u32 filter; /* NBO. Bitmask of filter options */ | 145 | __u32 filter; /* bitmask of filter options */ |
140 | char usr_handle[8]; /* Opaque. Available for subscriber use */ | 146 | char usr_handle[8]; /* available for subscriber use */ |
141 | }; | 147 | }; |
142 | 148 | ||
143 | #define TIPC_PUBLISHED 1 /* publication event */ | 149 | #define TIPC_PUBLISHED 1 /* publication event */ |
@@ -145,11 +151,11 @@ struct tipc_subscr { | |||
145 | #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ | 151 | #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ |
146 | 152 | ||
147 | struct tipc_event { | 153 | struct tipc_event { |
148 | __u32 event; /* NBO. Event type, as defined above */ | 154 | __u32 event; /* event type */ |
149 | __u32 found_lower; /* NBO. Matching name seq instances */ | 155 | __u32 found_lower; /* matching name seq instances */ |
150 | __u32 found_upper; /* " " " " " */ | 156 | __u32 found_upper; /* " " " " */ |
151 | struct tipc_portid port; /* NBO. Associated port */ | 157 | struct tipc_portid port; /* associated port */ |
152 | struct tipc_subscr s; /* Original, associated subscription */ | 158 | struct tipc_subscr s; /* associated subscription */ |
153 | }; | 159 | }; |
154 | 160 | ||
155 | /* | 161 | /* |
diff --git a/include/linux/topology.h b/include/linux/topology.h index 64e084ff5e5c..b91a40e847d2 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
@@ -201,6 +201,12 @@ int arch_update_cpu_topology(void); | |||
201 | .balance_interval = 64, \ | 201 | .balance_interval = 64, \ |
202 | } | 202 | } |
203 | 203 | ||
204 | #ifdef CONFIG_SCHED_BOOK | ||
205 | #ifndef SD_BOOK_INIT | ||
206 | #error Please define an appropriate SD_BOOK_INIT in include/asm/topology.h!!! | ||
207 | #endif | ||
208 | #endif /* CONFIG_SCHED_BOOK */ | ||
209 | |||
204 | #ifdef CONFIG_NUMA | 210 | #ifdef CONFIG_NUMA |
205 | #ifndef SD_NODE_INIT | 211 | #ifndef SD_NODE_INIT |
206 | #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!! | 212 | #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!! |
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h index 10db0102a890..3a2e66d88a32 100644 --- a/include/linux/tracehook.h +++ b/include/linux/tracehook.h | |||
@@ -150,7 +150,7 @@ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step) | |||
150 | * | 150 | * |
151 | * Return %LSM_UNSAFE_* bits applied to an exec because of tracing. | 151 | * Return %LSM_UNSAFE_* bits applied to an exec because of tracing. |
152 | * | 152 | * |
153 | * @task->cred_guard_mutex is held by the caller through the do_execve(). | 153 | * @task->signal->cred_guard_mutex is held by the caller through the do_execve(). |
154 | */ | 154 | */ |
155 | static inline int tracehook_unsafe_exec(struct task_struct *task) | 155 | static inline int tracehook_unsafe_exec(struct task_struct *task) |
156 | { | 156 | { |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 103d1b61aacb..a4a90b6726ce 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
19 | #include <linux/rcupdate.h> | 19 | #include <linux/rcupdate.h> |
20 | #include <linux/jump_label.h> | ||
20 | 21 | ||
21 | struct module; | 22 | struct module; |
22 | struct tracepoint; | 23 | struct tracepoint; |
@@ -145,7 +146,9 @@ static inline void tracepoint_update_probe_range(struct tracepoint *begin, | |||
145 | extern struct tracepoint __tracepoint_##name; \ | 146 | extern struct tracepoint __tracepoint_##name; \ |
146 | static inline void trace_##name(proto) \ | 147 | static inline void trace_##name(proto) \ |
147 | { \ | 148 | { \ |
148 | if (unlikely(__tracepoint_##name.state)) \ | 149 | JUMP_LABEL(&__tracepoint_##name.state, do_trace); \ |
150 | return; \ | ||
151 | do_trace: \ | ||
149 | __DO_TRACE(&__tracepoint_##name, \ | 152 | __DO_TRACE(&__tracepoint_##name, \ |
150 | TP_PROTO(data_proto), \ | 153 | TP_PROTO(data_proto), \ |
151 | TP_ARGS(data_args)); \ | 154 | TP_ARGS(data_args)); \ |
diff --git a/include/linux/tty.h b/include/linux/tty.h index 67d64e6efe7a..c7ea9bc8897c 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -50,6 +50,7 @@ | |||
50 | #define N_V253 19 /* Codec control over voice modem */ | 50 | #define N_V253 19 /* Codec control over voice modem */ |
51 | #define N_CAIF 20 /* CAIF protocol for talking to modems */ | 51 | #define N_CAIF 20 /* CAIF protocol for talking to modems */ |
52 | #define N_GSM0710 21 /* GSM 0710 Mux */ | 52 | #define N_GSM0710 21 /* GSM 0710 Mux */ |
53 | #define N_TI_WL 22 /* for TI's WL BT, FM, GPS combo chips */ | ||
53 | 54 | ||
54 | /* | 55 | /* |
55 | * This character is the same as _POSIX_VDISABLE: it cannot be used as | 56 | * This character is the same as _POSIX_VDISABLE: it cannot be used as |
@@ -256,6 +257,7 @@ struct tty_operations; | |||
256 | struct tty_struct { | 257 | struct tty_struct { |
257 | int magic; | 258 | int magic; |
258 | struct kref kref; | 259 | struct kref kref; |
260 | struct device *dev; | ||
259 | struct tty_driver *driver; | 261 | struct tty_driver *driver; |
260 | const struct tty_operations *ops; | 262 | const struct tty_operations *ops; |
261 | int index; | 263 | int index; |
@@ -465,7 +467,7 @@ extern void proc_clear_tty(struct task_struct *p); | |||
465 | extern struct tty_struct *get_current_tty(void); | 467 | extern struct tty_struct *get_current_tty(void); |
466 | extern void tty_default_fops(struct file_operations *fops); | 468 | extern void tty_default_fops(struct file_operations *fops); |
467 | extern struct tty_struct *alloc_tty_struct(void); | 469 | extern struct tty_struct *alloc_tty_struct(void); |
468 | extern void tty_add_file(struct tty_struct *tty, struct file *file); | 470 | extern int tty_add_file(struct tty_struct *tty, struct file *file); |
469 | extern void free_tty_struct(struct tty_struct *tty); | 471 | extern void free_tty_struct(struct tty_struct *tty); |
470 | extern void initialize_tty_struct(struct tty_struct *tty, | 472 | extern void initialize_tty_struct(struct tty_struct *tty, |
471 | struct tty_driver *driver, int idx); | 473 | struct tty_driver *driver, int idx); |
@@ -539,8 +541,8 @@ extern void tty_audit_exit(void); | |||
539 | extern void tty_audit_fork(struct signal_struct *sig); | 541 | extern void tty_audit_fork(struct signal_struct *sig); |
540 | extern void tty_audit_tiocsti(struct tty_struct *tty, char ch); | 542 | extern void tty_audit_tiocsti(struct tty_struct *tty, char ch); |
541 | extern void tty_audit_push(struct tty_struct *tty); | 543 | extern void tty_audit_push(struct tty_struct *tty); |
542 | extern void tty_audit_push_task(struct task_struct *tsk, | 544 | extern int tty_audit_push_task(struct task_struct *tsk, |
543 | uid_t loginuid, u32 sessionid); | 545 | uid_t loginuid, u32 sessionid); |
544 | #else | 546 | #else |
545 | static inline void tty_audit_add_data(struct tty_struct *tty, | 547 | static inline void tty_audit_add_data(struct tty_struct *tty, |
546 | unsigned char *data, size_t size) | 548 | unsigned char *data, size_t size) |
@@ -558,9 +560,10 @@ static inline void tty_audit_fork(struct signal_struct *sig) | |||
558 | static inline void tty_audit_push(struct tty_struct *tty) | 560 | static inline void tty_audit_push(struct tty_struct *tty) |
559 | { | 561 | { |
560 | } | 562 | } |
561 | static inline void tty_audit_push_task(struct task_struct *tsk, | 563 | static inline int tty_audit_push_task(struct task_struct *tsk, |
562 | uid_t loginuid, u32 sessionid) | 564 | uid_t loginuid, u32 sessionid) |
563 | { | 565 | { |
566 | return 0; | ||
564 | } | 567 | } |
565 | #endif | 568 | #endif |
566 | 569 | ||
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index b08677982525..db2d227694da 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
@@ -224,6 +224,12 @@ | |||
224 | * unless the tty also has a valid tty->termiox pointer. | 224 | * unless the tty also has a valid tty->termiox pointer. |
225 | * | 225 | * |
226 | * Optional: Called under the termios lock | 226 | * Optional: Called under the termios lock |
227 | * | ||
228 | * int (*get_icount)(struct tty_struct *tty, struct serial_icounter *icount); | ||
229 | * | ||
230 | * Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel | ||
231 | * structure to complete. This method is optional and will only be called | ||
232 | * if provided (otherwise EINVAL will be returned). | ||
227 | */ | 233 | */ |
228 | 234 | ||
229 | #include <linux/fs.h> | 235 | #include <linux/fs.h> |
@@ -232,6 +238,7 @@ | |||
232 | 238 | ||
233 | struct tty_struct; | 239 | struct tty_struct; |
234 | struct tty_driver; | 240 | struct tty_driver; |
241 | struct serial_icounter_struct; | ||
235 | 242 | ||
236 | struct tty_operations { | 243 | struct tty_operations { |
237 | struct tty_struct * (*lookup)(struct tty_driver *driver, | 244 | struct tty_struct * (*lookup)(struct tty_driver *driver, |
@@ -268,6 +275,8 @@ struct tty_operations { | |||
268 | unsigned int set, unsigned int clear); | 275 | unsigned int set, unsigned int clear); |
269 | int (*resize)(struct tty_struct *tty, struct winsize *ws); | 276 | int (*resize)(struct tty_struct *tty, struct winsize *ws); |
270 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); | 277 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); |
278 | int (*get_icount)(struct tty_struct *tty, | ||
279 | struct serial_icounter_struct *icount); | ||
271 | #ifdef CONFIG_CONSOLE_POLL | 280 | #ifdef CONFIG_CONSOLE_POLL |
272 | int (*poll_init)(struct tty_driver *driver, int line, char *options); | 281 | int (*poll_init)(struct tty_driver *driver, int line, char *options); |
273 | int (*poll_get_char)(struct tty_driver *driver, int line); | 282 | int (*poll_get_char)(struct tty_driver *driver, int line); |
diff --git a/include/linux/types.h b/include/linux/types.h index 01a082f56ef4..c2a9eb44f2fa 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -178,6 +178,19 @@ typedef __u64 __bitwise __be64; | |||
178 | typedef __u16 __bitwise __sum16; | 178 | typedef __u16 __bitwise __sum16; |
179 | typedef __u32 __bitwise __wsum; | 179 | typedef __u32 __bitwise __wsum; |
180 | 180 | ||
181 | /* | ||
182 | * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid | ||
183 | * common 32/64-bit compat problems. | ||
184 | * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other | ||
185 | * architectures) and to 8-byte boundaries on 64-bit architetures. The new | ||
186 | * aligned_64 type enforces 8-byte alignment so that structs containing | ||
187 | * aligned_64 values have the same alignment on 32-bit and 64-bit architectures. | ||
188 | * No conversions are necessary between 32-bit user-space and a 64-bit kernel. | ||
189 | */ | ||
190 | #define __aligned_u64 __u64 __attribute__((aligned(8))) | ||
191 | #define __aligned_be64 __be64 __attribute__((aligned(8))) | ||
192 | #define __aligned_le64 __le64 __attribute__((aligned(8))) | ||
193 | |||
181 | #ifdef __KERNEL__ | 194 | #ifdef __KERNEL__ |
182 | typedef unsigned __bitwise__ gfp_t; | 195 | typedef unsigned __bitwise__ gfp_t; |
183 | typedef unsigned __bitwise__ fmode_t; | 196 | typedef unsigned __bitwise__ fmode_t; |
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index 5dcc9ff72f69..d6188e5a52df 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h | |||
@@ -108,7 +108,7 @@ extern void uio_event_notify(struct uio_info *info); | |||
108 | 108 | ||
109 | /* defines for uio_info->irq */ | 109 | /* defines for uio_info->irq */ |
110 | #define UIO_IRQ_CUSTOM -1 | 110 | #define UIO_IRQ_CUSTOM -1 |
111 | #define UIO_IRQ_NONE -2 | 111 | #define UIO_IRQ_NONE 0 |
112 | 112 | ||
113 | /* defines for uio_mem->memtype */ | 113 | /* defines for uio_mem->memtype */ |
114 | #define UIO_MEM_NONE 0 | 114 | #define UIO_MEM_NONE 0 |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 35fe6ab222bb..24300d8a1bc1 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -797,7 +797,7 @@ struct usbdrv_wrap { | |||
797 | * @disconnect: Called when the interface is no longer accessible, usually | 797 | * @disconnect: Called when the interface is no longer accessible, usually |
798 | * because its device has been (or is being) disconnected or the | 798 | * because its device has been (or is being) disconnected or the |
799 | * driver module is being unloaded. | 799 | * driver module is being unloaded. |
800 | * @ioctl: Used for drivers that want to talk to userspace through | 800 | * @unlocked_ioctl: Used for drivers that want to talk to userspace through |
801 | * the "usbfs" filesystem. This lets devices provide ways to | 801 | * the "usbfs" filesystem. This lets devices provide ways to |
802 | * expose information to user space regardless of where they | 802 | * expose information to user space regardless of where they |
803 | * do (or don't) show up otherwise in the filesystem. | 803 | * do (or don't) show up otherwise in the filesystem. |
diff --git a/include/linux/usb/cdc.h b/include/linux/usb/cdc.h index c117a68d04a7..5e86dc771da4 100644 --- a/include/linux/usb/cdc.h +++ b/include/linux/usb/cdc.h | |||
@@ -32,6 +32,8 @@ | |||
32 | 32 | ||
33 | #define USB_CDC_PROTO_EEM 7 | 33 | #define USB_CDC_PROTO_EEM 7 |
34 | 34 | ||
35 | #define USB_CDC_NCM_PROTO_NTB 1 | ||
36 | |||
35 | /*-------------------------------------------------------------------------*/ | 37 | /*-------------------------------------------------------------------------*/ |
36 | 38 | ||
37 | /* | 39 | /* |
@@ -274,13 +276,13 @@ struct usb_cdc_notification { | |||
274 | /* | 276 | /* |
275 | * Class Specific structures and constants | 277 | * Class Specific structures and constants |
276 | * | 278 | * |
277 | * CDC NCM parameter structure, CDC NCM subclass 6.2.1 | 279 | * CDC NCM NTB parameters structure, CDC NCM subclass 6.2.1 |
278 | * | 280 | * |
279 | */ | 281 | */ |
280 | 282 | ||
281 | struct usb_cdc_ncm_ntb_parameter { | 283 | struct usb_cdc_ncm_ntb_parameters { |
282 | __le16 wLength; | 284 | __le16 wLength; |
283 | __le16 bmNtbFormatSupported; | 285 | __le16 bmNtbFormatsSupported; |
284 | __le32 dwNtbInMaxSize; | 286 | __le32 dwNtbInMaxSize; |
285 | __le16 wNdpInDivisor; | 287 | __le16 wNdpInDivisor; |
286 | __le16 wNdpInPayloadRemainder; | 288 | __le16 wNdpInPayloadRemainder; |
@@ -297,8 +299,8 @@ struct usb_cdc_ncm_ntb_parameter { | |||
297 | * CDC NCM transfer headers, CDC NCM subclass 3.2 | 299 | * CDC NCM transfer headers, CDC NCM subclass 3.2 |
298 | */ | 300 | */ |
299 | 301 | ||
300 | #define NCM_NTH16_SIGN 0x484D434E /* NCMH */ | 302 | #define USB_CDC_NCM_NTH16_SIGN 0x484D434E /* NCMH */ |
301 | #define NCM_NTH32_SIGN 0x686D636E /* ncmh */ | 303 | #define USB_CDC_NCM_NTH32_SIGN 0x686D636E /* ncmh */ |
302 | 304 | ||
303 | struct usb_cdc_ncm_nth16 { | 305 | struct usb_cdc_ncm_nth16 { |
304 | __le32 dwSignature; | 306 | __le32 dwSignature; |
@@ -320,25 +322,78 @@ struct usb_cdc_ncm_nth32 { | |||
320 | * CDC NCM datagram pointers, CDC NCM subclass 3.3 | 322 | * CDC NCM datagram pointers, CDC NCM subclass 3.3 |
321 | */ | 323 | */ |
322 | 324 | ||
323 | #define NCM_NDP16_CRC_SIGN 0x314D434E /* NCM1 */ | 325 | #define USB_CDC_NCM_NDP16_CRC_SIGN 0x314D434E /* NCM1 */ |
324 | #define NCM_NDP16_NOCRC_SIGN 0x304D434E /* NCM0 */ | 326 | #define USB_CDC_NCM_NDP16_NOCRC_SIGN 0x304D434E /* NCM0 */ |
325 | #define NCM_NDP32_CRC_SIGN 0x316D636E /* ncm1 */ | 327 | #define USB_CDC_NCM_NDP32_CRC_SIGN 0x316D636E /* ncm1 */ |
326 | #define NCM_NDP32_NOCRC_SIGN 0x306D636E /* ncm0 */ | 328 | #define USB_CDC_NCM_NDP32_NOCRC_SIGN 0x306D636E /* ncm0 */ |
329 | |||
330 | /* 16-bit NCM Datagram Pointer Entry */ | ||
331 | struct usb_cdc_ncm_dpe16 { | ||
332 | __le16 wDatagramIndex; | ||
333 | __le16 wDatagramLength; | ||
334 | } __attribute__((__packed__)); | ||
327 | 335 | ||
336 | /* 16-bit NCM Datagram Pointer Table */ | ||
328 | struct usb_cdc_ncm_ndp16 { | 337 | struct usb_cdc_ncm_ndp16 { |
329 | __le32 dwSignature; | 338 | __le32 dwSignature; |
330 | __le16 wLength; | 339 | __le16 wLength; |
331 | __le16 wNextFpIndex; | 340 | __le16 wNextFpIndex; |
332 | __u8 data[0]; | 341 | struct usb_cdc_ncm_dpe16 dpe16[0]; |
333 | } __attribute__ ((packed)); | 342 | } __attribute__ ((packed)); |
334 | 343 | ||
344 | /* 32-bit NCM Datagram Pointer Entry */ | ||
345 | struct usb_cdc_ncm_dpe32 { | ||
346 | __le32 dwDatagramIndex; | ||
347 | __le32 dwDatagramLength; | ||
348 | } __attribute__((__packed__)); | ||
349 | |||
350 | /* 32-bit NCM Datagram Pointer Table */ | ||
335 | struct usb_cdc_ncm_ndp32 { | 351 | struct usb_cdc_ncm_ndp32 { |
336 | __le32 dwSignature; | 352 | __le32 dwSignature; |
337 | __le16 wLength; | 353 | __le16 wLength; |
338 | __le16 wReserved6; | 354 | __le16 wReserved6; |
339 | __le32 dwNextFpIndex; | 355 | __le32 dwNextNdpIndex; |
340 | __le32 dwReserved12; | 356 | __le32 dwReserved12; |
341 | __u8 data[0]; | 357 | struct usb_cdc_ncm_dpe32 dpe32[0]; |
342 | } __attribute__ ((packed)); | 358 | } __attribute__ ((packed)); |
343 | 359 | ||
360 | /* CDC NCM subclass 3.2.1 and 3.2.2 */ | ||
361 | #define USB_CDC_NCM_NDP16_INDEX_MIN 0x000C | ||
362 | #define USB_CDC_NCM_NDP32_INDEX_MIN 0x0010 | ||
363 | |||
364 | /* CDC NCM subclass 3.3.3 Datagram Formatting */ | ||
365 | #define USB_CDC_NCM_DATAGRAM_FORMAT_CRC 0x30 | ||
366 | #define USB_CDC_NCM_DATAGRAM_FORMAT_NOCRC 0X31 | ||
367 | |||
368 | /* CDC NCM subclass 4.2 NCM Communications Interface Protocol Code */ | ||
369 | #define USB_CDC_NCM_PROTO_CODE_NO_ENCAP_COMMANDS 0x00 | ||
370 | #define USB_CDC_NCM_PROTO_CODE_EXTERN_PROTO 0xFE | ||
371 | |||
372 | /* CDC NCM subclass 5.2.1 NCM Functional Descriptor, bmNetworkCapabilities */ | ||
373 | #define USB_CDC_NCM_NCAP_ETH_FILTER (1 << 0) | ||
374 | #define USB_CDC_NCM_NCAP_NET_ADDRESS (1 << 1) | ||
375 | #define USB_CDC_NCM_NCAP_ENCAP_COMMAND (1 << 2) | ||
376 | #define USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE (1 << 3) | ||
377 | #define USB_CDC_NCM_NCAP_CRC_MODE (1 << 4) | ||
378 | |||
379 | /* CDC NCM subclass Table 6-3: NTB Parameter Structure */ | ||
380 | #define USB_CDC_NCM_NTB16_SUPPORTED (1 << 0) | ||
381 | #define USB_CDC_NCM_NTB32_SUPPORTED (1 << 1) | ||
382 | |||
383 | /* CDC NCM subclass Table 6-3: NTB Parameter Structure */ | ||
384 | #define USB_CDC_NCM_NDP_ALIGN_MIN_SIZE 0x04 | ||
385 | #define USB_CDC_NCM_NTB_MAX_LENGTH 0x1C | ||
386 | |||
387 | /* CDC NCM subclass 6.2.5 SetNtbFormat */ | ||
388 | #define USB_CDC_NCM_NTB16_FORMAT 0x00 | ||
389 | #define USB_CDC_NCM_NTB32_FORMAT 0x01 | ||
390 | |||
391 | /* CDC NCM subclass 6.2.7 SetNtbInputSize */ | ||
392 | #define USB_CDC_NCM_NTB_MIN_IN_SIZE 2048 | ||
393 | #define USB_CDC_NCM_NTB_MIN_OUT_SIZE 2048 | ||
394 | |||
395 | /* CDC NCM subclass 6.2.11 SetCrcMode */ | ||
396 | #define USB_CDC_NCM_CRC_NOT_APPENDED 0x00 | ||
397 | #define USB_CDC_NCM_CRC_APPENDED 0x01 | ||
398 | |||
344 | #endif /* __LINUX_USB_CDC_H */ | 399 | #endif /* __LINUX_USB_CDC_H */ |
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index da2ed77d3e8d..f917bbbc8901 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h | |||
@@ -123,8 +123,23 @@ | |||
123 | #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ | 123 | #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ |
124 | #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ | 124 | #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ |
125 | 125 | ||
126 | /* | ||
127 | * New Feature Selectors as added by USB 3.0 | ||
128 | * See USB 3.0 spec Table 9-6 | ||
129 | */ | ||
130 | #define USB_DEVICE_U1_ENABLE 48 /* dev may initiate U1 transition */ | ||
131 | #define USB_DEVICE_U2_ENABLE 49 /* dev may initiate U2 transition */ | ||
132 | #define USB_DEVICE_LTM_ENABLE 50 /* dev may send LTM */ | ||
133 | #define USB_INTRF_FUNC_SUSPEND 0 /* function suspend */ | ||
134 | |||
135 | #define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00 | ||
136 | |||
126 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ | 137 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ |
127 | 138 | ||
139 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ | ||
140 | #define USB_DEV_STAT_U1_ENABLED 2 /* transition into U1 state */ | ||
141 | #define USB_DEV_STAT_U2_ENABLED 3 /* transition into U2 state */ | ||
142 | #define USB_DEV_STAT_LTM_ENABLED 4 /* Latency tolerance messages */ | ||
128 | 143 | ||
129 | /** | 144 | /** |
130 | * struct usb_ctrlrequest - SETUP data for a USB device control request | 145 | * struct usb_ctrlrequest - SETUP data for a USB device control request |
@@ -675,6 +690,7 @@ struct usb_bos_descriptor { | |||
675 | __u8 bNumDeviceCaps; | 690 | __u8 bNumDeviceCaps; |
676 | } __attribute__((packed)); | 691 | } __attribute__((packed)); |
677 | 692 | ||
693 | #define USB_DT_BOS_SIZE 5 | ||
678 | /*-------------------------------------------------------------------------*/ | 694 | /*-------------------------------------------------------------------------*/ |
679 | 695 | ||
680 | /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ | 696 | /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ |
@@ -712,16 +728,56 @@ struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ | |||
712 | __u8 bReserved; | 728 | __u8 bReserved; |
713 | } __attribute__((packed)); | 729 | } __attribute__((packed)); |
714 | 730 | ||
731 | /* USB 2.0 Extension descriptor */ | ||
715 | #define USB_CAP_TYPE_EXT 2 | 732 | #define USB_CAP_TYPE_EXT 2 |
716 | 733 | ||
717 | struct usb_ext_cap_descriptor { /* Link Power Management */ | 734 | struct usb_ext_cap_descriptor { /* Link Power Management */ |
718 | __u8 bLength; | 735 | __u8 bLength; |
719 | __u8 bDescriptorType; | 736 | __u8 bDescriptorType; |
720 | __u8 bDevCapabilityType; | 737 | __u8 bDevCapabilityType; |
721 | __u8 bmAttributes; | 738 | __le32 bmAttributes; |
722 | #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */ | 739 | #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */ |
723 | } __attribute__((packed)); | 740 | } __attribute__((packed)); |
724 | 741 | ||
742 | #define USB_DT_USB_EXT_CAP_SIZE 7 | ||
743 | |||
744 | /* | ||
745 | * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB | ||
746 | * specific device level capabilities | ||
747 | */ | ||
748 | #define USB_SS_CAP_TYPE 3 | ||
749 | struct usb_ss_cap_descriptor { /* Link Power Management */ | ||
750 | __u8 bLength; | ||
751 | __u8 bDescriptorType; | ||
752 | __u8 bDevCapabilityType; | ||
753 | __u8 bmAttributes; | ||
754 | #define USB_LTM_SUPPORT (1 << 1) /* supports LTM */ | ||
755 | __le16 wSpeedSupported; | ||
756 | #define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */ | ||
757 | #define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */ | ||
758 | #define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */ | ||
759 | #define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */ | ||
760 | __u8 bFunctionalitySupport; | ||
761 | __u8 bU1devExitLat; | ||
762 | __le16 bU2DevExitLat; | ||
763 | } __attribute__((packed)); | ||
764 | |||
765 | #define USB_DT_USB_SS_CAP_SIZE 10 | ||
766 | |||
767 | /* | ||
768 | * Container ID Capability descriptor: Defines the instance unique ID used to | ||
769 | * identify the instance across all operating modes | ||
770 | */ | ||
771 | #define CONTAINER_ID_TYPE 4 | ||
772 | struct usb_ss_container_id_descriptor { | ||
773 | __u8 bLength; | ||
774 | __u8 bDescriptorType; | ||
775 | __u8 bDevCapabilityType; | ||
776 | __u8 bReserved; | ||
777 | __u8 ContainerID[16]; /* 128-bit number */ | ||
778 | } __attribute__((packed)); | ||
779 | |||
780 | #define USB_DT_USB_SS_CONTN_ID_SIZE 20 | ||
725 | /*-------------------------------------------------------------------------*/ | 781 | /*-------------------------------------------------------------------------*/ |
726 | 782 | ||
727 | /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with | 783 | /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with |
@@ -808,4 +864,14 @@ enum usb_device_state { | |||
808 | */ | 864 | */ |
809 | }; | 865 | }; |
810 | 866 | ||
867 | /*-------------------------------------------------------------------------*/ | ||
868 | |||
869 | /* | ||
870 | * As per USB compliance update, a device that is actively drawing | ||
871 | * more than 100mA from USB must report itself as bus-powered in | ||
872 | * the GetStatus(DEVICE) call. | ||
873 | * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34 | ||
874 | */ | ||
875 | #define USB_SELF_POWER_VBUS_MAX_DRAW 100 | ||
876 | |||
811 | #endif /* __LINUX_USB_CH9_H */ | 877 | #endif /* __LINUX_USB_CH9_H */ |
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 617068134ae8..3d29a7dcac2d 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h | |||
@@ -161,8 +161,6 @@ ep_choose(struct usb_gadget *g, struct usb_endpoint_descriptor *hs, | |||
161 | * and by language IDs provided in control requests. | 161 | * and by language IDs provided in control requests. |
162 | * @descriptors: Table of descriptors preceding all function descriptors. | 162 | * @descriptors: Table of descriptors preceding all function descriptors. |
163 | * Examples include OTG and vendor-specific descriptors. | 163 | * Examples include OTG and vendor-specific descriptors. |
164 | * @bind: Called from @usb_add_config() to allocate resources unique to this | ||
165 | * configuration and to call @usb_add_function() for each function used. | ||
166 | * @unbind: Reverses @bind; called as a side effect of unregistering the | 164 | * @unbind: Reverses @bind; called as a side effect of unregistering the |
167 | * driver which added this configuration. | 165 | * driver which added this configuration. |
168 | * @setup: Used to delegate control requests that aren't handled by standard | 166 | * @setup: Used to delegate control requests that aren't handled by standard |
@@ -207,8 +205,7 @@ struct usb_configuration { | |||
207 | * we can't restructure things to avoid mismatching... | 205 | * we can't restructure things to avoid mismatching... |
208 | */ | 206 | */ |
209 | 207 | ||
210 | /* configuration management: bind/unbind */ | 208 | /* configuration management: unbind/setup */ |
211 | int (*bind)(struct usb_configuration *); | ||
212 | void (*unbind)(struct usb_configuration *); | 209 | void (*unbind)(struct usb_configuration *); |
213 | int (*setup)(struct usb_configuration *, | 210 | int (*setup)(struct usb_configuration *, |
214 | const struct usb_ctrlrequest *); | 211 | const struct usb_ctrlrequest *); |
@@ -232,20 +229,24 @@ struct usb_configuration { | |||
232 | }; | 229 | }; |
233 | 230 | ||
234 | int usb_add_config(struct usb_composite_dev *, | 231 | int usb_add_config(struct usb_composite_dev *, |
235 | struct usb_configuration *); | 232 | struct usb_configuration *, |
233 | int (*)(struct usb_configuration *)); | ||
236 | 234 | ||
237 | /** | 235 | /** |
238 | * struct usb_composite_driver - groups configurations into a gadget | 236 | * struct usb_composite_driver - groups configurations into a gadget |
239 | * @name: For diagnostics, identifies the driver. | 237 | * @name: For diagnostics, identifies the driver. |
238 | * @iProduct: Used as iProduct override if @dev->iProduct is not set. | ||
239 | * If NULL value of @name is taken. | ||
240 | * @iManufacturer: Used as iManufacturer override if @dev->iManufacturer is | ||
241 | * not set. If NULL a default "<system> <release> with <udc>" value | ||
242 | * will be used. | ||
240 | * @dev: Template descriptor for the device, including default device | 243 | * @dev: Template descriptor for the device, including default device |
241 | * identifiers. | 244 | * identifiers. |
242 | * @strings: tables of strings, keyed by identifiers assigned during bind() | 245 | * @strings: tables of strings, keyed by identifiers assigned during bind() |
243 | * and language IDs provided in control requests | 246 | * and language IDs provided in control requests |
244 | * @bind: (REQUIRED) Used to allocate resources that are shared across the | 247 | * @needs_serial: set to 1 if the gadget needs userspace to provide |
245 | * whole device, such as string IDs, and add its configurations using | 248 | * a serial number. If one is not provided, warning will be printed. |
246 | * @usb_add_config(). This may fail by returning a negative errno | 249 | * @unbind: Reverses bind; called as a side effect of unregistering |
247 | * value; it should return zero on successful initialization. | ||
248 | * @unbind: Reverses @bind(); called as a side effect of unregistering | ||
249 | * this driver. | 250 | * this driver. |
250 | * @disconnect: optional driver disconnect method | 251 | * @disconnect: optional driver disconnect method |
251 | * @suspend: Notifies when the host stops sending USB traffic, | 252 | * @suspend: Notifies when the host stops sending USB traffic, |
@@ -256,7 +257,7 @@ int usb_add_config(struct usb_composite_dev *, | |||
256 | * Devices default to reporting self powered operation. Devices which rely | 257 | * Devices default to reporting self powered operation. Devices which rely |
257 | * on bus powered operation should report this in their @bind() method. | 258 | * on bus powered operation should report this in their @bind() method. |
258 | * | 259 | * |
259 | * Before returning from @bind, various fields in the template descriptor | 260 | * Before returning from bind, various fields in the template descriptor |
260 | * may be overridden. These include the idVendor/idProduct/bcdDevice values | 261 | * may be overridden. These include the idVendor/idProduct/bcdDevice values |
261 | * normally to bind the appropriate host side driver, and the three strings | 262 | * normally to bind the appropriate host side driver, and the three strings |
262 | * (iManufacturer, iProduct, iSerialNumber) normally used to provide user | 263 | * (iManufacturer, iProduct, iSerialNumber) normally used to provide user |
@@ -266,15 +267,12 @@ int usb_add_config(struct usb_composite_dev *, | |||
266 | */ | 267 | */ |
267 | struct usb_composite_driver { | 268 | struct usb_composite_driver { |
268 | const char *name; | 269 | const char *name; |
270 | const char *iProduct; | ||
271 | const char *iManufacturer; | ||
269 | const struct usb_device_descriptor *dev; | 272 | const struct usb_device_descriptor *dev; |
270 | struct usb_gadget_strings **strings; | 273 | struct usb_gadget_strings **strings; |
274 | unsigned needs_serial:1; | ||
271 | 275 | ||
272 | /* REVISIT: bind() functions can be marked __init, which | ||
273 | * makes trouble for section mismatch analysis. See if | ||
274 | * we can't restructure things to avoid mismatching... | ||
275 | */ | ||
276 | |||
277 | int (*bind)(struct usb_composite_dev *); | ||
278 | int (*unbind)(struct usb_composite_dev *); | 276 | int (*unbind)(struct usb_composite_dev *); |
279 | 277 | ||
280 | void (*disconnect)(struct usb_composite_dev *); | 278 | void (*disconnect)(struct usb_composite_dev *); |
@@ -284,8 +282,9 @@ struct usb_composite_driver { | |||
284 | void (*resume)(struct usb_composite_dev *); | 282 | void (*resume)(struct usb_composite_dev *); |
285 | }; | 283 | }; |
286 | 284 | ||
287 | extern int usb_composite_register(struct usb_composite_driver *); | 285 | extern int usb_composite_probe(struct usb_composite_driver *driver, |
288 | extern void usb_composite_unregister(struct usb_composite_driver *); | 286 | int (*bind)(struct usb_composite_dev *cdev)); |
287 | extern void usb_composite_unregister(struct usb_composite_driver *driver); | ||
289 | 288 | ||
290 | 289 | ||
291 | /** | 290 | /** |
@@ -334,6 +333,9 @@ struct usb_composite_dev { | |||
334 | struct list_head configs; | 333 | struct list_head configs; |
335 | struct usb_composite_driver *driver; | 334 | struct usb_composite_driver *driver; |
336 | u8 next_string_id; | 335 | u8 next_string_id; |
336 | u8 manufacturer_override; | ||
337 | u8 product_override; | ||
338 | u8 serial_override; | ||
337 | 339 | ||
338 | /* the gadget driver won't enable the data pullup | 340 | /* the gadget driver won't enable the data pullup |
339 | * while the deactivation count is nonzero. | 341 | * while the deactivation count is nonzero. |
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index d3ef42d7d2f0..006412ce2303 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
@@ -705,11 +705,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget) | |||
705 | * struct usb_gadget_driver - driver for usb 'slave' devices | 705 | * struct usb_gadget_driver - driver for usb 'slave' devices |
706 | * @function: String describing the gadget's function | 706 | * @function: String describing the gadget's function |
707 | * @speed: Highest speed the driver handles. | 707 | * @speed: Highest speed the driver handles. |
708 | * @bind: Invoked when the driver is bound to a gadget, usually | ||
709 | * after registering the driver. | ||
710 | * At that point, ep0 is fully initialized, and ep_list holds | ||
711 | * the currently-available endpoints. | ||
712 | * Called in a context that permits sleeping. | ||
713 | * @setup: Invoked for ep0 control requests that aren't handled by | 708 | * @setup: Invoked for ep0 control requests that aren't handled by |
714 | * the hardware level driver. Most calls must be handled by | 709 | * the hardware level driver. Most calls must be handled by |
715 | * the gadget driver, including descriptor and configuration | 710 | * the gadget driver, including descriptor and configuration |
@@ -774,7 +769,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget) | |||
774 | struct usb_gadget_driver { | 769 | struct usb_gadget_driver { |
775 | char *function; | 770 | char *function; |
776 | enum usb_device_speed speed; | 771 | enum usb_device_speed speed; |
777 | int (*bind)(struct usb_gadget *); | ||
778 | void (*unbind)(struct usb_gadget *); | 772 | void (*unbind)(struct usb_gadget *); |
779 | int (*setup)(struct usb_gadget *, | 773 | int (*setup)(struct usb_gadget *, |
780 | const struct usb_ctrlrequest *); | 774 | const struct usb_ctrlrequest *); |
@@ -798,17 +792,19 @@ struct usb_gadget_driver { | |||
798 | */ | 792 | */ |
799 | 793 | ||
800 | /** | 794 | /** |
801 | * usb_gadget_register_driver - register a gadget driver | 795 | * usb_gadget_probe_driver - probe a gadget driver |
802 | * @driver:the driver being registered | 796 | * @driver: the driver being registered |
797 | * @bind: the driver's bind callback | ||
803 | * Context: can sleep | 798 | * Context: can sleep |
804 | * | 799 | * |
805 | * Call this in your gadget driver's module initialization function, | 800 | * Call this in your gadget driver's module initialization function, |
806 | * to tell the underlying usb controller driver about your driver. | 801 | * to tell the underlying usb controller driver about your driver. |
807 | * The driver's bind() function will be called to bind it to a | 802 | * The @bind() function will be called to bind it to a gadget before this |
808 | * gadget before this registration call returns. It's expected that | 803 | * registration call returns. It's expected that the @bind() function will |
809 | * the bind() functions will be in init sections. | 804 | * be in init sections. |
810 | */ | 805 | */ |
811 | int usb_gadget_register_driver(struct usb_gadget_driver *driver); | 806 | int usb_gadget_probe_driver(struct usb_gadget_driver *driver, |
807 | int (*bind)(struct usb_gadget *)); | ||
812 | 808 | ||
813 | /** | 809 | /** |
814 | * usb_gadget_unregister_driver - unregister a gadget driver | 810 | * usb_gadget_unregister_driver - unregister a gadget driver |
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 3b571f1ffbb3..0b6e751ea0b1 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h | |||
@@ -329,6 +329,8 @@ extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags); | |||
329 | extern int usb_hcd_unlink_urb(struct urb *urb, int status); | 329 | extern int usb_hcd_unlink_urb(struct urb *urb, int status); |
330 | extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, | 330 | extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, |
331 | int status); | 331 | int status); |
332 | extern void unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *); | ||
333 | extern void unmap_urb_for_dma(struct usb_hcd *, struct urb *); | ||
332 | extern void usb_hcd_flush_endpoint(struct usb_device *udev, | 334 | extern void usb_hcd_flush_endpoint(struct usb_device *udev, |
333 | struct usb_host_endpoint *ep); | 335 | struct usb_host_endpoint *ep); |
334 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, | 336 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, |
diff --git a/include/linux/usb/intel_mid_otg.h b/include/linux/usb/intel_mid_otg.h new file mode 100644 index 000000000000..a0ccf795f362 --- /dev/null +++ b/include/linux/usb/intel_mid_otg.h | |||
@@ -0,0 +1,180 @@ | |||
1 | /* | ||
2 | * Intel MID (Langwell/Penwell) USB OTG Transceiver driver | ||
3 | * Copyright (C) 2008 - 2010, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | * | ||
18 | */ | ||
19 | |||
20 | #ifndef __INTEL_MID_OTG_H | ||
21 | #define __INTEL_MID_OTG_H | ||
22 | |||
23 | #include <linux/pm.h> | ||
24 | #include <linux/usb/otg.h> | ||
25 | #include <linux/notifier.h> | ||
26 | |||
27 | struct intel_mid_otg_xceiv; | ||
28 | |||
29 | /* This is a common data structure for Intel MID platform to | ||
30 | * save values of the OTG state machine */ | ||
31 | struct otg_hsm { | ||
32 | /* Input */ | ||
33 | int a_bus_resume; | ||
34 | int a_bus_suspend; | ||
35 | int a_conn; | ||
36 | int a_sess_vld; | ||
37 | int a_srp_det; | ||
38 | int a_vbus_vld; | ||
39 | int b_bus_resume; | ||
40 | int b_bus_suspend; | ||
41 | int b_conn; | ||
42 | int b_se0_srp; | ||
43 | int b_ssend_srp; | ||
44 | int b_sess_end; | ||
45 | int b_sess_vld; | ||
46 | int id; | ||
47 | /* id values */ | ||
48 | #define ID_B 0x05 | ||
49 | #define ID_A 0x04 | ||
50 | #define ID_ACA_C 0x03 | ||
51 | #define ID_ACA_B 0x02 | ||
52 | #define ID_ACA_A 0x01 | ||
53 | int power_up; | ||
54 | int adp_change; | ||
55 | int test_device; | ||
56 | |||
57 | /* Internal variables */ | ||
58 | int a_set_b_hnp_en; | ||
59 | int b_srp_done; | ||
60 | int b_hnp_enable; | ||
61 | int hnp_poll_enable; | ||
62 | |||
63 | /* Timeout indicator for timers */ | ||
64 | int a_wait_vrise_tmout; | ||
65 | int a_wait_bcon_tmout; | ||
66 | int a_aidl_bdis_tmout; | ||
67 | int a_bidl_adis_tmout; | ||
68 | int a_bidl_adis_tmr; | ||
69 | int a_wait_vfall_tmout; | ||
70 | int b_ase0_brst_tmout; | ||
71 | int b_bus_suspend_tmout; | ||
72 | int b_srp_init_tmout; | ||
73 | int b_srp_fail_tmout; | ||
74 | int b_srp_fail_tmr; | ||
75 | int b_adp_sense_tmout; | ||
76 | |||
77 | /* Informative variables */ | ||
78 | int a_bus_drop; | ||
79 | int a_bus_req; | ||
80 | int a_clr_err; | ||
81 | int b_bus_req; | ||
82 | int a_suspend_req; | ||
83 | int b_bus_suspend_vld; | ||
84 | |||
85 | /* Output */ | ||
86 | int drv_vbus; | ||
87 | int loc_conn; | ||
88 | int loc_sof; | ||
89 | |||
90 | /* Others */ | ||
91 | int vbus_srp_up; | ||
92 | }; | ||
93 | |||
94 | /* must provide ULPI access function to read/write registers implemented in | ||
95 | * ULPI address space */ | ||
96 | struct iotg_ulpi_access_ops { | ||
97 | int (*read)(struct intel_mid_otg_xceiv *iotg, u8 reg, u8 *val); | ||
98 | int (*write)(struct intel_mid_otg_xceiv *iotg, u8 reg, u8 val); | ||
99 | }; | ||
100 | |||
101 | #define OTG_A_DEVICE 0x0 | ||
102 | #define OTG_B_DEVICE 0x1 | ||
103 | |||
104 | /* | ||
105 | * the Intel MID (Langwell/Penwell) otg transceiver driver needs to interact | ||
106 | * with device and host drivers to implement the USB OTG related feature. More | ||
107 | * function members are added based on otg_transceiver data structure for this | ||
108 | * purpose. | ||
109 | */ | ||
110 | struct intel_mid_otg_xceiv { | ||
111 | struct otg_transceiver otg; | ||
112 | struct otg_hsm hsm; | ||
113 | |||
114 | /* base address */ | ||
115 | void __iomem *base; | ||
116 | |||
117 | /* ops to access ulpi */ | ||
118 | struct iotg_ulpi_access_ops ulpi_ops; | ||
119 | |||
120 | /* atomic notifier for interrupt context */ | ||
121 | struct atomic_notifier_head iotg_notifier; | ||
122 | |||
123 | /* start/stop USB Host function */ | ||
124 | int (*start_host)(struct intel_mid_otg_xceiv *iotg); | ||
125 | int (*stop_host)(struct intel_mid_otg_xceiv *iotg); | ||
126 | |||
127 | /* start/stop USB Peripheral function */ | ||
128 | int (*start_peripheral)(struct intel_mid_otg_xceiv *iotg); | ||
129 | int (*stop_peripheral)(struct intel_mid_otg_xceiv *iotg); | ||
130 | |||
131 | /* start/stop ADP sense/probe function */ | ||
132 | int (*set_adp_probe)(struct intel_mid_otg_xceiv *iotg, | ||
133 | bool enabled, int dev); | ||
134 | int (*set_adp_sense)(struct intel_mid_otg_xceiv *iotg, | ||
135 | bool enabled); | ||
136 | |||
137 | #ifdef CONFIG_PM | ||
138 | /* suspend/resume USB host function */ | ||
139 | int (*suspend_host)(struct intel_mid_otg_xceiv *iotg, | ||
140 | pm_message_t message); | ||
141 | int (*resume_host)(struct intel_mid_otg_xceiv *iotg); | ||
142 | |||
143 | int (*suspend_peripheral)(struct intel_mid_otg_xceiv *iotg, | ||
144 | pm_message_t message); | ||
145 | int (*resume_peripheral)(struct intel_mid_otg_xceiv *iotg); | ||
146 | #endif | ||
147 | |||
148 | }; | ||
149 | static inline | ||
150 | struct intel_mid_otg_xceiv *otg_to_mid_xceiv(struct otg_transceiver *otg) | ||
151 | { | ||
152 | return container_of(otg, struct intel_mid_otg_xceiv, otg); | ||
153 | } | ||
154 | |||
155 | #define MID_OTG_NOTIFY_CONNECT 0x0001 | ||
156 | #define MID_OTG_NOTIFY_DISCONN 0x0002 | ||
157 | #define MID_OTG_NOTIFY_HSUSPEND 0x0003 | ||
158 | #define MID_OTG_NOTIFY_HRESUME 0x0004 | ||
159 | #define MID_OTG_NOTIFY_CSUSPEND 0x0005 | ||
160 | #define MID_OTG_NOTIFY_CRESUME 0x0006 | ||
161 | #define MID_OTG_NOTIFY_HOSTADD 0x0007 | ||
162 | #define MID_OTG_NOTIFY_HOSTREMOVE 0x0008 | ||
163 | #define MID_OTG_NOTIFY_CLIENTADD 0x0009 | ||
164 | #define MID_OTG_NOTIFY_CLIENTREMOVE 0x000a | ||
165 | |||
166 | static inline int | ||
167 | intel_mid_otg_register_notifier(struct intel_mid_otg_xceiv *iotg, | ||
168 | struct notifier_block *nb) | ||
169 | { | ||
170 | return atomic_notifier_chain_register(&iotg->iotg_notifier, nb); | ||
171 | } | ||
172 | |||
173 | static inline void | ||
174 | intel_mid_otg_unregister_notifier(struct intel_mid_otg_xceiv *iotg, | ||
175 | struct notifier_block *nb) | ||
176 | { | ||
177 | atomic_notifier_chain_unregister(&iotg->iotg_notifier, nb); | ||
178 | } | ||
179 | |||
180 | #endif /* __INTEL_MID_OTG_H */ | ||
diff --git a/include/linux/usb/langwell_otg.h b/include/linux/usb/langwell_otg.h new file mode 100644 index 000000000000..51f17b16d312 --- /dev/null +++ b/include/linux/usb/langwell_otg.h | |||
@@ -0,0 +1,139 @@ | |||
1 | /* | ||
2 | * Intel Langwell USB OTG transceiver driver | ||
3 | * Copyright (C) 2008 - 2010, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | * | ||
18 | */ | ||
19 | |||
20 | #ifndef __LANGWELL_OTG_H | ||
21 | #define __LANGWELL_OTG_H | ||
22 | |||
23 | #include <linux/usb/intel_mid_otg.h> | ||
24 | |||
25 | #define CI_USBCMD 0x30 | ||
26 | # define USBCMD_RST BIT(1) | ||
27 | # define USBCMD_RS BIT(0) | ||
28 | #define CI_USBSTS 0x34 | ||
29 | # define USBSTS_SLI BIT(8) | ||
30 | # define USBSTS_URI BIT(6) | ||
31 | # define USBSTS_PCI BIT(2) | ||
32 | #define CI_PORTSC1 0x74 | ||
33 | # define PORTSC_PP BIT(12) | ||
34 | # define PORTSC_LS (BIT(11) | BIT(10)) | ||
35 | # define PORTSC_SUSP BIT(7) | ||
36 | # define PORTSC_CCS BIT(0) | ||
37 | #define CI_HOSTPC1 0xb4 | ||
38 | # define HOSTPC1_PHCD BIT(22) | ||
39 | #define CI_OTGSC 0xf4 | ||
40 | # define OTGSC_DPIE BIT(30) | ||
41 | # define OTGSC_1MSE BIT(29) | ||
42 | # define OTGSC_BSEIE BIT(28) | ||
43 | # define OTGSC_BSVIE BIT(27) | ||
44 | # define OTGSC_ASVIE BIT(26) | ||
45 | # define OTGSC_AVVIE BIT(25) | ||
46 | # define OTGSC_IDIE BIT(24) | ||
47 | # define OTGSC_DPIS BIT(22) | ||
48 | # define OTGSC_1MSS BIT(21) | ||
49 | # define OTGSC_BSEIS BIT(20) | ||
50 | # define OTGSC_BSVIS BIT(19) | ||
51 | # define OTGSC_ASVIS BIT(18) | ||
52 | # define OTGSC_AVVIS BIT(17) | ||
53 | # define OTGSC_IDIS BIT(16) | ||
54 | # define OTGSC_DPS BIT(14) | ||
55 | # define OTGSC_1MST BIT(13) | ||
56 | # define OTGSC_BSE BIT(12) | ||
57 | # define OTGSC_BSV BIT(11) | ||
58 | # define OTGSC_ASV BIT(10) | ||
59 | # define OTGSC_AVV BIT(9) | ||
60 | # define OTGSC_ID BIT(8) | ||
61 | # define OTGSC_HABA BIT(7) | ||
62 | # define OTGSC_HADP BIT(6) | ||
63 | # define OTGSC_IDPU BIT(5) | ||
64 | # define OTGSC_DP BIT(4) | ||
65 | # define OTGSC_OT BIT(3) | ||
66 | # define OTGSC_HAAR BIT(2) | ||
67 | # define OTGSC_VC BIT(1) | ||
68 | # define OTGSC_VD BIT(0) | ||
69 | # define OTGSC_INTEN_MASK (0x7f << 24) | ||
70 | # define OTGSC_INT_MASK (0x5f << 24) | ||
71 | # define OTGSC_INTSTS_MASK (0x7f << 16) | ||
72 | #define CI_USBMODE 0xf8 | ||
73 | # define USBMODE_CM (BIT(1) | BIT(0)) | ||
74 | # define USBMODE_IDLE 0 | ||
75 | # define USBMODE_DEVICE 0x2 | ||
76 | # define USBMODE_HOST 0x3 | ||
77 | #define USBCFG_ADDR 0xff10801c | ||
78 | #define USBCFG_LEN 4 | ||
79 | # define USBCFG_VBUSVAL BIT(14) | ||
80 | # define USBCFG_AVALID BIT(13) | ||
81 | # define USBCFG_BVALID BIT(12) | ||
82 | # define USBCFG_SESEND BIT(11) | ||
83 | |||
84 | #define INTR_DUMMY_MASK (USBSTS_SLI | USBSTS_URI | USBSTS_PCI) | ||
85 | |||
86 | enum langwell_otg_timer_type { | ||
87 | TA_WAIT_VRISE_TMR, | ||
88 | TA_WAIT_BCON_TMR, | ||
89 | TA_AIDL_BDIS_TMR, | ||
90 | TB_ASE0_BRST_TMR, | ||
91 | TB_SE0_SRP_TMR, | ||
92 | TB_SRP_INIT_TMR, | ||
93 | TB_SRP_FAIL_TMR, | ||
94 | TB_BUS_SUSPEND_TMR | ||
95 | }; | ||
96 | |||
97 | #define TA_WAIT_VRISE 100 | ||
98 | #define TA_WAIT_BCON 30000 | ||
99 | #define TA_AIDL_BDIS 15000 | ||
100 | #define TB_ASE0_BRST 5000 | ||
101 | #define TB_SE0_SRP 2 | ||
102 | #define TB_SRP_INIT 100 | ||
103 | #define TB_SRP_FAIL 5500 | ||
104 | #define TB_BUS_SUSPEND 500 | ||
105 | |||
106 | struct langwell_otg_timer { | ||
107 | unsigned long expires; /* Number of count increase to timeout */ | ||
108 | unsigned long count; /* Tick counter */ | ||
109 | void (*function)(unsigned long); /* Timeout function */ | ||
110 | unsigned long data; /* Data passed to function */ | ||
111 | struct list_head list; | ||
112 | }; | ||
113 | |||
114 | struct langwell_otg { | ||
115 | struct intel_mid_otg_xceiv iotg; | ||
116 | struct device *dev; | ||
117 | |||
118 | void __iomem *usbcfg; /* SCCBUSB config Reg */ | ||
119 | |||
120 | unsigned region; | ||
121 | unsigned cfg_region; | ||
122 | |||
123 | struct work_struct work; | ||
124 | struct workqueue_struct *qwork; | ||
125 | struct timer_list hsm_timer; | ||
126 | |||
127 | spinlock_t lock; | ||
128 | spinlock_t wq_lock; | ||
129 | |||
130 | struct notifier_block iotg_notifier; | ||
131 | }; | ||
132 | |||
133 | static inline | ||
134 | struct langwell_otg *mid_xceiv_to_lnw(struct intel_mid_otg_xceiv *iotg) | ||
135 | { | ||
136 | return container_of(iotg, struct langwell_otg, iotg); | ||
137 | } | ||
138 | |||
139 | #endif /* __LANGWELL_OTG_H__ */ | ||
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h index ee2dd1d506ed..2387f9fc8138 100644 --- a/include/linux/usb/musb.h +++ b/include/linux/usb/musb.h | |||
@@ -89,6 +89,8 @@ struct musb_hdrc_config { | |||
89 | /* A GPIO controlling VRSEL in Blackfin */ | 89 | /* A GPIO controlling VRSEL in Blackfin */ |
90 | unsigned int gpio_vrsel; | 90 | unsigned int gpio_vrsel; |
91 | unsigned int gpio_vrsel_active; | 91 | unsigned int gpio_vrsel_active; |
92 | /* musb CLKIN in Blackfin in MHZ */ | ||
93 | unsigned char clkin; | ||
92 | #endif | 94 | #endif |
93 | 95 | ||
94 | }; | 96 | }; |
diff --git a/include/linux/usb/ncm.h b/include/linux/usb/ncm.h deleted file mode 100644 index 006d1064c8b2..000000000000 --- a/include/linux/usb/ncm.h +++ /dev/null | |||
@@ -1,114 +0,0 @@ | |||
1 | /* | ||
2 | * USB CDC NCM auxiliary definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef __LINUX_USB_NCM_H | ||
6 | #define __LINUX_USB_NCM_H | ||
7 | |||
8 | #include <linux/types.h> | ||
9 | #include <linux/usb/cdc.h> | ||
10 | #include <asm/unaligned.h> | ||
11 | |||
12 | #define NCM_NTB_MIN_IN_SIZE 2048 | ||
13 | #define NCM_NTB_MIN_OUT_SIZE 2048 | ||
14 | |||
15 | #define NCM_CONTROL_TIMEOUT (5 * 1000) | ||
16 | |||
17 | /* bmNetworkCapabilities */ | ||
18 | |||
19 | #define NCM_NCAP_ETH_FILTER (1 << 0) | ||
20 | #define NCM_NCAP_NET_ADDRESS (1 << 1) | ||
21 | #define NCM_NCAP_ENCAP_COMM (1 << 2) | ||
22 | #define NCM_NCAP_MAX_DGRAM (1 << 3) | ||
23 | #define NCM_NCAP_CRC_MODE (1 << 4) | ||
24 | |||
25 | /* | ||
26 | * Here are options for NCM Datagram Pointer table (NDP) parser. | ||
27 | * There are 2 different formats: NDP16 and NDP32 in the spec (ch. 3), | ||
28 | * in NDP16 offsets and sizes fields are 1 16bit word wide, | ||
29 | * in NDP32 -- 2 16bit words wide. Also signatures are different. | ||
30 | * To make the parser code the same, put the differences in the structure, | ||
31 | * and switch pointers to the structures when the format is changed. | ||
32 | */ | ||
33 | |||
34 | struct ndp_parser_opts { | ||
35 | u32 nth_sign; | ||
36 | u32 ndp_sign; | ||
37 | unsigned nth_size; | ||
38 | unsigned ndp_size; | ||
39 | unsigned ndplen_align; | ||
40 | /* sizes in u16 units */ | ||
41 | unsigned dgram_item_len; /* index or length */ | ||
42 | unsigned block_length; | ||
43 | unsigned fp_index; | ||
44 | unsigned reserved1; | ||
45 | unsigned reserved2; | ||
46 | unsigned next_fp_index; | ||
47 | }; | ||
48 | |||
49 | #define INIT_NDP16_OPTS { \ | ||
50 | .nth_sign = NCM_NTH16_SIGN, \ | ||
51 | .ndp_sign = NCM_NDP16_NOCRC_SIGN, \ | ||
52 | .nth_size = sizeof(struct usb_cdc_ncm_nth16), \ | ||
53 | .ndp_size = sizeof(struct usb_cdc_ncm_ndp16), \ | ||
54 | .ndplen_align = 4, \ | ||
55 | .dgram_item_len = 1, \ | ||
56 | .block_length = 1, \ | ||
57 | .fp_index = 1, \ | ||
58 | .reserved1 = 0, \ | ||
59 | .reserved2 = 0, \ | ||
60 | .next_fp_index = 1, \ | ||
61 | } | ||
62 | |||
63 | |||
64 | #define INIT_NDP32_OPTS { \ | ||
65 | .nth_sign = NCM_NTH32_SIGN, \ | ||
66 | .ndp_sign = NCM_NDP32_NOCRC_SIGN, \ | ||
67 | .nth_size = sizeof(struct usb_cdc_ncm_nth32), \ | ||
68 | .ndp_size = sizeof(struct usb_cdc_ncm_ndp32), \ | ||
69 | .ndplen_align = 8, \ | ||
70 | .dgram_item_len = 2, \ | ||
71 | .block_length = 2, \ | ||
72 | .fp_index = 2, \ | ||
73 | .reserved1 = 1, \ | ||
74 | .reserved2 = 2, \ | ||
75 | .next_fp_index = 2, \ | ||
76 | } | ||
77 | |||
78 | static inline void put_ncm(__le16 **p, unsigned size, unsigned val) | ||
79 | { | ||
80 | switch (size) { | ||
81 | case 1: | ||
82 | put_unaligned_le16((u16)val, *p); | ||
83 | break; | ||
84 | case 2: | ||
85 | put_unaligned_le32((u32)val, *p); | ||
86 | |||
87 | break; | ||
88 | default: | ||
89 | BUG(); | ||
90 | } | ||
91 | |||
92 | *p += size; | ||
93 | } | ||
94 | |||
95 | static inline unsigned get_ncm(__le16 **p, unsigned size) | ||
96 | { | ||
97 | unsigned tmp; | ||
98 | |||
99 | switch (size) { | ||
100 | case 1: | ||
101 | tmp = get_unaligned_le16(*p); | ||
102 | break; | ||
103 | case 2: | ||
104 | tmp = get_unaligned_le32(*p); | ||
105 | break; | ||
106 | default: | ||
107 | BUG(); | ||
108 | } | ||
109 | |||
110 | *p += size; | ||
111 | return tmp; | ||
112 | } | ||
113 | |||
114 | #endif /* __LINUX_USB_NCM_H */ | ||
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 545cba73ccaf..0a5b3711e502 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h | |||
@@ -164,8 +164,19 @@ otg_shutdown(struct otg_transceiver *otg) | |||
164 | } | 164 | } |
165 | 165 | ||
166 | /* for usb host and peripheral controller drivers */ | 166 | /* for usb host and peripheral controller drivers */ |
167 | #ifdef CONFIG_USB_OTG_UTILS | ||
167 | extern struct otg_transceiver *otg_get_transceiver(void); | 168 | extern struct otg_transceiver *otg_get_transceiver(void); |
168 | extern void otg_put_transceiver(struct otg_transceiver *); | 169 | extern void otg_put_transceiver(struct otg_transceiver *); |
170 | #else | ||
171 | static inline struct otg_transceiver *otg_get_transceiver(void) | ||
172 | { | ||
173 | return NULL; | ||
174 | } | ||
175 | |||
176 | static inline void otg_put_transceiver(struct otg_transceiver *x) | ||
177 | { | ||
178 | } | ||
179 | #endif | ||
169 | 180 | ||
170 | /* Context: can sleep */ | 181 | /* Context: can sleep */ |
171 | static inline int | 182 | static inline int |
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index 55675b1efb28..16d682f4f7c3 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h | |||
@@ -271,6 +271,8 @@ struct usb_serial_driver { | |||
271 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 271 | int (*tiocmget)(struct tty_struct *tty, struct file *file); |
272 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 272 | int (*tiocmset)(struct tty_struct *tty, struct file *file, |
273 | unsigned int set, unsigned int clear); | 273 | unsigned int set, unsigned int clear); |
274 | int (*get_icount)(struct tty_struct *tty, | ||
275 | struct serial_icounter_struct *icount); | ||
274 | /* Called by the tty layer for port level work. There may or may not | 276 | /* Called by the tty layer for port level work. There may or may not |
275 | be an attached tty at this point */ | 277 | be an attached tty at this point */ |
276 | void (*dtr_rts)(struct usb_serial_port *port, int on); | 278 | void (*dtr_rts)(struct usb_serial_port *port, int on); |
diff --git a/include/linux/usb/storage.h b/include/linux/usb/storage.h new file mode 100644 index 000000000000..d7fc910f1dc4 --- /dev/null +++ b/include/linux/usb/storage.h | |||
@@ -0,0 +1,48 @@ | |||
1 | #ifndef __LINUX_USB_STORAGE_H | ||
2 | #define __LINUX_USB_STORAGE_H | ||
3 | |||
4 | /* | ||
5 | * linux/usb/storage.h | ||
6 | * | ||
7 | * Copyright Matthew Wilcox for Intel Corp, 2010 | ||
8 | * | ||
9 | * This file contains definitions taken from the | ||
10 | * USB Mass Storage Class Specification Overview | ||
11 | * | ||
12 | * Distributed under the terms of the GNU GPL, version two. | ||
13 | */ | ||
14 | |||
15 | /* Storage subclass codes */ | ||
16 | |||
17 | #define USB_SC_RBC 0x01 /* Typically, flash devices */ | ||
18 | #define USB_SC_8020 0x02 /* CD-ROM */ | ||
19 | #define USB_SC_QIC 0x03 /* QIC-157 Tapes */ | ||
20 | #define USB_SC_UFI 0x04 /* Floppy */ | ||
21 | #define USB_SC_8070 0x05 /* Removable media */ | ||
22 | #define USB_SC_SCSI 0x06 /* Transparent */ | ||
23 | #define USB_SC_LOCKABLE 0x07 /* Password-protected */ | ||
24 | |||
25 | #define USB_SC_ISD200 0xf0 /* ISD200 ATA */ | ||
26 | #define USB_SC_CYP_ATACB 0xf1 /* Cypress ATACB */ | ||
27 | #define USB_SC_DEVICE 0xff /* Use device's value */ | ||
28 | |||
29 | /* Storage protocol codes */ | ||
30 | |||
31 | #define USB_PR_CBI 0x00 /* Control/Bulk/Interrupt */ | ||
32 | #define USB_PR_CB 0x01 /* Control/Bulk w/o interrupt */ | ||
33 | #define USB_PR_BULK 0x50 /* bulk only */ | ||
34 | #define USB_PR_UAS 0x62 /* USB Attached SCSI */ | ||
35 | |||
36 | #define USB_PR_USBAT 0x80 /* SCM-ATAPI bridge */ | ||
37 | #define USB_PR_EUSB_SDDR09 0x81 /* SCM-SCSI bridge for SDDR-09 */ | ||
38 | #define USB_PR_SDDR55 0x82 /* SDDR-55 (made up) */ | ||
39 | #define USB_PR_DPCM_USB 0xf0 /* Combination CB/SDDR09 */ | ||
40 | #define USB_PR_FREECOM 0xf1 /* Freecom */ | ||
41 | #define USB_PR_DATAFAB 0xf2 /* Datafab chipsets */ | ||
42 | #define USB_PR_JUMPSHOT 0xf3 /* Lexar Jumpshot */ | ||
43 | #define USB_PR_ALAUDA 0xf4 /* Alauda chipsets */ | ||
44 | #define USB_PR_KARMA 0xf5 /* Rio Karma */ | ||
45 | |||
46 | #define USB_PR_DEVICE 0xff /* Use device's value */ | ||
47 | |||
48 | #endif | ||
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index a4b947e470a5..71693d4a4fe1 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h | |||
@@ -58,7 +58,11 @@ | |||
58 | US_FLAG(CAPACITY_OK, 0x00010000) \ | 58 | US_FLAG(CAPACITY_OK, 0x00010000) \ |
59 | /* READ CAPACITY response is correct */ \ | 59 | /* READ CAPACITY response is correct */ \ |
60 | US_FLAG(BAD_SENSE, 0x00020000) \ | 60 | US_FLAG(BAD_SENSE, 0x00020000) \ |
61 | /* Bad Sense (never more than 18 bytes) */ | 61 | /* Bad Sense (never more than 18 bytes) */ \ |
62 | US_FLAG(NO_READ_DISC_INFO, 0x00040000) \ | ||
63 | /* cannot handle READ_DISC_INFO */ \ | ||
64 | US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ | ||
65 | /* cannot handle READ_CAPACITY_16 */ | ||
62 | 66 | ||
63 | #define US_FLAG(name, value) US_FL_##name = value , | 67 | #define US_FLAG(name, value) US_FL_##name = value , |
64 | enum { US_DO_ALL_FLAGS }; | 68 | enum { US_DO_ALL_FLAGS }; |
@@ -74,42 +78,7 @@ enum { US_DO_ALL_FLAGS }; | |||
74 | #define USB_US_TYPE(flags) (((flags) >> 24) & 0xFF) | 78 | #define USB_US_TYPE(flags) (((flags) >> 24) & 0xFF) |
75 | #define USB_US_ORIG_FLAGS(flags) ((flags) & 0x00FFFFFF) | 79 | #define USB_US_ORIG_FLAGS(flags) ((flags) & 0x00FFFFFF) |
76 | 80 | ||
77 | /* | 81 | #include <linux/usb/storage.h> |
78 | * This is probably not the best place to keep these constants, conceptually. | ||
79 | * But it's the only header included into all places which need them. | ||
80 | */ | ||
81 | |||
82 | /* Sub Classes */ | ||
83 | |||
84 | #define US_SC_RBC 0x01 /* Typically, flash devices */ | ||
85 | #define US_SC_8020 0x02 /* CD-ROM */ | ||
86 | #define US_SC_QIC 0x03 /* QIC-157 Tapes */ | ||
87 | #define US_SC_UFI 0x04 /* Floppy */ | ||
88 | #define US_SC_8070 0x05 /* Removable media */ | ||
89 | #define US_SC_SCSI 0x06 /* Transparent */ | ||
90 | #define US_SC_LOCKABLE 0x07 /* Password-protected */ | ||
91 | |||
92 | #define US_SC_ISD200 0xf0 /* ISD200 ATA */ | ||
93 | #define US_SC_CYP_ATACB 0xf1 /* Cypress ATACB */ | ||
94 | #define US_SC_DEVICE 0xff /* Use device's value */ | ||
95 | |||
96 | /* Protocols */ | ||
97 | |||
98 | #define US_PR_CBI 0x00 /* Control/Bulk/Interrupt */ | ||
99 | #define US_PR_CB 0x01 /* Control/Bulk w/o interrupt */ | ||
100 | #define US_PR_BULK 0x50 /* bulk only */ | ||
101 | |||
102 | #define US_PR_USBAT 0x80 /* SCM-ATAPI bridge */ | ||
103 | #define US_PR_EUSB_SDDR09 0x81 /* SCM-SCSI bridge for SDDR-09 */ | ||
104 | #define US_PR_SDDR55 0x82 /* SDDR-55 (made up) */ | ||
105 | #define US_PR_DPCM_USB 0xf0 /* Combination CB/SDDR09 */ | ||
106 | #define US_PR_FREECOM 0xf1 /* Freecom */ | ||
107 | #define US_PR_DATAFAB 0xf2 /* Datafab chipsets */ | ||
108 | #define US_PR_JUMPSHOT 0xf3 /* Lexar Jumpshot */ | ||
109 | #define US_PR_ALAUDA 0xf4 /* Alauda chipsets */ | ||
110 | #define US_PR_KARMA 0xf5 /* Rio Karma */ | ||
111 | |||
112 | #define US_PR_DEVICE 0xff /* Use device's value */ | ||
113 | 82 | ||
114 | /* | 83 | /* |
115 | */ | 84 | */ |
diff --git a/include/linux/via-core.h b/include/linux/via-core.h index 7ffb521e1a7a..38bffd8ccca5 100644 --- a/include/linux/via-core.h +++ b/include/linux/via-core.h | |||
@@ -81,7 +81,7 @@ struct viafb_dev { | |||
81 | unsigned long fbmem_start; | 81 | unsigned long fbmem_start; |
82 | long fbmem_len; | 82 | long fbmem_len; |
83 | void __iomem *fbmem; | 83 | void __iomem *fbmem; |
84 | #if defined(CONFIG_FB_VIA_CAMERA) || defined(CONFIG_FB_VIA_CAMERA_MODULE) | 84 | #if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE) |
85 | long camera_fbmem_offset; | 85 | long camera_fbmem_offset; |
86 | long camera_fbmem_size; | 86 | long camera_fbmem_size; |
87 | #endif | 87 | #endif |
@@ -138,6 +138,7 @@ void viafb_irq_disable(u32 mask); | |||
138 | #define VDE_I_LVDSSIEN 0x40000000 /* LVDS Sense enable */ | 138 | #define VDE_I_LVDSSIEN 0x40000000 /* LVDS Sense enable */ |
139 | #define VDE_I_ENABLE 0x80000000 /* Global interrupt enable */ | 139 | #define VDE_I_ENABLE 0x80000000 /* Global interrupt enable */ |
140 | 140 | ||
141 | #if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE) | ||
141 | /* | 142 | /* |
142 | * DMA management. | 143 | * DMA management. |
143 | */ | 144 | */ |
@@ -172,6 +173,7 @@ int viafb_dma_copy_out_sg(unsigned int offset, struct scatterlist *sg, int nsg); | |||
172 | */ | 173 | */ |
173 | #define VGA_WIDTH 640 | 174 | #define VGA_WIDTH 640 |
174 | #define VGA_HEIGHT 480 | 175 | #define VGA_HEIGHT 480 |
176 | #endif /* CONFIG_VIDEO_VIA_CAMERA */ | ||
175 | 177 | ||
176 | /* | 178 | /* |
177 | * Indexed port operations. Note that these are all multi-op | 179 | * Indexed port operations. Note that these are all multi-op |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 61490c6dcdbd..5f6f47044abf 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -363,6 +363,8 @@ struct v4l2_pix_format { | |||
363 | #define V4L2_PIX_FMT_OV518 v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */ | 363 | #define V4L2_PIX_FMT_OV518 v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */ |
364 | #define V4L2_PIX_FMT_STV0680 v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */ | 364 | #define V4L2_PIX_FMT_STV0680 v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */ |
365 | #define V4L2_PIX_FMT_TM6000 v4l2_fourcc('T', 'M', '6', '0') /* tm5600/tm60x0 */ | 365 | #define V4L2_PIX_FMT_TM6000 v4l2_fourcc('T', 'M', '6', '0') /* tm5600/tm60x0 */ |
366 | #define V4L2_PIX_FMT_CIT_YYVYUY v4l2_fourcc('C', 'I', 'T', 'V') /* one line of Y then 1 line of VYUY */ | ||
367 | #define V4L2_PIX_FMT_KONICA420 v4l2_fourcc('K', 'O', 'N', 'I') /* YUV420 planar in blocks of 256 pixels */ | ||
366 | 368 | ||
367 | /* | 369 | /* |
368 | * F O R M A T E N U M E R A T I O N | 370 | * F O R M A T E N U M E R A T I O N |
@@ -1045,8 +1047,11 @@ enum v4l2_colorfx { | |||
1045 | 1047 | ||
1046 | #define V4L2_CID_CHROMA_GAIN (V4L2_CID_BASE+36) | 1048 | #define V4L2_CID_CHROMA_GAIN (V4L2_CID_BASE+36) |
1047 | 1049 | ||
1050 | #define V4L2_CID_ILLUMINATORS_1 (V4L2_CID_BASE+37) | ||
1051 | #define V4L2_CID_ILLUMINATORS_2 (V4L2_CID_BASE+38) | ||
1052 | |||
1048 | /* last CID + 1 */ | 1053 | /* last CID + 1 */ |
1049 | #define V4L2_CID_LASTP1 (V4L2_CID_BASE+37) | 1054 | #define V4L2_CID_LASTP1 (V4L2_CID_BASE+39) |
1050 | 1055 | ||
1051 | /* MPEG-class control IDs defined by V4L2 */ | 1056 | /* MPEG-class control IDs defined by V4L2 */ |
1052 | #define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900) | 1057 | #define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900) |
@@ -1363,6 +1368,8 @@ struct v4l2_modulator { | |||
1363 | #define V4L2_TUNER_CAP_SAP 0x0020 | 1368 | #define V4L2_TUNER_CAP_SAP 0x0020 |
1364 | #define V4L2_TUNER_CAP_LANG1 0x0040 | 1369 | #define V4L2_TUNER_CAP_LANG1 0x0040 |
1365 | #define V4L2_TUNER_CAP_RDS 0x0080 | 1370 | #define V4L2_TUNER_CAP_RDS 0x0080 |
1371 | #define V4L2_TUNER_CAP_RDS_BLOCK_IO 0x0100 | ||
1372 | #define V4L2_TUNER_CAP_RDS_CONTROLS 0x0200 | ||
1366 | 1373 | ||
1367 | /* Flags for the 'rxsubchans' field */ | 1374 | /* Flags for the 'rxsubchans' field */ |
1368 | #define V4L2_TUNER_SUB_MONO 0x0001 | 1375 | #define V4L2_TUNER_SUB_MONO 0x0001 |
@@ -1392,7 +1399,8 @@ struct v4l2_hw_freq_seek { | |||
1392 | enum v4l2_tuner_type type; | 1399 | enum v4l2_tuner_type type; |
1393 | __u32 seek_upward; | 1400 | __u32 seek_upward; |
1394 | __u32 wrap_around; | 1401 | __u32 wrap_around; |
1395 | __u32 reserved[8]; | 1402 | __u32 spacing; |
1403 | __u32 reserved[7]; | ||
1396 | }; | 1404 | }; |
1397 | 1405 | ||
1398 | /* | 1406 | /* |
diff --git a/include/linux/videotext.h b/include/linux/videotext.h deleted file mode 100644 index 3e68c8d1c7f7..000000000000 --- a/include/linux/videotext.h +++ /dev/null | |||
@@ -1,125 +0,0 @@ | |||
1 | #ifndef _VTX_H | ||
2 | #define _VTX_H | ||
3 | |||
4 | /* | ||
5 | * Teletext (=Videotext) hardware decoders using interface /dev/vtx | ||
6 | * Do not confuse with drivers using /dev/vbi which decode videotext by software | ||
7 | * | ||
8 | * Videotext IOCTLs changed in order to use _IO() macros defined in <linux/ioctl.h>, | ||
9 | * unused tuner IOCTLs cleaned up by | ||
10 | * Michael Geng <linux@MichaelGeng.de> | ||
11 | * | ||
12 | * Copyright (c) 1994-97 Martin Buck <martin-2.buck@student.uni-ulm.de> | ||
13 | * Read COPYING for more information | ||
14 | * | ||
15 | */ | ||
16 | |||
17 | |||
18 | /* | ||
19 | * Videotext ioctls | ||
20 | */ | ||
21 | #define VTXIOCGETINFO _IOR (0x81, 1, vtx_info_t) | ||
22 | #define VTXIOCCLRPAGE _IOW (0x81, 2, vtx_pagereq_t) | ||
23 | #define VTXIOCCLRFOUND _IOW (0x81, 3, vtx_pagereq_t) | ||
24 | #define VTXIOCPAGEREQ _IOW (0x81, 4, vtx_pagereq_t) | ||
25 | #define VTXIOCGETSTAT _IOW (0x81, 5, vtx_pagereq_t) | ||
26 | #define VTXIOCGETPAGE _IOW (0x81, 6, vtx_pagereq_t) | ||
27 | #define VTXIOCSTOPDAU _IOW (0x81, 7, vtx_pagereq_t) | ||
28 | #define VTXIOCPUTPAGE _IO (0x81, 8) | ||
29 | #define VTXIOCSETDISP _IO (0x81, 9) | ||
30 | #define VTXIOCPUTSTAT _IO (0x81, 10) | ||
31 | #define VTXIOCCLRCACHE _IO (0x81, 11) | ||
32 | #define VTXIOCSETVIRT _IOW (0x81, 12, long) | ||
33 | |||
34 | /* for compatibility, will go away some day */ | ||
35 | #define VTXIOCGETINFO_OLD 0x7101 /* get version of driver & capabilities of vtx-chipset */ | ||
36 | #define VTXIOCCLRPAGE_OLD 0x7102 /* clear page-buffer */ | ||
37 | #define VTXIOCCLRFOUND_OLD 0x7103 /* clear bits indicating that page was found */ | ||
38 | #define VTXIOCPAGEREQ_OLD 0x7104 /* search for page */ | ||
39 | #define VTXIOCGETSTAT_OLD 0x7105 /* get status of page-buffer */ | ||
40 | #define VTXIOCGETPAGE_OLD 0x7106 /* get contents of page-buffer */ | ||
41 | #define VTXIOCSTOPDAU_OLD 0x7107 /* stop data acquisition unit */ | ||
42 | #define VTXIOCPUTPAGE_OLD 0x7108 /* display page on TV-screen */ | ||
43 | #define VTXIOCSETDISP_OLD 0x7109 /* set TV-mode */ | ||
44 | #define VTXIOCPUTSTAT_OLD 0x710a /* set status of TV-output-buffer */ | ||
45 | #define VTXIOCCLRCACHE_OLD 0x710b /* clear cache on VTX-interface (if avail.) */ | ||
46 | #define VTXIOCSETVIRT_OLD 0x710c /* turn on virtual mode (this disables TV-display) */ | ||
47 | |||
48 | /* | ||
49 | * Definitions for VTXIOCGETINFO | ||
50 | */ | ||
51 | |||
52 | #define SAA5243 0 | ||
53 | #define SAA5246 1 | ||
54 | #define SAA5249 2 | ||
55 | #define SAA5248 3 | ||
56 | #define XSTV5346 4 | ||
57 | |||
58 | typedef struct { | ||
59 | int version_major, version_minor; /* version of driver; if version_major changes, driver */ | ||
60 | /* is not backward compatible!!! CHECK THIS!!! */ | ||
61 | int numpages; /* number of page-buffers of vtx-chipset */ | ||
62 | int cct_type; /* type of vtx-chipset (SAA5243, SAA5246, SAA5248 or | ||
63 | * SAA5249) */ | ||
64 | } | ||
65 | vtx_info_t; | ||
66 | |||
67 | |||
68 | /* | ||
69 | * Definitions for VTXIOC{CLRPAGE,CLRFOUND,PAGEREQ,GETSTAT,GETPAGE,STOPDAU,PUTPAGE,SETDISP} | ||
70 | */ | ||
71 | |||
72 | #define MIN_UNIT (1<<0) | ||
73 | #define MIN_TEN (1<<1) | ||
74 | #define HR_UNIT (1<<2) | ||
75 | #define HR_TEN (1<<3) | ||
76 | #define PG_UNIT (1<<4) | ||
77 | #define PG_TEN (1<<5) | ||
78 | #define PG_HUND (1<<6) | ||
79 | #define PGMASK_MAX (1<<7) | ||
80 | #define PGMASK_PAGE (PG_HUND | PG_TEN | PG_UNIT) | ||
81 | #define PGMASK_HOUR (HR_TEN | HR_UNIT) | ||
82 | #define PGMASK_MINUTE (MIN_TEN | MIN_UNIT) | ||
83 | |||
84 | typedef struct | ||
85 | { | ||
86 | int page; /* number of requested page (hexadecimal) */ | ||
87 | int hour; /* requested hour (hexadecimal) */ | ||
88 | int minute; /* requested minute (hexadecimal) */ | ||
89 | int pagemask; /* mask defining which values of the above are set */ | ||
90 | int pgbuf; /* buffer where page will be stored */ | ||
91 | int start; /* start of requested part of page */ | ||
92 | int end; /* end of requested part of page */ | ||
93 | void __user *buffer; /* pointer to beginning of destination buffer */ | ||
94 | } | ||
95 | vtx_pagereq_t; | ||
96 | |||
97 | |||
98 | /* | ||
99 | * Definitions for VTXIOC{GETSTAT,PUTSTAT} | ||
100 | */ | ||
101 | |||
102 | #define VTX_PAGESIZE (40 * 24) | ||
103 | #define VTX_VIRTUALSIZE (40 * 49) | ||
104 | |||
105 | typedef struct | ||
106 | { | ||
107 | int pagenum; /* number of page (hexadecimal) */ | ||
108 | int hour; /* hour (hexadecimal) */ | ||
109 | int minute; /* minute (hexadecimal) */ | ||
110 | int charset; /* national charset */ | ||
111 | unsigned delete : 1; /* delete page (C4) */ | ||
112 | unsigned headline : 1; /* insert headline (C5) */ | ||
113 | unsigned subtitle : 1; /* insert subtitle (C6) */ | ||
114 | unsigned supp_header : 1; /* suppress header (C7) */ | ||
115 | unsigned update : 1; /* update page (C8) */ | ||
116 | unsigned inter_seq : 1; /* interrupted sequence (C9) */ | ||
117 | unsigned dis_disp : 1; /* disable/suppress display (C10) */ | ||
118 | unsigned serial : 1; /* serial mode (C11) */ | ||
119 | unsigned notfound : 1; /* /FOUND */ | ||
120 | unsigned pblf : 1; /* PBLF */ | ||
121 | unsigned hamming : 1; /* hamming-error occurred */ | ||
122 | } | ||
123 | vtx_pageinfo_t; | ||
124 | |||
125 | #endif /* _VTX_H */ | ||
diff --git a/include/linux/virtio_9p.h b/include/linux/virtio_9p.h index 1faa80d92f05..e68b439b2860 100644 --- a/include/linux/virtio_9p.h +++ b/include/linux/virtio_9p.h | |||
@@ -5,7 +5,6 @@ | |||
5 | #include <linux/types.h> | 5 | #include <linux/types.h> |
6 | #include <linux/virtio_ids.h> | 6 | #include <linux/virtio_ids.h> |
7 | #include <linux/virtio_config.h> | 7 | #include <linux/virtio_config.h> |
8 | #include <linux/types.h> | ||
9 | 8 | ||
10 | /* The feature bitmap for virtio 9P */ | 9 | /* The feature bitmap for virtio 9P */ |
11 | 10 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 01c2145118dc..a03dcf62ca9d 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -53,8 +53,10 @@ static inline void vmalloc_init(void) | |||
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | extern void *vmalloc(unsigned long size); | 55 | extern void *vmalloc(unsigned long size); |
56 | extern void *vzalloc(unsigned long size); | ||
56 | extern void *vmalloc_user(unsigned long size); | 57 | extern void *vmalloc_user(unsigned long size); |
57 | extern void *vmalloc_node(unsigned long size, int node); | 58 | extern void *vmalloc_node(unsigned long size, int node); |
59 | extern void *vzalloc_node(unsigned long size, int node); | ||
58 | extern void *vmalloc_exec(unsigned long size); | 60 | extern void *vmalloc_exec(unsigned long size); |
59 | extern void *vmalloc_32(unsigned long size); | 61 | extern void *vmalloc_32(unsigned long size); |
60 | extern void *vmalloc_32_user(unsigned long size); | 62 | extern void *vmalloc_32_user(unsigned long size); |
@@ -117,10 +119,12 @@ extern rwlock_t vmlist_lock; | |||
117 | extern struct vm_struct *vmlist; | 119 | extern struct vm_struct *vmlist; |
118 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); | 120 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); |
119 | 121 | ||
122 | #ifdef CONFIG_SMP | ||
120 | struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, | 123 | struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, |
121 | const size_t *sizes, int nr_vms, | 124 | const size_t *sizes, int nr_vms, |
122 | size_t align, gfp_t gfp_mask); | 125 | size_t align, gfp_t gfp_mask); |
123 | 126 | ||
124 | void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms); | 127 | void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms); |
128 | #endif | ||
125 | 129 | ||
126 | #endif /* _LINUX_VMALLOC_H */ | 130 | #endif /* _LINUX_VMALLOC_H */ |
diff --git a/include/linux/wireless.h b/include/linux/wireless.h index e6827eedf18b..4395b28bb86c 100644 --- a/include/linux/wireless.h +++ b/include/linux/wireless.h | |||
@@ -1157,6 +1157,6 @@ struct __compat_iw_event { | |||
1157 | #define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) | 1157 | #define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) |
1158 | #define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) | 1158 | #define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) |
1159 | #define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) | 1159 | #define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) |
1160 | #define IW_EV_POINT_PK_LEN (IW_EV_LCP_LEN + 4) | 1160 | #define IW_EV_POINT_PK_LEN (IW_EV_LCP_PK_LEN + 4) |
1161 | 1161 | ||
1162 | #endif /* _LINUX_WIRELESS_H */ | 1162 | #endif /* _LINUX_WIRELESS_H */ |
diff --git a/include/linux/spi/wl12xx.h b/include/linux/wl12xx.h index a223ecbc71ef..4f902e1908aa 100644 --- a/include/linux/spi/wl12xx.h +++ b/include/linux/wl12xx.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2009 Nokia Corporation | 4 | * Copyright (C) 2009 Nokia Corporation |
5 | * | 5 | * |
6 | * Contact: Kalle Valo <kalle.valo@nokia.com> | 6 | * Contact: Luciano Coelho <luciano.coelho@nokia.com> |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU General Public License | 9 | * modify it under the terms of the GNU General Public License |
@@ -21,14 +21,31 @@ | |||
21 | * | 21 | * |
22 | */ | 22 | */ |
23 | 23 | ||
24 | #ifndef _LINUX_SPI_WL12XX_H | 24 | #ifndef _LINUX_WL12XX_H |
25 | #define _LINUX_SPI_WL12XX_H | 25 | #define _LINUX_WL12XX_H |
26 | 26 | ||
27 | struct wl12xx_platform_data { | 27 | struct wl12xx_platform_data { |
28 | void (*set_power)(bool enable); | 28 | void (*set_power)(bool enable); |
29 | /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ | 29 | /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ |
30 | int irq; | 30 | int irq; |
31 | bool use_eeprom; | 31 | bool use_eeprom; |
32 | int board_ref_clock; | ||
32 | }; | 33 | }; |
33 | 34 | ||
35 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | ||
36 | |||
37 | int wl12xx_set_platform_data(const struct wl12xx_platform_data *data); | ||
38 | |||
39 | #else | ||
40 | |||
41 | static inline | ||
42 | int wl12xx_set_platform_data(const struct wl12xx_platform_data *data) | ||
43 | { | ||
44 | return -ENOSYS; | ||
45 | } | ||
46 | |||
47 | #endif | ||
48 | |||
49 | const struct wl12xx_platform_data *wl12xx_get_platform_data(void); | ||
50 | |||
34 | #endif | 51 | #endif |
diff --git a/include/linux/wlp.h b/include/linux/wlp.h deleted file mode 100644 index c76fe2392506..000000000000 --- a/include/linux/wlp.h +++ /dev/null | |||
@@ -1,736 +0,0 @@ | |||
1 | /* | ||
2 | * WiMedia Logical Link Control Protocol (WLP) | ||
3 | * | ||
4 | * Copyright (C) 2005-2006 Intel Corporation | ||
5 | * Reinette Chatre <reinette.chatre@intel.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License version | ||
9 | * 2 as published by the Free Software Foundation. | ||
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., 51 Franklin Street, Fifth Floor, Boston, MA | ||
19 | * 02110-1301, USA. | ||
20 | * | ||
21 | * | ||
22 | * FIXME: docs | ||
23 | * | ||
24 | * - Does not (yet) include support for WLP control frames | ||
25 | * WLP Draft 0.99 [6.5]. | ||
26 | * | ||
27 | * A visual representation of the data structures. | ||
28 | * | ||
29 | * wssidB wssidB | ||
30 | * ^ ^ | ||
31 | * | | | ||
32 | * wssidA wssidA | ||
33 | * wlp interface { ^ ^ | ||
34 | * ... | | | ||
35 | * ... ... wssid wssid ... | ||
36 | * wlp --- ... | | | ||
37 | * }; neighbors --> neighbA --> neighbB | ||
38 | * ... | ||
39 | * wss | ||
40 | * ... | ||
41 | * eda cache --> neighborA --> neighborB --> neighborC ... | ||
42 | */ | ||
43 | |||
44 | #ifndef __LINUX__WLP_H_ | ||
45 | #define __LINUX__WLP_H_ | ||
46 | |||
47 | #include <linux/netdevice.h> | ||
48 | #include <linux/skbuff.h> | ||
49 | #include <linux/list.h> | ||
50 | #include <linux/uwb.h> | ||
51 | |||
52 | /** | ||
53 | * WLP Protocol ID | ||
54 | * WLP Draft 0.99 [6.2] | ||
55 | * | ||
56 | * The MUX header for all WLP frames | ||
57 | */ | ||
58 | #define WLP_PROTOCOL_ID 0x0100 | ||
59 | |||
60 | /** | ||
61 | * WLP Version | ||
62 | * WLP version placed in the association frames (WLP 0.99 [6.6]) | ||
63 | */ | ||
64 | #define WLP_VERSION 0x10 | ||
65 | |||
66 | /** | ||
67 | * Bytes needed to print UUID as string | ||
68 | */ | ||
69 | #define WLP_WSS_UUID_STRSIZE 48 | ||
70 | |||
71 | /** | ||
72 | * Bytes needed to print nonce as string | ||
73 | */ | ||
74 | #define WLP_WSS_NONCE_STRSIZE 48 | ||
75 | |||
76 | |||
77 | /** | ||
78 | * Size used for WLP name size | ||
79 | * | ||
80 | * The WSS name is set to 65 bytes, 1 byte larger than the maximum | ||
81 | * allowed by the WLP spec. This is to have a null terminated string | ||
82 | * for display to the user. A maximum of 64 bytes will still be used | ||
83 | * when placing the WSS name field in association frames. | ||
84 | */ | ||
85 | #define WLP_WSS_NAME_SIZE 65 | ||
86 | |||
87 | /** | ||
88 | * Number of bytes added by WLP to data frame | ||
89 | * | ||
90 | * A data frame transmitted from a host will be placed in a Standard or | ||
91 | * Abbreviated WLP frame. These have an extra 4 bytes of header (struct | ||
92 | * wlp_frame_std_abbrv_hdr). | ||
93 | * When the stack sends this data frame for transmission it needs to ensure | ||
94 | * there is enough headroom for this header. | ||
95 | */ | ||
96 | #define WLP_DATA_HLEN 4 | ||
97 | |||
98 | /** | ||
99 | * State of device regarding WLP Service Set | ||
100 | * | ||
101 | * WLP_WSS_STATE_NONE: the host does not participate in any WSS | ||
102 | * WLP_WSS_STATE_PART_ENROLLED: used as part of the enrollment sequence | ||
103 | * ("Partial Enroll"). This state is used to | ||
104 | * indicate the first part of enrollment that is | ||
105 | * unsecure. If the WSS is unsecure then the | ||
106 | * state will promptly go to WLP_WSS_STATE_ENROLLED, | ||
107 | * if the WSS is not secure then the enrollment | ||
108 | * procedure is a few more steps before we are | ||
109 | * enrolled. | ||
110 | * WLP_WSS_STATE_ENROLLED: the host is enrolled in a WSS | ||
111 | * WLP_WSS_STATE_ACTIVE: WSS is activated | ||
112 | * WLP_WSS_STATE_CONNECTED: host is connected to neighbor in WSS | ||
113 | * | ||
114 | */ | ||
115 | enum wlp_wss_state { | ||
116 | WLP_WSS_STATE_NONE = 0, | ||
117 | WLP_WSS_STATE_PART_ENROLLED, | ||
118 | WLP_WSS_STATE_ENROLLED, | ||
119 | WLP_WSS_STATE_ACTIVE, | ||
120 | WLP_WSS_STATE_CONNECTED, | ||
121 | }; | ||
122 | |||
123 | /** | ||
124 | * WSS Secure status | ||
125 | * WLP 0.99 Table 6 | ||
126 | * | ||
127 | * Set to one if the WSS is secure, zero if it is not secure | ||
128 | */ | ||
129 | enum wlp_wss_sec_status { | ||
130 | WLP_WSS_UNSECURE = 0, | ||
131 | WLP_WSS_SECURE, | ||
132 | }; | ||
133 | |||
134 | /** | ||
135 | * WLP frame type | ||
136 | * WLP Draft 0.99 [6.2 Table 1] | ||
137 | */ | ||
138 | enum wlp_frame_type { | ||
139 | WLP_FRAME_STANDARD = 0, | ||
140 | WLP_FRAME_ABBREVIATED, | ||
141 | WLP_FRAME_CONTROL, | ||
142 | WLP_FRAME_ASSOCIATION, | ||
143 | }; | ||
144 | |||
145 | /** | ||
146 | * WLP Association Message Type | ||
147 | * WLP Draft 0.99 [6.6.1.2 Table 8] | ||
148 | */ | ||
149 | enum wlp_assoc_type { | ||
150 | WLP_ASSOC_D1 = 2, | ||
151 | WLP_ASSOC_D2 = 3, | ||
152 | WLP_ASSOC_M1 = 4, | ||
153 | WLP_ASSOC_M2 = 5, | ||
154 | WLP_ASSOC_M3 = 7, | ||
155 | WLP_ASSOC_M4 = 8, | ||
156 | WLP_ASSOC_M5 = 9, | ||
157 | WLP_ASSOC_M6 = 10, | ||
158 | WLP_ASSOC_M7 = 11, | ||
159 | WLP_ASSOC_M8 = 12, | ||
160 | WLP_ASSOC_F0 = 14, | ||
161 | WLP_ASSOC_E1 = 32, | ||
162 | WLP_ASSOC_E2 = 33, | ||
163 | WLP_ASSOC_C1 = 34, | ||
164 | WLP_ASSOC_C2 = 35, | ||
165 | WLP_ASSOC_C3 = 36, | ||
166 | WLP_ASSOC_C4 = 37, | ||
167 | }; | ||
168 | |||
169 | /** | ||
170 | * WLP Attribute Type | ||
171 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
172 | */ | ||
173 | enum wlp_attr_type { | ||
174 | WLP_ATTR_AUTH = 0x1005, /* Authenticator */ | ||
175 | WLP_ATTR_DEV_NAME = 0x1011, /* Device Name */ | ||
176 | WLP_ATTR_DEV_PWD_ID = 0x1012, /* Device Password ID */ | ||
177 | WLP_ATTR_E_HASH1 = 0x1014, /* E-Hash1 */ | ||
178 | WLP_ATTR_E_HASH2 = 0x1015, /* E-Hash2 */ | ||
179 | WLP_ATTR_E_SNONCE1 = 0x1016, /* E-SNonce1 */ | ||
180 | WLP_ATTR_E_SNONCE2 = 0x1017, /* E-SNonce2 */ | ||
181 | WLP_ATTR_ENCR_SET = 0x1018, /* Encrypted Settings */ | ||
182 | WLP_ATTR_ENRL_NONCE = 0x101A, /* Enrollee Nonce */ | ||
183 | WLP_ATTR_KEYWRAP_AUTH = 0x101E, /* Key Wrap Authenticator */ | ||
184 | WLP_ATTR_MANUF = 0x1021, /* Manufacturer */ | ||
185 | WLP_ATTR_MSG_TYPE = 0x1022, /* Message Type */ | ||
186 | WLP_ATTR_MODEL_NAME = 0x1023, /* Model Name */ | ||
187 | WLP_ATTR_MODEL_NR = 0x1024, /* Model Number */ | ||
188 | WLP_ATTR_PUB_KEY = 0x1032, /* Public Key */ | ||
189 | WLP_ATTR_REG_NONCE = 0x1039, /* Registrar Nonce */ | ||
190 | WLP_ATTR_R_HASH1 = 0x103D, /* R-Hash1 */ | ||
191 | WLP_ATTR_R_HASH2 = 0x103E, /* R-Hash2 */ | ||
192 | WLP_ATTR_R_SNONCE1 = 0x103F, /* R-SNonce1 */ | ||
193 | WLP_ATTR_R_SNONCE2 = 0x1040, /* R-SNonce2 */ | ||
194 | WLP_ATTR_SERIAL = 0x1042, /* Serial number */ | ||
195 | WLP_ATTR_UUID_E = 0x1047, /* UUID-E */ | ||
196 | WLP_ATTR_UUID_R = 0x1048, /* UUID-R */ | ||
197 | WLP_ATTR_PRI_DEV_TYPE = 0x1054, /* Primary Device Type */ | ||
198 | WLP_ATTR_SEC_DEV_TYPE = 0x1055, /* Secondary Device Type */ | ||
199 | WLP_ATTR_PORT_DEV = 0x1056, /* Portable Device */ | ||
200 | WLP_ATTR_APP_EXT = 0x1058, /* Application Extension */ | ||
201 | WLP_ATTR_WLP_VER = 0x2000, /* WLP Version */ | ||
202 | WLP_ATTR_WSSID = 0x2001, /* WSSID */ | ||
203 | WLP_ATTR_WSS_NAME = 0x2002, /* WSS Name */ | ||
204 | WLP_ATTR_WSS_SEC_STAT = 0x2003, /* WSS Secure Status */ | ||
205 | WLP_ATTR_WSS_BCAST = 0x2004, /* WSS Broadcast Address */ | ||
206 | WLP_ATTR_WSS_M_KEY = 0x2005, /* WSS Master Key */ | ||
207 | WLP_ATTR_ACC_ENRL = 0x2006, /* Accepting Enrollment */ | ||
208 | WLP_ATTR_WSS_INFO = 0x2007, /* WSS Information */ | ||
209 | WLP_ATTR_WSS_SEL_MTHD = 0x2008, /* WSS Selection Method */ | ||
210 | WLP_ATTR_ASSC_MTHD_LIST = 0x2009, /* Association Methods List */ | ||
211 | WLP_ATTR_SEL_ASSC_MTHD = 0x200A, /* Selected Association Method */ | ||
212 | WLP_ATTR_ENRL_HASH_COMM = 0x200B, /* Enrollee Hash Commitment */ | ||
213 | WLP_ATTR_WSS_TAG = 0x200C, /* WSS Tag */ | ||
214 | WLP_ATTR_WSS_VIRT = 0x200D, /* WSS Virtual EUI-48 */ | ||
215 | WLP_ATTR_WLP_ASSC_ERR = 0x200E, /* WLP Association Error */ | ||
216 | WLP_ATTR_VNDR_EXT = 0x200F, /* Vendor Extension */ | ||
217 | }; | ||
218 | |||
219 | /** | ||
220 | * WLP Category ID of primary/secondary device | ||
221 | * WLP Draft 0.99 [6.6.1.8 Table 12] | ||
222 | */ | ||
223 | enum wlp_dev_category_id { | ||
224 | WLP_DEV_CAT_COMPUTER = 1, | ||
225 | WLP_DEV_CAT_INPUT, | ||
226 | WLP_DEV_CAT_PRINT_SCAN_FAX_COPIER, | ||
227 | WLP_DEV_CAT_CAMERA, | ||
228 | WLP_DEV_CAT_STORAGE, | ||
229 | WLP_DEV_CAT_INFRASTRUCTURE, | ||
230 | WLP_DEV_CAT_DISPLAY, | ||
231 | WLP_DEV_CAT_MULTIM, | ||
232 | WLP_DEV_CAT_GAMING, | ||
233 | WLP_DEV_CAT_TELEPHONE, | ||
234 | WLP_DEV_CAT_OTHER = 65535, | ||
235 | }; | ||
236 | |||
237 | /** | ||
238 | * WLP WSS selection method | ||
239 | * WLP Draft 0.99 [6.6.1.6 Table 10] | ||
240 | */ | ||
241 | enum wlp_wss_sel_mthd { | ||
242 | WLP_WSS_ENRL_SELECT = 1, /* Enrollee selects */ | ||
243 | WLP_WSS_REG_SELECT, /* Registrar selects */ | ||
244 | }; | ||
245 | |||
246 | /** | ||
247 | * WLP association error values | ||
248 | * WLP Draft 0.99 [6.6.1.5 Table 9] | ||
249 | */ | ||
250 | enum wlp_assc_error { | ||
251 | WLP_ASSOC_ERROR_NONE, | ||
252 | WLP_ASSOC_ERROR_AUTH, /* Authenticator Failure */ | ||
253 | WLP_ASSOC_ERROR_ROGUE, /* Rogue activity suspected */ | ||
254 | WLP_ASSOC_ERROR_BUSY, /* Device busy */ | ||
255 | WLP_ASSOC_ERROR_LOCK, /* Setup Locked */ | ||
256 | WLP_ASSOC_ERROR_NOT_READY, /* Registrar not ready */ | ||
257 | WLP_ASSOC_ERROR_INV, /* Invalid WSS selection */ | ||
258 | WLP_ASSOC_ERROR_MSG_TIME, /* Message timeout */ | ||
259 | WLP_ASSOC_ERROR_ENR_TIME, /* Enrollment session timeout */ | ||
260 | WLP_ASSOC_ERROR_PW, /* Device password invalid */ | ||
261 | WLP_ASSOC_ERROR_VER, /* Unsupported version */ | ||
262 | WLP_ASSOC_ERROR_INT, /* Internal error */ | ||
263 | WLP_ASSOC_ERROR_UNDEF, /* Undefined error */ | ||
264 | WLP_ASSOC_ERROR_NUM, /* Numeric comparison failure */ | ||
265 | WLP_ASSOC_ERROR_WAIT, /* Waiting for user input */ | ||
266 | }; | ||
267 | |||
268 | /** | ||
269 | * WLP Parameters | ||
270 | * WLP 0.99 [7.7] | ||
271 | */ | ||
272 | enum wlp_parameters { | ||
273 | WLP_PER_MSG_TIMEOUT = 15, /* Seconds to wait for response to | ||
274 | association message. */ | ||
275 | }; | ||
276 | |||
277 | /** | ||
278 | * WLP IE | ||
279 | * | ||
280 | * The WLP IE should be included in beacons by all devices. | ||
281 | * | ||
282 | * The driver can set only a few of the fields in this information element, | ||
283 | * most fields are managed by the device self. When the driver needs to set | ||
284 | * a field it will only provide values for the fields of interest, the rest | ||
285 | * will be filled with zeroes. The fields of interest are: | ||
286 | * | ||
287 | * Element ID | ||
288 | * Length | ||
289 | * Capabilities (only to include WSSID Hash list length) | ||
290 | * WSSID Hash List fields | ||
291 | * | ||
292 | * WLP 0.99 [6.7] | ||
293 | * | ||
294 | * Only the fields that will be used are detailed in this structure, rest | ||
295 | * are not detailed or marked as "notused". | ||
296 | */ | ||
297 | struct wlp_ie { | ||
298 | struct uwb_ie_hdr hdr; | ||
299 | __le16 capabilities; | ||
300 | __le16 cycle_param; | ||
301 | __le16 acw_anchor_addr; | ||
302 | u8 wssid_hash_list[]; | ||
303 | } __packed; | ||
304 | |||
305 | static inline int wlp_ie_hash_length(struct wlp_ie *ie) | ||
306 | { | ||
307 | return (le16_to_cpu(ie->capabilities) >> 12) & 0xf; | ||
308 | } | ||
309 | |||
310 | static inline void wlp_ie_set_hash_length(struct wlp_ie *ie, int hash_length) | ||
311 | { | ||
312 | u16 caps = le16_to_cpu(ie->capabilities); | ||
313 | caps = (caps & ~(0xf << 12)) | (hash_length << 12); | ||
314 | ie->capabilities = cpu_to_le16(caps); | ||
315 | } | ||
316 | |||
317 | /** | ||
318 | * WLP nonce | ||
319 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
320 | * | ||
321 | * A 128-bit random number often used (E-SNonce1, E-SNonce2, Enrollee | ||
322 | * Nonce, Registrar Nonce, R-SNonce1, R-SNonce2). It is passed to HW so | ||
323 | * it is packed. | ||
324 | */ | ||
325 | struct wlp_nonce { | ||
326 | u8 data[16]; | ||
327 | } __packed; | ||
328 | |||
329 | /** | ||
330 | * WLP UUID | ||
331 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
332 | * | ||
333 | * Universally Unique Identifier (UUID) encoded as an octet string in the | ||
334 | * order the octets are shown in string representation in RFC4122. A UUID | ||
335 | * is often used (UUID-E, UUID-R, WSSID). It is passed to HW so it is packed. | ||
336 | */ | ||
337 | struct wlp_uuid { | ||
338 | u8 data[16]; | ||
339 | } __packed; | ||
340 | |||
341 | |||
342 | /** | ||
343 | * Primary and secondary device type attributes | ||
344 | * WLP Draft 0.99 [6.6.1.8] | ||
345 | */ | ||
346 | struct wlp_dev_type { | ||
347 | enum wlp_dev_category_id category:16; | ||
348 | u8 OUI[3]; | ||
349 | u8 OUIsubdiv; | ||
350 | __le16 subID; | ||
351 | } __packed; | ||
352 | |||
353 | /** | ||
354 | * WLP frame header | ||
355 | * WLP Draft 0.99 [6.2] | ||
356 | */ | ||
357 | struct wlp_frame_hdr { | ||
358 | __le16 mux_hdr; /* WLP_PROTOCOL_ID */ | ||
359 | enum wlp_frame_type type:8; | ||
360 | } __packed; | ||
361 | |||
362 | /** | ||
363 | * WLP attribute field header | ||
364 | * WLP Draft 0.99 [6.6.1] | ||
365 | * | ||
366 | * Header of each attribute found in an association frame | ||
367 | */ | ||
368 | struct wlp_attr_hdr { | ||
369 | __le16 type; | ||
370 | __le16 length; | ||
371 | } __packed; | ||
372 | |||
373 | /** | ||
374 | * Device information commonly used together | ||
375 | * | ||
376 | * Each of these device information elements has a specified range in which it | ||
377 | * should fit (WLP 0.99 [Table 6]). This range provided in the spec does not | ||
378 | * include the termination null '\0' character (when used in the | ||
379 | * association protocol the attribute fields are accompanied | ||
380 | * with a "length" field so the full range from the spec can be used for | ||
381 | * the value). We thus allocate an extra byte to be able to store a string | ||
382 | * of max length with a terminating '\0'. | ||
383 | */ | ||
384 | struct wlp_device_info { | ||
385 | char name[33]; | ||
386 | char model_name[33]; | ||
387 | char manufacturer[65]; | ||
388 | char model_nr[33]; | ||
389 | char serial[33]; | ||
390 | struct wlp_dev_type prim_dev_type; | ||
391 | }; | ||
392 | |||
393 | /** | ||
394 | * Macros for the WLP attributes | ||
395 | * | ||
396 | * There are quite a few attributes (total is 43). The attribute layout can be | ||
397 | * in one of three categories: one value, an array, an enum forced to 8 bits. | ||
398 | * These macros help with their definitions. | ||
399 | */ | ||
400 | #define wlp_attr(type, name) \ | ||
401 | struct wlp_attr_##name { \ | ||
402 | struct wlp_attr_hdr hdr; \ | ||
403 | type name; \ | ||
404 | } __packed; | ||
405 | |||
406 | #define wlp_attr_array(type, name) \ | ||
407 | struct wlp_attr_##name { \ | ||
408 | struct wlp_attr_hdr hdr; \ | ||
409 | type name[]; \ | ||
410 | } __packed; | ||
411 | |||
412 | /** | ||
413 | * WLP association attribute fields | ||
414 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
415 | * | ||
416 | * Attributes appear in same order as the Table in the spec | ||
417 | * FIXME Does not define all attributes yet | ||
418 | */ | ||
419 | |||
420 | /* Device name: Friendly name of sending device */ | ||
421 | wlp_attr_array(u8, dev_name) | ||
422 | |||
423 | /* Enrollee Nonce: Random number generated by enrollee for an enrollment | ||
424 | * session */ | ||
425 | wlp_attr(struct wlp_nonce, enonce) | ||
426 | |||
427 | /* Manufacturer name: Name of manufacturer of the sending device */ | ||
428 | wlp_attr_array(u8, manufacturer) | ||
429 | |||
430 | /* WLP Message Type */ | ||
431 | wlp_attr(u8, msg_type) | ||
432 | |||
433 | /* WLP Model name: Model name of sending device */ | ||
434 | wlp_attr_array(u8, model_name) | ||
435 | |||
436 | /* WLP Model number: Model number of sending device */ | ||
437 | wlp_attr_array(u8, model_nr) | ||
438 | |||
439 | /* Registrar Nonce: Random number generated by registrar for an enrollment | ||
440 | * session */ | ||
441 | wlp_attr(struct wlp_nonce, rnonce) | ||
442 | |||
443 | /* Serial number of device */ | ||
444 | wlp_attr_array(u8, serial) | ||
445 | |||
446 | /* UUID of enrollee */ | ||
447 | wlp_attr(struct wlp_uuid, uuid_e) | ||
448 | |||
449 | /* UUID of registrar */ | ||
450 | wlp_attr(struct wlp_uuid, uuid_r) | ||
451 | |||
452 | /* WLP Primary device type */ | ||
453 | wlp_attr(struct wlp_dev_type, prim_dev_type) | ||
454 | |||
455 | /* WLP Secondary device type */ | ||
456 | wlp_attr(struct wlp_dev_type, sec_dev_type) | ||
457 | |||
458 | /* WLP protocol version */ | ||
459 | wlp_attr(u8, version) | ||
460 | |||
461 | /* WLP service set identifier */ | ||
462 | wlp_attr(struct wlp_uuid, wssid) | ||
463 | |||
464 | /* WLP WSS name */ | ||
465 | wlp_attr_array(u8, wss_name) | ||
466 | |||
467 | /* WLP WSS Secure Status */ | ||
468 | wlp_attr(u8, wss_sec_status) | ||
469 | |||
470 | /* WSS Broadcast Address */ | ||
471 | wlp_attr(struct uwb_mac_addr, wss_bcast) | ||
472 | |||
473 | /* WLP Accepting Enrollment */ | ||
474 | wlp_attr(u8, accept_enrl) | ||
475 | |||
476 | /** | ||
477 | * WSS information attributes | ||
478 | * WLP Draft 0.99 [6.6.3 Table 15] | ||
479 | */ | ||
480 | struct wlp_wss_info { | ||
481 | struct wlp_attr_wssid wssid; | ||
482 | struct wlp_attr_wss_name name; | ||
483 | struct wlp_attr_accept_enrl accept; | ||
484 | struct wlp_attr_wss_sec_status sec_stat; | ||
485 | struct wlp_attr_wss_bcast bcast; | ||
486 | } __packed; | ||
487 | |||
488 | /* WLP WSS Information */ | ||
489 | wlp_attr_array(struct wlp_wss_info, wss_info) | ||
490 | |||
491 | /* WLP WSS Selection method */ | ||
492 | wlp_attr(u8, wss_sel_mthd) | ||
493 | |||
494 | /* WLP WSS tag */ | ||
495 | wlp_attr(u8, wss_tag) | ||
496 | |||
497 | /* WSS Virtual Address */ | ||
498 | wlp_attr(struct uwb_mac_addr, wss_virt) | ||
499 | |||
500 | /* WLP association error */ | ||
501 | wlp_attr(u8, wlp_assc_err) | ||
502 | |||
503 | /** | ||
504 | * WLP standard and abbreviated frames | ||
505 | * | ||
506 | * WLP Draft 0.99 [6.3] and [6.4] | ||
507 | * | ||
508 | * The difference between the WLP standard frame and the WLP | ||
509 | * abbreviated frame is that the standard frame includes the src | ||
510 | * and dest addresses from the Ethernet header, the abbreviated frame does | ||
511 | * not. | ||
512 | * The src/dest (as well as the type/length and client data) are already | ||
513 | * defined as part of the Ethernet header, we do not do this here. | ||
514 | * From this perspective the standard and abbreviated frames appear the | ||
515 | * same - they will be treated differently though. | ||
516 | * | ||
517 | * The size of this header is also captured in WLP_DATA_HLEN to enable | ||
518 | * interfaces to prepare their headroom. | ||
519 | */ | ||
520 | struct wlp_frame_std_abbrv_hdr { | ||
521 | struct wlp_frame_hdr hdr; | ||
522 | u8 tag; | ||
523 | } __packed; | ||
524 | |||
525 | /** | ||
526 | * WLP association frames | ||
527 | * | ||
528 | * WLP Draft 0.99 [6.6] | ||
529 | */ | ||
530 | struct wlp_frame_assoc { | ||
531 | struct wlp_frame_hdr hdr; | ||
532 | enum wlp_assoc_type type:8; | ||
533 | struct wlp_attr_version version; | ||
534 | struct wlp_attr_msg_type msg_type; | ||
535 | u8 attr[]; | ||
536 | } __packed; | ||
537 | |||
538 | /* Ethernet to dev address mapping */ | ||
539 | struct wlp_eda { | ||
540 | spinlock_t lock; | ||
541 | struct list_head cache; /* Eth<->Dev Addr cache */ | ||
542 | }; | ||
543 | |||
544 | /** | ||
545 | * WSS information temporary storage | ||
546 | * | ||
547 | * This information is only stored temporarily during discovery. It should | ||
548 | * not be stored unless the device is enrolled in the advertised WSS. This | ||
549 | * is done mainly because we follow the letter of the spec in this regard. | ||
550 | * See WLP 0.99 [7.2.3]. | ||
551 | * When the device does become enrolled in a WSS the WSS information will | ||
552 | * be stored as part of the more comprehensive struct wlp_wss. | ||
553 | */ | ||
554 | struct wlp_wss_tmp_info { | ||
555 | char name[WLP_WSS_NAME_SIZE]; | ||
556 | u8 accept_enroll; | ||
557 | u8 sec_status; | ||
558 | struct uwb_mac_addr bcast; | ||
559 | }; | ||
560 | |||
561 | struct wlp_wssid_e { | ||
562 | struct list_head node; | ||
563 | struct wlp_uuid wssid; | ||
564 | struct wlp_wss_tmp_info *info; | ||
565 | }; | ||
566 | |||
567 | /** | ||
568 | * A cache entry of WLP neighborhood | ||
569 | * | ||
570 | * @node: head of list is wlp->neighbors | ||
571 | * @wssid: list of wssids of this neighbor, element is wlp_wssid_e | ||
572 | * @info: temporary storage for information learned during discovery. This | ||
573 | * storage is used together with the wssid_e temporary storage | ||
574 | * during discovery. | ||
575 | */ | ||
576 | struct wlp_neighbor_e { | ||
577 | struct list_head node; | ||
578 | struct wlp_uuid uuid; | ||
579 | struct uwb_dev *uwb_dev; | ||
580 | struct list_head wssid; /* Elements are wlp_wssid_e */ | ||
581 | struct wlp_device_info *info; | ||
582 | }; | ||
583 | |||
584 | struct wlp; | ||
585 | /** | ||
586 | * Information for an association session in progress. | ||
587 | * | ||
588 | * @exp_message: The type of the expected message. Both this message and a | ||
589 | * F0 message (which can be sent in response to any | ||
590 | * association frame) will be accepted as a valid message for | ||
591 | * this session. | ||
592 | * @cb: The function that will be called upon receipt of this | ||
593 | * message. | ||
594 | * @cb_priv: Private data of callback | ||
595 | * @data: Data used in association process (always a sk_buff?) | ||
596 | * @neighbor: Address of neighbor with which association session is in | ||
597 | * progress. | ||
598 | */ | ||
599 | struct wlp_session { | ||
600 | enum wlp_assoc_type exp_message; | ||
601 | void (*cb)(struct wlp *); | ||
602 | void *cb_priv; | ||
603 | void *data; | ||
604 | struct uwb_dev_addr neighbor_addr; | ||
605 | }; | ||
606 | |||
607 | /** | ||
608 | * WLP Service Set | ||
609 | * | ||
610 | * @mutex: used to protect entire WSS structure. | ||
611 | * | ||
612 | * @name: The WSS name is set to 65 bytes, 1 byte larger than the maximum | ||
613 | * allowed by the WLP spec. This is to have a null terminated string | ||
614 | * for display to the user. A maximum of 64 bytes will still be used | ||
615 | * when placing the WSS name field in association frames. | ||
616 | * | ||
617 | * @accept_enroll: Accepting enrollment: Set to one if registrar is | ||
618 | * accepting enrollment in WSS, or zero otherwise. | ||
619 | * | ||
620 | * Global and local information for each WSS in which we are enrolled. | ||
621 | * WLP 0.99 Section 7.2.1 and Section 7.2.2 | ||
622 | */ | ||
623 | struct wlp_wss { | ||
624 | struct mutex mutex; | ||
625 | struct kobject kobj; | ||
626 | /* Global properties. */ | ||
627 | struct wlp_uuid wssid; | ||
628 | u8 hash; | ||
629 | char name[WLP_WSS_NAME_SIZE]; | ||
630 | struct uwb_mac_addr bcast; | ||
631 | u8 secure_status:1; | ||
632 | u8 master_key[16]; | ||
633 | /* Local properties. */ | ||
634 | u8 tag; | ||
635 | struct uwb_mac_addr virtual_addr; | ||
636 | /* Extra */ | ||
637 | u8 accept_enroll:1; | ||
638 | enum wlp_wss_state state; | ||
639 | }; | ||
640 | |||
641 | /** | ||
642 | * WLP main structure | ||
643 | * @mutex: protect changes to WLP structure. We only allow changes to the | ||
644 | * uuid, so currently this mutex only protects this field. | ||
645 | */ | ||
646 | struct wlp { | ||
647 | struct mutex mutex; | ||
648 | struct uwb_rc *rc; /* UWB radio controller */ | ||
649 | struct net_device *ndev; | ||
650 | struct uwb_pal pal; | ||
651 | struct wlp_eda eda; | ||
652 | struct wlp_uuid uuid; | ||
653 | struct wlp_session *session; | ||
654 | struct wlp_wss wss; | ||
655 | struct mutex nbmutex; /* Neighbor mutex protects neighbors list */ | ||
656 | struct list_head neighbors; /* Elements are wlp_neighbor_e */ | ||
657 | struct uwb_notifs_handler uwb_notifs_handler; | ||
658 | struct wlp_device_info *dev_info; | ||
659 | void (*fill_device_info)(struct wlp *wlp, struct wlp_device_info *info); | ||
660 | int (*xmit_frame)(struct wlp *, struct sk_buff *, | ||
661 | struct uwb_dev_addr *); | ||
662 | void (*stop_queue)(struct wlp *); | ||
663 | void (*start_queue)(struct wlp *); | ||
664 | }; | ||
665 | |||
666 | /* sysfs */ | ||
667 | |||
668 | |||
669 | struct wlp_wss_attribute { | ||
670 | struct attribute attr; | ||
671 | ssize_t (*show)(struct wlp_wss *wss, char *buf); | ||
672 | ssize_t (*store)(struct wlp_wss *wss, const char *buf, size_t count); | ||
673 | }; | ||
674 | |||
675 | #define WSS_ATTR(_name, _mode, _show, _store) \ | ||
676 | static struct wlp_wss_attribute wss_attr_##_name = __ATTR(_name, _mode, \ | ||
677 | _show, _store) | ||
678 | |||
679 | extern int wlp_setup(struct wlp *, struct uwb_rc *, struct net_device *ndev); | ||
680 | extern void wlp_remove(struct wlp *); | ||
681 | extern ssize_t wlp_neighborhood_show(struct wlp *, char *); | ||
682 | extern int wlp_wss_setup(struct net_device *, struct wlp_wss *); | ||
683 | extern void wlp_wss_remove(struct wlp_wss *); | ||
684 | extern ssize_t wlp_wss_activate_show(struct wlp_wss *, char *); | ||
685 | extern ssize_t wlp_wss_activate_store(struct wlp_wss *, const char *, size_t); | ||
686 | extern ssize_t wlp_eda_show(struct wlp *, char *); | ||
687 | extern ssize_t wlp_eda_store(struct wlp *, const char *, size_t); | ||
688 | extern ssize_t wlp_uuid_show(struct wlp *, char *); | ||
689 | extern ssize_t wlp_uuid_store(struct wlp *, const char *, size_t); | ||
690 | extern ssize_t wlp_dev_name_show(struct wlp *, char *); | ||
691 | extern ssize_t wlp_dev_name_store(struct wlp *, const char *, size_t); | ||
692 | extern ssize_t wlp_dev_manufacturer_show(struct wlp *, char *); | ||
693 | extern ssize_t wlp_dev_manufacturer_store(struct wlp *, const char *, size_t); | ||
694 | extern ssize_t wlp_dev_model_name_show(struct wlp *, char *); | ||
695 | extern ssize_t wlp_dev_model_name_store(struct wlp *, const char *, size_t); | ||
696 | extern ssize_t wlp_dev_model_nr_show(struct wlp *, char *); | ||
697 | extern ssize_t wlp_dev_model_nr_store(struct wlp *, const char *, size_t); | ||
698 | extern ssize_t wlp_dev_serial_show(struct wlp *, char *); | ||
699 | extern ssize_t wlp_dev_serial_store(struct wlp *, const char *, size_t); | ||
700 | extern ssize_t wlp_dev_prim_category_show(struct wlp *, char *); | ||
701 | extern ssize_t wlp_dev_prim_category_store(struct wlp *, const char *, | ||
702 | size_t); | ||
703 | extern ssize_t wlp_dev_prim_OUI_show(struct wlp *, char *); | ||
704 | extern ssize_t wlp_dev_prim_OUI_store(struct wlp *, const char *, size_t); | ||
705 | extern ssize_t wlp_dev_prim_OUI_sub_show(struct wlp *, char *); | ||
706 | extern ssize_t wlp_dev_prim_OUI_sub_store(struct wlp *, const char *, | ||
707 | size_t); | ||
708 | extern ssize_t wlp_dev_prim_subcat_show(struct wlp *, char *); | ||
709 | extern ssize_t wlp_dev_prim_subcat_store(struct wlp *, const char *, | ||
710 | size_t); | ||
711 | extern int wlp_receive_frame(struct device *, struct wlp *, struct sk_buff *, | ||
712 | struct uwb_dev_addr *); | ||
713 | extern int wlp_prepare_tx_frame(struct device *, struct wlp *, | ||
714 | struct sk_buff *, struct uwb_dev_addr *); | ||
715 | void wlp_reset_all(struct wlp *wlp); | ||
716 | |||
717 | /** | ||
718 | * Initialize WSS | ||
719 | */ | ||
720 | static inline | ||
721 | void wlp_wss_init(struct wlp_wss *wss) | ||
722 | { | ||
723 | mutex_init(&wss->mutex); | ||
724 | } | ||
725 | |||
726 | static inline | ||
727 | void wlp_init(struct wlp *wlp) | ||
728 | { | ||
729 | INIT_LIST_HEAD(&wlp->neighbors); | ||
730 | mutex_init(&wlp->mutex); | ||
731 | mutex_init(&wlp->nbmutex); | ||
732 | wlp_wss_init(&wlp->wss); | ||
733 | } | ||
734 | |||
735 | |||
736 | #endif /* #ifndef __LINUX__WLP_H_ */ | ||
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 25e02c941bac..0c0771f06bfa 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -190,7 +190,7 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; } | |||
190 | __INIT_WORK((_work), (_func), 0); \ | 190 | __INIT_WORK((_work), (_func), 0); \ |
191 | } while (0) | 191 | } while (0) |
192 | 192 | ||
193 | #define INIT_WORK_ON_STACK(_work, _func) \ | 193 | #define INIT_WORK_ONSTACK(_work, _func) \ |
194 | do { \ | 194 | do { \ |
195 | __INIT_WORK((_work), (_func), 1); \ | 195 | __INIT_WORK((_work), (_func), 1); \ |
196 | } while (0) | 196 | } while (0) |
@@ -201,9 +201,9 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; } | |||
201 | init_timer(&(_work)->timer); \ | 201 | init_timer(&(_work)->timer); \ |
202 | } while (0) | 202 | } while (0) |
203 | 203 | ||
204 | #define INIT_DELAYED_WORK_ON_STACK(_work, _func) \ | 204 | #define INIT_DELAYED_WORK_ONSTACK(_work, _func) \ |
205 | do { \ | 205 | do { \ |
206 | INIT_WORK_ON_STACK(&(_work)->work, (_func)); \ | 206 | INIT_WORK_ONSTACK(&(_work)->work, (_func)); \ |
207 | init_timer_on_stack(&(_work)->timer); \ | 207 | init_timer_on_stack(&(_work)->timer); \ |
208 | } while (0) | 208 | } while (0) |
209 | 209 | ||
@@ -243,11 +243,12 @@ enum { | |||
243 | WQ_NON_REENTRANT = 1 << 0, /* guarantee non-reentrance */ | 243 | WQ_NON_REENTRANT = 1 << 0, /* guarantee non-reentrance */ |
244 | WQ_UNBOUND = 1 << 1, /* not bound to any cpu */ | 244 | WQ_UNBOUND = 1 << 1, /* not bound to any cpu */ |
245 | WQ_FREEZEABLE = 1 << 2, /* freeze during suspend */ | 245 | WQ_FREEZEABLE = 1 << 2, /* freeze during suspend */ |
246 | WQ_RESCUER = 1 << 3, /* has an rescue worker */ | 246 | WQ_MEM_RECLAIM = 1 << 3, /* may be used for memory reclaim */ |
247 | WQ_HIGHPRI = 1 << 4, /* high priority */ | 247 | WQ_HIGHPRI = 1 << 4, /* high priority */ |
248 | WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ | 248 | WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ |
249 | 249 | ||
250 | WQ_DYING = 1 << 6, /* internal: workqueue is dying */ | 250 | WQ_DYING = 1 << 6, /* internal: workqueue is dying */ |
251 | WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */ | ||
251 | 252 | ||
252 | WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ | 253 | WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ |
253 | WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */ | 254 | WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */ |
@@ -306,12 +307,30 @@ __alloc_workqueue_key(const char *name, unsigned int flags, int max_active, | |||
306 | __alloc_workqueue_key((name), (flags), (max_active), NULL, NULL) | 307 | __alloc_workqueue_key((name), (flags), (max_active), NULL, NULL) |
307 | #endif | 308 | #endif |
308 | 309 | ||
310 | /** | ||
311 | * alloc_ordered_workqueue - allocate an ordered workqueue | ||
312 | * @name: name of the workqueue | ||
313 | * @flags: WQ_* flags (only WQ_FREEZEABLE and WQ_MEM_RECLAIM are meaningful) | ||
314 | * | ||
315 | * Allocate an ordered workqueue. An ordered workqueue executes at | ||
316 | * most one work item at any given time in the queued order. They are | ||
317 | * implemented as unbound workqueues with @max_active of one. | ||
318 | * | ||
319 | * RETURNS: | ||
320 | * Pointer to the allocated workqueue on success, %NULL on failure. | ||
321 | */ | ||
322 | static inline struct workqueue_struct * | ||
323 | alloc_ordered_workqueue(const char *name, unsigned int flags) | ||
324 | { | ||
325 | return alloc_workqueue(name, WQ_UNBOUND | flags, 1); | ||
326 | } | ||
327 | |||
309 | #define create_workqueue(name) \ | 328 | #define create_workqueue(name) \ |
310 | alloc_workqueue((name), WQ_RESCUER, 1) | 329 | alloc_workqueue((name), WQ_MEM_RECLAIM, 1) |
311 | #define create_freezeable_workqueue(name) \ | 330 | #define create_freezeable_workqueue(name) \ |
312 | alloc_workqueue((name), WQ_FREEZEABLE | WQ_UNBOUND | WQ_RESCUER, 1) | 331 | alloc_workqueue((name), WQ_FREEZEABLE | WQ_UNBOUND | WQ_MEM_RECLAIM, 1) |
313 | #define create_singlethread_workqueue(name) \ | 332 | #define create_singlethread_workqueue(name) \ |
314 | alloc_workqueue((name), WQ_UNBOUND | WQ_RESCUER, 1) | 333 | alloc_workqueue((name), WQ_UNBOUND | WQ_MEM_RECLAIM, 1) |
315 | 334 | ||
316 | extern void destroy_workqueue(struct workqueue_struct *wq); | 335 | extern void destroy_workqueue(struct workqueue_struct *wq); |
317 | 336 | ||
@@ -325,7 +344,6 @@ extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | |||
325 | 344 | ||
326 | extern void flush_workqueue(struct workqueue_struct *wq); | 345 | extern void flush_workqueue(struct workqueue_struct *wq); |
327 | extern void flush_scheduled_work(void); | 346 | extern void flush_scheduled_work(void); |
328 | extern void flush_delayed_work(struct delayed_work *work); | ||
329 | 347 | ||
330 | extern int schedule_work(struct work_struct *work); | 348 | extern int schedule_work(struct work_struct *work); |
331 | extern int schedule_work_on(int cpu, struct work_struct *work); | 349 | extern int schedule_work_on(int cpu, struct work_struct *work); |
@@ -337,8 +355,13 @@ extern int keventd_up(void); | |||
337 | 355 | ||
338 | int execute_in_process_context(work_func_t fn, struct execute_work *); | 356 | int execute_in_process_context(work_func_t fn, struct execute_work *); |
339 | 357 | ||
340 | extern int flush_work(struct work_struct *work); | 358 | extern bool flush_work(struct work_struct *work); |
341 | extern int cancel_work_sync(struct work_struct *work); | 359 | extern bool flush_work_sync(struct work_struct *work); |
360 | extern bool cancel_work_sync(struct work_struct *work); | ||
361 | |||
362 | extern bool flush_delayed_work(struct delayed_work *dwork); | ||
363 | extern bool flush_delayed_work_sync(struct delayed_work *work); | ||
364 | extern bool cancel_delayed_work_sync(struct delayed_work *dwork); | ||
342 | 365 | ||
343 | extern void workqueue_set_max_active(struct workqueue_struct *wq, | 366 | extern void workqueue_set_max_active(struct workqueue_struct *wq, |
344 | int max_active); | 367 | int max_active); |
@@ -352,9 +375,9 @@ extern unsigned int work_busy(struct work_struct *work); | |||
352 | * it returns 1 and the work doesn't re-arm itself. Run flush_workqueue() or | 375 | * it returns 1 and the work doesn't re-arm itself. Run flush_workqueue() or |
353 | * cancel_work_sync() to wait on it. | 376 | * cancel_work_sync() to wait on it. |
354 | */ | 377 | */ |
355 | static inline int cancel_delayed_work(struct delayed_work *work) | 378 | static inline bool cancel_delayed_work(struct delayed_work *work) |
356 | { | 379 | { |
357 | int ret; | 380 | bool ret; |
358 | 381 | ||
359 | ret = del_timer_sync(&work->timer); | 382 | ret = del_timer_sync(&work->timer); |
360 | if (ret) | 383 | if (ret) |
@@ -367,9 +390,9 @@ static inline int cancel_delayed_work(struct delayed_work *work) | |||
367 | * if it returns 0 the timer function may be running and the queueing is in | 390 | * if it returns 0 the timer function may be running and the queueing is in |
368 | * progress. | 391 | * progress. |
369 | */ | 392 | */ |
370 | static inline int __cancel_delayed_work(struct delayed_work *work) | 393 | static inline bool __cancel_delayed_work(struct delayed_work *work) |
371 | { | 394 | { |
372 | int ret; | 395 | bool ret; |
373 | 396 | ||
374 | ret = del_timer(&work->timer); | 397 | ret = del_timer(&work->timer); |
375 | if (ret) | 398 | if (ret) |
@@ -377,8 +400,6 @@ static inline int __cancel_delayed_work(struct delayed_work *work) | |||
377 | return ret; | 400 | return ret; |
378 | } | 401 | } |
379 | 402 | ||
380 | extern int cancel_delayed_work_sync(struct delayed_work *work); | ||
381 | |||
382 | /* Obsolete. use cancel_delayed_work_sync() */ | 403 | /* Obsolete. use cancel_delayed_work_sync() */ |
383 | static inline | 404 | static inline |
384 | void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq, | 405 | void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq, |
@@ -409,8 +430,4 @@ extern bool freeze_workqueues_busy(void); | |||
409 | extern void thaw_workqueues(void); | 430 | extern void thaw_workqueues(void); |
410 | #endif /* CONFIG_FREEZER */ | 431 | #endif /* CONFIG_FREEZER */ |
411 | 432 | ||
412 | #ifdef CONFIG_LOCKDEP | ||
413 | int in_workqueue_context(struct workqueue_struct *wq); | ||
414 | #endif | ||
415 | |||
416 | #endif | 433 | #endif |
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 72a5d647a5f2..0ead399e08b5 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
@@ -10,8 +10,6 @@ | |||
10 | struct backing_dev_info; | 10 | struct backing_dev_info; |
11 | 11 | ||
12 | extern spinlock_t inode_lock; | 12 | extern spinlock_t inode_lock; |
13 | extern struct list_head inode_in_use; | ||
14 | extern struct list_head inode_unused; | ||
15 | 13 | ||
16 | /* | 14 | /* |
17 | * fs/fs-writeback.c | 15 | * fs/fs-writeback.c |
@@ -60,7 +58,9 @@ struct writeback_control { | |||
60 | struct bdi_writeback; | 58 | struct bdi_writeback; |
61 | int inode_wait(void *); | 59 | int inode_wait(void *); |
62 | void writeback_inodes_sb(struct super_block *); | 60 | void writeback_inodes_sb(struct super_block *); |
61 | void writeback_inodes_sb_nr(struct super_block *, unsigned long nr); | ||
63 | int writeback_inodes_sb_if_idle(struct super_block *); | 62 | int writeback_inodes_sb_if_idle(struct super_block *); |
63 | int writeback_inodes_sb_nr_if_idle(struct super_block *, unsigned long nr); | ||
64 | void sync_inodes_sb(struct super_block *); | 64 | void sync_inodes_sb(struct super_block *); |
65 | void writeback_inodes_wb(struct bdi_writeback *wb, | 65 | void writeback_inodes_wb(struct bdi_writeback *wb, |
66 | struct writeback_control *wbc); | 66 | struct writeback_control *wbc); |
@@ -143,12 +143,16 @@ typedef int (*writepage_t)(struct page *page, struct writeback_control *wbc, | |||
143 | 143 | ||
144 | int generic_writepages(struct address_space *mapping, | 144 | int generic_writepages(struct address_space *mapping, |
145 | struct writeback_control *wbc); | 145 | struct writeback_control *wbc); |
146 | void tag_pages_for_writeback(struct address_space *mapping, | ||
147 | pgoff_t start, pgoff_t end); | ||
146 | int write_cache_pages(struct address_space *mapping, | 148 | int write_cache_pages(struct address_space *mapping, |
147 | struct writeback_control *wbc, writepage_t writepage, | 149 | struct writeback_control *wbc, writepage_t writepage, |
148 | void *data); | 150 | void *data); |
149 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc); | 151 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc); |
150 | void set_page_dirty_balance(struct page *page, int page_mkwrite); | 152 | void set_page_dirty_balance(struct page *page, int page_mkwrite); |
151 | void writeback_set_ratelimit(void); | 153 | void writeback_set_ratelimit(void); |
154 | void tag_pages_for_writeback(struct address_space *mapping, | ||
155 | pgoff_t start, pgoff_t end); | ||
152 | 156 | ||
153 | /* pdflush.c */ | 157 | /* pdflush.c */ |
154 | extern int nr_pdflush_threads; /* Global so it can be exported to sysctl | 158 | extern int nr_pdflush_threads; /* Global so it can be exported to sysctl |
diff --git a/include/media/ir-core.h b/include/media/ir-core.h index eb7fddf8f607..6dc37fae6606 100644 --- a/include/media/ir-core.h +++ b/include/media/ir-core.h | |||
@@ -60,6 +60,7 @@ enum rc_driver_type { | |||
60 | * @s_idle: optional: enable/disable hardware idle mode, upon which, | 60 | * @s_idle: optional: enable/disable hardware idle mode, upon which, |
61 | device doesn't interrupt host until it sees IR pulses | 61 | device doesn't interrupt host until it sees IR pulses |
62 | * @s_learning_mode: enable wide band receiver used for learning | 62 | * @s_learning_mode: enable wide band receiver used for learning |
63 | * @s_carrier_report: enable carrier reports | ||
63 | */ | 64 | */ |
64 | struct ir_dev_props { | 65 | struct ir_dev_props { |
65 | enum rc_driver_type driver_type; | 66 | enum rc_driver_type driver_type; |
@@ -82,8 +83,9 @@ struct ir_dev_props { | |||
82 | int (*s_tx_duty_cycle)(void *priv, u32 duty_cycle); | 83 | int (*s_tx_duty_cycle)(void *priv, u32 duty_cycle); |
83 | int (*s_rx_carrier_range)(void *priv, u32 min, u32 max); | 84 | int (*s_rx_carrier_range)(void *priv, u32 min, u32 max); |
84 | int (*tx_ir)(void *priv, int *txbuf, u32 n); | 85 | int (*tx_ir)(void *priv, int *txbuf, u32 n); |
85 | void (*s_idle)(void *priv, int enable); | 86 | void (*s_idle)(void *priv, bool enable); |
86 | int (*s_learning_mode)(void *priv, int enable); | 87 | int (*s_learning_mode)(void *priv, int enable); |
88 | int (*s_carrier_report) (void *priv, int enable); | ||
87 | }; | 89 | }; |
88 | 90 | ||
89 | struct ir_input_dev { | 91 | struct ir_input_dev { |
@@ -157,27 +159,54 @@ void ir_input_unregister(struct input_dev *input_dev); | |||
157 | 159 | ||
158 | void ir_repeat(struct input_dev *dev); | 160 | void ir_repeat(struct input_dev *dev); |
159 | void ir_keydown(struct input_dev *dev, int scancode, u8 toggle); | 161 | void ir_keydown(struct input_dev *dev, int scancode, u8 toggle); |
162 | void ir_keyup(struct ir_input_dev *ir); | ||
160 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, u32 scancode); | 163 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, u32 scancode); |
161 | 164 | ||
162 | /* From ir-raw-event.c */ | 165 | /* From ir-raw-event.c */ |
163 | 166 | ||
164 | struct ir_raw_event { | 167 | struct ir_raw_event { |
165 | unsigned pulse:1; | 168 | union { |
166 | unsigned duration:31; | 169 | u32 duration; |
170 | |||
171 | struct { | ||
172 | u32 carrier; | ||
173 | u8 duty_cycle; | ||
174 | }; | ||
175 | }; | ||
176 | |||
177 | unsigned pulse:1; | ||
178 | unsigned reset:1; | ||
179 | unsigned timeout:1; | ||
180 | unsigned carrier_report:1; | ||
167 | }; | 181 | }; |
168 | 182 | ||
169 | #define IR_MAX_DURATION 0x7FFFFFFF /* a bit more than 2 seconds */ | 183 | #define DEFINE_IR_RAW_EVENT(event) \ |
184 | struct ir_raw_event event = { \ | ||
185 | { .duration = 0 } , \ | ||
186 | .pulse = 0, \ | ||
187 | .reset = 0, \ | ||
188 | .timeout = 0, \ | ||
189 | .carrier_report = 0 } | ||
190 | |||
191 | static inline void init_ir_raw_event(struct ir_raw_event *ev) | ||
192 | { | ||
193 | memset(ev, 0, sizeof(*ev)); | ||
194 | } | ||
195 | |||
196 | #define IR_MAX_DURATION 0xFFFFFFFF /* a bit more than 4 seconds */ | ||
170 | 197 | ||
171 | void ir_raw_event_handle(struct input_dev *input_dev); | 198 | void ir_raw_event_handle(struct input_dev *input_dev); |
172 | int ir_raw_event_store(struct input_dev *input_dev, struct ir_raw_event *ev); | 199 | int ir_raw_event_store(struct input_dev *input_dev, struct ir_raw_event *ev); |
173 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); | 200 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); |
174 | int ir_raw_event_store_with_filter(struct input_dev *input_dev, | 201 | int ir_raw_event_store_with_filter(struct input_dev *input_dev, |
175 | struct ir_raw_event *ev); | 202 | struct ir_raw_event *ev); |
176 | void ir_raw_event_set_idle(struct input_dev *input_dev, int idle); | 203 | void ir_raw_event_set_idle(struct input_dev *input_dev, bool idle); |
177 | 204 | ||
178 | static inline void ir_raw_event_reset(struct input_dev *input_dev) | 205 | static inline void ir_raw_event_reset(struct input_dev *input_dev) |
179 | { | 206 | { |
180 | struct ir_raw_event ev = { .pulse = false, .duration = 0 }; | 207 | DEFINE_IR_RAW_EVENT(ev); |
208 | ev.reset = true; | ||
209 | |||
181 | ir_raw_event_store(input_dev, &ev); | 210 | ir_raw_event_store(input_dev, &ev); |
182 | ir_raw_event_handle(input_dev); | 211 | ir_raw_event_handle(input_dev); |
183 | } | 212 | } |
diff --git a/include/media/ir-kbd-i2c.h b/include/media/ir-kbd-i2c.h index 5e96d7a430be..557c676ab7dc 100644 --- a/include/media/ir-kbd-i2c.h +++ b/include/media/ir-kbd-i2c.h | |||
@@ -3,6 +3,8 @@ | |||
3 | 3 | ||
4 | #include <media/ir-common.h> | 4 | #include <media/ir-common.h> |
5 | 5 | ||
6 | #define DEFAULT_POLLING_INTERVAL 100 /* ms */ | ||
7 | |||
6 | struct IR_i2c; | 8 | struct IR_i2c; |
7 | 9 | ||
8 | struct IR_i2c { | 10 | struct IR_i2c { |
@@ -15,6 +17,8 @@ struct IR_i2c { | |||
15 | /* Used to avoid fast repeating */ | 17 | /* Used to avoid fast repeating */ |
16 | unsigned char old; | 18 | unsigned char old; |
17 | 19 | ||
20 | u32 polling_interval; /* in ms */ | ||
21 | |||
18 | struct delayed_work work; | 22 | struct delayed_work work; |
19 | char name[32]; | 23 | char name[32]; |
20 | char phys[32]; | 24 | char phys[32]; |
@@ -24,7 +28,6 @@ struct IR_i2c { | |||
24 | enum ir_kbd_get_key_fn { | 28 | enum ir_kbd_get_key_fn { |
25 | IR_KBD_GET_KEY_CUSTOM = 0, | 29 | IR_KBD_GET_KEY_CUSTOM = 0, |
26 | IR_KBD_GET_KEY_PIXELVIEW, | 30 | IR_KBD_GET_KEY_PIXELVIEW, |
27 | IR_KBD_GET_KEY_PV951, | ||
28 | IR_KBD_GET_KEY_HAUP, | 31 | IR_KBD_GET_KEY_HAUP, |
29 | IR_KBD_GET_KEY_KNC1, | 32 | IR_KBD_GET_KEY_KNC1, |
30 | IR_KBD_GET_KEY_FUSIONHDTV, | 33 | IR_KBD_GET_KEY_FUSIONHDTV, |
@@ -35,8 +38,9 @@ enum ir_kbd_get_key_fn { | |||
35 | /* Can be passed when instantiating an ir_video i2c device */ | 38 | /* Can be passed when instantiating an ir_video i2c device */ |
36 | struct IR_i2c_init_data { | 39 | struct IR_i2c_init_data { |
37 | char *ir_codes; | 40 | char *ir_codes; |
38 | const char *name; | 41 | const char *name; |
39 | u64 type; /* IR_TYPE_RC5, etc */ | 42 | u64 type; /* IR_TYPE_RC5, etc */ |
43 | u32 polling_interval; /* 0 means DEFAULT_POLLING_INTERVAL */ | ||
40 | /* | 44 | /* |
41 | * Specify either a function pointer or a value indicating one of | 45 | * Specify either a function pointer or a value indicating one of |
42 | * ir_kbd_i2c's internal get_key functions | 46 | * ir_kbd_i2c's internal get_key functions |
diff --git a/include/media/lirc_dev.h b/include/media/lirc_dev.h index b1f60663cb39..54780a560d0e 100644 --- a/include/media/lirc_dev.h +++ b/include/media/lirc_dev.h | |||
@@ -125,10 +125,10 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf, | |||
125 | struct lirc_driver { | 125 | struct lirc_driver { |
126 | char name[40]; | 126 | char name[40]; |
127 | int minor; | 127 | int minor; |
128 | unsigned long code_length; | 128 | __u32 code_length; |
129 | unsigned int buffer_size; /* in chunks holding one code each */ | 129 | unsigned int buffer_size; /* in chunks holding one code each */ |
130 | int sample_rate; | 130 | int sample_rate; |
131 | unsigned long features; | 131 | __u32 features; |
132 | 132 | ||
133 | unsigned int chunk_size; | 133 | unsigned int chunk_size; |
134 | 134 | ||
@@ -139,7 +139,7 @@ struct lirc_driver { | |||
139 | struct lirc_buffer *rbuf; | 139 | struct lirc_buffer *rbuf; |
140 | int (*set_use_inc) (void *data); | 140 | int (*set_use_inc) (void *data); |
141 | void (*set_use_dec) (void *data); | 141 | void (*set_use_dec) (void *data); |
142 | struct file_operations *fops; | 142 | const struct file_operations *fops; |
143 | struct device *dev; | 143 | struct device *dev; |
144 | struct module *owner; | 144 | struct module *owner; |
145 | }; | 145 | }; |
diff --git a/include/media/omap1_camera.h b/include/media/omap1_camera.h new file mode 100644 index 000000000000..819767cf04d4 --- /dev/null +++ b/include/media/omap1_camera.h | |||
@@ -0,0 +1,35 @@ | |||
1 | /* | ||
2 | * Header for V4L2 SoC Camera driver for OMAP1 Camera Interface | ||
3 | * | ||
4 | * Copyright (C) 2010, Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> | ||
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 __MEDIA_OMAP1_CAMERA_H_ | ||
12 | #define __MEDIA_OMAP1_CAMERA_H_ | ||
13 | |||
14 | #include <linux/bitops.h> | ||
15 | |||
16 | #define OMAP1_CAMERA_IOSIZE 0x1c | ||
17 | |||
18 | enum omap1_cam_vb_mode { | ||
19 | OMAP1_CAM_DMA_CONTIG = 0, | ||
20 | OMAP1_CAM_DMA_SG, | ||
21 | }; | ||
22 | |||
23 | #define OMAP1_CAMERA_MIN_BUF_COUNT(x) ((x) == OMAP1_CAM_DMA_CONTIG ? 3 : 2) | ||
24 | |||
25 | struct omap1_cam_platform_data { | ||
26 | unsigned long camexclk_khz; | ||
27 | unsigned long lclk_khz_max; | ||
28 | unsigned long flags; | ||
29 | }; | ||
30 | |||
31 | #define OMAP1_CAMERA_LCLK_RISING BIT(0) | ||
32 | #define OMAP1_CAMERA_RST_LOW BIT(1) | ||
33 | #define OMAP1_CAMERA_RST_HIGH BIT(2) | ||
34 | |||
35 | #endif /* __MEDIA_OMAP1_CAMERA_H_ */ | ||
diff --git a/include/media/rc-map.h b/include/media/rc-map.h index a9c041d49662..e0f17edf38ed 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h | |||
@@ -17,12 +17,13 @@ | |||
17 | #define IR_TYPE_RC6 (1 << 2) /* Philips RC6 protocol */ | 17 | #define IR_TYPE_RC6 (1 << 2) /* Philips RC6 protocol */ |
18 | #define IR_TYPE_JVC (1 << 3) /* JVC protocol */ | 18 | #define IR_TYPE_JVC (1 << 3) /* JVC protocol */ |
19 | #define IR_TYPE_SONY (1 << 4) /* Sony12/15/20 protocol */ | 19 | #define IR_TYPE_SONY (1 << 4) /* Sony12/15/20 protocol */ |
20 | #define IR_TYPE_RC5_SZ (1 << 5) /* RC5 variant used by Streamzap */ | ||
20 | #define IR_TYPE_LIRC (1 << 30) /* Pass raw IR to lirc userspace */ | 21 | #define IR_TYPE_LIRC (1 << 30) /* Pass raw IR to lirc userspace */ |
21 | #define IR_TYPE_OTHER (1u << 31) | 22 | #define IR_TYPE_OTHER (1u << 31) |
22 | 23 | ||
23 | #define IR_TYPE_ALL (IR_TYPE_RC5 | IR_TYPE_NEC | IR_TYPE_RC6 | \ | 24 | #define IR_TYPE_ALL (IR_TYPE_RC5 | IR_TYPE_NEC | IR_TYPE_RC6 | \ |
24 | IR_TYPE_JVC | IR_TYPE_SONY | IR_TYPE_LIRC | \ | 25 | IR_TYPE_JVC | IR_TYPE_SONY | IR_TYPE_LIRC | \ |
25 | IR_TYPE_OTHER) | 26 | IR_TYPE_RC5_SZ | IR_TYPE_OTHER) |
26 | 27 | ||
27 | struct ir_scancode { | 28 | struct ir_scancode { |
28 | u32 scancode; | 29 | u32 scancode; |
@@ -35,7 +36,7 @@ struct ir_scancode_table { | |||
35 | unsigned int len; /* Used number of entries */ | 36 | unsigned int len; /* Used number of entries */ |
36 | unsigned int alloc; /* Size of *scan in bytes */ | 37 | unsigned int alloc; /* Size of *scan in bytes */ |
37 | u64 ir_type; | 38 | u64 ir_type; |
38 | char *name; | 39 | const char *name; |
39 | spinlock_t lock; | 40 | spinlock_t lock; |
40 | }; | 41 | }; |
41 | 42 | ||
@@ -54,6 +55,8 @@ void rc_map_init(void); | |||
54 | /* Names of the several keytables defined in-kernel */ | 55 | /* Names of the several keytables defined in-kernel */ |
55 | 56 | ||
56 | #define RC_MAP_ADSTECH_DVB_T_PCI "rc-adstech-dvb-t-pci" | 57 | #define RC_MAP_ADSTECH_DVB_T_PCI "rc-adstech-dvb-t-pci" |
58 | #define RC_MAP_ALINK_DTU_M "rc-alink-dtu-m" | ||
59 | #define RC_MAP_ANYSEE "rc-anysee" | ||
57 | #define RC_MAP_APAC_VIEWCOMP "rc-apac-viewcomp" | 60 | #define RC_MAP_APAC_VIEWCOMP "rc-apac-viewcomp" |
58 | #define RC_MAP_ASUS_PC39 "rc-asus-pc39" | 61 | #define RC_MAP_ASUS_PC39 "rc-asus-pc39" |
59 | #define RC_MAP_ATI_TV_WONDER_HD_600 "rc-ati-tv-wonder-hd-600" | 62 | #define RC_MAP_ATI_TV_WONDER_HD_600 "rc-ati-tv-wonder-hd-600" |
@@ -62,8 +65,10 @@ void rc_map_init(void); | |||
62 | #define RC_MAP_AVERMEDIA_DVBT "rc-avermedia-dvbt" | 65 | #define RC_MAP_AVERMEDIA_DVBT "rc-avermedia-dvbt" |
63 | #define RC_MAP_AVERMEDIA_M135A "rc-avermedia-m135a" | 66 | #define RC_MAP_AVERMEDIA_M135A "rc-avermedia-m135a" |
64 | #define RC_MAP_AVERMEDIA_M733A_RM_K6 "rc-avermedia-m733a-rm-k6" | 67 | #define RC_MAP_AVERMEDIA_M733A_RM_K6 "rc-avermedia-m733a-rm-k6" |
68 | #define RC_MAP_AVERMEDIA_RM_KS "rc-avermedia-rm-ks" | ||
65 | #define RC_MAP_AVERMEDIA "rc-avermedia" | 69 | #define RC_MAP_AVERMEDIA "rc-avermedia" |
66 | #define RC_MAP_AVERTV_303 "rc-avertv-303" | 70 | #define RC_MAP_AVERTV_303 "rc-avertv-303" |
71 | #define RC_MAP_AZUREWAVE_AD_TU700 "rc-azurewave-ad-tu700" | ||
67 | #define RC_MAP_BEHOLD_COLUMBUS "rc-behold-columbus" | 72 | #define RC_MAP_BEHOLD_COLUMBUS "rc-behold-columbus" |
68 | #define RC_MAP_BEHOLD "rc-behold" | 73 | #define RC_MAP_BEHOLD "rc-behold" |
69 | #define RC_MAP_BUDGET_CI_OLD "rc-budget-ci-old" | 74 | #define RC_MAP_BUDGET_CI_OLD "rc-budget-ci-old" |
@@ -71,6 +76,8 @@ void rc_map_init(void); | |||
71 | #define RC_MAP_CINERGY "rc-cinergy" | 76 | #define RC_MAP_CINERGY "rc-cinergy" |
72 | #define RC_MAP_DIB0700_NEC_TABLE "rc-dib0700-nec" | 77 | #define RC_MAP_DIB0700_NEC_TABLE "rc-dib0700-nec" |
73 | #define RC_MAP_DIB0700_RC5_TABLE "rc-dib0700-rc5" | 78 | #define RC_MAP_DIB0700_RC5_TABLE "rc-dib0700-rc5" |
79 | #define RC_MAP_DIGITALNOW_TINYTWIN "rc-digitalnow-tinytwin" | ||
80 | #define RC_MAP_DIGITTRADE "rc-digittrade" | ||
74 | #define RC_MAP_DM1105_NEC "rc-dm1105-nec" | 81 | #define RC_MAP_DM1105_NEC "rc-dm1105-nec" |
75 | #define RC_MAP_DNTV_LIVE_DVBT_PRO "rc-dntv-live-dvbt-pro" | 82 | #define RC_MAP_DNTV_LIVE_DVBT_PRO "rc-dntv-live-dvbt-pro" |
76 | #define RC_MAP_DNTV_LIVE_DVB_T "rc-dntv-live-dvb-t" | 83 | #define RC_MAP_DNTV_LIVE_DVB_T "rc-dntv-live-dvb-t" |
@@ -94,8 +101,12 @@ void rc_map_init(void); | |||
94 | #define RC_MAP_KAIOMY "rc-kaiomy" | 101 | #define RC_MAP_KAIOMY "rc-kaiomy" |
95 | #define RC_MAP_KWORLD_315U "rc-kworld-315u" | 102 | #define RC_MAP_KWORLD_315U "rc-kworld-315u" |
96 | #define RC_MAP_KWORLD_PLUS_TV_ANALOG "rc-kworld-plus-tv-analog" | 103 | #define RC_MAP_KWORLD_PLUS_TV_ANALOG "rc-kworld-plus-tv-analog" |
104 | #define RC_MAP_LEADTEK_Y04G0051 "rc-leadtek-y04g0051" | ||
97 | #define RC_MAP_LIRC "rc-lirc" | 105 | #define RC_MAP_LIRC "rc-lirc" |
106 | #define RC_MAP_LME2510 "rc-lme2510" | ||
98 | #define RC_MAP_MANLI "rc-manli" | 107 | #define RC_MAP_MANLI "rc-manli" |
108 | #define RC_MAP_MSI_DIGIVOX_II "rc-msi-digivox-ii" | ||
109 | #define RC_MAP_MSI_DIGIVOX_III "rc-msi-digivox-iii" | ||
99 | #define RC_MAP_MSI_TVANYWHERE_PLUS "rc-msi-tvanywhere-plus" | 110 | #define RC_MAP_MSI_TVANYWHERE_PLUS "rc-msi-tvanywhere-plus" |
100 | #define RC_MAP_MSI_TVANYWHERE "rc-msi-tvanywhere" | 111 | #define RC_MAP_MSI_TVANYWHERE "rc-msi-tvanywhere" |
101 | #define RC_MAP_NEBULA "rc-nebula" | 112 | #define RC_MAP_NEBULA "rc-nebula" |
@@ -114,14 +125,18 @@ void rc_map_init(void); | |||
114 | #define RC_MAP_PURPLETV "rc-purpletv" | 125 | #define RC_MAP_PURPLETV "rc-purpletv" |
115 | #define RC_MAP_PV951 "rc-pv951" | 126 | #define RC_MAP_PV951 "rc-pv951" |
116 | #define RC_MAP_RC5_HAUPPAUGE_NEW "rc-rc5-hauppauge-new" | 127 | #define RC_MAP_RC5_HAUPPAUGE_NEW "rc-rc5-hauppauge-new" |
117 | #define RC_MAP_RC5_STREAMZAP "rc-rc5-streamzap" | ||
118 | #define RC_MAP_RC5_TV "rc-rc5-tv" | 128 | #define RC_MAP_RC5_TV "rc-rc5-tv" |
119 | #define RC_MAP_RC6_MCE "rc-rc6-mce" | 129 | #define RC_MAP_RC6_MCE "rc-rc6-mce" |
120 | #define RC_MAP_REAL_AUDIO_220_32_KEYS "rc-real-audio-220-32-keys" | 130 | #define RC_MAP_REAL_AUDIO_220_32_KEYS "rc-real-audio-220-32-keys" |
131 | #define RC_MAP_STREAMZAP "rc-streamzap" | ||
121 | #define RC_MAP_TBS_NEC "rc-tbs-nec" | 132 | #define RC_MAP_TBS_NEC "rc-tbs-nec" |
122 | #define RC_MAP_TERRATEC_CINERGY_XS "rc-terratec-cinergy-xs" | 133 | #define RC_MAP_TERRATEC_CINERGY_XS "rc-terratec-cinergy-xs" |
134 | #define RC_MAP_TERRATEC_SLIM "rc-terratec-slim" | ||
123 | #define RC_MAP_TEVII_NEC "rc-tevii-nec" | 135 | #define RC_MAP_TEVII_NEC "rc-tevii-nec" |
136 | #define RC_MAP_TOTAL_MEDIA_IN_HAND "rc-total-media-in-hand" | ||
137 | #define RC_MAP_TREKSTOR "rc-trekstor" | ||
124 | #define RC_MAP_TT_1500 "rc-tt-1500" | 138 | #define RC_MAP_TT_1500 "rc-tt-1500" |
139 | #define RC_MAP_TWINHAN_VP1027_DVBS "rc-twinhan1027" | ||
125 | #define RC_MAP_VIDEOMATE_S350 "rc-videomate-s350" | 140 | #define RC_MAP_VIDEOMATE_S350 "rc-videomate-s350" |
126 | #define RC_MAP_VIDEOMATE_TV_PVR "rc-videomate-tv-pvr" | 141 | #define RC_MAP_VIDEOMATE_TV_PVR "rc-videomate-tv-pvr" |
127 | #define RC_MAP_WINFAST "rc-winfast" | 142 | #define RC_MAP_WINFAST "rc-winfast" |
diff --git a/include/media/s3c_fimc.h b/include/media/s3c_fimc.h new file mode 100644 index 000000000000..ca1b6738e4a4 --- /dev/null +++ b/include/media/s3c_fimc.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /* | ||
2 | * Samsung S5P SoC camera interface driver header | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics Co., Ltd | ||
5 | * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com> | ||
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 S3C_FIMC_H_ | ||
13 | #define S3C_FIMC_H_ | ||
14 | |||
15 | enum cam_bus_type { | ||
16 | FIMC_ITU_601 = 1, | ||
17 | FIMC_ITU_656, | ||
18 | FIMC_MIPI_CSI2, | ||
19 | FIMC_LCD_WB, /* FIFO link from LCD mixer */ | ||
20 | }; | ||
21 | |||
22 | #define FIMC_CLK_INV_PCLK (1 << 0) | ||
23 | #define FIMC_CLK_INV_VSYNC (1 << 1) | ||
24 | #define FIMC_CLK_INV_HREF (1 << 2) | ||
25 | #define FIMC_CLK_INV_HSYNC (1 << 3) | ||
26 | |||
27 | struct i2c_board_info; | ||
28 | |||
29 | /** | ||
30 | * struct s3c_fimc_isp_info - image sensor information required for host | ||
31 | * interace configuration. | ||
32 | * | ||
33 | * @board_info: pointer to I2C subdevice's board info | ||
34 | * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc. | ||
35 | * @i2c_bus_num: i2c control bus id the sensor is attached to | ||
36 | * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU) | ||
37 | * @bus_width: camera data bus width in bits | ||
38 | * @flags: flags defining bus signals polarity inversion (High by default) | ||
39 | */ | ||
40 | struct s3c_fimc_isp_info { | ||
41 | struct i2c_board_info *board_info; | ||
42 | enum cam_bus_type bus_type; | ||
43 | u16 i2c_bus_num; | ||
44 | u16 mux_id; | ||
45 | u16 bus_width; | ||
46 | u16 flags; | ||
47 | }; | ||
48 | |||
49 | |||
50 | #define FIMC_MAX_CAMIF_CLIENTS 2 | ||
51 | |||
52 | /** | ||
53 | * struct s3c_platform_fimc - camera host interface platform data | ||
54 | * | ||
55 | * @isp_info: properties of camera sensor required for host interface setup | ||
56 | */ | ||
57 | struct s3c_platform_fimc { | ||
58 | struct s3c_fimc_isp_info *isp_info[FIMC_MAX_CAMIF_CLIENTS]; | ||
59 | }; | ||
60 | #endif /* S3C_FIMC_H_ */ | ||
diff --git a/include/media/sh_vou.h b/include/media/sh_vou.h index a3ef30242b00..ec3ba9a597a2 100644 --- a/include/media/sh_vou.h +++ b/include/media/sh_vou.h | |||
@@ -28,7 +28,6 @@ struct sh_vou_pdata { | |||
28 | int i2c_adap; | 28 | int i2c_adap; |
29 | struct i2c_board_info *board_info; | 29 | struct i2c_board_info *board_info; |
30 | unsigned long flags; | 30 | unsigned long flags; |
31 | char *module_name; | ||
32 | }; | 31 | }; |
33 | 32 | ||
34 | #endif | 33 | #endif |
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index 2ce957301f77..86e3631764ef 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h | |||
@@ -21,6 +21,8 @@ | |||
21 | 21 | ||
22 | extern struct bus_type soc_camera_bus_type; | 22 | extern struct bus_type soc_camera_bus_type; |
23 | 23 | ||
24 | struct file; | ||
25 | |||
24 | struct soc_camera_device { | 26 | struct soc_camera_device { |
25 | struct list_head list; | 27 | struct list_head list; |
26 | struct device dev; | 28 | struct device dev; |
@@ -41,10 +43,7 @@ struct soc_camera_device { | |||
41 | /* soc_camera.c private count. Only accessed with .video_lock held */ | 43 | /* soc_camera.c private count. Only accessed with .video_lock held */ |
42 | int use_count; | 44 | int use_count; |
43 | struct mutex video_lock; /* Protects device data */ | 45 | struct mutex video_lock; /* Protects device data */ |
44 | }; | 46 | struct file *streamer; /* stream owner */ |
45 | |||
46 | struct soc_camera_file { | ||
47 | struct soc_camera_device *icd; | ||
48 | struct videobuf_queue vb_vidq; | 47 | struct videobuf_queue vb_vidq; |
49 | }; | 48 | }; |
50 | 49 | ||
@@ -79,7 +78,7 @@ struct soc_camera_host_ops { | |||
79 | int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *); | 78 | int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *); |
80 | void (*init_videobuf)(struct videobuf_queue *, | 79 | void (*init_videobuf)(struct videobuf_queue *, |
81 | struct soc_camera_device *); | 80 | struct soc_camera_device *); |
82 | int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *); | 81 | int (*reqbufs)(struct soc_camera_device *, struct v4l2_requestbuffers *); |
83 | int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); | 82 | int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); |
84 | int (*set_bus_param)(struct soc_camera_device *, __u32); | 83 | int (*set_bus_param)(struct soc_camera_device *, __u32); |
85 | int (*get_ctrl)(struct soc_camera_device *, struct v4l2_control *); | 84 | int (*get_ctrl)(struct soc_camera_device *, struct v4l2_control *); |
diff --git a/include/media/sr030pc30.h b/include/media/sr030pc30.h new file mode 100644 index 000000000000..6f901a653ba2 --- /dev/null +++ b/include/media/sr030pc30.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* | ||
2 | * Driver header for SR030PC30 camera sensor | ||
3 | * | ||
4 | * Copyright (c) 2010 Samsung Electronics, Co. Ltd | ||
5 | * Contact: Sylwester Nawrocki <s.nawrocki@samsung.com> | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef SR030PC30_H | ||
14 | #define SR030PC30_H | ||
15 | |||
16 | struct sr030pc30_platform_data { | ||
17 | unsigned long clk_rate; /* master clock frequency in Hz */ | ||
18 | int (*set_power)(struct device *dev, int on); | ||
19 | }; | ||
20 | |||
21 | #endif /* SR030PC30_H */ | ||
diff --git a/include/media/v4l2-chip-ident.h b/include/media/v4l2-chip-ident.h index 21b4428c12ab..51e89f2267b8 100644 --- a/include/media/v4l2-chip-ident.h +++ b/include/media/v4l2-chip-ident.h | |||
@@ -38,6 +38,9 @@ enum { | |||
38 | /* module tvaudio: reserved range 50-99 */ | 38 | /* module tvaudio: reserved range 50-99 */ |
39 | V4L2_IDENT_TVAUDIO = 50, /* A tvaudio chip, unknown which it is exactly */ | 39 | V4L2_IDENT_TVAUDIO = 50, /* A tvaudio chip, unknown which it is exactly */ |
40 | 40 | ||
41 | /* Sony IMX074 */ | ||
42 | V4L2_IDENT_IMX074 = 74, | ||
43 | |||
41 | /* module saa7110: just ident 100 */ | 44 | /* module saa7110: just ident 100 */ |
42 | V4L2_IDENT_SAA7110 = 100, | 45 | V4L2_IDENT_SAA7110 = 100, |
43 | 46 | ||
@@ -70,6 +73,7 @@ enum { | |||
70 | V4L2_IDENT_OV9655 = 255, | 73 | V4L2_IDENT_OV9655 = 255, |
71 | V4L2_IDENT_SOI968 = 256, | 74 | V4L2_IDENT_SOI968 = 256, |
72 | V4L2_IDENT_OV9640 = 257, | 75 | V4L2_IDENT_OV9640 = 257, |
76 | V4L2_IDENT_OV6650 = 258, | ||
73 | 77 | ||
74 | /* module saa7146: reserved range 300-309 */ | 78 | /* module saa7146: reserved range 300-309 */ |
75 | V4L2_IDENT_SAA7146 = 300, | 79 | V4L2_IDENT_SAA7146 = 300, |
@@ -111,6 +115,10 @@ enum { | |||
111 | V4L2_IDENT_VPX3216B = 3216, | 115 | V4L2_IDENT_VPX3216B = 3216, |
112 | V4L2_IDENT_VPX3220A = 3220, | 116 | V4L2_IDENT_VPX3220A = 3220, |
113 | 117 | ||
118 | /* VX855 just ident 3409 */ | ||
119 | /* Other via devs could use 3314, 3324, 3327, 3336, 3364, 3353 */ | ||
120 | V4L2_IDENT_VIA_VX855 = 3409, | ||
121 | |||
114 | /* module tvp5150 */ | 122 | /* module tvp5150 */ |
115 | V4L2_IDENT_TVP5150 = 5150, | 123 | V4L2_IDENT_TVP5150 = 5150, |
116 | 124 | ||
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 98b32645e5a7..41dd480e45f1 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h | |||
@@ -232,4 +232,14 @@ void v4l_bound_align_image(unsigned int *w, unsigned int wmin, | |||
232 | unsigned int hmax, unsigned int halign, | 232 | unsigned int hmax, unsigned int halign, |
233 | unsigned int salign); | 233 | unsigned int salign); |
234 | int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info); | 234 | int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info); |
235 | |||
236 | struct v4l2_discrete_probe { | ||
237 | const struct v4l2_frmsize_discrete *sizes; | ||
238 | int num_sizes; | ||
239 | }; | ||
240 | |||
241 | const struct v4l2_frmsize_discrete *v4l2_find_nearest_format( | ||
242 | const struct v4l2_discrete_probe *probe, | ||
243 | s32 width, s32 height); | ||
244 | |||
235 | #endif /* V4L2_COMMON_H_ */ | 245 | #endif /* V4L2_COMMON_H_ */ |
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index 1efcacbed01a..15802a067a12 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h | |||
@@ -21,8 +21,7 @@ | |||
21 | #define VFL_TYPE_GRABBER 0 | 21 | #define VFL_TYPE_GRABBER 0 |
22 | #define VFL_TYPE_VBI 1 | 22 | #define VFL_TYPE_VBI 1 |
23 | #define VFL_TYPE_RADIO 2 | 23 | #define VFL_TYPE_RADIO 2 |
24 | #define VFL_TYPE_VTX 3 | 24 | #define VFL_TYPE_MAX 3 |
25 | #define VFL_TYPE_MAX 4 | ||
26 | 25 | ||
27 | struct v4l2_ioctl_callbacks; | 26 | struct v4l2_ioctl_callbacks; |
28 | struct video_device; | 27 | struct video_device; |
@@ -42,8 +41,6 @@ struct v4l2_file_operations { | |||
42 | unsigned int (*poll) (struct file *, struct poll_table_struct *); | 41 | unsigned int (*poll) (struct file *, struct poll_table_struct *); |
43 | long (*ioctl) (struct file *, unsigned int, unsigned long); | 42 | long (*ioctl) (struct file *, unsigned int, unsigned long); |
44 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 43 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
45 | unsigned long (*get_unmapped_area) (struct file *, unsigned long, | ||
46 | unsigned long, unsigned long, unsigned long); | ||
47 | int (*mmap) (struct file *, struct vm_area_struct *); | 44 | int (*mmap) (struct file *, struct vm_area_struct *); |
48 | int (*open) (struct file *); | 45 | int (*open) (struct file *); |
49 | int (*release) (struct file *); | 46 | int (*release) (struct file *); |
@@ -97,6 +94,9 @@ struct video_device | |||
97 | 94 | ||
98 | /* ioctl callbacks */ | 95 | /* ioctl callbacks */ |
99 | const struct v4l2_ioctl_ops *ioctl_ops; | 96 | const struct v4l2_ioctl_ops *ioctl_ops; |
97 | |||
98 | /* serialization lock */ | ||
99 | struct mutex *lock; | ||
100 | }; | 100 | }; |
101 | 101 | ||
102 | /* dev to video-device */ | 102 | /* dev to video-device */ |
diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h index 8bcbd7a0271c..6648036b728d 100644 --- a/include/media/v4l2-device.h +++ b/include/media/v4l2-device.h | |||
@@ -101,46 +101,67 @@ void v4l2_device_unregister_subdev(struct v4l2_subdev *sd); | |||
101 | /* Call the specified callback for all subdevs matching the condition. | 101 | /* Call the specified callback for all subdevs matching the condition. |
102 | Ignore any errors. Note that you cannot add or delete a subdev | 102 | Ignore any errors. Note that you cannot add or delete a subdev |
103 | while walking the subdevs list. */ | 103 | while walking the subdevs list. */ |
104 | #define __v4l2_device_call_subdevs(v4l2_dev, cond, o, f, args...) \ | 104 | #define __v4l2_device_call_subdevs_p(v4l2_dev, sd, cond, o, f, args...) \ |
105 | do { \ | 105 | do { \ |
106 | struct v4l2_subdev *sd; \ | 106 | list_for_each_entry((sd), &(v4l2_dev)->subdevs, list) \ |
107 | if ((cond) && (sd)->ops->o && (sd)->ops->o->f) \ | ||
108 | (sd)->ops->o->f((sd) , ##args); \ | ||
109 | } while (0) | ||
110 | |||
111 | #define __v4l2_device_call_subdevs(v4l2_dev, cond, o, f, args...) \ | ||
112 | do { \ | ||
113 | struct v4l2_subdev *__sd; \ | ||
107 | \ | 114 | \ |
108 | list_for_each_entry(sd, &(v4l2_dev)->subdevs, list) \ | 115 | __v4l2_device_call_subdevs_p(v4l2_dev, __sd, cond, o, \ |
109 | if ((cond) && sd->ops->o && sd->ops->o->f) \ | 116 | f , ##args); \ |
110 | sd->ops->o->f(sd , ##args); \ | ||
111 | } while (0) | 117 | } while (0) |
112 | 118 | ||
113 | /* Call the specified callback for all subdevs matching the condition. | 119 | /* Call the specified callback for all subdevs matching the condition. |
114 | If the callback returns an error other than 0 or -ENOIOCTLCMD, then | 120 | If the callback returns an error other than 0 or -ENOIOCTLCMD, then |
115 | return with that error code. Note that you cannot add or delete a | 121 | return with that error code. Note that you cannot add or delete a |
116 | subdev while walking the subdevs list. */ | 122 | subdev while walking the subdevs list. */ |
117 | #define __v4l2_device_call_subdevs_until_err(v4l2_dev, cond, o, f, args...) \ | 123 | #define __v4l2_device_call_subdevs_until_err_p(v4l2_dev, sd, cond, o, f, args...) \ |
118 | ({ \ | 124 | ({ \ |
119 | struct v4l2_subdev *sd; \ | 125 | long __err = 0; \ |
120 | long err = 0; \ | ||
121 | \ | 126 | \ |
122 | list_for_each_entry(sd, &(v4l2_dev)->subdevs, list) { \ | 127 | list_for_each_entry((sd), &(v4l2_dev)->subdevs, list) { \ |
123 | if ((cond) && sd->ops->o && sd->ops->o->f) \ | 128 | if ((cond) && (sd)->ops->o && (sd)->ops->o->f) \ |
124 | err = sd->ops->o->f(sd , ##args); \ | 129 | __err = (sd)->ops->o->f((sd) , ##args); \ |
125 | if (err && err != -ENOIOCTLCMD) \ | 130 | if (__err && __err != -ENOIOCTLCMD) \ |
126 | break; \ | 131 | break; \ |
127 | } \ | 132 | } \ |
128 | (err == -ENOIOCTLCMD) ? 0 : err; \ | 133 | (__err == -ENOIOCTLCMD) ? 0 : __err; \ |
134 | }) | ||
135 | |||
136 | #define __v4l2_device_call_subdevs_until_err(v4l2_dev, cond, o, f, args...) \ | ||
137 | ({ \ | ||
138 | struct v4l2_subdev *__sd; \ | ||
139 | __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, cond, o, \ | ||
140 | f, args...); \ | ||
129 | }) | 141 | }) |
130 | 142 | ||
131 | /* Call the specified callback for all subdevs matching grp_id (if 0, then | 143 | /* Call the specified callback for all subdevs matching grp_id (if 0, then |
132 | match them all). Ignore any errors. Note that you cannot add or delete | 144 | match them all). Ignore any errors. Note that you cannot add or delete |
133 | a subdev while walking the subdevs list. */ | 145 | a subdev while walking the subdevs list. */ |
134 | #define v4l2_device_call_all(v4l2_dev, grpid, o, f, args...) \ | 146 | #define v4l2_device_call_all(v4l2_dev, grpid, o, f, args...) \ |
135 | __v4l2_device_call_subdevs(v4l2_dev, \ | 147 | do { \ |
136 | !(grpid) || sd->grp_id == (grpid), o, f , ##args) | 148 | struct v4l2_subdev *__sd; \ |
149 | \ | ||
150 | __v4l2_device_call_subdevs_p(v4l2_dev, __sd, \ | ||
151 | !(grpid) || __sd->grp_id == (grpid), o, f , \ | ||
152 | ##args); \ | ||
153 | } while (0) | ||
137 | 154 | ||
138 | /* Call the specified callback for all subdevs matching grp_id (if 0, then | 155 | /* Call the specified callback for all subdevs matching grp_id (if 0, then |
139 | match them all). If the callback returns an error other than 0 or | 156 | match them all). If the callback returns an error other than 0 or |
140 | -ENOIOCTLCMD, then return with that error code. Note that you cannot | 157 | -ENOIOCTLCMD, then return with that error code. Note that you cannot |
141 | add or delete a subdev while walking the subdevs list. */ | 158 | add or delete a subdev while walking the subdevs list. */ |
142 | #define v4l2_device_call_until_err(v4l2_dev, grpid, o, f, args...) \ | 159 | #define v4l2_device_call_until_err(v4l2_dev, grpid, o, f, args...) \ |
143 | __v4l2_device_call_subdevs_until_err(v4l2_dev, \ | 160 | ({ \ |
144 | !(grpid) || sd->grp_id == (grpid), o, f , ##args) | 161 | struct v4l2_subdev *__sd; \ |
162 | __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, \ | ||
163 | !(grpid) || __sd->grp_id == (grpid), o, f , \ | ||
164 | ##args); \ | ||
165 | }) | ||
145 | 166 | ||
146 | #endif | 167 | #endif |
diff --git a/include/media/v4l2-i2c-drv.h b/include/media/v4l2-i2c-drv.h deleted file mode 100644 index 74bf741d1a9b..000000000000 --- a/include/media/v4l2-i2c-drv.h +++ /dev/null | |||
@@ -1,80 +0,0 @@ | |||
1 | /* | ||
2 | * v4l2-i2c-drv.h - contains I2C handling code that's identical for | ||
3 | * all V4L2 I2C drivers. Use this header if the | ||
4 | * I2C driver is only used by drivers converted | ||
5 | * to the bus-based I2C API. | ||
6 | * | ||
7 | * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> | ||
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 as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | /* NOTE: the full version of this header is in the v4l-dvb repository | ||
25 | * and allows v4l i2c drivers to be compiled on pre-2.6.26 kernels. | ||
26 | * The version of this header as it appears in the kernel is a stripped | ||
27 | * version (without all the backwards compatibility stuff) and so it | ||
28 | * looks a bit odd. | ||
29 | * | ||
30 | * If you look at the full version then you will understand the reason | ||
31 | * for introducing this header since you really don't want to have all | ||
32 | * the tricky backwards compatibility code in each and every i2c driver. | ||
33 | * | ||
34 | * If the i2c driver will never be compiled for pre-2.6.26 kernels, then | ||
35 | * DO NOT USE this header! Just write it as a regular i2c driver. | ||
36 | */ | ||
37 | |||
38 | #ifndef __V4L2_I2C_DRV_H__ | ||
39 | #define __V4L2_I2C_DRV_H__ | ||
40 | |||
41 | #include <media/v4l2-common.h> | ||
42 | |||
43 | struct v4l2_i2c_driver_data { | ||
44 | const char * const name; | ||
45 | int (*command)(struct i2c_client *client, unsigned int cmd, void *arg); | ||
46 | int (*probe)(struct i2c_client *client, const struct i2c_device_id *id); | ||
47 | int (*remove)(struct i2c_client *client); | ||
48 | int (*suspend)(struct i2c_client *client, pm_message_t state); | ||
49 | int (*resume)(struct i2c_client *client); | ||
50 | const struct i2c_device_id *id_table; | ||
51 | }; | ||
52 | |||
53 | static struct v4l2_i2c_driver_data v4l2_i2c_data; | ||
54 | static struct i2c_driver v4l2_i2c_driver; | ||
55 | |||
56 | |||
57 | /* Bus-based I2C implementation for kernels >= 2.6.26 */ | ||
58 | |||
59 | static int __init v4l2_i2c_drv_init(void) | ||
60 | { | ||
61 | v4l2_i2c_driver.driver.name = v4l2_i2c_data.name; | ||
62 | v4l2_i2c_driver.command = v4l2_i2c_data.command; | ||
63 | v4l2_i2c_driver.probe = v4l2_i2c_data.probe; | ||
64 | v4l2_i2c_driver.remove = v4l2_i2c_data.remove; | ||
65 | v4l2_i2c_driver.suspend = v4l2_i2c_data.suspend; | ||
66 | v4l2_i2c_driver.resume = v4l2_i2c_data.resume; | ||
67 | v4l2_i2c_driver.id_table = v4l2_i2c_data.id_table; | ||
68 | return i2c_add_driver(&v4l2_i2c_driver); | ||
69 | } | ||
70 | |||
71 | |||
72 | static void __exit v4l2_i2c_drv_cleanup(void) | ||
73 | { | ||
74 | i2c_del_driver(&v4l2_i2c_driver); | ||
75 | } | ||
76 | |||
77 | module_init(v4l2_i2c_drv_init); | ||
78 | module_exit(v4l2_i2c_drv_cleanup); | ||
79 | |||
80 | #endif /* __V4L2_I2C_DRV_H__ */ | ||
diff --git a/include/media/v4l2-mediabus.h b/include/media/v4l2-mediabus.h index f0cf2e7def06..8e6559838ae3 100644 --- a/include/media/v4l2-mediabus.h +++ b/include/media/v4l2-mediabus.h | |||
@@ -28,10 +28,18 @@ enum v4l2_mbus_pixelcode { | |||
28 | V4L2_MBUS_FMT_YVYU8_2X8, | 28 | V4L2_MBUS_FMT_YVYU8_2X8, |
29 | V4L2_MBUS_FMT_UYVY8_2X8, | 29 | V4L2_MBUS_FMT_UYVY8_2X8, |
30 | V4L2_MBUS_FMT_VYUY8_2X8, | 30 | V4L2_MBUS_FMT_VYUY8_2X8, |
31 | V4L2_MBUS_FMT_YVYU10_2X10, | ||
32 | V4L2_MBUS_FMT_YUYV10_2X10, | ||
33 | V4L2_MBUS_FMT_YVYU10_1X20, | ||
34 | V4L2_MBUS_FMT_YUYV10_1X20, | ||
35 | V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE, | ||
36 | V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE, | ||
31 | V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, | 37 | V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, |
32 | V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE, | 38 | V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE, |
33 | V4L2_MBUS_FMT_RGB565_2X8_LE, | 39 | V4L2_MBUS_FMT_RGB565_2X8_LE, |
34 | V4L2_MBUS_FMT_RGB565_2X8_BE, | 40 | V4L2_MBUS_FMT_RGB565_2X8_BE, |
41 | V4L2_MBUS_FMT_BGR565_2X8_LE, | ||
42 | V4L2_MBUS_FMT_BGR565_2X8_BE, | ||
35 | V4L2_MBUS_FMT_SBGGR8_1X8, | 43 | V4L2_MBUS_FMT_SBGGR8_1X8, |
36 | V4L2_MBUS_FMT_SBGGR10_1X10, | 44 | V4L2_MBUS_FMT_SBGGR10_1X10, |
37 | V4L2_MBUS_FMT_GREY8_1X8, | 45 | V4L2_MBUS_FMT_GREY8_1X8, |
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 4a97d7341a94..b0316a7cf08d 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
@@ -256,10 +256,6 @@ struct v4l2_subdev_video_ops { | |||
256 | int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std); | 256 | int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std); |
257 | int (*g_input_status)(struct v4l2_subdev *sd, u32 *status); | 257 | int (*g_input_status)(struct v4l2_subdev *sd, u32 *status); |
258 | int (*s_stream)(struct v4l2_subdev *sd, int enable); | 258 | int (*s_stream)(struct v4l2_subdev *sd, int enable); |
259 | int (*enum_fmt)(struct v4l2_subdev *sd, struct v4l2_fmtdesc *fmtdesc); | ||
260 | int (*g_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | ||
261 | int (*try_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | ||
262 | int (*s_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | ||
263 | int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc); | 259 | int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc); |
264 | int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); | 260 | int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); |
265 | int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); | 261 | int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); |
@@ -442,17 +438,28 @@ struct v4l2_subdev { | |||
442 | /* can be used to group similar subdevs, value is driver-specific */ | 438 | /* can be used to group similar subdevs, value is driver-specific */ |
443 | u32 grp_id; | 439 | u32 grp_id; |
444 | /* pointer to private data */ | 440 | /* pointer to private data */ |
445 | void *priv; | 441 | void *dev_priv; |
442 | void *host_priv; | ||
446 | }; | 443 | }; |
447 | 444 | ||
448 | static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) | 445 | static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) |
449 | { | 446 | { |
450 | sd->priv = p; | 447 | sd->dev_priv = p; |
451 | } | 448 | } |
452 | 449 | ||
453 | static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd) | 450 | static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd) |
454 | { | 451 | { |
455 | return sd->priv; | 452 | return sd->dev_priv; |
453 | } | ||
454 | |||
455 | static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p) | ||
456 | { | ||
457 | sd->host_priv = p; | ||
458 | } | ||
459 | |||
460 | static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd) | ||
461 | { | ||
462 | return sd->host_priv; | ||
456 | } | 463 | } |
457 | 464 | ||
458 | static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | 465 | static inline void v4l2_subdev_init(struct v4l2_subdev *sd, |
@@ -466,7 +473,8 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | |||
466 | sd->flags = 0; | 473 | sd->flags = 0; |
467 | sd->name[0] = '\0'; | 474 | sd->name[0] = '\0'; |
468 | sd->grp_id = 0; | 475 | sd->grp_id = 0; |
469 | sd->priv = NULL; | 476 | sd->dev_priv = NULL; |
477 | sd->host_priv = NULL; | ||
470 | } | 478 | } |
471 | 479 | ||
472 | /* Call an ops of a v4l2_subdev, doing the right checks against | 480 | /* Call an ops of a v4l2_subdev, doing the right checks against |
diff --git a/include/media/videobuf-core.h b/include/media/videobuf-core.h index f2c41cebf453..1d3835fc26be 100644 --- a/include/media/videobuf-core.h +++ b/include/media/videobuf-core.h | |||
@@ -139,6 +139,7 @@ struct videobuf_qtype_ops { | |||
139 | 139 | ||
140 | struct videobuf_queue { | 140 | struct videobuf_queue { |
141 | struct mutex vb_lock; | 141 | struct mutex vb_lock; |
142 | struct mutex *ext_lock; | ||
142 | spinlock_t *irqlock; | 143 | spinlock_t *irqlock; |
143 | struct device *dev; | 144 | struct device *dev; |
144 | 145 | ||
@@ -167,7 +168,20 @@ struct videobuf_queue { | |||
167 | void *priv_data; | 168 | void *priv_data; |
168 | }; | 169 | }; |
169 | 170 | ||
170 | int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr); | 171 | static inline void videobuf_queue_lock(struct videobuf_queue *q) |
172 | { | ||
173 | if (!q->ext_lock) | ||
174 | mutex_lock(&q->vb_lock); | ||
175 | } | ||
176 | |||
177 | static inline void videobuf_queue_unlock(struct videobuf_queue *q) | ||
178 | { | ||
179 | if (!q->ext_lock) | ||
180 | mutex_unlock(&q->vb_lock); | ||
181 | } | ||
182 | |||
183 | int videobuf_waiton(struct videobuf_queue *q, struct videobuf_buffer *vb, | ||
184 | int non_blocking, int intr); | ||
171 | int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, | 185 | int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, |
172 | struct v4l2_framebuffer *fbuf); | 186 | struct v4l2_framebuffer *fbuf); |
173 | 187 | ||
@@ -185,7 +199,8 @@ void videobuf_queue_core_init(struct videobuf_queue *q, | |||
185 | enum v4l2_field field, | 199 | enum v4l2_field field, |
186 | unsigned int msize, | 200 | unsigned int msize, |
187 | void *priv, | 201 | void *priv, |
188 | struct videobuf_qtype_ops *int_ops); | 202 | struct videobuf_qtype_ops *int_ops, |
203 | struct mutex *ext_lock); | ||
189 | int videobuf_queue_is_busy(struct videobuf_queue *q); | 204 | int videobuf_queue_is_busy(struct videobuf_queue *q); |
190 | void videobuf_queue_cancel(struct videobuf_queue *q); | 205 | void videobuf_queue_cancel(struct videobuf_queue *q); |
191 | 206 | ||
diff --git a/include/media/videobuf-dma-contig.h b/include/media/videobuf-dma-contig.h index ebaa9bc1ee8d..f0ed82543d9f 100644 --- a/include/media/videobuf-dma-contig.h +++ b/include/media/videobuf-dma-contig.h | |||
@@ -23,7 +23,8 @@ void videobuf_queue_dma_contig_init(struct videobuf_queue *q, | |||
23 | enum v4l2_buf_type type, | 23 | enum v4l2_buf_type type, |
24 | enum v4l2_field field, | 24 | enum v4l2_field field, |
25 | unsigned int msize, | 25 | unsigned int msize, |
26 | void *priv); | 26 | void *priv, |
27 | struct mutex *ext_lock); | ||
27 | 28 | ||
28 | dma_addr_t videobuf_to_dma_contig(struct videobuf_buffer *buf); | 29 | dma_addr_t videobuf_to_dma_contig(struct videobuf_buffer *buf); |
29 | void videobuf_dma_contig_free(struct videobuf_queue *q, | 30 | void videobuf_dma_contig_free(struct videobuf_queue *q, |
diff --git a/include/media/videobuf-dma-sg.h b/include/media/videobuf-dma-sg.h index aa4ebb42a565..1c647e8148c4 100644 --- a/include/media/videobuf-dma-sg.h +++ b/include/media/videobuf-dma-sg.h | |||
@@ -103,7 +103,8 @@ void videobuf_queue_sg_init(struct videobuf_queue *q, | |||
103 | enum v4l2_buf_type type, | 103 | enum v4l2_buf_type type, |
104 | enum v4l2_field field, | 104 | enum v4l2_field field, |
105 | unsigned int msize, | 105 | unsigned int msize, |
106 | void *priv); | 106 | void *priv, |
107 | struct mutex *ext_lock); | ||
107 | 108 | ||
108 | #endif /* _VIDEOBUF_DMA_SG_H */ | 109 | #endif /* _VIDEOBUF_DMA_SG_H */ |
109 | 110 | ||
diff --git a/include/media/videobuf-vmalloc.h b/include/media/videobuf-vmalloc.h index e19403c18dae..486a97efdb56 100644 --- a/include/media/videobuf-vmalloc.h +++ b/include/media/videobuf-vmalloc.h | |||
@@ -36,7 +36,8 @@ void videobuf_queue_vmalloc_init(struct videobuf_queue *q, | |||
36 | enum v4l2_buf_type type, | 36 | enum v4l2_buf_type type, |
37 | enum v4l2_field field, | 37 | enum v4l2_field field, |
38 | unsigned int msize, | 38 | unsigned int msize, |
39 | void *priv); | 39 | void *priv, |
40 | struct mutex *ext_lock); | ||
40 | 41 | ||
41 | void *videobuf_to_vmalloc(struct videobuf_buffer *buf); | 42 | void *videobuf_to_vmalloc(struct videobuf_buffer *buf); |
42 | 43 | ||
diff --git a/include/media/wm8775.h b/include/media/wm8775.h index 60739c5a23ae..a1c4d417dfa2 100644 --- a/include/media/wm8775.h +++ b/include/media/wm8775.h | |||
@@ -32,4 +32,7 @@ | |||
32 | #define WM8775_AIN3 4 | 32 | #define WM8775_AIN3 4 |
33 | #define WM8775_AIN4 8 | 33 | #define WM8775_AIN4 8 |
34 | 34 | ||
35 | /* subdev group ID */ | ||
36 | #define WM8775_GID (1 << 0) | ||
37 | |||
35 | #endif | 38 | #endif |
diff --git a/include/mtd/mtd-abi.h b/include/mtd/mtd-abi.h index 4debb4514634..2f7d45bcbd24 100644 --- a/include/mtd/mtd-abi.h +++ b/include/mtd/mtd-abi.h | |||
@@ -52,6 +52,7 @@ struct mtd_oob_buf64 { | |||
52 | #define MTD_NANDFLASH 4 | 52 | #define MTD_NANDFLASH 4 |
53 | #define MTD_DATAFLASH 6 | 53 | #define MTD_DATAFLASH 6 |
54 | #define MTD_UBIVOLUME 7 | 54 | #define MTD_UBIVOLUME 7 |
55 | #define MTD_MLCNANDFLASH 8 | ||
55 | 56 | ||
56 | #define MTD_WRITEABLE 0x400 /* Device is writeable */ | 57 | #define MTD_WRITEABLE 0x400 /* Device is writeable */ |
57 | #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ | 58 | #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ |
@@ -119,7 +120,7 @@ struct otp_info { | |||
119 | #define OTPGETREGIONCOUNT _IOW('M', 14, int) | 120 | #define OTPGETREGIONCOUNT _IOW('M', 14, int) |
120 | #define OTPGETREGIONINFO _IOW('M', 15, struct otp_info) | 121 | #define OTPGETREGIONINFO _IOW('M', 15, struct otp_info) |
121 | #define OTPLOCK _IOR('M', 16, struct otp_info) | 122 | #define OTPLOCK _IOR('M', 16, struct otp_info) |
122 | #define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout) | 123 | #define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout_user) |
123 | #define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats) | 124 | #define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats) |
124 | #define MTDFILEMODE _IO('M', 19) | 125 | #define MTDFILEMODE _IO('M', 19) |
125 | #define MEMERASE64 _IOW('M', 20, struct erase_info_user64) | 126 | #define MEMERASE64 _IOW('M', 20, struct erase_info_user64) |
@@ -144,13 +145,18 @@ struct nand_oobfree { | |||
144 | }; | 145 | }; |
145 | 146 | ||
146 | #define MTD_MAX_OOBFREE_ENTRIES 8 | 147 | #define MTD_MAX_OOBFREE_ENTRIES 8 |
148 | #define MTD_MAX_ECCPOS_ENTRIES 64 | ||
147 | /* | 149 | /* |
148 | * ECC layout control structure. Exported to userspace for | 150 | * OBSOLETE: ECC layout control structure. Exported to user-space via ioctl |
149 | * diagnosis and to allow creation of raw images | 151 | * ECCGETLAYOUT for backwards compatbility and should not be mistaken as a |
152 | * complete set of ECC information. The ioctl truncates the larger internal | ||
153 | * structure to retain binary compatibility with the static declaration of the | ||
154 | * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of | ||
155 | * the user struct, not the MAX size of the internal struct nand_ecclayout. | ||
150 | */ | 156 | */ |
151 | struct nand_ecclayout { | 157 | struct nand_ecclayout_user { |
152 | __u32 eccbytes; | 158 | __u32 eccbytes; |
153 | __u32 eccpos[64]; | 159 | __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES]; |
154 | __u32 oobavail; | 160 | __u32 oobavail; |
155 | struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]; | 161 | struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]; |
156 | }; | 162 | }; |
diff --git a/include/mtd/mtd-user.h b/include/mtd/mtd-user.h index aa3c2f86a913..83327c808c86 100644 --- a/include/mtd/mtd-user.h +++ b/include/mtd/mtd-user.h | |||
@@ -29,6 +29,6 @@ typedef struct mtd_info_user mtd_info_t; | |||
29 | typedef struct erase_info_user erase_info_t; | 29 | typedef struct erase_info_user erase_info_t; |
30 | typedef struct region_info_user region_info_t; | 30 | typedef struct region_info_user region_info_t; |
31 | typedef struct nand_oobinfo nand_oobinfo_t; | 31 | typedef struct nand_oobinfo nand_oobinfo_t; |
32 | typedef struct nand_ecclayout nand_ecclayout_t; | 32 | typedef struct nand_ecclayout_user nand_ecclayout_t; |
33 | 33 | ||
34 | #endif /* __MTD_USER_H__ */ | 34 | #endif /* __MTD_USER_H__ */ |
diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h index a8de812ccbc8..071fd7a8d781 100644 --- a/include/net/9p/9p.h +++ b/include/net/9p/9p.h | |||
@@ -86,6 +86,8 @@ do { \ | |||
86 | 86 | ||
87 | /** | 87 | /** |
88 | * enum p9_msg_t - 9P message types | 88 | * enum p9_msg_t - 9P message types |
89 | * @P9_TLERROR: not used | ||
90 | * @P9_RLERROR: response for any failed request for 9P2000.L | ||
89 | * @P9_TSTATFS: file system status request | 91 | * @P9_TSTATFS: file system status request |
90 | * @P9_RSTATFS: file system status response | 92 | * @P9_RSTATFS: file system status response |
91 | * @P9_TSYMLINK: make symlink request | 93 | * @P9_TSYMLINK: make symlink request |
@@ -137,6 +139,8 @@ do { \ | |||
137 | */ | 139 | */ |
138 | 140 | ||
139 | enum p9_msg_t { | 141 | enum p9_msg_t { |
142 | P9_TLERROR = 6, | ||
143 | P9_RLERROR, | ||
140 | P9_TSTATFS = 8, | 144 | P9_TSTATFS = 8, |
141 | P9_RSTATFS, | 145 | P9_RSTATFS, |
142 | P9_TLOPEN = 12, | 146 | P9_TLOPEN = 12, |
@@ -149,6 +153,8 @@ enum p9_msg_t { | |||
149 | P9_RMKNOD, | 153 | P9_RMKNOD, |
150 | P9_TRENAME = 20, | 154 | P9_TRENAME = 20, |
151 | P9_RRENAME, | 155 | P9_RRENAME, |
156 | P9_TREADLINK = 22, | ||
157 | P9_RREADLINK, | ||
152 | P9_TGETATTR = 24, | 158 | P9_TGETATTR = 24, |
153 | P9_RGETATTR, | 159 | P9_RGETATTR, |
154 | P9_TSETATTR = 26, | 160 | P9_TSETATTR = 26, |
@@ -159,6 +165,12 @@ enum p9_msg_t { | |||
159 | P9_RXATTRCREATE, | 165 | P9_RXATTRCREATE, |
160 | P9_TREADDIR = 40, | 166 | P9_TREADDIR = 40, |
161 | P9_RREADDIR, | 167 | P9_RREADDIR, |
168 | P9_TFSYNC = 50, | ||
169 | P9_RFSYNC, | ||
170 | P9_TLOCK = 52, | ||
171 | P9_RLOCK, | ||
172 | P9_TGETLOCK = 54, | ||
173 | P9_RGETLOCK, | ||
162 | P9_TLINK = 70, | 174 | P9_TLINK = 70, |
163 | P9_RLINK, | 175 | P9_RLINK, |
164 | P9_TMKDIR = 72, | 176 | P9_TMKDIR = 72, |
@@ -458,6 +470,48 @@ struct p9_iattr_dotl { | |||
458 | u64 mtime_nsec; | 470 | u64 mtime_nsec; |
459 | }; | 471 | }; |
460 | 472 | ||
473 | #define P9_LOCK_SUCCESS 0 | ||
474 | #define P9_LOCK_BLOCKED 1 | ||
475 | #define P9_LOCK_ERROR 2 | ||
476 | #define P9_LOCK_GRACE 3 | ||
477 | |||
478 | #define P9_LOCK_FLAGS_BLOCK 1 | ||
479 | #define P9_LOCK_FLAGS_RECLAIM 2 | ||
480 | |||
481 | /* struct p9_flock: POSIX lock structure | ||
482 | * @type - type of lock | ||
483 | * @flags - lock flags | ||
484 | * @start - starting offset of the lock | ||
485 | * @length - number of bytes | ||
486 | * @proc_id - process id which wants to take lock | ||
487 | * @client_id - client id | ||
488 | */ | ||
489 | |||
490 | struct p9_flock { | ||
491 | u8 type; | ||
492 | u32 flags; | ||
493 | u64 start; | ||
494 | u64 length; | ||
495 | u32 proc_id; | ||
496 | char *client_id; | ||
497 | }; | ||
498 | |||
499 | /* struct p9_getlock: getlock structure | ||
500 | * @type - type of lock | ||
501 | * @start - starting offset of the lock | ||
502 | * @length - number of bytes | ||
503 | * @proc_id - process id which wants to take lock | ||
504 | * @client_id - client id | ||
505 | */ | ||
506 | |||
507 | struct p9_getlock { | ||
508 | u8 type; | ||
509 | u64 start; | ||
510 | u64 length; | ||
511 | u32 proc_id; | ||
512 | char *client_id; | ||
513 | }; | ||
514 | |||
461 | /* Structures for Protocol Operations */ | 515 | /* Structures for Protocol Operations */ |
462 | struct p9_tstatfs { | 516 | struct p9_tstatfs { |
463 | u32 fid; | 517 | u32 fid; |
diff --git a/include/net/9p/client.h b/include/net/9p/client.h index d1aa2cfb30f0..83ba6a4d58a3 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h | |||
@@ -212,15 +212,12 @@ struct p9_dirent { | |||
212 | 212 | ||
213 | int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb); | 213 | int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb); |
214 | int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name); | 214 | int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name); |
215 | int p9_client_version(struct p9_client *); | ||
216 | struct p9_client *p9_client_create(const char *dev_name, char *options); | 215 | struct p9_client *p9_client_create(const char *dev_name, char *options); |
217 | void p9_client_destroy(struct p9_client *clnt); | 216 | void p9_client_destroy(struct p9_client *clnt); |
218 | void p9_client_disconnect(struct p9_client *clnt); | 217 | void p9_client_disconnect(struct p9_client *clnt); |
219 | void p9_client_begin_disconnect(struct p9_client *clnt); | 218 | void p9_client_begin_disconnect(struct p9_client *clnt); |
220 | struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, | 219 | struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, |
221 | char *uname, u32 n_uname, char *aname); | 220 | char *uname, u32 n_uname, char *aname); |
222 | struct p9_fid *p9_client_auth(struct p9_client *clnt, char *uname, | ||
223 | u32 n_uname, char *aname); | ||
224 | struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames, | 221 | struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames, |
225 | int clone); | 222 | int clone); |
226 | int p9_client_open(struct p9_fid *fid, int mode); | 223 | int p9_client_open(struct p9_fid *fid, int mode); |
@@ -232,6 +229,7 @@ int p9_client_symlink(struct p9_fid *fid, char *name, char *symname, gid_t gid, | |||
232 | int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode, | 229 | int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode, |
233 | gid_t gid, struct p9_qid *qid); | 230 | gid_t gid, struct p9_qid *qid); |
234 | 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); | ||
235 | int p9_client_remove(struct p9_fid *fid); | 233 | int p9_client_remove(struct p9_fid *fid); |
236 | int p9_client_read(struct p9_fid *fid, char *data, char __user *udata, | 234 | int p9_client_read(struct p9_fid *fid, char *data, char __user *udata, |
237 | u64 offset, u32 count); | 235 | u64 offset, u32 count); |
@@ -251,6 +249,8 @@ int p9_client_mknod_dotl(struct p9_fid *oldfid, char *name, int mode, | |||
251 | dev_t rdev, gid_t gid, struct p9_qid *); | 249 | dev_t rdev, gid_t gid, struct p9_qid *); |
252 | int p9_client_mkdir_dotl(struct p9_fid *fid, char *name, int mode, | 250 | int p9_client_mkdir_dotl(struct p9_fid *fid, char *name, int mode, |
253 | gid_t gid, struct p9_qid *); | 251 | gid_t gid, struct p9_qid *); |
252 | int p9_client_lock_dotl(struct p9_fid *fid, struct p9_flock *flock, u8 *status); | ||
253 | int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *fl); | ||
254 | struct p9_req_t *p9_tag_lookup(struct p9_client *, u16); | 254 | struct p9_req_t *p9_tag_lookup(struct p9_client *, u16); |
255 | void p9_client_cb(struct p9_client *c, struct p9_req_t *req); | 255 | void p9_client_cb(struct p9_client *c, struct p9_req_t *req); |
256 | 256 | ||
@@ -262,5 +262,6 @@ int p9_is_proto_dotu(struct p9_client *clnt); | |||
262 | int p9_is_proto_dotl(struct p9_client *clnt); | 262 | int p9_is_proto_dotl(struct p9_client *clnt); |
263 | struct p9_fid *p9_client_xattrwalk(struct p9_fid *, const char *, u64 *); | 263 | struct p9_fid *p9_client_xattrwalk(struct p9_fid *, const char *, u64 *); |
264 | int p9_client_xattrcreate(struct p9_fid *, const char *, u64, int); | 264 | int p9_client_xattrcreate(struct p9_fid *, const char *, u64, int); |
265 | int p9_client_readlink(struct p9_fid *fid, char **target); | ||
265 | 266 | ||
266 | #endif /* NET_9P_CLIENT_H */ | 267 | #endif /* NET_9P_CLIENT_H */ |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 4d40c4d0230b..a9441249306c 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
@@ -175,20 +175,32 @@ extern int ipv6_chk_acast_addr(struct net *net, struct net_device *dev, | |||
175 | extern int register_inet6addr_notifier(struct notifier_block *nb); | 175 | extern int register_inet6addr_notifier(struct notifier_block *nb); |
176 | extern int unregister_inet6addr_notifier(struct notifier_block *nb); | 176 | extern int unregister_inet6addr_notifier(struct notifier_block *nb); |
177 | 177 | ||
178 | static inline struct inet6_dev * | 178 | /** |
179 | __in6_dev_get(struct net_device *dev) | 179 | * __in6_dev_get - get inet6_dev pointer from netdevice |
180 | * @dev: network device | ||
181 | * | ||
182 | * Caller must hold rcu_read_lock or RTNL, because this function | ||
183 | * does not take a reference on the inet6_dev. | ||
184 | */ | ||
185 | static inline struct inet6_dev *__in6_dev_get(const struct net_device *dev) | ||
180 | { | 186 | { |
181 | return rcu_dereference_check(dev->ip6_ptr, | 187 | return rcu_dereference_rtnl(dev->ip6_ptr); |
182 | rcu_read_lock_held() || | ||
183 | lockdep_rtnl_is_held()); | ||
184 | } | 188 | } |
185 | 189 | ||
186 | static inline struct inet6_dev * | 190 | /** |
187 | in6_dev_get(struct net_device *dev) | 191 | * in6_dev_get - get inet6_dev pointer from netdevice |
192 | * @dev: network device | ||
193 | * | ||
194 | * This version can be used in any context, and takes a reference | ||
195 | * on the inet6_dev. Callers must use in6_dev_put() later to | ||
196 | * release this reference. | ||
197 | */ | ||
198 | static inline struct inet6_dev *in6_dev_get(const struct net_device *dev) | ||
188 | { | 199 | { |
189 | struct inet6_dev *idev = NULL; | 200 | struct inet6_dev *idev; |
201 | |||
190 | rcu_read_lock(); | 202 | rcu_read_lock(); |
191 | idev = __in6_dev_get(dev); | 203 | idev = rcu_dereference(dev->ip6_ptr); |
192 | if (idev) | 204 | if (idev) |
193 | atomic_inc(&idev->refcnt); | 205 | atomic_inc(&idev->refcnt); |
194 | rcu_read_unlock(); | 206 | rcu_read_unlock(); |
@@ -197,16 +209,21 @@ in6_dev_get(struct net_device *dev) | |||
197 | 209 | ||
198 | extern void in6_dev_finish_destroy(struct inet6_dev *idev); | 210 | extern void in6_dev_finish_destroy(struct inet6_dev *idev); |
199 | 211 | ||
200 | static inline void | 212 | static inline void in6_dev_put(struct inet6_dev *idev) |
201 | in6_dev_put(struct inet6_dev *idev) | ||
202 | { | 213 | { |
203 | if (atomic_dec_and_test(&idev->refcnt)) | 214 | if (atomic_dec_and_test(&idev->refcnt)) |
204 | in6_dev_finish_destroy(idev); | 215 | in6_dev_finish_destroy(idev); |
205 | } | 216 | } |
206 | 217 | ||
207 | #define __in6_dev_put(idev) atomic_dec(&(idev)->refcnt) | 218 | static inline void __in6_dev_put(struct inet6_dev *idev) |
208 | #define in6_dev_hold(idev) atomic_inc(&(idev)->refcnt) | 219 | { |
220 | atomic_dec(&idev->refcnt); | ||
221 | } | ||
209 | 222 | ||
223 | static inline void in6_dev_hold(struct inet6_dev *idev) | ||
224 | { | ||
225 | atomic_inc(&idev->refcnt); | ||
226 | } | ||
210 | 227 | ||
211 | extern void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp); | 228 | extern void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp); |
212 | 229 | ||
@@ -216,9 +233,15 @@ static inline void in6_ifa_put(struct inet6_ifaddr *ifp) | |||
216 | inet6_ifa_finish_destroy(ifp); | 233 | inet6_ifa_finish_destroy(ifp); |
217 | } | 234 | } |
218 | 235 | ||
219 | #define __in6_ifa_put(ifp) atomic_dec(&(ifp)->refcnt) | 236 | static inline void __in6_ifa_put(struct inet6_ifaddr *ifp) |
220 | #define in6_ifa_hold(ifp) atomic_inc(&(ifp)->refcnt) | 237 | { |
238 | atomic_dec(&ifp->refcnt); | ||
239 | } | ||
221 | 240 | ||
241 | static inline void in6_ifa_hold(struct inet6_ifaddr *ifp) | ||
242 | { | ||
243 | atomic_inc(&ifp->refcnt); | ||
244 | } | ||
222 | 245 | ||
223 | 246 | ||
224 | /* | 247 | /* |
@@ -241,23 +264,21 @@ static inline int ipv6_addr_is_multicast(const struct in6_addr *addr) | |||
241 | 264 | ||
242 | static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) | 265 | static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) |
243 | { | 266 | { |
244 | return (((addr->s6_addr32[0] ^ htonl(0xff020000)) | | 267 | return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | |
245 | addr->s6_addr32[1] | addr->s6_addr32[2] | | 268 | addr->s6_addr32[1] | addr->s6_addr32[2] | |
246 | (addr->s6_addr32[3] ^ htonl(0x00000001))) == 0); | 269 | (addr->s6_addr32[3] ^ htonl(0x00000001))) == 0; |
247 | } | 270 | } |
248 | 271 | ||
249 | static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) | 272 | static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) |
250 | { | 273 | { |
251 | return (((addr->s6_addr32[0] ^ htonl(0xff020000)) | | 274 | return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | |
252 | addr->s6_addr32[1] | addr->s6_addr32[2] | | 275 | addr->s6_addr32[1] | addr->s6_addr32[2] | |
253 | (addr->s6_addr32[3] ^ htonl(0x00000002))) == 0); | 276 | (addr->s6_addr32[3] ^ htonl(0x00000002))) == 0; |
254 | } | 277 | } |
255 | 278 | ||
256 | extern int __ipv6_isatap_ifid(u8 *eui, __be32 addr); | ||
257 | |||
258 | static inline int ipv6_addr_is_isatap(const struct in6_addr *addr) | 279 | static inline int ipv6_addr_is_isatap(const struct in6_addr *addr) |
259 | { | 280 | { |
260 | return ((addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE)); | 281 | return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE); |
261 | } | 282 | } |
262 | 283 | ||
263 | #ifdef CONFIG_PROC_FS | 284 | #ifdef CONFIG_PROC_FS |
diff --git a/include/net/arp.h b/include/net/arp.h index 716f43c5c98e..f4cf6ce66586 100644 --- a/include/net/arp.h +++ b/include/net/arp.h | |||
@@ -26,6 +26,4 @@ extern struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | |||
26 | const unsigned char *target_hw); | 26 | const unsigned char *target_hw); |
27 | extern void arp_xmit(struct sk_buff *skb); | 27 | extern void arp_xmit(struct sk_buff *skb); |
28 | 28 | ||
29 | extern const struct neigh_ops arp_broken_ops; | ||
30 | |||
31 | #endif /* _ARP_H */ | 29 | #endif /* _ARP_H */ |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 30fce0128dd7..d81ea7997701 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -126,6 +126,8 @@ int bt_sock_unregister(int proto); | |||
126 | void bt_sock_link(struct bt_sock_list *l, struct sock *s); | 126 | void bt_sock_link(struct bt_sock_list *l, struct sock *s); |
127 | void bt_sock_unlink(struct bt_sock_list *l, struct sock *s); | 127 | void bt_sock_unlink(struct bt_sock_list *l, struct sock *s); |
128 | int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags); | 128 | int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags); |
129 | int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
130 | struct msghdr *msg, size_t len, int flags); | ||
129 | uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait); | 131 | uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait); |
130 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 132 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
131 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); | 133 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index bcbdd6d4e6dd..e30e00834340 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -54,7 +54,7 @@ | |||
54 | 54 | ||
55 | /* HCI controller types */ | 55 | /* HCI controller types */ |
56 | #define HCI_BREDR 0x00 | 56 | #define HCI_BREDR 0x00 |
57 | #define HCI_80211 0x01 | 57 | #define HCI_AMP 0x01 |
58 | 58 | ||
59 | /* HCI device quirks */ | 59 | /* HCI device quirks */ |
60 | enum { | 60 | enum { |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 4568b938ca35..ebec8c9a929d 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -233,7 +233,7 @@ static inline void inquiry_cache_init(struct hci_dev *hdev) | |||
233 | static inline int inquiry_cache_empty(struct hci_dev *hdev) | 233 | static inline int inquiry_cache_empty(struct hci_dev *hdev) |
234 | { | 234 | { |
235 | struct inquiry_cache *c = &hdev->inq_cache; | 235 | struct inquiry_cache *c = &hdev->inq_cache; |
236 | return (c->list == NULL); | 236 | return c->list == NULL; |
237 | } | 237 | } |
238 | 238 | ||
239 | static inline long inquiry_cache_age(struct hci_dev *hdev) | 239 | static inline long inquiry_cache_age(struct hci_dev *hdev) |
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 6c241444f902..c819c8bf9b68 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -414,7 +414,7 @@ static inline int l2cap_tx_window_full(struct sock *sk) | |||
414 | if (sub < 0) | 414 | if (sub < 0) |
415 | sub += 64; | 415 | sub += 64; |
416 | 416 | ||
417 | return (sub == pi->remote_tx_win); | 417 | return sub == pi->remote_tx_win; |
418 | } | 418 | } |
419 | 419 | ||
420 | #define __get_txseq(ctrl) ((ctrl) & L2CAP_CTRL_TXSEQ) >> 1 | 420 | #define __get_txseq(ctrl) ((ctrl) & L2CAP_CTRL_TXSEQ) >> 1 |
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index a140847d622c..71047bc0af84 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
@@ -213,11 +213,6 @@ struct rfcomm_dlc { | |||
213 | #define RFCOMM_DEFER_SETUP 8 | 213 | #define RFCOMM_DEFER_SETUP 8 |
214 | 214 | ||
215 | /* Scheduling flags and events */ | 215 | /* Scheduling flags and events */ |
216 | #define RFCOMM_SCHED_STATE 0 | ||
217 | #define RFCOMM_SCHED_RX 1 | ||
218 | #define RFCOMM_SCHED_TX 2 | ||
219 | #define RFCOMM_SCHED_TIMEO 3 | ||
220 | #define RFCOMM_SCHED_AUTH 4 | ||
221 | #define RFCOMM_SCHED_WAKEUP 31 | 216 | #define RFCOMM_SCHED_WAKEUP 31 |
222 | 217 | ||
223 | /* MSC exchange flags */ | 218 | /* MSC exchange flags */ |
diff --git a/include/net/caif/caif_dev.h b/include/net/caif/caif_dev.h index 6da573c75d54..8eff83b95366 100644 --- a/include/net/caif/caif_dev.h +++ b/include/net/caif/caif_dev.h | |||
@@ -28,7 +28,7 @@ struct caif_param { | |||
28 | * @sockaddr: Socket address to connect. | 28 | * @sockaddr: Socket address to connect. |
29 | * @priority: Priority of the connection. | 29 | * @priority: Priority of the connection. |
30 | * @link_selector: Link selector (high bandwidth or low latency) | 30 | * @link_selector: Link selector (high bandwidth or low latency) |
31 | * @link_name: Name of the CAIF Link Layer to use. | 31 | * @ifindex: kernel index of the interface. |
32 | * @param: Connect Request parameters (CAIF_SO_REQ_PARAM). | 32 | * @param: Connect Request parameters (CAIF_SO_REQ_PARAM). |
33 | * | 33 | * |
34 | * This struct is used when connecting a CAIF channel. | 34 | * This struct is used when connecting a CAIF channel. |
@@ -39,7 +39,7 @@ struct caif_connect_request { | |||
39 | struct sockaddr_caif sockaddr; | 39 | struct sockaddr_caif sockaddr; |
40 | enum caif_channel_priority priority; | 40 | enum caif_channel_priority priority; |
41 | enum caif_link_selector link_selector; | 41 | enum caif_link_selector link_selector; |
42 | char link_name[16]; | 42 | int ifindex; |
43 | struct caif_param param; | 43 | struct caif_param param; |
44 | }; | 44 | }; |
45 | 45 | ||
diff --git a/include/net/caif/caif_shm.h b/include/net/caif/caif_shm.h new file mode 100644 index 000000000000..5bcce55438cf --- /dev/null +++ b/include/net/caif/caif_shm.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * Copyright (C) ST-Ericsson AB 2010 | ||
3 | * Contact: Sjur Brendeland / sjur.brandeland@stericsson.com | ||
4 | * Author: Amarnath Revanna / amarnath.bangalore.revanna@stericsson.com | ||
5 | * License terms: GNU General Public License (GPL) version 2 | ||
6 | */ | ||
7 | |||
8 | #ifndef CAIF_SHM_H_ | ||
9 | #define CAIF_SHM_H_ | ||
10 | |||
11 | struct shmdev_layer { | ||
12 | u32 shm_base_addr; | ||
13 | u32 shm_total_sz; | ||
14 | u32 shm_id; | ||
15 | u32 shm_loopback; | ||
16 | void *hmbx; | ||
17 | int (*pshmdev_mbxsend) (u32 shm_id, u32 mbx_msg); | ||
18 | int (*pshmdev_mbxsetup) (void *pshmdrv_cb, | ||
19 | struct shmdev_layer *pshm_dev, void *pshm_drv); | ||
20 | struct net_device *pshm_netdev; | ||
21 | }; | ||
22 | |||
23 | extern int caif_shmcore_probe(struct shmdev_layer *pshm_dev); | ||
24 | extern void caif_shmcore_remove(struct net_device *pshm_netdev); | ||
25 | |||
26 | #endif | ||
diff --git a/include/net/caif/caif_spi.h b/include/net/caif/caif_spi.h index ce4570dff020..87c3d11b8e55 100644 --- a/include/net/caif/caif_spi.h +++ b/include/net/caif/caif_spi.h | |||
@@ -121,6 +121,8 @@ struct cfspi { | |||
121 | wait_queue_head_t wait; | 121 | wait_queue_head_t wait; |
122 | spinlock_t lock; | 122 | spinlock_t lock; |
123 | bool flow_stop; | 123 | bool flow_stop; |
124 | bool slave; | ||
125 | bool slave_talked; | ||
124 | #ifdef CONFIG_DEBUG_FS | 126 | #ifdef CONFIG_DEBUG_FS |
125 | enum cfspi_state dbg_state; | 127 | enum cfspi_state dbg_state; |
126 | u16 pcmd; | 128 | u16 pcmd; |
diff --git a/include/net/caif/cfcnfg.h b/include/net/caif/cfcnfg.h index bd646faffa47..f688478bfb84 100644 --- a/include/net/caif/cfcnfg.h +++ b/include/net/caif/cfcnfg.h | |||
@@ -139,10 +139,10 @@ struct dev_info *cfcnfg_get_phyid(struct cfcnfg *cnfg, | |||
139 | enum cfcnfg_phy_preference phy_pref); | 139 | enum cfcnfg_phy_preference phy_pref); |
140 | 140 | ||
141 | /** | 141 | /** |
142 | * cfcnfg_get_named() - Get the Physical Identifier of CAIF Link Layer | 142 | * cfcnfg_get_id_from_ifi() - Get the Physical Identifier of ifindex, |
143 | * it matches caif physical id with the kernel interface id. | ||
143 | * @cnfg: Configuration object | 144 | * @cnfg: Configuration object |
144 | * @name: Name of the Physical Layer (Caif Link Layer) | 145 | * @ifi: ifindex obtained from socket.c bindtodevice. |
145 | */ | 146 | */ |
146 | int cfcnfg_get_named(struct cfcnfg *cnfg, char *name); | 147 | int cfcnfg_get_id_from_ifi(struct cfcnfg *cnfg, int ifi); |
147 | |||
148 | #endif /* CFCNFG_H_ */ | 148 | #endif /* CFCNFG_H_ */ |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 2fd06c60ffbb..2a7936d7851d 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -25,6 +25,43 @@ | |||
25 | #include <linux/wireless.h> | 25 | #include <linux/wireless.h> |
26 | 26 | ||
27 | 27 | ||
28 | /** | ||
29 | * DOC: Introduction | ||
30 | * | ||
31 | * cfg80211 is the configuration API for 802.11 devices in Linux. It bridges | ||
32 | * userspace and drivers, and offers some utility functionality associated | ||
33 | * with 802.11. cfg80211 must, directly or indirectly via mac80211, be used | ||
34 | * by all modern wireless drivers in Linux, so that they offer a consistent | ||
35 | * API through nl80211. For backward compatibility, cfg80211 also offers | ||
36 | * wireless extensions to userspace, but hides them from drivers completely. | ||
37 | * | ||
38 | * Additionally, cfg80211 contains code to help enforce regulatory spectrum | ||
39 | * use restrictions. | ||
40 | */ | ||
41 | |||
42 | |||
43 | /** | ||
44 | * DOC: Device registration | ||
45 | * | ||
46 | * In order for a driver to use cfg80211, it must register the hardware device | ||
47 | * with cfg80211. This happens through a number of hardware capability structs | ||
48 | * described below. | ||
49 | * | ||
50 | * The fundamental structure for each device is the 'wiphy', of which each | ||
51 | * instance describes a physical wireless device connected to the system. Each | ||
52 | * such wiphy can have zero, one, or many virtual interfaces associated with | ||
53 | * it, which need to be identified as such by pointing the network interface's | ||
54 | * @ieee80211_ptr pointer to a &struct wireless_dev which further describes | ||
55 | * the wireless part of the interface, normally this struct is embedded in the | ||
56 | * network interface's private data area. Drivers can optionally allow creating | ||
57 | * or destroying virtual interfaces on the fly, but without at least one or the | ||
58 | * ability to create some the wireless device isn't useful. | ||
59 | * | ||
60 | * Each wiphy structure contains device capability information, and also has | ||
61 | * a pointer to the various operations the driver offers. The definitions and | ||
62 | * structures here describe these capabilities in detail. | ||
63 | */ | ||
64 | |||
28 | /* | 65 | /* |
29 | * wireless hardware capability structures | 66 | * wireless hardware capability structures |
30 | */ | 67 | */ |
@@ -205,6 +242,21 @@ struct ieee80211_supported_band { | |||
205 | */ | 242 | */ |
206 | 243 | ||
207 | /** | 244 | /** |
245 | * DOC: Actions and configuration | ||
246 | * | ||
247 | * Each wireless device and each virtual interface offer a set of configuration | ||
248 | * operations and other actions that are invoked by userspace. Each of these | ||
249 | * actions is described in the operations structure, and the parameters these | ||
250 | * operations use are described separately. | ||
251 | * | ||
252 | * Additionally, some operations are asynchronous and expect to get status | ||
253 | * information via some functions that drivers need to call. | ||
254 | * | ||
255 | * Scanning and BSS list handling with its associated functionality is described | ||
256 | * in a separate chapter. | ||
257 | */ | ||
258 | |||
259 | /** | ||
208 | * struct vif_params - describes virtual interface parameters | 260 | * struct vif_params - describes virtual interface parameters |
209 | * @mesh_id: mesh ID to use | 261 | * @mesh_id: mesh ID to use |
210 | * @mesh_id_len: length of the mesh ID | 262 | * @mesh_id_len: length of the mesh ID |
@@ -241,12 +293,24 @@ struct key_params { | |||
241 | * enum survey_info_flags - survey information flags | 293 | * enum survey_info_flags - survey information flags |
242 | * | 294 | * |
243 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in | 295 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in |
296 | * @SURVEY_INFO_IN_USE: channel is currently being used | ||
297 | * @SURVEY_INFO_CHANNEL_TIME: channel active time (in ms) was filled in | ||
298 | * @SURVEY_INFO_CHANNEL_TIME_BUSY: channel busy time was filled in | ||
299 | * @SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: extension channel busy time was filled in | ||
300 | * @SURVEY_INFO_CHANNEL_TIME_RX: channel receive time was filled in | ||
301 | * @SURVEY_INFO_CHANNEL_TIME_TX: channel transmit time was filled in | ||
244 | * | 302 | * |
245 | * Used by the driver to indicate which info in &struct survey_info | 303 | * Used by the driver to indicate which info in &struct survey_info |
246 | * it has filled in during the get_survey(). | 304 | * it has filled in during the get_survey(). |
247 | */ | 305 | */ |
248 | enum survey_info_flags { | 306 | enum survey_info_flags { |
249 | SURVEY_INFO_NOISE_DBM = 1<<0, | 307 | SURVEY_INFO_NOISE_DBM = 1<<0, |
308 | SURVEY_INFO_IN_USE = 1<<1, | ||
309 | SURVEY_INFO_CHANNEL_TIME = 1<<2, | ||
310 | SURVEY_INFO_CHANNEL_TIME_BUSY = 1<<3, | ||
311 | SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = 1<<4, | ||
312 | SURVEY_INFO_CHANNEL_TIME_RX = 1<<5, | ||
313 | SURVEY_INFO_CHANNEL_TIME_TX = 1<<6, | ||
250 | }; | 314 | }; |
251 | 315 | ||
252 | /** | 316 | /** |
@@ -256,6 +320,11 @@ enum survey_info_flags { | |||
256 | * @filled: bitflag of flags from &enum survey_info_flags | 320 | * @filled: bitflag of flags from &enum survey_info_flags |
257 | * @noise: channel noise in dBm. This and all following fields are | 321 | * @noise: channel noise in dBm. This and all following fields are |
258 | * optional | 322 | * optional |
323 | * @channel_time: amount of time in ms the radio spent on the channel | ||
324 | * @channel_time_busy: amount of time the primary channel was sensed busy | ||
325 | * @channel_time_ext_busy: amount of time the extension channel was sensed busy | ||
326 | * @channel_time_rx: amount of time the radio spent receiving data | ||
327 | * @channel_time_tx: amount of time the radio spent transmitting data | ||
259 | * | 328 | * |
260 | * Used by dump_survey() to report back per-channel survey information. | 329 | * Used by dump_survey() to report back per-channel survey information. |
261 | * | 330 | * |
@@ -264,6 +333,11 @@ enum survey_info_flags { | |||
264 | */ | 333 | */ |
265 | struct survey_info { | 334 | struct survey_info { |
266 | struct ieee80211_channel *channel; | 335 | struct ieee80211_channel *channel; |
336 | u64 channel_time; | ||
337 | u64 channel_time_busy; | ||
338 | u64 channel_time_ext_busy; | ||
339 | u64 channel_time_rx; | ||
340 | u64 channel_time_tx; | ||
267 | u32 filled; | 341 | u32 filled; |
268 | s8 noise; | 342 | s8 noise; |
269 | }; | 343 | }; |
@@ -347,6 +421,9 @@ struct station_parameters { | |||
347 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) | 421 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) |
348 | * @STATION_INFO_RX_PACKETS: @rx_packets filled | 422 | * @STATION_INFO_RX_PACKETS: @rx_packets filled |
349 | * @STATION_INFO_TX_PACKETS: @tx_packets filled | 423 | * @STATION_INFO_TX_PACKETS: @tx_packets filled |
424 | * @STATION_INFO_TX_RETRIES: @tx_retries filled | ||
425 | * @STATION_INFO_TX_FAILED: @tx_failed filled | ||
426 | * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled | ||
350 | */ | 427 | */ |
351 | enum station_info_flags { | 428 | enum station_info_flags { |
352 | STATION_INFO_INACTIVE_TIME = 1<<0, | 429 | STATION_INFO_INACTIVE_TIME = 1<<0, |
@@ -359,6 +436,9 @@ enum station_info_flags { | |||
359 | STATION_INFO_TX_BITRATE = 1<<7, | 436 | STATION_INFO_TX_BITRATE = 1<<7, |
360 | STATION_INFO_RX_PACKETS = 1<<8, | 437 | STATION_INFO_RX_PACKETS = 1<<8, |
361 | STATION_INFO_TX_PACKETS = 1<<9, | 438 | STATION_INFO_TX_PACKETS = 1<<9, |
439 | STATION_INFO_TX_RETRIES = 1<<10, | ||
440 | STATION_INFO_TX_FAILED = 1<<11, | ||
441 | STATION_INFO_RX_DROP_MISC = 1<<12, | ||
362 | }; | 442 | }; |
363 | 443 | ||
364 | /** | 444 | /** |
@@ -408,6 +488,9 @@ struct rate_info { | |||
408 | * @txrate: current unicast bitrate to this station | 488 | * @txrate: current unicast bitrate to this station |
409 | * @rx_packets: packets received from this station | 489 | * @rx_packets: packets received from this station |
410 | * @tx_packets: packets transmitted to this station | 490 | * @tx_packets: packets transmitted to this station |
491 | * @tx_retries: cumulative retry counts | ||
492 | * @tx_failed: number of failed transmissions (retries exceeded, no ACK) | ||
493 | * @rx_dropped_misc: Dropped for un-specified reason. | ||
411 | * @generation: generation number for nl80211 dumps. | 494 | * @generation: generation number for nl80211 dumps. |
412 | * This number should increase every time the list of stations | 495 | * This number should increase every time the list of stations |
413 | * changes, i.e. when a station is added or removed, so that | 496 | * changes, i.e. when a station is added or removed, so that |
@@ -425,6 +508,9 @@ struct station_info { | |||
425 | struct rate_info txrate; | 508 | struct rate_info txrate; |
426 | u32 rx_packets; | 509 | u32 rx_packets; |
427 | u32 tx_packets; | 510 | u32 tx_packets; |
511 | u32 tx_retries; | ||
512 | u32 tx_failed; | ||
513 | u32 rx_dropped_misc; | ||
428 | 514 | ||
429 | int generation; | 515 | int generation; |
430 | }; | 516 | }; |
@@ -570,8 +656,28 @@ struct ieee80211_txq_params { | |||
570 | /* from net/wireless.h */ | 656 | /* from net/wireless.h */ |
571 | struct wiphy; | 657 | struct wiphy; |
572 | 658 | ||
573 | /* from net/ieee80211.h */ | 659 | /** |
574 | struct ieee80211_channel; | 660 | * DOC: Scanning and BSS list handling |
661 | * | ||
662 | * The scanning process itself is fairly simple, but cfg80211 offers quite | ||
663 | * a bit of helper functionality. To start a scan, the scan operation will | ||
664 | * be invoked with a scan definition. This scan definition contains the | ||
665 | * channels to scan, and the SSIDs to send probe requests for (including the | ||
666 | * wildcard, if desired). A passive scan is indicated by having no SSIDs to | ||
667 | * probe. Additionally, a scan request may contain extra information elements | ||
668 | * that should be added to the probe request. The IEs are guaranteed to be | ||
669 | * well-formed, and will not exceed the maximum length the driver advertised | ||
670 | * in the wiphy structure. | ||
671 | * | ||
672 | * When scanning finds a BSS, cfg80211 needs to be notified of that, because | ||
673 | * it is responsible for maintaining the BSS list; the driver should not | ||
674 | * maintain a list itself. For this notification, various functions exist. | ||
675 | * | ||
676 | * Since drivers do not maintain a BSS list, there are also a number of | ||
677 | * functions to search for a BSS and obtain information about it from the | ||
678 | * BSS structure cfg80211 maintains. The BSS list is also made available | ||
679 | * to userspace. | ||
680 | */ | ||
575 | 681 | ||
576 | /** | 682 | /** |
577 | * struct cfg80211_ssid - SSID description | 683 | * struct cfg80211_ssid - SSID description |
@@ -691,6 +797,10 @@ const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie); | |||
691 | * sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is | 797 | * sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is |
692 | * required to assume that the port is unauthorized until authorized by | 798 | * required to assume that the port is unauthorized until authorized by |
693 | * user space. Otherwise, port is marked authorized by default. | 799 | * user space. Otherwise, port is marked authorized by default. |
800 | * @control_port_ethertype: the control port protocol that should be | ||
801 | * allowed through even on unauthorized ports | ||
802 | * @control_port_no_encrypt: TRUE to prevent encryption of control port | ||
803 | * protocol frames. | ||
694 | */ | 804 | */ |
695 | struct cfg80211_crypto_settings { | 805 | struct cfg80211_crypto_settings { |
696 | u32 wpa_versions; | 806 | u32 wpa_versions; |
@@ -700,6 +810,8 @@ struct cfg80211_crypto_settings { | |||
700 | int n_akm_suites; | 810 | int n_akm_suites; |
701 | u32 akm_suites[NL80211_MAX_NR_AKM_SUITES]; | 811 | u32 akm_suites[NL80211_MAX_NR_AKM_SUITES]; |
702 | bool control_port; | 812 | bool control_port; |
813 | __be16 control_port_ethertype; | ||
814 | bool control_port_no_encrypt; | ||
703 | }; | 815 | }; |
704 | 816 | ||
705 | /** | 817 | /** |
@@ -1020,7 +1132,7 @@ struct cfg80211_pmksa { | |||
1020 | * @cancel_remain_on_channel: Cancel an on-going remain-on-channel operation. | 1132 | * @cancel_remain_on_channel: Cancel an on-going remain-on-channel operation. |
1021 | * This allows the operation to be terminated prior to timeout based on | 1133 | * This allows the operation to be terminated prior to timeout based on |
1022 | * the duration value. | 1134 | * the duration value. |
1023 | * @action: Transmit an action frame | 1135 | * @mgmt_tx: Transmit a management frame |
1024 | * | 1136 | * |
1025 | * @testmode_cmd: run a test mode command | 1137 | * @testmode_cmd: run a test mode command |
1026 | * | 1138 | * |
@@ -1035,6 +1147,9 @@ struct cfg80211_pmksa { | |||
1035 | * allows the driver to adjust the dynamic ps timeout value. | 1147 | * allows the driver to adjust the dynamic ps timeout value. |
1036 | * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold. | 1148 | * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold. |
1037 | * | 1149 | * |
1150 | * @mgmt_frame_register: Notify driver that a management frame type was | ||
1151 | * registered. Note that this callback may not sleep, and cannot run | ||
1152 | * concurrently with itself. | ||
1038 | */ | 1153 | */ |
1039 | struct cfg80211_ops { | 1154 | struct cfg80211_ops { |
1040 | int (*suspend)(struct wiphy *wiphy); | 1155 | int (*suspend)(struct wiphy *wiphy); |
@@ -1050,13 +1165,14 @@ struct cfg80211_ops { | |||
1050 | struct vif_params *params); | 1165 | struct vif_params *params); |
1051 | 1166 | ||
1052 | int (*add_key)(struct wiphy *wiphy, struct net_device *netdev, | 1167 | int (*add_key)(struct wiphy *wiphy, struct net_device *netdev, |
1053 | u8 key_index, const u8 *mac_addr, | 1168 | u8 key_index, bool pairwise, const u8 *mac_addr, |
1054 | struct key_params *params); | 1169 | struct key_params *params); |
1055 | int (*get_key)(struct wiphy *wiphy, struct net_device *netdev, | 1170 | int (*get_key)(struct wiphy *wiphy, struct net_device *netdev, |
1056 | u8 key_index, const u8 *mac_addr, void *cookie, | 1171 | u8 key_index, bool pairwise, const u8 *mac_addr, |
1172 | void *cookie, | ||
1057 | void (*callback)(void *cookie, struct key_params*)); | 1173 | void (*callback)(void *cookie, struct key_params*)); |
1058 | int (*del_key)(struct wiphy *wiphy, struct net_device *netdev, | 1174 | int (*del_key)(struct wiphy *wiphy, struct net_device *netdev, |
1059 | u8 key_index, const u8 *mac_addr); | 1175 | u8 key_index, bool pairwise, const u8 *mac_addr); |
1060 | int (*set_default_key)(struct wiphy *wiphy, | 1176 | int (*set_default_key)(struct wiphy *wiphy, |
1061 | struct net_device *netdev, | 1177 | struct net_device *netdev, |
1062 | u8 key_index); | 1178 | u8 key_index); |
@@ -1140,7 +1256,7 @@ struct cfg80211_ops { | |||
1140 | int (*get_tx_power)(struct wiphy *wiphy, int *dbm); | 1256 | int (*get_tx_power)(struct wiphy *wiphy, int *dbm); |
1141 | 1257 | ||
1142 | int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev, | 1258 | int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev, |
1143 | u8 *addr); | 1259 | const u8 *addr); |
1144 | 1260 | ||
1145 | void (*rfkill_poll)(struct wiphy *wiphy); | 1261 | void (*rfkill_poll)(struct wiphy *wiphy); |
1146 | 1262 | ||
@@ -1172,7 +1288,7 @@ struct cfg80211_ops { | |||
1172 | struct net_device *dev, | 1288 | struct net_device *dev, |
1173 | u64 cookie); | 1289 | u64 cookie); |
1174 | 1290 | ||
1175 | int (*action)(struct wiphy *wiphy, struct net_device *dev, | 1291 | int (*mgmt_tx)(struct wiphy *wiphy, struct net_device *dev, |
1176 | struct ieee80211_channel *chan, | 1292 | struct ieee80211_channel *chan, |
1177 | enum nl80211_channel_type channel_type, | 1293 | enum nl80211_channel_type channel_type, |
1178 | bool channel_type_valid, | 1294 | bool channel_type_valid, |
@@ -1184,6 +1300,10 @@ struct cfg80211_ops { | |||
1184 | int (*set_cqm_rssi_config)(struct wiphy *wiphy, | 1300 | int (*set_cqm_rssi_config)(struct wiphy *wiphy, |
1185 | struct net_device *dev, | 1301 | struct net_device *dev, |
1186 | s32 rssi_thold, u32 rssi_hyst); | 1302 | s32 rssi_thold, u32 rssi_hyst); |
1303 | |||
1304 | void (*mgmt_frame_register)(struct wiphy *wiphy, | ||
1305 | struct net_device *dev, | ||
1306 | u16 frame_type, bool reg); | ||
1187 | }; | 1307 | }; |
1188 | 1308 | ||
1189 | /* | 1309 | /* |
@@ -1221,21 +1341,31 @@ struct cfg80211_ops { | |||
1221 | * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station | 1341 | * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station |
1222 | * on a VLAN interface) | 1342 | * on a VLAN interface) |
1223 | * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station | 1343 | * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station |
1344 | * @WIPHY_FLAG_CONTROL_PORT_PROTOCOL: This device supports setting the | ||
1345 | * control port protocol ethertype. The device also honours the | ||
1346 | * control_port_no_encrypt flag. | ||
1347 | * @WIPHY_FLAG_IBSS_RSN: The device supports IBSS RSN. | ||
1224 | */ | 1348 | */ |
1225 | enum wiphy_flags { | 1349 | enum wiphy_flags { |
1226 | WIPHY_FLAG_CUSTOM_REGULATORY = BIT(0), | 1350 | WIPHY_FLAG_CUSTOM_REGULATORY = BIT(0), |
1227 | WIPHY_FLAG_STRICT_REGULATORY = BIT(1), | 1351 | WIPHY_FLAG_STRICT_REGULATORY = BIT(1), |
1228 | WIPHY_FLAG_DISABLE_BEACON_HINTS = BIT(2), | 1352 | WIPHY_FLAG_DISABLE_BEACON_HINTS = BIT(2), |
1229 | WIPHY_FLAG_NETNS_OK = BIT(3), | 1353 | WIPHY_FLAG_NETNS_OK = BIT(3), |
1230 | WIPHY_FLAG_PS_ON_BY_DEFAULT = BIT(4), | 1354 | WIPHY_FLAG_PS_ON_BY_DEFAULT = BIT(4), |
1231 | WIPHY_FLAG_4ADDR_AP = BIT(5), | 1355 | WIPHY_FLAG_4ADDR_AP = BIT(5), |
1232 | WIPHY_FLAG_4ADDR_STATION = BIT(6), | 1356 | WIPHY_FLAG_4ADDR_STATION = BIT(6), |
1357 | WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7), | ||
1358 | WIPHY_FLAG_IBSS_RSN = BIT(7), | ||
1233 | }; | 1359 | }; |
1234 | 1360 | ||
1235 | struct mac_address { | 1361 | struct mac_address { |
1236 | u8 addr[ETH_ALEN]; | 1362 | u8 addr[ETH_ALEN]; |
1237 | }; | 1363 | }; |
1238 | 1364 | ||
1365 | struct ieee80211_txrx_stypes { | ||
1366 | u16 tx, rx; | ||
1367 | }; | ||
1368 | |||
1239 | /** | 1369 | /** |
1240 | * struct wiphy - wireless hardware description | 1370 | * struct wiphy - wireless hardware description |
1241 | * @reg_notifier: the driver's regulatory notification callback | 1371 | * @reg_notifier: the driver's regulatory notification callback |
@@ -1286,6 +1416,10 @@ struct mac_address { | |||
1286 | * @privid: a pointer that drivers can use to identify if an arbitrary | 1416 | * @privid: a pointer that drivers can use to identify if an arbitrary |
1287 | * wiphy is theirs, e.g. in global notifiers | 1417 | * wiphy is theirs, e.g. in global notifiers |
1288 | * @bands: information about bands/channels supported by this device | 1418 | * @bands: information about bands/channels supported by this device |
1419 | * | ||
1420 | * @mgmt_stypes: bitmasks of frame subtypes that can be subscribed to or | ||
1421 | * transmitted through nl80211, points to an array indexed by interface | ||
1422 | * type | ||
1289 | */ | 1423 | */ |
1290 | struct wiphy { | 1424 | struct wiphy { |
1291 | /* assign these fields before you register the wiphy */ | 1425 | /* assign these fields before you register the wiphy */ |
@@ -1294,9 +1428,12 @@ struct wiphy { | |||
1294 | u8 perm_addr[ETH_ALEN]; | 1428 | u8 perm_addr[ETH_ALEN]; |
1295 | u8 addr_mask[ETH_ALEN]; | 1429 | u8 addr_mask[ETH_ALEN]; |
1296 | 1430 | ||
1297 | u16 n_addresses; | ||
1298 | struct mac_address *addresses; | 1431 | struct mac_address *addresses; |
1299 | 1432 | ||
1433 | const struct ieee80211_txrx_stypes *mgmt_stypes; | ||
1434 | |||
1435 | u16 n_addresses; | ||
1436 | |||
1300 | /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ | 1437 | /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ |
1301 | u16 interface_modes; | 1438 | u16 interface_modes; |
1302 | 1439 | ||
@@ -1492,8 +1629,8 @@ struct cfg80211_cached_keys; | |||
1492 | * set by driver (if supported) on add_interface BEFORE registering the | 1629 | * set by driver (if supported) on add_interface BEFORE registering the |
1493 | * netdev and may otherwise be used by driver read-only, will be update | 1630 | * netdev and may otherwise be used by driver read-only, will be update |
1494 | * by cfg80211 on change_interface | 1631 | * by cfg80211 on change_interface |
1495 | * @action_registrations: list of registrations for action frames | 1632 | * @mgmt_registrations: list of registrations for management frames |
1496 | * @action_registrations_lock: lock for the list | 1633 | * @mgmt_registrations_lock: lock for the list |
1497 | * @mtx: mutex used to lock data in this struct | 1634 | * @mtx: mutex used to lock data in this struct |
1498 | * @cleanup_work: work struct used for cleanup that can't be done directly | 1635 | * @cleanup_work: work struct used for cleanup that can't be done directly |
1499 | */ | 1636 | */ |
@@ -1505,8 +1642,8 @@ struct wireless_dev { | |||
1505 | struct list_head list; | 1642 | struct list_head list; |
1506 | struct net_device *netdev; | 1643 | struct net_device *netdev; |
1507 | 1644 | ||
1508 | struct list_head action_registrations; | 1645 | struct list_head mgmt_registrations; |
1509 | spinlock_t action_registrations_lock; | 1646 | spinlock_t mgmt_registrations_lock; |
1510 | 1647 | ||
1511 | struct mutex mtx; | 1648 | struct mutex mtx; |
1512 | 1649 | ||
@@ -1563,8 +1700,10 @@ static inline void *wdev_priv(struct wireless_dev *wdev) | |||
1563 | return wiphy_priv(wdev->wiphy); | 1700 | return wiphy_priv(wdev->wiphy); |
1564 | } | 1701 | } |
1565 | 1702 | ||
1566 | /* | 1703 | /** |
1567 | * Utility functions | 1704 | * DOC: Utility functions |
1705 | * | ||
1706 | * cfg80211 offers a number of utility functions that can be useful. | ||
1568 | */ | 1707 | */ |
1569 | 1708 | ||
1570 | /** | 1709 | /** |
@@ -1715,7 +1854,15 @@ unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb); | |||
1715 | * ieee80211_hdrlen - get header length in bytes from frame control | 1854 | * ieee80211_hdrlen - get header length in bytes from frame control |
1716 | * @fc: frame control field in little-endian format | 1855 | * @fc: frame control field in little-endian format |
1717 | */ | 1856 | */ |
1718 | unsigned int ieee80211_hdrlen(__le16 fc); | 1857 | unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc); |
1858 | |||
1859 | /** | ||
1860 | * DOC: Data path helpers | ||
1861 | * | ||
1862 | * In addition to generic utilities, cfg80211 also offers | ||
1863 | * functions that help implement the data path for devices | ||
1864 | * that do not do the 802.11/802.3 conversion on the device. | ||
1865 | */ | ||
1719 | 1866 | ||
1720 | /** | 1867 | /** |
1721 | * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3 | 1868 | * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3 |
@@ -1777,8 +1924,10 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb); | |||
1777 | */ | 1924 | */ |
1778 | const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len); | 1925 | const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len); |
1779 | 1926 | ||
1780 | /* | 1927 | /** |
1781 | * Regulatory helper functions for wiphys | 1928 | * DOC: Regulatory enforcement infrastructure |
1929 | * | ||
1930 | * TODO | ||
1782 | */ | 1931 | */ |
1783 | 1932 | ||
1784 | /** | 1933 | /** |
@@ -2181,6 +2330,20 @@ void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, | |||
2181 | void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp); | 2330 | void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp); |
2182 | 2331 | ||
2183 | /** | 2332 | /** |
2333 | * DOC: RFkill integration | ||
2334 | * | ||
2335 | * RFkill integration in cfg80211 is almost invisible to drivers, | ||
2336 | * as cfg80211 automatically registers an rfkill instance for each | ||
2337 | * wireless device it knows about. Soft kill is also translated | ||
2338 | * into disconnecting and turning all interfaces off, drivers are | ||
2339 | * expected to turn off the device when all interfaces are down. | ||
2340 | * | ||
2341 | * However, devices may have a hard RFkill line, in which case they | ||
2342 | * also need to interact with the rfkill subsystem, via cfg80211. | ||
2343 | * They can do this with a few helper functions documented here. | ||
2344 | */ | ||
2345 | |||
2346 | /** | ||
2184 | * wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state | 2347 | * wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state |
2185 | * @wiphy: the wiphy | 2348 | * @wiphy: the wiphy |
2186 | * @blocked: block status | 2349 | * @blocked: block status |
@@ -2201,6 +2364,17 @@ void wiphy_rfkill_stop_polling(struct wiphy *wiphy); | |||
2201 | 2364 | ||
2202 | #ifdef CONFIG_NL80211_TESTMODE | 2365 | #ifdef CONFIG_NL80211_TESTMODE |
2203 | /** | 2366 | /** |
2367 | * DOC: Test mode | ||
2368 | * | ||
2369 | * Test mode is a set of utility functions to allow drivers to | ||
2370 | * interact with driver-specific tools to aid, for instance, | ||
2371 | * factory programming. | ||
2372 | * | ||
2373 | * This chapter describes how drivers interact with it, for more | ||
2374 | * information see the nl80211 book's chapter on it. | ||
2375 | */ | ||
2376 | |||
2377 | /** | ||
2204 | * cfg80211_testmode_alloc_reply_skb - allocate testmode reply | 2378 | * cfg80211_testmode_alloc_reply_skb - allocate testmode reply |
2205 | * @wiphy: the wiphy | 2379 | * @wiphy: the wiphy |
2206 | * @approxlen: an upper bound of the length of the data that will | 2380 | * @approxlen: an upper bound of the length of the data that will |
@@ -2373,38 +2547,39 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, | |||
2373 | struct station_info *sinfo, gfp_t gfp); | 2547 | struct station_info *sinfo, gfp_t gfp); |
2374 | 2548 | ||
2375 | /** | 2549 | /** |
2376 | * cfg80211_rx_action - notification of received, unprocessed Action frame | 2550 | * cfg80211_rx_mgmt - notification of received, unprocessed management frame |
2377 | * @dev: network device | 2551 | * @dev: network device |
2378 | * @freq: Frequency on which the frame was received in MHz | 2552 | * @freq: Frequency on which the frame was received in MHz |
2379 | * @buf: Action frame (header + body) | 2553 | * @buf: Management frame (header + body) |
2380 | * @len: length of the frame data | 2554 | * @len: length of the frame data |
2381 | * @gfp: context flags | 2555 | * @gfp: context flags |
2382 | * Returns %true if a user space application is responsible for rejecting the | 2556 | * |
2383 | * unrecognized Action frame; %false if no such application is registered | 2557 | * Returns %true if a user space application has registered for this frame. |
2384 | * (i.e., the driver is responsible for rejecting the unrecognized Action | 2558 | * For action frames, that makes it responsible for rejecting unrecognized |
2385 | * frame) | 2559 | * action frames; %false otherwise, in which case for action frames the |
2560 | * driver is responsible for rejecting the frame. | ||
2386 | * | 2561 | * |
2387 | * This function is called whenever an Action frame is received for a station | 2562 | * This function is called whenever an Action frame is received for a station |
2388 | * mode interface, but is not processed in kernel. | 2563 | * mode interface, but is not processed in kernel. |
2389 | */ | 2564 | */ |
2390 | bool cfg80211_rx_action(struct net_device *dev, int freq, const u8 *buf, | 2565 | bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf, |
2391 | size_t len, gfp_t gfp); | 2566 | size_t len, gfp_t gfp); |
2392 | 2567 | ||
2393 | /** | 2568 | /** |
2394 | * cfg80211_action_tx_status - notification of TX status for Action frame | 2569 | * cfg80211_mgmt_tx_status - notification of TX status for management frame |
2395 | * @dev: network device | 2570 | * @dev: network device |
2396 | * @cookie: Cookie returned by cfg80211_ops::action() | 2571 | * @cookie: Cookie returned by cfg80211_ops::mgmt_tx() |
2397 | * @buf: Action frame (header + body) | 2572 | * @buf: Management frame (header + body) |
2398 | * @len: length of the frame data | 2573 | * @len: length of the frame data |
2399 | * @ack: Whether frame was acknowledged | 2574 | * @ack: Whether frame was acknowledged |
2400 | * @gfp: context flags | 2575 | * @gfp: context flags |
2401 | * | 2576 | * |
2402 | * This function is called whenever an Action frame was requested to be | 2577 | * This function is called whenever a management frame was requested to be |
2403 | * transmitted with cfg80211_ops::action() to report the TX status of the | 2578 | * transmitted with cfg80211_ops::mgmt_tx() to report the TX status of the |
2404 | * transmission attempt. | 2579 | * transmission attempt. |
2405 | */ | 2580 | */ |
2406 | void cfg80211_action_tx_status(struct net_device *dev, u64 cookie, | 2581 | void cfg80211_mgmt_tx_status(struct net_device *dev, u64 cookie, |
2407 | const u8 *buf, size_t len, bool ack, gfp_t gfp); | 2582 | const u8 *buf, size_t len, bool ack, gfp_t gfp); |
2408 | 2583 | ||
2409 | 2584 | ||
2410 | /** | 2585 | /** |
@@ -2420,56 +2595,41 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev, | |||
2420 | enum nl80211_cqm_rssi_threshold_event rssi_event, | 2595 | enum nl80211_cqm_rssi_threshold_event rssi_event, |
2421 | gfp_t gfp); | 2596 | gfp_t gfp); |
2422 | 2597 | ||
2423 | #ifdef __KERNEL__ | ||
2424 | |||
2425 | /* Logging, debugging and troubleshooting/diagnostic helpers. */ | 2598 | /* Logging, debugging and troubleshooting/diagnostic helpers. */ |
2426 | 2599 | ||
2427 | /* wiphy_printk helpers, similar to dev_printk */ | 2600 | /* wiphy_printk helpers, similar to dev_printk */ |
2428 | 2601 | ||
2429 | #define wiphy_printk(level, wiphy, format, args...) \ | 2602 | #define wiphy_printk(level, wiphy, format, args...) \ |
2430 | printk(level "%s: " format, wiphy_name(wiphy), ##args) | 2603 | dev_printk(level, &(wiphy)->dev, format, ##args) |
2431 | #define wiphy_emerg(wiphy, format, args...) \ | 2604 | #define wiphy_emerg(wiphy, format, args...) \ |
2432 | wiphy_printk(KERN_EMERG, wiphy, format, ##args) | 2605 | dev_emerg(&(wiphy)->dev, format, ##args) |
2433 | #define wiphy_alert(wiphy, format, args...) \ | 2606 | #define wiphy_alert(wiphy, format, args...) \ |
2434 | wiphy_printk(KERN_ALERT, wiphy, format, ##args) | 2607 | dev_alert(&(wiphy)->dev, format, ##args) |
2435 | #define wiphy_crit(wiphy, format, args...) \ | 2608 | #define wiphy_crit(wiphy, format, args...) \ |
2436 | wiphy_printk(KERN_CRIT, wiphy, format, ##args) | 2609 | dev_crit(&(wiphy)->dev, format, ##args) |
2437 | #define wiphy_err(wiphy, format, args...) \ | 2610 | #define wiphy_err(wiphy, format, args...) \ |
2438 | wiphy_printk(KERN_ERR, wiphy, format, ##args) | 2611 | dev_err(&(wiphy)->dev, format, ##args) |
2439 | #define wiphy_warn(wiphy, format, args...) \ | 2612 | #define wiphy_warn(wiphy, format, args...) \ |
2440 | wiphy_printk(KERN_WARNING, wiphy, format, ##args) | 2613 | dev_warn(&(wiphy)->dev, format, ##args) |
2441 | #define wiphy_notice(wiphy, format, args...) \ | 2614 | #define wiphy_notice(wiphy, format, args...) \ |
2442 | wiphy_printk(KERN_NOTICE, wiphy, format, ##args) | 2615 | dev_notice(&(wiphy)->dev, format, ##args) |
2443 | #define wiphy_info(wiphy, format, args...) \ | 2616 | #define wiphy_info(wiphy, format, args...) \ |
2444 | wiphy_printk(KERN_INFO, wiphy, format, ##args) | 2617 | dev_info(&(wiphy)->dev, format, ##args) |
2445 | 2618 | ||
2446 | int wiphy_debug(const struct wiphy *wiphy, const char *format, ...) | 2619 | #define wiphy_debug(wiphy, format, args...) \ |
2447 | __attribute__ ((format (printf, 2, 3))); | ||
2448 | |||
2449 | #if defined(DEBUG) | ||
2450 | #define wiphy_dbg(wiphy, format, args...) \ | ||
2451 | wiphy_printk(KERN_DEBUG, wiphy, format, ##args) | 2620 | wiphy_printk(KERN_DEBUG, wiphy, format, ##args) |
2452 | #elif defined(CONFIG_DYNAMIC_DEBUG) | 2621 | |
2453 | #define wiphy_dbg(wiphy, format, args...) \ | 2622 | #define wiphy_dbg(wiphy, format, args...) \ |
2454 | dynamic_pr_debug("%s: " format, wiphy_name(wiphy), ##args) | 2623 | dev_dbg(&(wiphy)->dev, format, ##args) |
2455 | #else | ||
2456 | #define wiphy_dbg(wiphy, format, args...) \ | ||
2457 | ({ \ | ||
2458 | if (0) \ | ||
2459 | wiphy_printk(KERN_DEBUG, wiphy, format, ##args); \ | ||
2460 | 0; \ | ||
2461 | }) | ||
2462 | #endif | ||
2463 | 2624 | ||
2464 | #if defined(VERBOSE_DEBUG) | 2625 | #if defined(VERBOSE_DEBUG) |
2465 | #define wiphy_vdbg wiphy_dbg | 2626 | #define wiphy_vdbg wiphy_dbg |
2466 | #else | 2627 | #else |
2467 | |||
2468 | #define wiphy_vdbg(wiphy, format, args...) \ | 2628 | #define wiphy_vdbg(wiphy, format, args...) \ |
2469 | ({ \ | 2629 | ({ \ |
2470 | if (0) \ | 2630 | if (0) \ |
2471 | wiphy_printk(KERN_DEBUG, wiphy, format, ##args); \ | 2631 | wiphy_printk(KERN_DEBUG, wiphy, format, ##args); \ |
2472 | 0; \ | 2632 | 0; \ |
2473 | }) | 2633 | }) |
2474 | #endif | 2634 | #endif |
2475 | 2635 | ||
@@ -2481,6 +2641,4 @@ int wiphy_debug(const struct wiphy *wiphy, const char *format, ...) | |||
2481 | #define wiphy_WARN(wiphy, format, args...) \ | 2641 | #define wiphy_WARN(wiphy, format, args...) \ |
2482 | WARN(1, "wiphy: %s\n" format, wiphy_name(wiphy), ##args); | 2642 | WARN(1, "wiphy: %s\n" format, wiphy_name(wiphy), ##args); |
2483 | 2643 | ||
2484 | #endif | ||
2485 | |||
2486 | #endif /* __NET_CFG80211_H */ | 2644 | #endif /* __NET_CFG80211_H */ |
diff --git a/include/net/cls_cgroup.h b/include/net/cls_cgroup.h index ef6c24a529e1..a4dc5b027bd9 100644 --- a/include/net/cls_cgroup.h +++ b/include/net/cls_cgroup.h | |||
@@ -51,7 +51,8 @@ static inline u32 task_cls_classid(struct task_struct *p) | |||
51 | return 0; | 51 | return 0; |
52 | 52 | ||
53 | rcu_read_lock(); | 53 | rcu_read_lock(); |
54 | id = rcu_dereference(net_cls_subsys_id); | 54 | id = rcu_dereference_index_check(net_cls_subsys_id, |
55 | rcu_read_lock_held()); | ||
55 | if (id >= 0) | 56 | if (id >= 0) |
56 | classid = container_of(task_subsys_state(p, id), | 57 | classid = container_of(task_subsys_state(p, id), |
57 | struct cgroup_cls_state, css)->classid; | 58 | struct cgroup_cls_state, css)->classid; |
diff --git a/include/net/dn.h b/include/net/dn.h index e5469f7b67a3..a514a3cf4573 100644 --- a/include/net/dn.h +++ b/include/net/dn.h | |||
@@ -225,7 +225,7 @@ extern int decnet_di_count; | |||
225 | extern int decnet_dr_count; | 225 | extern int decnet_dr_count; |
226 | extern int decnet_no_fc_max_cwnd; | 226 | extern int decnet_no_fc_max_cwnd; |
227 | 227 | ||
228 | extern int sysctl_decnet_mem[3]; | 228 | extern long sysctl_decnet_mem[3]; |
229 | extern int sysctl_decnet_wmem[3]; | 229 | extern int sysctl_decnet_wmem[3]; |
230 | extern int sysctl_decnet_rmem[3]; | 230 | extern int sysctl_decnet_rmem[3]; |
231 | 231 | ||
diff --git a/include/net/dst.h b/include/net/dst.h index 02386505033d..ffe9cb719c0e 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -43,10 +43,11 @@ struct dst_entry { | |||
43 | short error; | 43 | short error; |
44 | short obsolete; | 44 | short obsolete; |
45 | int flags; | 45 | int flags; |
46 | #define DST_HOST 1 | 46 | #define DST_HOST 0x0001 |
47 | #define DST_NOXFRM 2 | 47 | #define DST_NOXFRM 0x0002 |
48 | #define DST_NOPOLICY 4 | 48 | #define DST_NOPOLICY 0x0004 |
49 | #define DST_NOHASH 8 | 49 | #define DST_NOHASH 0x0008 |
50 | #define DST_NOCACHE 0x0010 | ||
50 | unsigned long expires; | 51 | unsigned long expires; |
51 | 52 | ||
52 | unsigned short header_len; /* more space at head required */ | 53 | unsigned short header_len; /* more space at head required */ |
@@ -94,7 +95,7 @@ struct dst_entry { | |||
94 | unsigned long lastuse; | 95 | unsigned long lastuse; |
95 | union { | 96 | union { |
96 | struct dst_entry *next; | 97 | struct dst_entry *next; |
97 | struct rtable *rt_next; | 98 | struct rtable __rcu *rt_next; |
98 | struct rt6_info *rt6_next; | 99 | struct rt6_info *rt6_next; |
99 | struct dn_route *dn_next; | 100 | struct dn_route *dn_next; |
100 | }; | 101 | }; |
@@ -228,23 +229,37 @@ static inline void skb_dst_force(struct sk_buff *skb) | |||
228 | 229 | ||
229 | 230 | ||
230 | /** | 231 | /** |
232 | * __skb_tunnel_rx - prepare skb for rx reinsert | ||
233 | * @skb: buffer | ||
234 | * @dev: tunnel device | ||
235 | * | ||
236 | * After decapsulation, packet is going to re-enter (netif_rx()) our stack, | ||
237 | * so make some cleanups. (no accounting done) | ||
238 | */ | ||
239 | static inline void __skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) | ||
240 | { | ||
241 | skb->dev = dev; | ||
242 | skb->rxhash = 0; | ||
243 | skb_set_queue_mapping(skb, 0); | ||
244 | skb_dst_drop(skb); | ||
245 | nf_reset(skb); | ||
246 | } | ||
247 | |||
248 | /** | ||
231 | * skb_tunnel_rx - prepare skb for rx reinsert | 249 | * skb_tunnel_rx - prepare skb for rx reinsert |
232 | * @skb: buffer | 250 | * @skb: buffer |
233 | * @dev: tunnel device | 251 | * @dev: tunnel device |
234 | * | 252 | * |
235 | * After decapsulation, packet is going to re-enter (netif_rx()) our stack, | 253 | * After decapsulation, packet is going to re-enter (netif_rx()) our stack, |
236 | * so make some cleanups, and perform accounting. | 254 | * so make some cleanups, and perform accounting. |
255 | * Note: this accounting is not SMP safe. | ||
237 | */ | 256 | */ |
238 | static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) | 257 | static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) |
239 | { | 258 | { |
240 | skb->dev = dev; | ||
241 | /* TODO : stats should be SMP safe */ | 259 | /* TODO : stats should be SMP safe */ |
242 | dev->stats.rx_packets++; | 260 | dev->stats.rx_packets++; |
243 | dev->stats.rx_bytes += skb->len; | 261 | dev->stats.rx_bytes += skb->len; |
244 | skb->rxhash = 0; | 262 | __skb_tunnel_rx(skb, dev); |
245 | skb_set_queue_mapping(skb, 0); | ||
246 | skb_dst_drop(skb); | ||
247 | nf_reset(skb); | ||
248 | } | 263 | } |
249 | 264 | ||
250 | /* Children define the path of the packet through the | 265 | /* Children define the path of the packet through the |
diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h index d1ff9b7e99b8..51665b3461b8 100644 --- a/include/net/dst_ops.h +++ b/include/net/dst_ops.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _NET_DST_OPS_H | 1 | #ifndef _NET_DST_OPS_H |
2 | #define _NET_DST_OPS_H | 2 | #define _NET_DST_OPS_H |
3 | #include <linux/types.h> | 3 | #include <linux/types.h> |
4 | #include <linux/percpu_counter.h> | ||
5 | #include <linux/cache.h> | ||
4 | 6 | ||
5 | struct dst_entry; | 7 | struct dst_entry; |
6 | struct kmem_cachep; | 8 | struct kmem_cachep; |
@@ -22,7 +24,41 @@ struct dst_ops { | |||
22 | void (*update_pmtu)(struct dst_entry *dst, u32 mtu); | 24 | void (*update_pmtu)(struct dst_entry *dst, u32 mtu); |
23 | int (*local_out)(struct sk_buff *skb); | 25 | int (*local_out)(struct sk_buff *skb); |
24 | 26 | ||
25 | atomic_t entries; | ||
26 | struct kmem_cache *kmem_cachep; | 27 | struct kmem_cache *kmem_cachep; |
28 | |||
29 | struct percpu_counter pcpuc_entries ____cacheline_aligned_in_smp; | ||
27 | }; | 30 | }; |
31 | |||
32 | static inline int dst_entries_get_fast(struct dst_ops *dst) | ||
33 | { | ||
34 | return percpu_counter_read_positive(&dst->pcpuc_entries); | ||
35 | } | ||
36 | |||
37 | static inline int dst_entries_get_slow(struct dst_ops *dst) | ||
38 | { | ||
39 | int res; | ||
40 | |||
41 | local_bh_disable(); | ||
42 | res = percpu_counter_sum_positive(&dst->pcpuc_entries); | ||
43 | local_bh_enable(); | ||
44 | return res; | ||
45 | } | ||
46 | |||
47 | static inline void dst_entries_add(struct dst_ops *dst, int val) | ||
48 | { | ||
49 | local_bh_disable(); | ||
50 | percpu_counter_add(&dst->pcpuc_entries, val); | ||
51 | local_bh_enable(); | ||
52 | } | ||
53 | |||
54 | static inline int dst_entries_init(struct dst_ops *dst) | ||
55 | { | ||
56 | return percpu_counter_init(&dst->pcpuc_entries, 0); | ||
57 | } | ||
58 | |||
59 | static inline void dst_entries_destroy(struct dst_ops *dst) | ||
60 | { | ||
61 | percpu_counter_destroy(&dst->pcpuc_entries); | ||
62 | } | ||
63 | |||
28 | #endif | 64 | #endif |
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h index e8923bc20f9f..075f1e3a0fed 100644 --- a/include/net/fib_rules.h +++ b/include/net/fib_rules.h | |||
@@ -20,7 +20,7 @@ struct fib_rule { | |||
20 | u32 table; | 20 | u32 table; |
21 | u8 action; | 21 | u8 action; |
22 | u32 target; | 22 | u32 target; |
23 | struct fib_rule * ctarget; | 23 | struct fib_rule __rcu *ctarget; |
24 | char iifname[IFNAMSIZ]; | 24 | char iifname[IFNAMSIZ]; |
25 | char oifname[IFNAMSIZ]; | 25 | char oifname[IFNAMSIZ]; |
26 | struct rcu_head rcu; | 26 | struct rcu_head rcu; |
@@ -31,6 +31,8 @@ struct fib_lookup_arg { | |||
31 | void *lookup_ptr; | 31 | void *lookup_ptr; |
32 | void *result; | 32 | void *result; |
33 | struct fib_rule *rule; | 33 | struct fib_rule *rule; |
34 | int flags; | ||
35 | #define FIB_LOOKUP_NOREF 1 | ||
34 | }; | 36 | }; |
35 | 37 | ||
36 | struct fib_rules_ops { | 38 | struct fib_rules_ops { |
@@ -106,7 +108,6 @@ static inline u32 frh_get_table(struct fib_rule_hdr *frh, struct nlattr **nla) | |||
106 | 108 | ||
107 | extern struct fib_rules_ops *fib_rules_register(const struct fib_rules_ops *, struct net *); | 109 | extern struct fib_rules_ops *fib_rules_register(const struct fib_rules_ops *, struct net *); |
108 | extern void fib_rules_unregister(struct fib_rules_ops *); | 110 | extern void fib_rules_unregister(struct fib_rules_ops *); |
109 | extern void fib_rules_cleanup_ops(struct fib_rules_ops *); | ||
110 | 111 | ||
111 | extern int fib_rules_lookup(struct fib_rules_ops *, | 112 | extern int fib_rules_lookup(struct fib_rules_ops *, |
112 | struct flowi *, int flags, | 113 | struct flowi *, int flags, |
diff --git a/include/net/flow.h b/include/net/flow.h index bb08692a20b0..0ac3fb5e0973 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
@@ -49,6 +49,7 @@ struct flowi { | |||
49 | __u8 proto; | 49 | __u8 proto; |
50 | __u8 flags; | 50 | __u8 flags; |
51 | #define FLOWI_FLAG_ANYSRC 0x01 | 51 | #define FLOWI_FLAG_ANYSRC 0x01 |
52 | #define FLOWI_FLAG_MATCH_ANY_IIF 0x02 | ||
52 | union { | 53 | union { |
53 | struct { | 54 | struct { |
54 | __be16 sport; | 55 | __be16 sport; |
diff --git a/include/net/garp.h b/include/net/garp.h index 825f172caba9..f4c295984c45 100644 --- a/include/net/garp.h +++ b/include/net/garp.h | |||
@@ -107,7 +107,7 @@ struct garp_applicant { | |||
107 | }; | 107 | }; |
108 | 108 | ||
109 | struct garp_port { | 109 | struct garp_port { |
110 | struct garp_applicant *applicants[GARP_APPLICATION_MAX + 1]; | 110 | struct garp_applicant __rcu *applicants[GARP_APPLICATION_MAX + 1]; |
111 | }; | 111 | }; |
112 | 112 | ||
113 | extern int garp_register_application(struct garp_application *app); | 113 | extern int garp_register_application(struct garp_application *app); |
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index f7dcd2c70412..8a64b811a39a 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h | |||
@@ -20,6 +20,9 @@ struct genl_multicast_group { | |||
20 | u32 id; | 20 | u32 id; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | struct genl_ops; | ||
24 | struct genl_info; | ||
25 | |||
23 | /** | 26 | /** |
24 | * struct genl_family - generic netlink family | 27 | * struct genl_family - generic netlink family |
25 | * @id: protocol family idenfitier | 28 | * @id: protocol family idenfitier |
@@ -29,6 +32,10 @@ struct genl_multicast_group { | |||
29 | * @maxattr: maximum number of attributes supported | 32 | * @maxattr: maximum number of attributes supported |
30 | * @netnsok: set to true if the family can handle network | 33 | * @netnsok: set to true if the family can handle network |
31 | * namespaces and should be presented in all of them | 34 | * namespaces and should be presented in all of them |
35 | * @pre_doit: called before an operation's doit callback, it may | ||
36 | * do additional, common, filtering and return an error | ||
37 | * @post_doit: called after an operation's doit callback, it may | ||
38 | * undo operations done by pre_doit, for example release locks | ||
32 | * @attrbuf: buffer to store parsed attributes | 39 | * @attrbuf: buffer to store parsed attributes |
33 | * @ops_list: list of all assigned operations | 40 | * @ops_list: list of all assigned operations |
34 | * @family_list: family list | 41 | * @family_list: family list |
@@ -41,6 +48,12 @@ struct genl_family { | |||
41 | unsigned int version; | 48 | unsigned int version; |
42 | unsigned int maxattr; | 49 | unsigned int maxattr; |
43 | bool netnsok; | 50 | bool netnsok; |
51 | int (*pre_doit)(struct genl_ops *ops, | ||
52 | struct sk_buff *skb, | ||
53 | struct genl_info *info); | ||
54 | void (*post_doit)(struct genl_ops *ops, | ||
55 | struct sk_buff *skb, | ||
56 | struct genl_info *info); | ||
44 | struct nlattr ** attrbuf; /* private */ | 57 | struct nlattr ** attrbuf; /* private */ |
45 | struct list_head ops_list; /* private */ | 58 | struct list_head ops_list; /* private */ |
46 | struct list_head family_list; /* private */ | 59 | struct list_head family_list; /* private */ |
@@ -55,6 +68,8 @@ struct genl_family { | |||
55 | * @genlhdr: generic netlink message header | 68 | * @genlhdr: generic netlink message header |
56 | * @userhdr: user specific header | 69 | * @userhdr: user specific header |
57 | * @attrs: netlink attributes | 70 | * @attrs: netlink attributes |
71 | * @_net: network namespace | ||
72 | * @user_ptr: user pointers | ||
58 | */ | 73 | */ |
59 | struct genl_info { | 74 | struct genl_info { |
60 | u32 snd_seq; | 75 | u32 snd_seq; |
@@ -66,6 +81,7 @@ struct genl_info { | |||
66 | #ifdef CONFIG_NET_NS | 81 | #ifdef CONFIG_NET_NS |
67 | struct net * _net; | 82 | struct net * _net; |
68 | #endif | 83 | #endif |
84 | void * user_ptr[2]; | ||
69 | }; | 85 | }; |
70 | 86 | ||
71 | static inline struct net *genl_info_net(struct genl_info *info) | 87 | static inline struct net *genl_info_net(struct genl_info *info) |
@@ -81,6 +97,7 @@ static inline void genl_info_net_set(struct genl_info *info, struct net *net) | |||
81 | /** | 97 | /** |
82 | * struct genl_ops - generic netlink operations | 98 | * struct genl_ops - generic netlink operations |
83 | * @cmd: command identifier | 99 | * @cmd: command identifier |
100 | * @internal_flags: flags used by the family | ||
84 | * @flags: flags | 101 | * @flags: flags |
85 | * @policy: attribute validation policy | 102 | * @policy: attribute validation policy |
86 | * @doit: standard command callback | 103 | * @doit: standard command callback |
@@ -90,6 +107,7 @@ static inline void genl_info_net_set(struct genl_info *info, struct net *net) | |||
90 | */ | 107 | */ |
91 | struct genl_ops { | 108 | struct genl_ops { |
92 | u8 cmd; | 109 | u8 cmd; |
110 | u8 internal_flags; | ||
93 | unsigned int flags; | 111 | unsigned int flags; |
94 | const struct nla_policy *policy; | 112 | const struct nla_policy *policy; |
95 | int (*doit)(struct sk_buff *skb, | 113 | int (*doit)(struct sk_buff *skb, |
diff --git a/include/net/gre.h b/include/net/gre.h new file mode 100644 index 000000000000..82665474bcb7 --- /dev/null +++ b/include/net/gre.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef __LINUX_GRE_H | ||
2 | #define __LINUX_GRE_H | ||
3 | |||
4 | #include <linux/skbuff.h> | ||
5 | |||
6 | #define GREPROTO_CISCO 0 | ||
7 | #define GREPROTO_PPTP 1 | ||
8 | #define GREPROTO_MAX 2 | ||
9 | |||
10 | struct gre_protocol { | ||
11 | int (*handler)(struct sk_buff *skb); | ||
12 | void (*err_handler)(struct sk_buff *skb, u32 info); | ||
13 | }; | ||
14 | |||
15 | int gre_add_protocol(const struct gre_protocol *proto, u8 version); | ||
16 | int gre_del_protocol(const struct gre_protocol *proto, u8 version); | ||
17 | |||
18 | #endif | ||
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index b6d3b55da19b..e4f494b42e06 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
@@ -125,6 +125,7 @@ struct inet_connection_sock { | |||
125 | int probe_size; | 125 | int probe_size; |
126 | } icsk_mtup; | 126 | } icsk_mtup; |
127 | u32 icsk_ca_priv[16]; | 127 | u32 icsk_ca_priv[16]; |
128 | u32 icsk_user_timeout; | ||
128 | #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32)) | 129 | #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32)) |
129 | }; | 130 | }; |
130 | 131 | ||
diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h index 9b5d08f4f6e8..88bdd010d65d 100644 --- a/include/net/inet_ecn.h +++ b/include/net/inet_ecn.h | |||
@@ -27,7 +27,7 @@ static inline int INET_ECN_is_not_ect(__u8 dsfield) | |||
27 | 27 | ||
28 | static inline int INET_ECN_is_capable(__u8 dsfield) | 28 | static inline int INET_ECN_is_capable(__u8 dsfield) |
29 | { | 29 | { |
30 | return (dsfield & INET_ECN_ECT_0); | 30 | return dsfield & INET_ECN_ECT_0; |
31 | } | 31 | } |
32 | 32 | ||
33 | static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner) | 33 | static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner) |
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 74358d1b3f43..e9c2ed8af864 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
@@ -245,7 +245,7 @@ static inline int inet_sk_listen_hashfn(const struct sock *sk) | |||
245 | } | 245 | } |
246 | 246 | ||
247 | /* Caller must disable local BH processing. */ | 247 | /* Caller must disable local BH processing. */ |
248 | extern void __inet_inherit_port(struct sock *sk, struct sock *child); | 248 | extern int __inet_inherit_port(struct sock *sk, struct sock *child); |
249 | 249 | ||
250 | extern void inet_put_port(struct sock *sk); | 250 | extern void inet_put_port(struct sock *sk); |
251 | 251 | ||
diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h index 417d0c894f29..fe239bfe5f7f 100644 --- a/include/net/inetpeer.h +++ b/include/net/inetpeer.h | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | struct inet_peer { | 16 | struct inet_peer { |
17 | /* group together avl_left,avl_right,v4daddr to speedup lookups */ | 17 | /* group together avl_left,avl_right,v4daddr to speedup lookups */ |
18 | struct inet_peer *avl_left, *avl_right; | 18 | struct inet_peer __rcu *avl_left, *avl_right; |
19 | __be32 v4daddr; /* peer's address */ | 19 | __be32 v4daddr; /* peer's address */ |
20 | __u32 avl_height; | 20 | __u32 avl_height; |
21 | struct list_head unused; | 21 | struct list_head unused; |
diff --git a/include/net/ip.h b/include/net/ip.h index 890f9725d681..86e2b182a0c0 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -53,13 +53,13 @@ struct ipcm_cookie { | |||
53 | __be32 addr; | 53 | __be32 addr; |
54 | int oif; | 54 | int oif; |
55 | struct ip_options *opt; | 55 | struct ip_options *opt; |
56 | union skb_shared_tx shtx; | 56 | __u8 tx_flags; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) | 59 | #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) |
60 | 60 | ||
61 | struct ip_ra_chain { | 61 | struct ip_ra_chain { |
62 | struct ip_ra_chain *next; | 62 | struct ip_ra_chain __rcu *next; |
63 | struct sock *sk; | 63 | struct sock *sk; |
64 | union { | 64 | union { |
65 | void (*destructor)(struct sock *); | 65 | void (*destructor)(struct sock *); |
@@ -68,7 +68,7 @@ struct ip_ra_chain { | |||
68 | struct rcu_head rcu; | 68 | struct rcu_head rcu; |
69 | }; | 69 | }; |
70 | 70 | ||
71 | extern struct ip_ra_chain *ip_ra_chain; | 71 | extern struct ip_ra_chain __rcu *ip_ra_chain; |
72 | 72 | ||
73 | /* IP flags. */ | 73 | /* IP flags. */ |
74 | #define IP_CE 0x8000 /* Flag: "Congestion" */ | 74 | #define IP_CE 0x8000 /* Flag: "Congestion" */ |
@@ -238,9 +238,9 @@ int ip_decrease_ttl(struct iphdr *iph) | |||
238 | static inline | 238 | static inline |
239 | int ip_dont_fragment(struct sock *sk, struct dst_entry *dst) | 239 | int ip_dont_fragment(struct sock *sk, struct dst_entry *dst) |
240 | { | 240 | { |
241 | return (inet_sk(sk)->pmtudisc == IP_PMTUDISC_DO || | 241 | return inet_sk(sk)->pmtudisc == IP_PMTUDISC_DO || |
242 | (inet_sk(sk)->pmtudisc == IP_PMTUDISC_WANT && | 242 | (inet_sk(sk)->pmtudisc == IP_PMTUDISC_WANT && |
243 | !(dst_metric_locked(dst, RTAX_MTU)))); | 243 | !(dst_metric_locked(dst, RTAX_MTU))); |
244 | } | 244 | } |
245 | 245 | ||
246 | extern void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more); | 246 | extern void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more); |
diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h index fc94ec568a50..fc73e667b50e 100644 --- a/include/net/ip6_tunnel.h +++ b/include/net/ip6_tunnel.h | |||
@@ -13,7 +13,7 @@ | |||
13 | /* IPv6 tunnel */ | 13 | /* IPv6 tunnel */ |
14 | 14 | ||
15 | struct ip6_tnl { | 15 | struct ip6_tnl { |
16 | struct ip6_tnl *next; /* next tunnel in list */ | 16 | struct ip6_tnl __rcu *next; /* next tunnel in list */ |
17 | struct net_device *dev; /* virtual device associated with tunnel */ | 17 | struct net_device *dev; /* virtual device associated with tunnel */ |
18 | struct ip6_tnl_parm parms; /* tunnel configuration parameters */ | 18 | struct ip6_tnl_parm parms; /* tunnel configuration parameters */ |
19 | struct flowi fl; /* flowi template for xmit */ | 19 | struct flowi fl; /* flowi template for xmit */ |
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index c93f94edc610..07bdb5e9e8ac 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h | |||
@@ -86,6 +86,7 @@ struct fib_info { | |||
86 | #ifdef CONFIG_IP_ROUTE_MULTIPATH | 86 | #ifdef CONFIG_IP_ROUTE_MULTIPATH |
87 | int fib_power; | 87 | int fib_power; |
88 | #endif | 88 | #endif |
89 | struct rcu_head rcu; | ||
89 | struct fib_nh fib_nh[0]; | 90 | struct fib_nh fib_nh[0]; |
90 | #define fib_dev fib_nh[0].nh_dev | 91 | #define fib_dev fib_nh[0].nh_dev |
91 | }; | 92 | }; |
@@ -148,7 +149,7 @@ struct fib_table { | |||
148 | }; | 149 | }; |
149 | 150 | ||
150 | extern int fib_table_lookup(struct fib_table *tb, const struct flowi *flp, | 151 | extern int fib_table_lookup(struct fib_table *tb, const struct flowi *flp, |
151 | struct fib_result *res); | 152 | struct fib_result *res, int fib_flags); |
152 | extern int fib_table_insert(struct fib_table *, struct fib_config *); | 153 | extern int fib_table_insert(struct fib_table *, struct fib_config *); |
153 | extern int fib_table_delete(struct fib_table *, struct fib_config *); | 154 | extern int fib_table_delete(struct fib_table *, struct fib_config *); |
154 | extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb, | 155 | extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb, |
@@ -157,6 +158,8 @@ extern int fib_table_flush(struct fib_table *table); | |||
157 | extern void fib_table_select_default(struct fib_table *table, | 158 | extern void fib_table_select_default(struct fib_table *table, |
158 | const struct flowi *flp, | 159 | const struct flowi *flp, |
159 | struct fib_result *res); | 160 | struct fib_result *res); |
161 | extern void fib_free_table(struct fib_table *tb); | ||
162 | |||
160 | 163 | ||
161 | 164 | ||
162 | #ifndef CONFIG_IP_MULTIPLE_TABLES | 165 | #ifndef CONFIG_IP_MULTIPLE_TABLES |
@@ -185,11 +188,11 @@ static inline int fib_lookup(struct net *net, const struct flowi *flp, | |||
185 | struct fib_table *table; | 188 | struct fib_table *table; |
186 | 189 | ||
187 | table = fib_get_table(net, RT_TABLE_LOCAL); | 190 | table = fib_get_table(net, RT_TABLE_LOCAL); |
188 | if (!fib_table_lookup(table, flp, res)) | 191 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) |
189 | return 0; | 192 | return 0; |
190 | 193 | ||
191 | table = fib_get_table(net, RT_TABLE_MAIN); | 194 | table = fib_get_table(net, RT_TABLE_MAIN); |
192 | if (!fib_table_lookup(table, flp, res)) | 195 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) |
193 | return 0; | 196 | return 0; |
194 | return -ENETUNREACH; | 197 | return -ENETUNREACH; |
195 | } | 198 | } |
@@ -254,16 +257,6 @@ static inline void fib_info_put(struct fib_info *fi) | |||
254 | free_fib_info(fi); | 257 | free_fib_info(fi); |
255 | } | 258 | } |
256 | 259 | ||
257 | static inline void fib_res_put(struct fib_result *res) | ||
258 | { | ||
259 | if (res->fi) | ||
260 | fib_info_put(res->fi); | ||
261 | #ifdef CONFIG_IP_MULTIPLE_TABLES | ||
262 | if (res->r) | ||
263 | fib_rule_put(res->r); | ||
264 | #endif | ||
265 | } | ||
266 | |||
267 | #ifdef CONFIG_PROC_FS | 260 | #ifdef CONFIG_PROC_FS |
268 | extern int __net_init fib_proc_init(struct net *net); | 261 | extern int __net_init fib_proc_init(struct net *net); |
269 | extern void __net_exit fib_proc_exit(struct net *net); | 262 | extern void __net_exit fib_proc_exit(struct net *net); |
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index f976885f686f..b7bbd6c28cfa 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h | |||
@@ -25,7 +25,9 @@ | |||
25 | #include <linux/ip.h> | 25 | #include <linux/ip.h> |
26 | #include <linux/ipv6.h> /* for struct ipv6hdr */ | 26 | #include <linux/ipv6.h> /* for struct ipv6hdr */ |
27 | #include <net/ipv6.h> /* for ipv6_addr_copy */ | 27 | #include <net/ipv6.h> /* for ipv6_addr_copy */ |
28 | 28 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | |
29 | #include <net/netfilter/nf_conntrack.h> | ||
30 | #endif | ||
29 | 31 | ||
30 | /* Connections' size value needed by ip_vs_ctl.c */ | 32 | /* Connections' size value needed by ip_vs_ctl.c */ |
31 | extern int ip_vs_conn_tab_size; | 33 | extern int ip_vs_conn_tab_size; |
@@ -134,24 +136,24 @@ static inline const char *ip_vs_dbg_addr(int af, char *buf, size_t buf_len, | |||
134 | if (net_ratelimit()) \ | 136 | if (net_ratelimit()) \ |
135 | printk(KERN_DEBUG pr_fmt(msg), ##__VA_ARGS__); \ | 137 | printk(KERN_DEBUG pr_fmt(msg), ##__VA_ARGS__); \ |
136 | } while (0) | 138 | } while (0) |
137 | #define IP_VS_DBG_PKT(level, pp, skb, ofs, msg) \ | 139 | #define IP_VS_DBG_PKT(level, af, pp, skb, ofs, msg) \ |
138 | do { \ | 140 | do { \ |
139 | if (level <= ip_vs_get_debug_level()) \ | 141 | if (level <= ip_vs_get_debug_level()) \ |
140 | pp->debug_packet(pp, skb, ofs, msg); \ | 142 | pp->debug_packet(af, pp, skb, ofs, msg); \ |
141 | } while (0) | 143 | } while (0) |
142 | #define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg) \ | 144 | #define IP_VS_DBG_RL_PKT(level, af, pp, skb, ofs, msg) \ |
143 | do { \ | 145 | do { \ |
144 | if (level <= ip_vs_get_debug_level() && \ | 146 | if (level <= ip_vs_get_debug_level() && \ |
145 | net_ratelimit()) \ | 147 | net_ratelimit()) \ |
146 | pp->debug_packet(pp, skb, ofs, msg); \ | 148 | pp->debug_packet(af, pp, skb, ofs, msg); \ |
147 | } while (0) | 149 | } while (0) |
148 | #else /* NO DEBUGGING at ALL */ | 150 | #else /* NO DEBUGGING at ALL */ |
149 | #define IP_VS_DBG_BUF(level, msg...) do {} while (0) | 151 | #define IP_VS_DBG_BUF(level, msg...) do {} while (0) |
150 | #define IP_VS_ERR_BUF(msg...) do {} while (0) | 152 | #define IP_VS_ERR_BUF(msg...) do {} while (0) |
151 | #define IP_VS_DBG(level, msg...) do {} while (0) | 153 | #define IP_VS_DBG(level, msg...) do {} while (0) |
152 | #define IP_VS_DBG_RL(msg...) do {} while (0) | 154 | #define IP_VS_DBG_RL(msg...) do {} while (0) |
153 | #define IP_VS_DBG_PKT(level, pp, skb, ofs, msg) do {} while (0) | 155 | #define IP_VS_DBG_PKT(level, af, pp, skb, ofs, msg) do {} while (0) |
154 | #define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg) do {} while (0) | 156 | #define IP_VS_DBG_RL_PKT(level, af, pp, skb, ofs, msg) do {} while (0) |
155 | #endif | 157 | #endif |
156 | 158 | ||
157 | #define IP_VS_BUG() BUG() | 159 | #define IP_VS_BUG() BUG() |
@@ -343,7 +345,7 @@ struct ip_vs_protocol { | |||
343 | 345 | ||
344 | int (*app_conn_bind)(struct ip_vs_conn *cp); | 346 | int (*app_conn_bind)(struct ip_vs_conn *cp); |
345 | 347 | ||
346 | void (*debug_packet)(struct ip_vs_protocol *pp, | 348 | void (*debug_packet)(int af, struct ip_vs_protocol *pp, |
347 | const struct sk_buff *skb, | 349 | const struct sk_buff *skb, |
348 | int offset, | 350 | int offset, |
349 | const char *msg); | 351 | const char *msg); |
@@ -355,6 +357,19 @@ struct ip_vs_protocol { | |||
355 | 357 | ||
356 | extern struct ip_vs_protocol * ip_vs_proto_get(unsigned short proto); | 358 | extern struct ip_vs_protocol * ip_vs_proto_get(unsigned short proto); |
357 | 359 | ||
360 | struct ip_vs_conn_param { | ||
361 | const union nf_inet_addr *caddr; | ||
362 | const union nf_inet_addr *vaddr; | ||
363 | __be16 cport; | ||
364 | __be16 vport; | ||
365 | __u16 protocol; | ||
366 | u16 af; | ||
367 | |||
368 | const struct ip_vs_pe *pe; | ||
369 | char *pe_data; | ||
370 | __u8 pe_data_len; | ||
371 | }; | ||
372 | |||
358 | /* | 373 | /* |
359 | * IP_VS structure allocated for each dynamically scheduled connection | 374 | * IP_VS structure allocated for each dynamically scheduled connection |
360 | */ | 375 | */ |
@@ -366,6 +381,7 @@ struct ip_vs_conn { | |||
366 | union nf_inet_addr caddr; /* client address */ | 381 | union nf_inet_addr caddr; /* client address */ |
367 | union nf_inet_addr vaddr; /* virtual address */ | 382 | union nf_inet_addr vaddr; /* virtual address */ |
368 | union nf_inet_addr daddr; /* destination address */ | 383 | union nf_inet_addr daddr; /* destination address */ |
384 | volatile __u32 flags; /* status flags */ | ||
369 | __be16 cport; | 385 | __be16 cport; |
370 | __be16 vport; | 386 | __be16 vport; |
371 | __be16 dport; | 387 | __be16 dport; |
@@ -378,7 +394,6 @@ struct ip_vs_conn { | |||
378 | 394 | ||
379 | /* Flags and state transition */ | 395 | /* Flags and state transition */ |
380 | spinlock_t lock; /* lock for state transition */ | 396 | spinlock_t lock; /* lock for state transition */ |
381 | volatile __u16 flags; /* status flags */ | ||
382 | volatile __u16 state; /* state info */ | 397 | volatile __u16 state; /* state info */ |
383 | volatile __u16 old_state; /* old state, to be used for | 398 | volatile __u16 old_state; /* old state, to be used for |
384 | * state transition triggerd | 399 | * state transition triggerd |
@@ -394,6 +409,7 @@ struct ip_vs_conn { | |||
394 | /* packet transmitter for different forwarding methods. If it | 409 | /* packet transmitter for different forwarding methods. If it |
395 | mangles the packet, it must return NF_DROP or better NF_STOLEN, | 410 | mangles the packet, it must return NF_DROP or better NF_STOLEN, |
396 | otherwise this must be changed to a sk_buff **. | 411 | otherwise this must be changed to a sk_buff **. |
412 | NF_ACCEPT can be returned when destination is local. | ||
397 | */ | 413 | */ |
398 | int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp, | 414 | int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp, |
399 | struct ip_vs_protocol *pp); | 415 | struct ip_vs_protocol *pp); |
@@ -405,6 +421,9 @@ struct ip_vs_conn { | |||
405 | void *app_data; /* Application private data */ | 421 | void *app_data; /* Application private data */ |
406 | struct ip_vs_seq in_seq; /* incoming seq. struct */ | 422 | struct ip_vs_seq in_seq; /* incoming seq. struct */ |
407 | struct ip_vs_seq out_seq; /* outgoing seq. struct */ | 423 | struct ip_vs_seq out_seq; /* outgoing seq. struct */ |
424 | |||
425 | char *pe_data; | ||
426 | __u8 pe_data_len; | ||
408 | }; | 427 | }; |
409 | 428 | ||
410 | 429 | ||
@@ -426,6 +445,7 @@ struct ip_vs_service_user_kern { | |||
426 | 445 | ||
427 | /* virtual service options */ | 446 | /* virtual service options */ |
428 | char *sched_name; | 447 | char *sched_name; |
448 | char *pe_name; | ||
429 | unsigned flags; /* virtual service flags */ | 449 | unsigned flags; /* virtual service flags */ |
430 | unsigned timeout; /* persistent timeout in sec */ | 450 | unsigned timeout; /* persistent timeout in sec */ |
431 | u32 netmask; /* persistent netmask */ | 451 | u32 netmask; /* persistent netmask */ |
@@ -475,6 +495,9 @@ struct ip_vs_service { | |||
475 | struct ip_vs_scheduler *scheduler; /* bound scheduler object */ | 495 | struct ip_vs_scheduler *scheduler; /* bound scheduler object */ |
476 | rwlock_t sched_lock; /* lock sched_data */ | 496 | rwlock_t sched_lock; /* lock sched_data */ |
477 | void *sched_data; /* scheduler application data */ | 497 | void *sched_data; /* scheduler application data */ |
498 | |||
499 | /* alternate persistence engine */ | ||
500 | struct ip_vs_pe *pe; | ||
478 | }; | 501 | }; |
479 | 502 | ||
480 | 503 | ||
@@ -507,6 +530,10 @@ struct ip_vs_dest { | |||
507 | spinlock_t dst_lock; /* lock of dst_cache */ | 530 | spinlock_t dst_lock; /* lock of dst_cache */ |
508 | struct dst_entry *dst_cache; /* destination cache entry */ | 531 | struct dst_entry *dst_cache; /* destination cache entry */ |
509 | u32 dst_rtos; /* RT_TOS(tos) for dst */ | 532 | u32 dst_rtos; /* RT_TOS(tos) for dst */ |
533 | u32 dst_cookie; | ||
534 | #ifdef CONFIG_IP_VS_IPV6 | ||
535 | struct in6_addr dst_saddr; | ||
536 | #endif | ||
510 | 537 | ||
511 | /* for virtual service */ | 538 | /* for virtual service */ |
512 | struct ip_vs_service *svc; /* service it belongs to */ | 539 | struct ip_vs_service *svc; /* service it belongs to */ |
@@ -538,6 +565,21 @@ struct ip_vs_scheduler { | |||
538 | const struct sk_buff *skb); | 565 | const struct sk_buff *skb); |
539 | }; | 566 | }; |
540 | 567 | ||
568 | /* The persistence engine object */ | ||
569 | struct ip_vs_pe { | ||
570 | struct list_head n_list; /* d-linked list head */ | ||
571 | char *name; /* scheduler name */ | ||
572 | atomic_t refcnt; /* reference counter */ | ||
573 | struct module *module; /* THIS_MODULE/NULL */ | ||
574 | |||
575 | /* get the connection template, if any */ | ||
576 | int (*fill_param)(struct ip_vs_conn_param *p, struct sk_buff *skb); | ||
577 | bool (*ct_match)(const struct ip_vs_conn_param *p, | ||
578 | struct ip_vs_conn *ct); | ||
579 | u32 (*hashkey_raw)(const struct ip_vs_conn_param *p, u32 initval, | ||
580 | bool inverse); | ||
581 | int (*show_pe_data)(const struct ip_vs_conn *cp, char *buf); | ||
582 | }; | ||
541 | 583 | ||
542 | /* | 584 | /* |
543 | * The application module object (a.k.a. app incarnation) | 585 | * The application module object (a.k.a. app incarnation) |
@@ -556,11 +598,19 @@ struct ip_vs_app { | |||
556 | __be16 port; /* port number in net order */ | 598 | __be16 port; /* port number in net order */ |
557 | atomic_t usecnt; /* usage counter */ | 599 | atomic_t usecnt; /* usage counter */ |
558 | 600 | ||
559 | /* output hook: return false if can't linearize. diff set for TCP. */ | 601 | /* |
602 | * output hook: Process packet in inout direction, diff set for TCP. | ||
603 | * Return: 0=Error, 1=Payload Not Mangled/Mangled but checksum is ok, | ||
604 | * 2=Mangled but checksum was not updated | ||
605 | */ | ||
560 | int (*pkt_out)(struct ip_vs_app *, struct ip_vs_conn *, | 606 | int (*pkt_out)(struct ip_vs_app *, struct ip_vs_conn *, |
561 | struct sk_buff *, int *diff); | 607 | struct sk_buff *, int *diff); |
562 | 608 | ||
563 | /* input hook: return false if can't linearize. diff set for TCP. */ | 609 | /* |
610 | * input hook: Process packet in outin direction, diff set for TCP. | ||
611 | * Return: 0=Error, 1=Payload Not Mangled/Mangled but checksum is ok, | ||
612 | * 2=Mangled but checksum was not updated | ||
613 | */ | ||
564 | int (*pkt_in)(struct ip_vs_app *, struct ip_vs_conn *, | 614 | int (*pkt_in)(struct ip_vs_app *, struct ip_vs_conn *, |
565 | struct sk_buff *, int *diff); | 615 | struct sk_buff *, int *diff); |
566 | 616 | ||
@@ -624,13 +674,25 @@ enum { | |||
624 | IP_VS_DIR_LAST, | 674 | IP_VS_DIR_LAST, |
625 | }; | 675 | }; |
626 | 676 | ||
627 | extern struct ip_vs_conn *ip_vs_conn_in_get | 677 | static inline void ip_vs_conn_fill_param(int af, int protocol, |
628 | (int af, int protocol, const union nf_inet_addr *s_addr, __be16 s_port, | 678 | const union nf_inet_addr *caddr, |
629 | const union nf_inet_addr *d_addr, __be16 d_port); | 679 | __be16 cport, |
680 | const union nf_inet_addr *vaddr, | ||
681 | __be16 vport, | ||
682 | struct ip_vs_conn_param *p) | ||
683 | { | ||
684 | p->af = af; | ||
685 | p->protocol = protocol; | ||
686 | p->caddr = caddr; | ||
687 | p->cport = cport; | ||
688 | p->vaddr = vaddr; | ||
689 | p->vport = vport; | ||
690 | p->pe = NULL; | ||
691 | p->pe_data = NULL; | ||
692 | } | ||
630 | 693 | ||
631 | extern struct ip_vs_conn *ip_vs_ct_in_get | 694 | struct ip_vs_conn *ip_vs_conn_in_get(const struct ip_vs_conn_param *p); |
632 | (int af, int protocol, const union nf_inet_addr *s_addr, __be16 s_port, | 695 | struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p); |
633 | const union nf_inet_addr *d_addr, __be16 d_port); | ||
634 | 696 | ||
635 | struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, | 697 | struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, |
636 | struct ip_vs_protocol *pp, | 698 | struct ip_vs_protocol *pp, |
@@ -638,9 +700,7 @@ struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, | |||
638 | unsigned int proto_off, | 700 | unsigned int proto_off, |
639 | int inverse); | 701 | int inverse); |
640 | 702 | ||
641 | extern struct ip_vs_conn *ip_vs_conn_out_get | 703 | struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p); |
642 | (int af, int protocol, const union nf_inet_addr *s_addr, __be16 s_port, | ||
643 | const union nf_inet_addr *d_addr, __be16 d_port); | ||
644 | 704 | ||
645 | struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb, | 705 | struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb, |
646 | struct ip_vs_protocol *pp, | 706 | struct ip_vs_protocol *pp, |
@@ -656,11 +716,10 @@ static inline void __ip_vs_conn_put(struct ip_vs_conn *cp) | |||
656 | extern void ip_vs_conn_put(struct ip_vs_conn *cp); | 716 | extern void ip_vs_conn_put(struct ip_vs_conn *cp); |
657 | extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport); | 717 | extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport); |
658 | 718 | ||
659 | extern struct ip_vs_conn * | 719 | struct ip_vs_conn *ip_vs_conn_new(const struct ip_vs_conn_param *p, |
660 | ip_vs_conn_new(int af, int proto, const union nf_inet_addr *caddr, __be16 cport, | 720 | const union nf_inet_addr *daddr, |
661 | const union nf_inet_addr *vaddr, __be16 vport, | 721 | __be16 dport, unsigned flags, |
662 | const union nf_inet_addr *daddr, __be16 dport, unsigned flags, | 722 | struct ip_vs_dest *dest); |
663 | struct ip_vs_dest *dest); | ||
664 | extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); | 723 | extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); |
665 | 724 | ||
666 | extern const char * ip_vs_state_name(__u16 proto, int state); | 725 | extern const char * ip_vs_state_name(__u16 proto, int state); |
@@ -751,6 +810,12 @@ extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff *skb); | |||
751 | extern int ip_vs_app_init(void); | 810 | extern int ip_vs_app_init(void); |
752 | extern void ip_vs_app_cleanup(void); | 811 | extern void ip_vs_app_cleanup(void); |
753 | 812 | ||
813 | 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); | ||
815 | int register_ip_vs_pe(struct ip_vs_pe *pe); | ||
816 | int unregister_ip_vs_pe(struct ip_vs_pe *pe); | ||
817 | extern struct ip_vs_pe *ip_vs_pe_get(const char *name); | ||
818 | extern void ip_vs_pe_put(struct ip_vs_pe *pe); | ||
754 | 819 | ||
755 | /* | 820 | /* |
756 | * IPVS protocol functions (from ip_vs_proto.c) | 821 | * IPVS protocol functions (from ip_vs_proto.c) |
@@ -763,7 +828,8 @@ extern int | |||
763 | ip_vs_set_state_timeout(int *table, int num, const char *const *names, | 828 | ip_vs_set_state_timeout(int *table, int num, const char *const *names, |
764 | const char *name, int to); | 829 | const char *name, int to); |
765 | extern void | 830 | extern void |
766 | ip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb, | 831 | ip_vs_tcpudp_debug_packet(int af, struct ip_vs_protocol *pp, |
832 | const struct sk_buff *skb, | ||
767 | int offset, const char *msg); | 833 | int offset, const char *msg); |
768 | 834 | ||
769 | extern struct ip_vs_protocol ip_vs_protocol_tcp; | 835 | extern struct ip_vs_protocol ip_vs_protocol_tcp; |
@@ -785,7 +851,8 @@ extern int ip_vs_unbind_scheduler(struct ip_vs_service *svc); | |||
785 | extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name); | 851 | extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name); |
786 | extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); | 852 | extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); |
787 | extern struct ip_vs_conn * | 853 | extern struct ip_vs_conn * |
788 | ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb); | 854 | ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb, |
855 | struct ip_vs_protocol *pp, int *ignored); | ||
789 | extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, | 856 | extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, |
790 | struct ip_vs_protocol *pp); | 857 | struct ip_vs_protocol *pp); |
791 | 858 | ||
@@ -798,6 +865,8 @@ extern int sysctl_ip_vs_expire_nodest_conn; | |||
798 | extern int sysctl_ip_vs_expire_quiescent_template; | 865 | extern int sysctl_ip_vs_expire_quiescent_template; |
799 | extern int sysctl_ip_vs_sync_threshold[2]; | 866 | extern int sysctl_ip_vs_sync_threshold[2]; |
800 | extern int sysctl_ip_vs_nat_icmp_send; | 867 | extern int sysctl_ip_vs_nat_icmp_send; |
868 | extern int sysctl_ip_vs_conntrack; | ||
869 | extern int sysctl_ip_vs_snat_reroute; | ||
801 | extern struct ip_vs_stats ip_vs_stats; | 870 | extern struct ip_vs_stats ip_vs_stats; |
802 | extern const struct ctl_path net_vs_ctl_path[]; | 871 | extern const struct ctl_path net_vs_ctl_path[]; |
803 | 872 | ||
@@ -955,8 +1024,65 @@ static inline __wsum ip_vs_check_diff2(__be16 old, __be16 new, __wsum oldsum) | |||
955 | return csum_partial(diff, sizeof(diff), oldsum); | 1024 | return csum_partial(diff, sizeof(diff), oldsum); |
956 | } | 1025 | } |
957 | 1026 | ||
1027 | /* | ||
1028 | * Forget current conntrack (unconfirmed) and attach notrack entry | ||
1029 | */ | ||
1030 | static inline void ip_vs_notrack(struct sk_buff *skb) | ||
1031 | { | ||
1032 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | ||
1033 | enum ip_conntrack_info ctinfo; | ||
1034 | struct nf_conn *ct = ct = nf_ct_get(skb, &ctinfo); | ||
1035 | |||
1036 | if (!ct || !nf_ct_is_untracked(ct)) { | ||
1037 | nf_reset(skb); | ||
1038 | skb->nfct = &nf_ct_untracked_get()->ct_general; | ||
1039 | skb->nfctinfo = IP_CT_NEW; | ||
1040 | nf_conntrack_get(skb->nfct); | ||
1041 | } | ||
1042 | #endif | ||
1043 | } | ||
1044 | |||
1045 | #ifdef CONFIG_IP_VS_NFCT | ||
1046 | /* | ||
1047 | * Netfilter connection tracking | ||
1048 | * (from ip_vs_nfct.c) | ||
1049 | */ | ||
1050 | static inline int ip_vs_conntrack_enabled(void) | ||
1051 | { | ||
1052 | return sysctl_ip_vs_conntrack; | ||
1053 | } | ||
1054 | |||
958 | extern void ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp, | 1055 | extern void ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp, |
959 | int outin); | 1056 | int outin); |
1057 | extern int ip_vs_confirm_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp); | ||
1058 | extern void ip_vs_nfct_expect_related(struct sk_buff *skb, struct nf_conn *ct, | ||
1059 | struct ip_vs_conn *cp, u_int8_t proto, | ||
1060 | const __be16 port, int from_rs); | ||
1061 | extern void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp); | ||
1062 | |||
1063 | #else | ||
1064 | |||
1065 | static inline int ip_vs_conntrack_enabled(void) | ||
1066 | { | ||
1067 | return 0; | ||
1068 | } | ||
1069 | |||
1070 | static inline void ip_vs_update_conntrack(struct sk_buff *skb, | ||
1071 | struct ip_vs_conn *cp, int outin) | ||
1072 | { | ||
1073 | } | ||
1074 | |||
1075 | static inline int ip_vs_confirm_conntrack(struct sk_buff *skb, | ||
1076 | struct ip_vs_conn *cp) | ||
1077 | { | ||
1078 | return NF_ACCEPT; | ||
1079 | } | ||
1080 | |||
1081 | static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp) | ||
1082 | { | ||
1083 | } | ||
1084 | /* CONFIG_IP_VS_NFCT */ | ||
1085 | #endif | ||
960 | 1086 | ||
961 | #endif /* __KERNEL__ */ | 1087 | #endif /* __KERNEL__ */ |
962 | 1088 | ||
diff --git a/include/net/ipip.h b/include/net/ipip.h index 65caea8b414f..a32654d52730 100644 --- a/include/net/ipip.h +++ b/include/net/ipip.h | |||
@@ -16,7 +16,7 @@ struct ip_tunnel_6rd_parm { | |||
16 | }; | 16 | }; |
17 | 17 | ||
18 | struct ip_tunnel { | 18 | struct ip_tunnel { |
19 | struct ip_tunnel *next; | 19 | struct ip_tunnel __rcu *next; |
20 | struct net_device *dev; | 20 | struct net_device *dev; |
21 | 21 | ||
22 | int err_count; /* Number of arrived ICMP errors */ | 22 | int err_count; /* Number of arrived ICMP errors */ |
@@ -34,18 +34,18 @@ struct ip_tunnel { | |||
34 | #ifdef CONFIG_IPV6_SIT_6RD | 34 | #ifdef CONFIG_IPV6_SIT_6RD |
35 | struct ip_tunnel_6rd_parm ip6rd; | 35 | struct ip_tunnel_6rd_parm ip6rd; |
36 | #endif | 36 | #endif |
37 | struct ip_tunnel_prl_entry *prl; /* potential router list */ | 37 | struct ip_tunnel_prl_entry __rcu *prl; /* potential router list */ |
38 | unsigned int prl_count; /* # of entries in PRL */ | 38 | unsigned int prl_count; /* # of entries in PRL */ |
39 | }; | 39 | }; |
40 | 40 | ||
41 | struct ip_tunnel_prl_entry { | 41 | struct ip_tunnel_prl_entry { |
42 | struct ip_tunnel_prl_entry *next; | 42 | struct ip_tunnel_prl_entry __rcu *next; |
43 | __be32 addr; | 43 | __be32 addr; |
44 | u16 flags; | 44 | u16 flags; |
45 | struct rcu_head rcu_head; | 45 | struct rcu_head rcu_head; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | #define IPTUNNEL_XMIT() do { \ | 48 | #define __IPTUNNEL_XMIT(stats1, stats2) do { \ |
49 | int err; \ | 49 | int err; \ |
50 | int pkt_len = skb->len - skb_transport_offset(skb); \ | 50 | int pkt_len = skb->len - skb_transport_offset(skb); \ |
51 | \ | 51 | \ |
@@ -54,12 +54,14 @@ struct ip_tunnel_prl_entry { | |||
54 | \ | 54 | \ |
55 | err = ip_local_out(skb); \ | 55 | err = ip_local_out(skb); \ |
56 | if (likely(net_xmit_eval(err) == 0)) { \ | 56 | if (likely(net_xmit_eval(err) == 0)) { \ |
57 | txq->tx_bytes += pkt_len; \ | 57 | (stats1)->tx_bytes += pkt_len; \ |
58 | txq->tx_packets++; \ | 58 | (stats1)->tx_packets++; \ |
59 | } else { \ | 59 | } else { \ |
60 | stats->tx_errors++; \ | 60 | (stats2)->tx_errors++; \ |
61 | stats->tx_aborted_errors++; \ | 61 | (stats2)->tx_aborted_errors++; \ |
62 | } \ | 62 | } \ |
63 | } while (0) | 63 | } while (0) |
64 | 64 | ||
65 | #define IPTUNNEL_XMIT() __IPTUNNEL_XMIT(txq, stats) | ||
66 | |||
65 | #endif | 67 | #endif |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 1f8412410998..4a3cd2cd2f5e 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -262,7 +262,7 @@ static inline int ipv6_addr_scope(const struct in6_addr *addr) | |||
262 | 262 | ||
263 | static inline int __ipv6_addr_src_scope(int type) | 263 | static inline int __ipv6_addr_src_scope(int type) |
264 | { | 264 | { |
265 | return (type == IPV6_ADDR_ANY ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16)); | 265 | return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16); |
266 | } | 266 | } |
267 | 267 | ||
268 | static inline int ipv6_addr_src_scope(const struct in6_addr *addr) | 268 | static inline int ipv6_addr_src_scope(const struct in6_addr *addr) |
@@ -279,10 +279,10 @@ static inline int | |||
279 | ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m, | 279 | ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m, |
280 | const struct in6_addr *a2) | 280 | const struct in6_addr *a2) |
281 | { | 281 | { |
282 | return (!!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) | | 282 | return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) | |
283 | ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) | | 283 | ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) | |
284 | ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) | | 284 | ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) | |
285 | ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]))); | 285 | ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3])); |
286 | } | 286 | } |
287 | 287 | ||
288 | static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) | 288 | static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) |
@@ -317,10 +317,10 @@ static inline void ipv6_addr_set(struct in6_addr *addr, | |||
317 | static inline int ipv6_addr_equal(const struct in6_addr *a1, | 317 | static inline int ipv6_addr_equal(const struct in6_addr *a1, |
318 | const struct in6_addr *a2) | 318 | const struct in6_addr *a2) |
319 | { | 319 | { |
320 | return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) | | 320 | return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) | |
321 | (a1->s6_addr32[1] ^ a2->s6_addr32[1]) | | 321 | (a1->s6_addr32[1] ^ a2->s6_addr32[1]) | |
322 | (a1->s6_addr32[2] ^ a2->s6_addr32[2]) | | 322 | (a1->s6_addr32[2] ^ a2->s6_addr32[2]) | |
323 | (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0); | 323 | (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0; |
324 | } | 324 | } |
325 | 325 | ||
326 | static inline int __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2, | 326 | static inline int __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2, |
@@ -373,20 +373,20 @@ int ip6_frag_match(struct inet_frag_queue *q, void *a); | |||
373 | 373 | ||
374 | static inline int ipv6_addr_any(const struct in6_addr *a) | 374 | static inline int ipv6_addr_any(const struct in6_addr *a) |
375 | { | 375 | { |
376 | return ((a->s6_addr32[0] | a->s6_addr32[1] | | 376 | return (a->s6_addr32[0] | a->s6_addr32[1] | |
377 | a->s6_addr32[2] | a->s6_addr32[3] ) == 0); | 377 | a->s6_addr32[2] | a->s6_addr32[3]) == 0; |
378 | } | 378 | } |
379 | 379 | ||
380 | static inline int ipv6_addr_loopback(const struct in6_addr *a) | 380 | static inline int ipv6_addr_loopback(const struct in6_addr *a) |
381 | { | 381 | { |
382 | return ((a->s6_addr32[0] | a->s6_addr32[1] | | 382 | return (a->s6_addr32[0] | a->s6_addr32[1] | |
383 | a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0); | 383 | a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0; |
384 | } | 384 | } |
385 | 385 | ||
386 | static inline int ipv6_addr_v4mapped(const struct in6_addr *a) | 386 | static inline int ipv6_addr_v4mapped(const struct in6_addr *a) |
387 | { | 387 | { |
388 | return ((a->s6_addr32[0] | a->s6_addr32[1] | | 388 | return (a->s6_addr32[0] | a->s6_addr32[1] | |
389 | (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0); | 389 | (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0; |
390 | } | 390 | } |
391 | 391 | ||
392 | /* | 392 | /* |
@@ -395,8 +395,7 @@ static inline int ipv6_addr_v4mapped(const struct in6_addr *a) | |||
395 | */ | 395 | */ |
396 | static inline int ipv6_addr_orchid(const struct in6_addr *a) | 396 | static inline int ipv6_addr_orchid(const struct in6_addr *a) |
397 | { | 397 | { |
398 | return ((a->s6_addr32[0] & htonl(0xfffffff0)) | 398 | return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010); |
399 | == htonl(0x20010010)); | ||
400 | } | 399 | } |
401 | 400 | ||
402 | static inline void ipv6_addr_set_v4mapped(const __be32 addr, | 401 | static inline void ipv6_addr_set_v4mapped(const __be32 addr, |
@@ -441,7 +440,7 @@ static inline int __ipv6_addr_diff(const void *token1, const void *token2, int a | |||
441 | * if returned value is greater than prefix length. | 440 | * if returned value is greater than prefix length. |
442 | * --ANK (980803) | 441 | * --ANK (980803) |
443 | */ | 442 | */ |
444 | return (addrlen << 5); | 443 | return addrlen << 5; |
445 | } | 444 | } |
446 | 445 | ||
447 | static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2) | 446 | static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2) |
diff --git a/include/net/irda/irlan_common.h b/include/net/irda/irlan_common.h index 73cacb3ac16c..0af8b8dfbc22 100644 --- a/include/net/irda/irlan_common.h +++ b/include/net/irda/irlan_common.h | |||
@@ -171,7 +171,6 @@ struct irlan_cb { | |||
171 | int magic; | 171 | int magic; |
172 | struct list_head dev_list; | 172 | struct list_head dev_list; |
173 | struct net_device *dev; /* Ethernet device structure*/ | 173 | struct net_device *dev; /* Ethernet device structure*/ |
174 | struct net_device_stats stats; | ||
175 | 174 | ||
176 | __u32 saddr; /* Source device address */ | 175 | __u32 saddr; /* Source device address */ |
177 | __u32 daddr; /* Destination device address */ | 176 | __u32 daddr; /* Destination device address */ |
diff --git a/include/net/irda/irlan_event.h b/include/net/irda/irlan_event.h index 6d9539f05806..018b5a77e610 100644 --- a/include/net/irda/irlan_event.h +++ b/include/net/irda/irlan_event.h | |||
@@ -67,7 +67,7 @@ typedef enum { | |||
67 | IRLAN_WATCHDOG_TIMEOUT, | 67 | IRLAN_WATCHDOG_TIMEOUT, |
68 | } IRLAN_EVENT; | 68 | } IRLAN_EVENT; |
69 | 69 | ||
70 | extern char *irlan_state[]; | 70 | extern const char * const irlan_state[]; |
71 | 71 | ||
72 | void irlan_do_client_event(struct irlan_cb *self, IRLAN_EVENT event, | 72 | void irlan_do_client_event(struct irlan_cb *self, IRLAN_EVENT event, |
73 | struct sk_buff *skb); | 73 | struct sk_buff *skb); |
diff --git a/include/net/irda/irlap.h b/include/net/irda/irlap.h index 9d0c78ea92f5..17fcd964f9d9 100644 --- a/include/net/irda/irlap.h +++ b/include/net/irda/irlap.h | |||
@@ -282,7 +282,7 @@ static inline int irlap_is_primary(struct irlap_cb *self) | |||
282 | default: | 282 | default: |
283 | ret = -1; | 283 | ret = -1; |
284 | } | 284 | } |
285 | return(ret); | 285 | return ret; |
286 | } | 286 | } |
287 | 287 | ||
288 | /* Clear a pending IrLAP disconnect. - Jean II */ | 288 | /* Clear a pending IrLAP disconnect. - Jean II */ |
diff --git a/include/net/irda/irlmp.h b/include/net/irda/irlmp.h index 3ffc1d0f93d6..fff11b7fe8a4 100644 --- a/include/net/irda/irlmp.h +++ b/include/net/irda/irlmp.h | |||
@@ -274,7 +274,7 @@ static inline int irlmp_lap_tx_queue_full(struct lsap_cb *self) | |||
274 | if (self->lap->irlap == NULL) | 274 | if (self->lap->irlap == NULL) |
275 | return 0; | 275 | return 0; |
276 | 276 | ||
277 | return(IRLAP_GET_TX_QUEUE_LEN(self->lap->irlap) >= LAP_HIGH_THRESHOLD); | 277 | return IRLAP_GET_TX_QUEUE_LEN(self->lap->irlap) >= LAP_HIGH_THRESHOLD; |
278 | } | 278 | } |
279 | 279 | ||
280 | /* After doing a irlmp_dup(), this get one of the two socket back into | 280 | /* After doing a irlmp_dup(), this get one of the two socket back into |
diff --git a/include/net/irda/irttp.h b/include/net/irda/irttp.h index 11aee7a2972a..af4b87721d13 100644 --- a/include/net/irda/irttp.h +++ b/include/net/irda/irttp.h | |||
@@ -204,7 +204,7 @@ static inline int irttp_is_primary(struct tsap_cb *self) | |||
204 | (self->lsap->lap == NULL) || | 204 | (self->lsap->lap == NULL) || |
205 | (self->lsap->lap->irlap == NULL)) | 205 | (self->lsap->lap->irlap == NULL)) |
206 | return -2; | 206 | return -2; |
207 | return(irlap_is_primary(self->lsap->lap->irlap)); | 207 | return irlap_is_primary(self->lsap->lap->irlap); |
208 | } | 208 | } |
209 | 209 | ||
210 | #endif /* IRTTP_H */ | 210 | #endif /* IRTTP_H */ |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index b0787a1dea90..9fdf982d1286 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -149,6 +149,7 @@ struct ieee80211_low_level_stats { | |||
149 | * @BSS_CHANGED_ARP_FILTER: Hardware ARP filter address list or state changed. | 149 | * @BSS_CHANGED_ARP_FILTER: Hardware ARP filter address list or state changed. |
150 | * @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note | 150 | * @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note |
151 | * that it is only ever disabled for station mode. | 151 | * that it is only ever disabled for station mode. |
152 | * @BSS_CHANGED_IDLE: Idle changed for this BSS/interface. | ||
152 | */ | 153 | */ |
153 | enum ieee80211_bss_change { | 154 | enum ieee80211_bss_change { |
154 | BSS_CHANGED_ASSOC = 1<<0, | 155 | BSS_CHANGED_ASSOC = 1<<0, |
@@ -165,6 +166,7 @@ enum ieee80211_bss_change { | |||
165 | BSS_CHANGED_IBSS = 1<<11, | 166 | BSS_CHANGED_IBSS = 1<<11, |
166 | BSS_CHANGED_ARP_FILTER = 1<<12, | 167 | BSS_CHANGED_ARP_FILTER = 1<<12, |
167 | BSS_CHANGED_QOS = 1<<13, | 168 | BSS_CHANGED_QOS = 1<<13, |
169 | BSS_CHANGED_IDLE = 1<<14, | ||
168 | 170 | ||
169 | /* when adding here, make sure to change ieee80211_reconfig */ | 171 | /* when adding here, make sure to change ieee80211_reconfig */ |
170 | }; | 172 | }; |
@@ -223,6 +225,9 @@ enum ieee80211_bss_change { | |||
223 | * hardware must not perform any ARP filtering. Note, that the filter will | 225 | * hardware must not perform any ARP filtering. Note, that the filter will |
224 | * be enabled also in promiscuous mode. | 226 | * be enabled also in promiscuous mode. |
225 | * @qos: This is a QoS-enabled BSS. | 227 | * @qos: This is a QoS-enabled BSS. |
228 | * @idle: This interface is idle. There's also a global idle flag in the | ||
229 | * hardware config which may be more appropriate depending on what | ||
230 | * your driver/device needs to do. | ||
226 | */ | 231 | */ |
227 | struct ieee80211_bss_conf { | 232 | struct ieee80211_bss_conf { |
228 | const u8 *bssid; | 233 | const u8 *bssid; |
@@ -247,6 +252,7 @@ struct ieee80211_bss_conf { | |||
247 | u8 arp_addr_cnt; | 252 | u8 arp_addr_cnt; |
248 | bool arp_filter_enabled; | 253 | bool arp_filter_enabled; |
249 | bool qos; | 254 | bool qos; |
255 | bool idle; | ||
250 | }; | 256 | }; |
251 | 257 | ||
252 | /** | 258 | /** |
@@ -315,6 +321,9 @@ struct ieee80211_bss_conf { | |||
315 | * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame | 321 | * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame |
316 | * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this | 322 | * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this |
317 | * frame and selects the maximum number of streams that it can use. | 323 | * frame and selects the maximum number of streams that it can use. |
324 | * | ||
325 | * Note: If you have to add new flags to the enumeration, then don't | ||
326 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. | ||
318 | */ | 327 | */ |
319 | enum mac80211_tx_control_flags { | 328 | enum mac80211_tx_control_flags { |
320 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), | 329 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), |
@@ -344,6 +353,19 @@ enum mac80211_tx_control_flags { | |||
344 | 353 | ||
345 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 | 354 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 |
346 | 355 | ||
356 | /* | ||
357 | * This definition is used as a mask to clear all temporary flags, which are | ||
358 | * set by the tx handlers for each transmission attempt by the mac80211 stack. | ||
359 | */ | ||
360 | #define IEEE80211_TX_TEMPORARY_FLAGS (IEEE80211_TX_CTL_NO_ACK | \ | ||
361 | IEEE80211_TX_CTL_CLEAR_PS_FILT | IEEE80211_TX_CTL_FIRST_FRAGMENT | \ | ||
362 | IEEE80211_TX_CTL_SEND_AFTER_DTIM | IEEE80211_TX_CTL_AMPDU | \ | ||
363 | IEEE80211_TX_STAT_TX_FILTERED | IEEE80211_TX_STAT_ACK | \ | ||
364 | IEEE80211_TX_STAT_AMPDU | IEEE80211_TX_STAT_AMPDU_NO_BACK | \ | ||
365 | IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_PSPOLL_RESPONSE | \ | ||
366 | IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC | \ | ||
367 | IEEE80211_TX_CTL_STBC) | ||
368 | |||
347 | /** | 369 | /** |
348 | * enum mac80211_rate_control_flags - per-rate flags set by the | 370 | * enum mac80211_rate_control_flags - per-rate flags set by the |
349 | * Rate Control algorithm. | 371 | * Rate Control algorithm. |
@@ -559,9 +581,6 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
559 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index | 581 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index |
560 | * @RX_FLAG_40MHZ: HT40 (40 MHz) was used | 582 | * @RX_FLAG_40MHZ: HT40 (40 MHz) was used |
561 | * @RX_FLAG_SHORT_GI: Short guard interval was used | 583 | * @RX_FLAG_SHORT_GI: Short guard interval was used |
562 | * @RX_FLAG_INTERNAL_CMTR: set internally after frame was reported | ||
563 | * on cooked monitor to avoid double-reporting it for multiple | ||
564 | * virtual interfaces | ||
565 | */ | 584 | */ |
566 | enum mac80211_rx_flags { | 585 | enum mac80211_rx_flags { |
567 | RX_FLAG_MMIC_ERROR = 1<<0, | 586 | RX_FLAG_MMIC_ERROR = 1<<0, |
@@ -575,7 +594,6 @@ enum mac80211_rx_flags { | |||
575 | RX_FLAG_HT = 1<<9, | 594 | RX_FLAG_HT = 1<<9, |
576 | RX_FLAG_40MHZ = 1<<10, | 595 | RX_FLAG_40MHZ = 1<<10, |
577 | RX_FLAG_SHORT_GI = 1<<11, | 596 | RX_FLAG_SHORT_GI = 1<<11, |
578 | RX_FLAG_INTERNAL_CMTR = 1<<12, | ||
579 | }; | 597 | }; |
580 | 598 | ||
581 | /** | 599 | /** |
@@ -596,6 +614,7 @@ enum mac80211_rx_flags { | |||
596 | * @rate_idx: index of data rate into band's supported rates or MCS index if | 614 | * @rate_idx: index of data rate into band's supported rates or MCS index if |
597 | * HT rates are use (RX_FLAG_HT) | 615 | * HT rates are use (RX_FLAG_HT) |
598 | * @flag: %RX_FLAG_* | 616 | * @flag: %RX_FLAG_* |
617 | * @rx_flags: internal RX flags for mac80211 | ||
599 | */ | 618 | */ |
600 | struct ieee80211_rx_status { | 619 | struct ieee80211_rx_status { |
601 | u64 mactime; | 620 | u64 mactime; |
@@ -605,6 +624,7 @@ struct ieee80211_rx_status { | |||
605 | int antenna; | 624 | int antenna; |
606 | int rate_idx; | 625 | int rate_idx; |
607 | int flag; | 626 | int flag; |
627 | unsigned int rx_flags; | ||
608 | }; | 628 | }; |
609 | 629 | ||
610 | /** | 630 | /** |
@@ -763,6 +783,8 @@ struct ieee80211_channel_switch { | |||
763 | * @bss_conf: BSS configuration for this interface, either our own | 783 | * @bss_conf: BSS configuration for this interface, either our own |
764 | * or the BSS we're associated to | 784 | * or the BSS we're associated to |
765 | * @addr: address of this interface | 785 | * @addr: address of this interface |
786 | * @p2p: indicates whether this AP or STA interface is a p2p | ||
787 | * interface, i.e. a GO or p2p-sta respectively | ||
766 | * @drv_priv: data area for driver use, will always be aligned to | 788 | * @drv_priv: data area for driver use, will always be aligned to |
767 | * sizeof(void *). | 789 | * sizeof(void *). |
768 | */ | 790 | */ |
@@ -770,6 +792,7 @@ struct ieee80211_vif { | |||
770 | enum nl80211_iftype type; | 792 | enum nl80211_iftype type; |
771 | struct ieee80211_bss_conf bss_conf; | 793 | struct ieee80211_bss_conf bss_conf; |
772 | u8 addr[ETH_ALEN]; | 794 | u8 addr[ETH_ALEN]; |
795 | bool p2p; | ||
773 | /* must be last */ | 796 | /* must be last */ |
774 | u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); | 797 | u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); |
775 | }; | 798 | }; |
@@ -783,20 +806,6 @@ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif) | |||
783 | } | 806 | } |
784 | 807 | ||
785 | /** | 808 | /** |
786 | * enum ieee80211_key_alg - key algorithm | ||
787 | * @ALG_WEP: WEP40 or WEP104 | ||
788 | * @ALG_TKIP: TKIP | ||
789 | * @ALG_CCMP: CCMP (AES) | ||
790 | * @ALG_AES_CMAC: AES-128-CMAC | ||
791 | */ | ||
792 | enum ieee80211_key_alg { | ||
793 | ALG_WEP, | ||
794 | ALG_TKIP, | ||
795 | ALG_CCMP, | ||
796 | ALG_AES_CMAC, | ||
797 | }; | ||
798 | |||
799 | /** | ||
800 | * enum ieee80211_key_flags - key flags | 809 | * enum ieee80211_key_flags - key flags |
801 | * | 810 | * |
802 | * These flags are used for communication about keys between the driver | 811 | * These flags are used for communication about keys between the driver |
@@ -833,7 +842,7 @@ enum ieee80211_key_flags { | |||
833 | * @hw_key_idx: To be set by the driver, this is the key index the driver | 842 | * @hw_key_idx: To be set by the driver, this is the key index the driver |
834 | * wants to be given when a frame is transmitted and needs to be | 843 | * wants to be given when a frame is transmitted and needs to be |
835 | * encrypted in hardware. | 844 | * encrypted in hardware. |
836 | * @alg: The key algorithm. | 845 | * @cipher: The key's cipher suite selector. |
837 | * @flags: key flags, see &enum ieee80211_key_flags. | 846 | * @flags: key flags, see &enum ieee80211_key_flags. |
838 | * @keyidx: the key index (0-3) | 847 | * @keyidx: the key index (0-3) |
839 | * @keylen: key material length | 848 | * @keylen: key material length |
@@ -846,7 +855,7 @@ enum ieee80211_key_flags { | |||
846 | * @iv_len: The IV length for this key type | 855 | * @iv_len: The IV length for this key type |
847 | */ | 856 | */ |
848 | struct ieee80211_key_conf { | 857 | struct ieee80211_key_conf { |
849 | enum ieee80211_key_alg alg; | 858 | u32 cipher; |
850 | u8 icv_len; | 859 | u8 icv_len; |
851 | u8 iv_len; | 860 | u8 iv_len; |
852 | u8 hw_key_idx; | 861 | u8 hw_key_idx; |
@@ -1032,6 +1041,13 @@ enum ieee80211_tkip_key_type { | |||
1032 | * @IEEE80211_HW_NEED_DTIM_PERIOD: | 1041 | * @IEEE80211_HW_NEED_DTIM_PERIOD: |
1033 | * This device needs to know the DTIM period for the BSS before | 1042 | * This device needs to know the DTIM period for the BSS before |
1034 | * associating. | 1043 | * associating. |
1044 | * | ||
1045 | * @IEEE80211_HW_SUPPORTS_PER_STA_GTK: The device's crypto engine supports | ||
1046 | * per-station GTKs as used by IBSS RSN or during fast transition. If | ||
1047 | * the device doesn't support per-station GTKs, but can be asked not | ||
1048 | * to decrypt group addressed frames, then IBSS RSN support is still | ||
1049 | * possible but software crypto will be used. Advertise the wiphy flag | ||
1050 | * only in that case. | ||
1035 | */ | 1051 | */ |
1036 | enum ieee80211_hw_flags { | 1052 | enum ieee80211_hw_flags { |
1037 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, | 1053 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, |
@@ -1055,6 +1071,7 @@ enum ieee80211_hw_flags { | |||
1055 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, | 1071 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, |
1056 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, | 1072 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, |
1057 | IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20, | 1073 | IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20, |
1074 | IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21, | ||
1058 | }; | 1075 | }; |
1059 | 1076 | ||
1060 | /** | 1077 | /** |
@@ -1100,8 +1117,15 @@ enum ieee80211_hw_flags { | |||
1100 | * @sta_data_size: size (in bytes) of the drv_priv data area | 1117 | * @sta_data_size: size (in bytes) of the drv_priv data area |
1101 | * within &struct ieee80211_sta. | 1118 | * within &struct ieee80211_sta. |
1102 | * | 1119 | * |
1103 | * @max_rates: maximum number of alternate rate retry stages | 1120 | * @max_rates: maximum number of alternate rate retry stages the hw |
1121 | * can handle. | ||
1122 | * @max_report_rates: maximum number of alternate rate retry stages | ||
1123 | * the hw can report back. | ||
1104 | * @max_rate_tries: maximum number of tries for each stage | 1124 | * @max_rate_tries: maximum number of tries for each stage |
1125 | * | ||
1126 | * @napi_weight: weight used for NAPI polling. You must specify an | ||
1127 | * appropriate value here if a napi_poll operation is provided | ||
1128 | * by your driver. | ||
1105 | */ | 1129 | */ |
1106 | struct ieee80211_hw { | 1130 | struct ieee80211_hw { |
1107 | struct ieee80211_conf conf; | 1131 | struct ieee80211_conf conf; |
@@ -1113,10 +1137,12 @@ struct ieee80211_hw { | |||
1113 | int channel_change_time; | 1137 | int channel_change_time; |
1114 | int vif_data_size; | 1138 | int vif_data_size; |
1115 | int sta_data_size; | 1139 | int sta_data_size; |
1140 | int napi_weight; | ||
1116 | u16 queues; | 1141 | u16 queues; |
1117 | u16 max_listen_interval; | 1142 | u16 max_listen_interval; |
1118 | s8 max_signal; | 1143 | s8 max_signal; |
1119 | u8 max_rates; | 1144 | u8 max_rates; |
1145 | u8 max_report_rates; | ||
1120 | u8 max_rate_tries; | 1146 | u8 max_rate_tries; |
1121 | }; | 1147 | }; |
1122 | 1148 | ||
@@ -1245,8 +1271,8 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw, | |||
1245 | * %IEEE80211_CONF_PS flag enabled means that the powersave mode defined in | 1271 | * %IEEE80211_CONF_PS flag enabled means that the powersave mode defined in |
1246 | * IEEE 802.11-2007 section 11.2 is enabled. This is not to be confused | 1272 | * IEEE 802.11-2007 section 11.2 is enabled. This is not to be confused |
1247 | * with hardware wakeup and sleep states. Driver is responsible for waking | 1273 | * with hardware wakeup and sleep states. Driver is responsible for waking |
1248 | * up the hardware before issueing commands to the hardware and putting it | 1274 | * up the hardware before issuing commands to the hardware and putting it |
1249 | * back to sleep at approriate times. | 1275 | * back to sleep at appropriate times. |
1250 | * | 1276 | * |
1251 | * When PS is enabled, hardware needs to wakeup for beacons and receive the | 1277 | * When PS is enabled, hardware needs to wakeup for beacons and receive the |
1252 | * buffered multicast/broadcast frames after the beacon. Also it must be | 1278 | * buffered multicast/broadcast frames after the beacon. Also it must be |
@@ -1267,7 +1293,7 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw, | |||
1267 | * there's data traffic and still saving significantly power in idle | 1293 | * there's data traffic and still saving significantly power in idle |
1268 | * periods. | 1294 | * periods. |
1269 | * | 1295 | * |
1270 | * Dynamic powersave is supported by simply mac80211 enabling and disabling | 1296 | * Dynamic powersave is simply supported by mac80211 enabling and disabling |
1271 | * PS based on traffic. Driver needs to only set %IEEE80211_HW_SUPPORTS_PS | 1297 | * PS based on traffic. Driver needs to only set %IEEE80211_HW_SUPPORTS_PS |
1272 | * flag and mac80211 will handle everything automatically. Additionally, | 1298 | * flag and mac80211 will handle everything automatically. Additionally, |
1273 | * hardware having support for the dynamic PS feature may set the | 1299 | * hardware having support for the dynamic PS feature may set the |
@@ -1452,12 +1478,14 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw, | |||
1452 | * honour this flag if possible. | 1478 | * honour this flag if possible. |
1453 | * | 1479 | * |
1454 | * @FIF_CONTROL: pass control frames (except for PS Poll), if PROMISC_IN_BSS | 1480 | * @FIF_CONTROL: pass control frames (except for PS Poll), if PROMISC_IN_BSS |
1455 | * is not set then only those addressed to this station. | 1481 | * is not set then only those addressed to this station. |
1456 | * | 1482 | * |
1457 | * @FIF_OTHER_BSS: pass frames destined to other BSSes | 1483 | * @FIF_OTHER_BSS: pass frames destined to other BSSes |
1458 | * | 1484 | * |
1459 | * @FIF_PSPOLL: pass PS Poll frames, if PROMISC_IN_BSS is not set then only | 1485 | * @FIF_PSPOLL: pass PS Poll frames, if PROMISC_IN_BSS is not set then only |
1460 | * those addressed to this station. | 1486 | * those addressed to this station. |
1487 | * | ||
1488 | * @FIF_PROBE_REQ: pass probe request frames | ||
1461 | */ | 1489 | */ |
1462 | enum ieee80211_filter_flags { | 1490 | enum ieee80211_filter_flags { |
1463 | FIF_PROMISC_IN_BSS = 1<<0, | 1491 | FIF_PROMISC_IN_BSS = 1<<0, |
@@ -1468,6 +1496,7 @@ enum ieee80211_filter_flags { | |||
1468 | FIF_CONTROL = 1<<5, | 1496 | FIF_CONTROL = 1<<5, |
1469 | FIF_OTHER_BSS = 1<<6, | 1497 | FIF_OTHER_BSS = 1<<6, |
1470 | FIF_PSPOLL = 1<<7, | 1498 | FIF_PSPOLL = 1<<7, |
1499 | FIF_PROBE_REQ = 1<<8, | ||
1471 | }; | 1500 | }; |
1472 | 1501 | ||
1473 | /** | 1502 | /** |
@@ -1540,6 +1569,12 @@ enum ieee80211_ampdu_mlme_action { | |||
1540 | * negative error code (which will be seen in userspace.) | 1569 | * negative error code (which will be seen in userspace.) |
1541 | * Must be implemented and can sleep. | 1570 | * Must be implemented and can sleep. |
1542 | * | 1571 | * |
1572 | * @change_interface: Called when a netdevice changes type. This callback | ||
1573 | * is optional, but only if it is supported can interface types be | ||
1574 | * switched while the interface is UP. The callback may sleep. | ||
1575 | * Note that while an interface is being switched, it will not be | ||
1576 | * found by the interface iteration callbacks. | ||
1577 | * | ||
1543 | * @remove_interface: Notifies a driver that an interface is going down. | 1578 | * @remove_interface: Notifies a driver that an interface is going down. |
1544 | * The @stop callback is called after this if it is the last interface | 1579 | * The @stop callback is called after this if it is the last interface |
1545 | * and no monitor interfaces are present. | 1580 | * and no monitor interfaces are present. |
@@ -1687,6 +1722,8 @@ enum ieee80211_ampdu_mlme_action { | |||
1687 | * switch operation for CSAs received from the AP may implement this | 1722 | * switch operation for CSAs received from the AP may implement this |
1688 | * callback. They must then call ieee80211_chswitch_done() to indicate | 1723 | * callback. They must then call ieee80211_chswitch_done() to indicate |
1689 | * completion of the channel switch. | 1724 | * completion of the channel switch. |
1725 | * | ||
1726 | * @napi_poll: Poll Rx queue for incoming data frames. | ||
1690 | */ | 1727 | */ |
1691 | struct ieee80211_ops { | 1728 | struct ieee80211_ops { |
1692 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); | 1729 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); |
@@ -1694,6 +1731,9 @@ struct ieee80211_ops { | |||
1694 | void (*stop)(struct ieee80211_hw *hw); | 1731 | void (*stop)(struct ieee80211_hw *hw); |
1695 | int (*add_interface)(struct ieee80211_hw *hw, | 1732 | int (*add_interface)(struct ieee80211_hw *hw, |
1696 | struct ieee80211_vif *vif); | 1733 | struct ieee80211_vif *vif); |
1734 | int (*change_interface)(struct ieee80211_hw *hw, | ||
1735 | struct ieee80211_vif *vif, | ||
1736 | enum nl80211_iftype new_type, bool p2p); | ||
1697 | void (*remove_interface)(struct ieee80211_hw *hw, | 1737 | void (*remove_interface)(struct ieee80211_hw *hw, |
1698 | struct ieee80211_vif *vif); | 1738 | struct ieee80211_vif *vif); |
1699 | int (*config)(struct ieee80211_hw *hw, u32 changed); | 1739 | int (*config)(struct ieee80211_hw *hw, u32 changed); |
@@ -1752,6 +1792,7 @@ struct ieee80211_ops { | |||
1752 | void (*flush)(struct ieee80211_hw *hw, bool drop); | 1792 | void (*flush)(struct ieee80211_hw *hw, bool drop); |
1753 | void (*channel_switch)(struct ieee80211_hw *hw, | 1793 | void (*channel_switch)(struct ieee80211_hw *hw, |
1754 | struct ieee80211_channel_switch *ch_switch); | 1794 | struct ieee80211_channel_switch *ch_switch); |
1795 | int (*napi_poll)(struct ieee80211_hw *hw, int budget); | ||
1755 | }; | 1796 | }; |
1756 | 1797 | ||
1757 | /** | 1798 | /** |
@@ -1897,6 +1938,22 @@ void ieee80211_free_hw(struct ieee80211_hw *hw); | |||
1897 | */ | 1938 | */ |
1898 | void ieee80211_restart_hw(struct ieee80211_hw *hw); | 1939 | void ieee80211_restart_hw(struct ieee80211_hw *hw); |
1899 | 1940 | ||
1941 | /** ieee80211_napi_schedule - schedule NAPI poll | ||
1942 | * | ||
1943 | * Use this function to schedule NAPI polling on a device. | ||
1944 | * | ||
1945 | * @hw: the hardware to start polling | ||
1946 | */ | ||
1947 | void ieee80211_napi_schedule(struct ieee80211_hw *hw); | ||
1948 | |||
1949 | /** ieee80211_napi_complete - complete NAPI polling | ||
1950 | * | ||
1951 | * Use this function to finish NAPI polling on a device. | ||
1952 | * | ||
1953 | * @hw: the hardware to stop polling | ||
1954 | */ | ||
1955 | void ieee80211_napi_complete(struct ieee80211_hw *hw); | ||
1956 | |||
1900 | /** | 1957 | /** |
1901 | * ieee80211_rx - receive frame | 1958 | * ieee80211_rx - receive frame |
1902 | * | 1959 | * |
@@ -2252,7 +2309,8 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw); | |||
2252 | * | 2309 | * |
2253 | * When hardware scan offload is used (i.e. the hw_scan() callback is | 2310 | * When hardware scan offload is used (i.e. the hw_scan() callback is |
2254 | * assigned) this function needs to be called by the driver to notify | 2311 | * assigned) this function needs to be called by the driver to notify |
2255 | * mac80211 that the scan finished. | 2312 | * mac80211 that the scan finished. This function can be called from |
2313 | * any context, including hardirq context. | ||
2256 | * | 2314 | * |
2257 | * @hw: the hardware that finished the scan | 2315 | * @hw: the hardware that finished the scan |
2258 | * @aborted: set to true if scan was aborted | 2316 | * @aborted: set to true if scan was aborted |
@@ -2267,6 +2325,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted); | |||
2267 | * This function allows the iterator function to sleep, when the iterator | 2325 | * This function allows the iterator function to sleep, when the iterator |
2268 | * function is atomic @ieee80211_iterate_active_interfaces_atomic can | 2326 | * function is atomic @ieee80211_iterate_active_interfaces_atomic can |
2269 | * be used. | 2327 | * be used. |
2328 | * Does not iterate over a new interface during add_interface() | ||
2270 | * | 2329 | * |
2271 | * @hw: the hardware struct of which the interfaces should be iterated over | 2330 | * @hw: the hardware struct of which the interfaces should be iterated over |
2272 | * @iterator: the iterator function to call | 2331 | * @iterator: the iterator function to call |
@@ -2284,6 +2343,7 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, | |||
2284 | * hardware that are currently active and calls the callback for them. | 2343 | * hardware that are currently active and calls the callback for them. |
2285 | * This function requires the iterator callback function to be atomic, | 2344 | * This function requires the iterator callback function to be atomic, |
2286 | * if that is not desired, use @ieee80211_iterate_active_interfaces instead. | 2345 | * if that is not desired, use @ieee80211_iterate_active_interfaces instead. |
2346 | * Does not iterate over a new interface during add_interface() | ||
2287 | * | 2347 | * |
2288 | * @hw: the hardware struct of which the interfaces should be iterated over | 2348 | * @hw: the hardware struct of which the interfaces should be iterated over |
2289 | * @iterator: the iterator function to call, cannot sleep | 2349 | * @iterator: the iterator function to call, cannot sleep |
@@ -2385,25 +2445,28 @@ struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif, | |||
2385 | const u8 *addr); | 2445 | const u8 *addr); |
2386 | 2446 | ||
2387 | /** | 2447 | /** |
2388 | * ieee80211_find_sta_by_hw - find a station on hardware | 2448 | * ieee80211_find_sta_by_ifaddr - find a station on hardware |
2389 | * | 2449 | * |
2390 | * @hw: pointer as obtained from ieee80211_alloc_hw() | 2450 | * @hw: pointer as obtained from ieee80211_alloc_hw() |
2391 | * @addr: station's address | 2451 | * @addr: remote station's address |
2452 | * @localaddr: local address (vif->sdata->vif.addr). Use NULL for 'any'. | ||
2392 | * | 2453 | * |
2393 | * This function must be called under RCU lock and the | 2454 | * This function must be called under RCU lock and the |
2394 | * resulting pointer is only valid under RCU lock as well. | 2455 | * resulting pointer is only valid under RCU lock as well. |
2395 | * | 2456 | * |
2396 | * NOTE: This function should not be used! When mac80211 is converted | 2457 | * NOTE: You may pass NULL for localaddr, but then you will just get |
2397 | * internally to properly keep track of stations on multiple | 2458 | * the first STA that matches the remote address 'addr'. |
2398 | * virtual interfaces, it will not always know which station to | 2459 | * We can have multiple STA associated with multiple |
2399 | * return here since a single address might be used by multiple | 2460 | * logical stations (e.g. consider a station connecting to another |
2400 | * logical stations (e.g. consider a station connecting to another | 2461 | * BSSID on the same AP hardware without disconnecting first). |
2401 | * BSSID on the same AP hardware without disconnecting first). | 2462 | * In this case, the result of this method with localaddr NULL |
2463 | * is not reliable. | ||
2402 | * | 2464 | * |
2403 | * DO NOT USE THIS FUNCTION. | 2465 | * DO NOT USE THIS FUNCTION with localaddr NULL if at all possible. |
2404 | */ | 2466 | */ |
2405 | struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw, | 2467 | struct ieee80211_sta *ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw, |
2406 | const u8 *addr); | 2468 | const u8 *addr, |
2469 | const u8 *localaddr); | ||
2407 | 2470 | ||
2408 | /** | 2471 | /** |
2409 | * ieee80211_sta_block_awake - block station from waking up | 2472 | * ieee80211_sta_block_awake - block station from waking up |
@@ -2442,7 +2505,7 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw, | |||
2442 | * | 2505 | * |
2443 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 2506 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
2444 | * | 2507 | * |
2445 | * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTERING and | 2508 | * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTER and |
2446 | * %IEEE80211_CONF_PS is set, the driver needs to inform whenever the | 2509 | * %IEEE80211_CONF_PS is set, the driver needs to inform whenever the |
2447 | * hardware is not receiving beacons with this function. | 2510 | * hardware is not receiving beacons with this function. |
2448 | */ | 2511 | */ |
@@ -2453,7 +2516,7 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif); | |||
2453 | * | 2516 | * |
2454 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 2517 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
2455 | * | 2518 | * |
2456 | * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTERING, and | 2519 | * When beacon filtering is enabled with %IEEE80211_HW_BEACON_FILTER, and |
2457 | * %IEEE80211_CONF_PS and %IEEE80211_HW_CONNECTION_MONITOR are set, the driver | 2520 | * %IEEE80211_CONF_PS and %IEEE80211_HW_CONNECTION_MONITOR are set, the driver |
2458 | * needs to inform if the connection to the AP has been lost. | 2521 | * needs to inform if the connection to the AP has been lost. |
2459 | * | 2522 | * |
@@ -2518,6 +2581,34 @@ void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif, | |||
2518 | */ | 2581 | */ |
2519 | void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success); | 2582 | void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success); |
2520 | 2583 | ||
2584 | /** | ||
2585 | * ieee80211_request_smps - request SM PS transition | ||
2586 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | ||
2587 | * @smps_mode: new SM PS mode | ||
2588 | * | ||
2589 | * This allows the driver to request an SM PS transition in managed | ||
2590 | * mode. This is useful when the driver has more information than | ||
2591 | * the stack about possible interference, for example by bluetooth. | ||
2592 | */ | ||
2593 | void ieee80211_request_smps(struct ieee80211_vif *vif, | ||
2594 | enum ieee80211_smps_mode smps_mode); | ||
2595 | |||
2596 | /** | ||
2597 | * ieee80211_key_removed - disable hw acceleration for key | ||
2598 | * @key_conf: The key hw acceleration should be disabled for | ||
2599 | * | ||
2600 | * This allows drivers to indicate that the given key has been | ||
2601 | * removed from hardware acceleration, due to a new key that | ||
2602 | * was added. Don't use this if the key can continue to be used | ||
2603 | * for TX, if the key restriction is on RX only it is permitted | ||
2604 | * to keep the key for TX only and not call this function. | ||
2605 | * | ||
2606 | * Due to locking constraints, it may only be called during | ||
2607 | * @set_key. This function must be allowed to sleep, and the | ||
2608 | * key it tries to disable may still be used until it returns. | ||
2609 | */ | ||
2610 | void ieee80211_key_removed(struct ieee80211_key_conf *key_conf); | ||
2611 | |||
2521 | /* Rate control API */ | 2612 | /* Rate control API */ |
2522 | 2613 | ||
2523 | /** | 2614 | /** |
@@ -2681,4 +2772,26 @@ conf_is_ht(struct ieee80211_conf *conf) | |||
2681 | return conf->channel_type != NL80211_CHAN_NO_HT; | 2772 | return conf->channel_type != NL80211_CHAN_NO_HT; |
2682 | } | 2773 | } |
2683 | 2774 | ||
2775 | static inline enum nl80211_iftype | ||
2776 | ieee80211_iftype_p2p(enum nl80211_iftype type, bool p2p) | ||
2777 | { | ||
2778 | if (p2p) { | ||
2779 | switch (type) { | ||
2780 | case NL80211_IFTYPE_STATION: | ||
2781 | return NL80211_IFTYPE_P2P_CLIENT; | ||
2782 | case NL80211_IFTYPE_AP: | ||
2783 | return NL80211_IFTYPE_P2P_GO; | ||
2784 | default: | ||
2785 | break; | ||
2786 | } | ||
2787 | } | ||
2788 | return type; | ||
2789 | } | ||
2790 | |||
2791 | static inline enum nl80211_iftype | ||
2792 | ieee80211_vif_type_p2p(struct ieee80211_vif *vif) | ||
2793 | { | ||
2794 | return ieee80211_iftype_p2p(vif->type, vif->p2p); | ||
2795 | } | ||
2796 | |||
2684 | #endif /* MAC80211_H */ | 2797 | #endif /* MAC80211_H */ |
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 242879b6c4df..55590ab16b3e 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
@@ -91,26 +91,28 @@ struct neigh_statistics { | |||
91 | #define NEIGH_CACHE_STAT_INC(tbl, field) this_cpu_inc((tbl)->stats->field) | 91 | #define NEIGH_CACHE_STAT_INC(tbl, field) this_cpu_inc((tbl)->stats->field) |
92 | 92 | ||
93 | struct neighbour { | 93 | struct neighbour { |
94 | struct neighbour *next; | 94 | struct neighbour __rcu *next; |
95 | struct neigh_table *tbl; | 95 | struct neigh_table *tbl; |
96 | struct neigh_parms *parms; | 96 | struct neigh_parms *parms; |
97 | struct net_device *dev; | ||
98 | unsigned long used; | ||
99 | unsigned long confirmed; | 97 | unsigned long confirmed; |
100 | unsigned long updated; | 98 | unsigned long updated; |
101 | __u8 flags; | 99 | __u8 flags; |
102 | __u8 nud_state; | 100 | __u8 nud_state; |
103 | __u8 type; | 101 | __u8 type; |
104 | __u8 dead; | 102 | __u8 dead; |
103 | atomic_t refcnt; | ||
104 | struct sk_buff_head arp_queue; | ||
105 | struct timer_list timer; | ||
106 | unsigned long used; | ||
105 | atomic_t probes; | 107 | atomic_t probes; |
106 | rwlock_t lock; | 108 | rwlock_t lock; |
109 | seqlock_t ha_lock; | ||
107 | unsigned char ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))]; | 110 | unsigned char ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))]; |
108 | struct hh_cache *hh; | 111 | struct hh_cache *hh; |
109 | atomic_t refcnt; | ||
110 | int (*output)(struct sk_buff *skb); | 112 | int (*output)(struct sk_buff *skb); |
111 | struct sk_buff_head arp_queue; | ||
112 | struct timer_list timer; | ||
113 | const struct neigh_ops *ops; | 113 | const struct neigh_ops *ops; |
114 | struct rcu_head rcu; | ||
115 | struct net_device *dev; | ||
114 | u8 primary_key[0]; | 116 | u8 primary_key[0]; |
115 | }; | 117 | }; |
116 | 118 | ||
@@ -138,13 +140,22 @@ struct pneigh_entry { | |||
138 | * neighbour table manipulation | 140 | * neighbour table manipulation |
139 | */ | 141 | */ |
140 | 142 | ||
143 | struct neigh_hash_table { | ||
144 | struct neighbour __rcu **hash_buckets; | ||
145 | unsigned int hash_mask; | ||
146 | __u32 hash_rnd; | ||
147 | struct rcu_head rcu; | ||
148 | }; | ||
149 | |||
141 | 150 | ||
142 | struct neigh_table { | 151 | struct neigh_table { |
143 | struct neigh_table *next; | 152 | struct neigh_table *next; |
144 | int family; | 153 | int family; |
145 | int entry_size; | 154 | int entry_size; |
146 | int key_len; | 155 | int key_len; |
147 | __u32 (*hash)(const void *pkey, const struct net_device *); | 156 | __u32 (*hash)(const void *pkey, |
157 | const struct net_device *dev, | ||
158 | __u32 hash_rnd); | ||
148 | int (*constructor)(struct neighbour *); | 159 | int (*constructor)(struct neighbour *); |
149 | int (*pconstructor)(struct pneigh_entry *); | 160 | int (*pconstructor)(struct pneigh_entry *); |
150 | void (*pdestructor)(struct pneigh_entry *); | 161 | void (*pdestructor)(struct pneigh_entry *); |
@@ -163,11 +174,9 @@ struct neigh_table { | |||
163 | atomic_t entries; | 174 | atomic_t entries; |
164 | rwlock_t lock; | 175 | rwlock_t lock; |
165 | unsigned long last_rand; | 176 | unsigned long last_rand; |
166 | struct kmem_cache *kmem_cachep; | 177 | struct kmem_cache *kmem_cachep; |
167 | struct neigh_statistics __percpu *stats; | 178 | struct neigh_statistics __percpu *stats; |
168 | struct neighbour **hash_buckets; | 179 | struct neigh_hash_table __rcu *nht; |
169 | unsigned int hash_mask; | ||
170 | __u32 hash_rnd; | ||
171 | struct pneigh_entry **phash_buckets; | 180 | struct pneigh_entry **phash_buckets; |
172 | }; | 181 | }; |
173 | 182 | ||
@@ -237,6 +246,7 @@ extern void pneigh_for_each(struct neigh_table *tbl, void (*cb)(struct pneigh_en | |||
237 | struct neigh_seq_state { | 246 | struct neigh_seq_state { |
238 | struct seq_net_private p; | 247 | struct seq_net_private p; |
239 | struct neigh_table *tbl; | 248 | struct neigh_table *tbl; |
249 | struct neigh_hash_table *nht; | ||
240 | void *(*neigh_sub_iter)(struct neigh_seq_state *state, | 250 | void *(*neigh_sub_iter)(struct neigh_seq_state *state, |
241 | struct neighbour *n, loff_t *pos); | 251 | struct neighbour *n, loff_t *pos); |
242 | unsigned int bucket; | 252 | unsigned int bucket; |
@@ -293,7 +303,10 @@ static inline void neigh_confirm(struct neighbour *neigh) | |||
293 | 303 | ||
294 | static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) | 304 | static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) |
295 | { | 305 | { |
296 | neigh->used = jiffies; | 306 | unsigned long now = ACCESS_ONCE(jiffies); |
307 | |||
308 | if (neigh->used != now) | ||
309 | neigh->used = now; | ||
297 | if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE))) | 310 | if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE))) |
298 | return __neigh_event_send(neigh, skb); | 311 | return __neigh_event_send(neigh, skb); |
299 | return 0; | 312 | return 0; |
@@ -364,4 +377,14 @@ struct neighbour_cb { | |||
364 | 377 | ||
365 | #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) | 378 | #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) |
366 | 379 | ||
380 | static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n, | ||
381 | const struct net_device *dev) | ||
382 | { | ||
383 | unsigned int seq; | ||
384 | |||
385 | do { | ||
386 | seq = read_seqbegin(&n->ha_lock); | ||
387 | memcpy(dst, n->ha, dev->addr_len); | ||
388 | } while (read_seqretry(&n->ha_lock, seq)); | ||
389 | } | ||
367 | #endif | 390 | #endif |
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index bd10a7908993..1bf812b21fb7 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
@@ -41,6 +41,8 @@ struct net { | |||
41 | * destroy on demand | 41 | * destroy on demand |
42 | */ | 42 | */ |
43 | #endif | 43 | #endif |
44 | spinlock_t rules_mod_lock; | ||
45 | |||
44 | struct list_head list; /* list of network namespaces */ | 46 | struct list_head list; /* list of network namespaces */ |
45 | struct list_head cleanup_list; /* namespaces on death row */ | 47 | struct list_head cleanup_list; /* namespaces on death row */ |
46 | struct list_head exit_list; /* Use only net_mutex */ | 48 | struct list_head exit_list; /* Use only net_mutex */ |
@@ -52,7 +54,8 @@ struct net { | |||
52 | struct ctl_table_set sysctls; | 54 | struct ctl_table_set sysctls; |
53 | #endif | 55 | #endif |
54 | 56 | ||
55 | struct net_device *loopback_dev; /* The loopback */ | 57 | struct sock *rtnl; /* rtnetlink socket */ |
58 | struct sock *genl_sock; | ||
56 | 59 | ||
57 | struct list_head dev_base_head; | 60 | struct list_head dev_base_head; |
58 | struct hlist_head *dev_name_head; | 61 | struct hlist_head *dev_name_head; |
@@ -60,11 +63,9 @@ struct net { | |||
60 | 63 | ||
61 | /* core fib_rules */ | 64 | /* core fib_rules */ |
62 | struct list_head rules_ops; | 65 | struct list_head rules_ops; |
63 | spinlock_t rules_mod_lock; | ||
64 | 66 | ||
65 | struct sock *rtnl; /* rtnetlink socket */ | ||
66 | struct sock *genl_sock; | ||
67 | 67 | ||
68 | struct net_device *loopback_dev; /* The loopback */ | ||
68 | struct netns_core core; | 69 | struct netns_core core; |
69 | struct netns_mib mib; | 70 | struct netns_mib mib; |
70 | struct netns_packet packet; | 71 | struct netns_packet packet; |
@@ -84,13 +85,15 @@ struct net { | |||
84 | struct sock *nfnl; | 85 | struct sock *nfnl; |
85 | struct sock *nfnl_stash; | 86 | struct sock *nfnl_stash; |
86 | #endif | 87 | #endif |
87 | #ifdef CONFIG_XFRM | ||
88 | struct netns_xfrm xfrm; | ||
89 | #endif | ||
90 | #ifdef CONFIG_WEXT_CORE | 88 | #ifdef CONFIG_WEXT_CORE |
91 | struct sk_buff_head wext_nlevents; | 89 | struct sk_buff_head wext_nlevents; |
92 | #endif | 90 | #endif |
93 | struct net_generic *gen; | 91 | struct net_generic __rcu *gen; |
92 | |||
93 | /* Note : following structs are cache line aligned */ | ||
94 | #ifdef CONFIG_XFRM | ||
95 | struct netns_xfrm xfrm; | ||
96 | #endif | ||
94 | }; | 97 | }; |
95 | 98 | ||
96 | 99 | ||
diff --git a/include/net/netfilter/ipv6/nf_defrag_ipv6.h b/include/net/netfilter/ipv6/nf_defrag_ipv6.h new file mode 100644 index 000000000000..94dd54d76b48 --- /dev/null +++ b/include/net/netfilter/ipv6/nf_defrag_ipv6.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _NF_DEFRAG_IPV6_H | ||
2 | #define _NF_DEFRAG_IPV6_H | ||
3 | |||
4 | extern void nf_defrag_ipv6_enable(void); | ||
5 | |||
6 | #endif /* _NF_DEFRAG_IPV6_H */ | ||
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index e624dae54fa4..caf17db87dbc 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
@@ -75,7 +75,7 @@ struct nf_conntrack_helper; | |||
75 | /* nf_conn feature for connections that have a helper */ | 75 | /* nf_conn feature for connections that have a helper */ |
76 | struct nf_conn_help { | 76 | struct nf_conn_help { |
77 | /* Helper. if any */ | 77 | /* Helper. if any */ |
78 | struct nf_conntrack_helper *helper; | 78 | struct nf_conntrack_helper __rcu *helper; |
79 | 79 | ||
80 | union nf_conntrack_help help; | 80 | union nf_conntrack_help help; |
81 | 81 | ||
diff --git a/include/net/netfilter/nf_conntrack_expect.h b/include/net/netfilter/nf_conntrack_expect.h index 11e815084fcf..0f8a8c587532 100644 --- a/include/net/netfilter/nf_conntrack_expect.h +++ b/include/net/netfilter/nf_conntrack_expect.h | |||
@@ -67,9 +67,6 @@ struct nf_conntrack_expect_policy { | |||
67 | 67 | ||
68 | #define NF_CT_EXPECT_CLASS_DEFAULT 0 | 68 | #define NF_CT_EXPECT_CLASS_DEFAULT 0 |
69 | 69 | ||
70 | #define NF_CT_EXPECT_PERMANENT 0x1 | ||
71 | #define NF_CT_EXPECT_INACTIVE 0x2 | ||
72 | |||
73 | int nf_conntrack_expect_init(struct net *net); | 70 | int nf_conntrack_expect_init(struct net *net); |
74 | void nf_conntrack_expect_fini(struct net *net); | 71 | void nf_conntrack_expect_fini(struct net *net); |
75 | 72 | ||
@@ -85,9 +82,16 @@ struct nf_conntrack_expect * | |||
85 | nf_ct_find_expectation(struct net *net, u16 zone, | 82 | nf_ct_find_expectation(struct net *net, u16 zone, |
86 | const struct nf_conntrack_tuple *tuple); | 83 | const struct nf_conntrack_tuple *tuple); |
87 | 84 | ||
88 | void nf_ct_unlink_expect(struct nf_conntrack_expect *exp); | 85 | void nf_ct_unlink_expect_report(struct nf_conntrack_expect *exp, |
86 | u32 pid, int report); | ||
87 | static inline void nf_ct_unlink_expect(struct nf_conntrack_expect *exp) | ||
88 | { | ||
89 | nf_ct_unlink_expect_report(exp, 0, 0); | ||
90 | } | ||
91 | |||
89 | void nf_ct_remove_expectations(struct nf_conn *ct); | 92 | void nf_ct_remove_expectations(struct nf_conn *ct); |
90 | void nf_ct_unexpect_related(struct nf_conntrack_expect *exp); | 93 | void nf_ct_unexpect_related(struct nf_conntrack_expect *exp); |
94 | void nf_ct_remove_userspace_expectations(void); | ||
91 | 95 | ||
92 | /* Allocate space for an expectation: this is mandatory before calling | 96 | /* Allocate space for an expectation: this is mandatory before calling |
93 | nf_ct_expect_related. You will have to call put afterwards. */ | 97 | nf_ct_expect_related. You will have to call put afterwards. */ |
diff --git a/include/net/netfilter/nf_nat_protocol.h b/include/net/netfilter/nf_nat_protocol.h index df17bac46bf5..93cc90d28e66 100644 --- a/include/net/netfilter/nf_nat_protocol.h +++ b/include/net/netfilter/nf_nat_protocol.h | |||
@@ -45,9 +45,6 @@ struct nf_nat_protocol { | |||
45 | extern int nf_nat_protocol_register(const struct nf_nat_protocol *proto); | 45 | extern int nf_nat_protocol_register(const struct nf_nat_protocol *proto); |
46 | extern void nf_nat_protocol_unregister(const struct nf_nat_protocol *proto); | 46 | extern void nf_nat_protocol_unregister(const struct nf_nat_protocol *proto); |
47 | 47 | ||
48 | extern const struct nf_nat_protocol *nf_nat_proto_find_get(u_int8_t protocol); | ||
49 | extern void nf_nat_proto_put(const struct nf_nat_protocol *proto); | ||
50 | |||
51 | /* Built-in protocols. */ | 48 | /* Built-in protocols. */ |
52 | extern const struct nf_nat_protocol nf_nat_protocol_tcp; | 49 | extern const struct nf_nat_protocol nf_nat_protocol_tcp; |
53 | extern const struct nf_nat_protocol nf_nat_protocol_udp; | 50 | extern const struct nf_nat_protocol nf_nat_protocol_udp; |
diff --git a/include/net/netfilter/nf_tproxy_core.h b/include/net/netfilter/nf_tproxy_core.h index 208b46f4d6d2..cd85b3bc8327 100644 --- a/include/net/netfilter/nf_tproxy_core.h +++ b/include/net/netfilter/nf_tproxy_core.h | |||
@@ -5,15 +5,201 @@ | |||
5 | #include <linux/in.h> | 5 | #include <linux/in.h> |
6 | #include <linux/skbuff.h> | 6 | #include <linux/skbuff.h> |
7 | #include <net/sock.h> | 7 | #include <net/sock.h> |
8 | #include <net/inet_sock.h> | 8 | #include <net/inet_hashtables.h> |
9 | #include <net/inet6_hashtables.h> | ||
9 | #include <net/tcp.h> | 10 | #include <net/tcp.h> |
10 | 11 | ||
12 | #define NFT_LOOKUP_ANY 0 | ||
13 | #define NFT_LOOKUP_LISTENER 1 | ||
14 | #define NFT_LOOKUP_ESTABLISHED 2 | ||
15 | |||
11 | /* look up and get a reference to a matching socket */ | 16 | /* look up and get a reference to a matching socket */ |
12 | extern struct sock * | 17 | |
18 | |||
19 | /* This function is used by the 'TPROXY' target and the 'socket' | ||
20 | * match. The following lookups are supported: | ||
21 | * | ||
22 | * Explicit TProxy target rule | ||
23 | * =========================== | ||
24 | * | ||
25 | * This is used when the user wants to intercept a connection matching | ||
26 | * an explicit iptables rule. In this case the sockets are assumed | ||
27 | * matching in preference order: | ||
28 | * | ||
29 | * - match: if there's a fully established connection matching the | ||
30 | * _packet_ tuple, it is returned, assuming the redirection | ||
31 | * already took place and we process a packet belonging to an | ||
32 | * established connection | ||
33 | * | ||
34 | * - match: if there's a listening socket matching the redirection | ||
35 | * (e.g. on-port & on-ip of the connection), it is returned, | ||
36 | * regardless if it was bound to 0.0.0.0 or an explicit | ||
37 | * address. The reasoning is that if there's an explicit rule, it | ||
38 | * does not really matter if the listener is bound to an interface | ||
39 | * or to 0. The user already stated that he wants redirection | ||
40 | * (since he added the rule). | ||
41 | * | ||
42 | * "socket" match based redirection (no specific rule) | ||
43 | * =================================================== | ||
44 | * | ||
45 | * There are connections with dynamic endpoints (e.g. FTP data | ||
46 | * connection) that the user is unable to add explicit rules | ||
47 | * for. These are taken care of by a generic "socket" rule. It is | ||
48 | * assumed that the proxy application is trusted to open such | ||
49 | * connections without explicit iptables rule (except of course the | ||
50 | * generic 'socket' rule). In this case the following sockets are | ||
51 | * matched in preference order: | ||
52 | * | ||
53 | * - match: if there's a fully established connection matching the | ||
54 | * _packet_ tuple | ||
55 | * | ||
56 | * - match: if there's a non-zero bound listener (possibly with a | ||
57 | * non-local address) We don't accept zero-bound listeners, since | ||
58 | * then local services could intercept traffic going through the | ||
59 | * box. | ||
60 | * | ||
61 | * Please note that there's an overlap between what a TPROXY target | ||
62 | * and a socket match will match. Normally if you have both rules the | ||
63 | * "socket" match will be the first one, effectively all packets | ||
64 | * belonging to established connections going through that one. | ||
65 | */ | ||
66 | static inline struct sock * | ||
13 | nf_tproxy_get_sock_v4(struct net *net, const u8 protocol, | 67 | nf_tproxy_get_sock_v4(struct net *net, const u8 protocol, |
14 | const __be32 saddr, const __be32 daddr, | 68 | const __be32 saddr, const __be32 daddr, |
15 | const __be16 sport, const __be16 dport, | 69 | const __be16 sport, const __be16 dport, |
16 | const struct net_device *in, bool listening); | 70 | const struct net_device *in, int lookup_type) |
71 | { | ||
72 | struct sock *sk; | ||
73 | |||
74 | /* look up socket */ | ||
75 | switch (protocol) { | ||
76 | case IPPROTO_TCP: | ||
77 | switch (lookup_type) { | ||
78 | case NFT_LOOKUP_ANY: | ||
79 | sk = __inet_lookup(net, &tcp_hashinfo, | ||
80 | saddr, sport, daddr, dport, | ||
81 | in->ifindex); | ||
82 | break; | ||
83 | case NFT_LOOKUP_LISTENER: | ||
84 | sk = inet_lookup_listener(net, &tcp_hashinfo, | ||
85 | daddr, dport, | ||
86 | in->ifindex); | ||
87 | |||
88 | /* NOTE: we return listeners even if bound to | ||
89 | * 0.0.0.0, those are filtered out in | ||
90 | * xt_socket, since xt_TPROXY needs 0 bound | ||
91 | * listeners too */ | ||
92 | |||
93 | break; | ||
94 | case NFT_LOOKUP_ESTABLISHED: | ||
95 | sk = inet_lookup_established(net, &tcp_hashinfo, | ||
96 | saddr, sport, daddr, dport, | ||
97 | in->ifindex); | ||
98 | break; | ||
99 | default: | ||
100 | WARN_ON(1); | ||
101 | sk = NULL; | ||
102 | break; | ||
103 | } | ||
104 | break; | ||
105 | case IPPROTO_UDP: | ||
106 | sk = udp4_lib_lookup(net, saddr, sport, daddr, dport, | ||
107 | in->ifindex); | ||
108 | if (sk && lookup_type != NFT_LOOKUP_ANY) { | ||
109 | int connected = (sk->sk_state == TCP_ESTABLISHED); | ||
110 | int wildcard = (inet_sk(sk)->inet_rcv_saddr == 0); | ||
111 | |||
112 | /* NOTE: we return listeners even if bound to | ||
113 | * 0.0.0.0, those are filtered out in | ||
114 | * xt_socket, since xt_TPROXY needs 0 bound | ||
115 | * listeners too */ | ||
116 | if ((lookup_type == NFT_LOOKUP_ESTABLISHED && (!connected || wildcard)) || | ||
117 | (lookup_type == NFT_LOOKUP_LISTENER && connected)) { | ||
118 | sock_put(sk); | ||
119 | sk = NULL; | ||
120 | } | ||
121 | } | ||
122 | break; | ||
123 | default: | ||
124 | WARN_ON(1); | ||
125 | sk = NULL; | ||
126 | } | ||
127 | |||
128 | pr_debug("tproxy socket lookup: proto %u %08x:%u -> %08x:%u, lookup type: %d, sock %p\n", | ||
129 | protocol, ntohl(saddr), ntohs(sport), ntohl(daddr), ntohs(dport), lookup_type, sk); | ||
130 | |||
131 | return sk; | ||
132 | } | ||
133 | |||
134 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
135 | static inline struct sock * | ||
136 | nf_tproxy_get_sock_v6(struct net *net, const u8 protocol, | ||
137 | const struct in6_addr *saddr, const struct in6_addr *daddr, | ||
138 | const __be16 sport, const __be16 dport, | ||
139 | const struct net_device *in, int lookup_type) | ||
140 | { | ||
141 | struct sock *sk; | ||
142 | |||
143 | /* look up socket */ | ||
144 | switch (protocol) { | ||
145 | case IPPROTO_TCP: | ||
146 | switch (lookup_type) { | ||
147 | case NFT_LOOKUP_ANY: | ||
148 | sk = inet6_lookup(net, &tcp_hashinfo, | ||
149 | saddr, sport, daddr, dport, | ||
150 | in->ifindex); | ||
151 | break; | ||
152 | case NFT_LOOKUP_LISTENER: | ||
153 | sk = inet6_lookup_listener(net, &tcp_hashinfo, | ||
154 | daddr, ntohs(dport), | ||
155 | in->ifindex); | ||
156 | |||
157 | /* NOTE: we return listeners even if bound to | ||
158 | * 0.0.0.0, those are filtered out in | ||
159 | * xt_socket, since xt_TPROXY needs 0 bound | ||
160 | * listeners too */ | ||
161 | |||
162 | break; | ||
163 | case NFT_LOOKUP_ESTABLISHED: | ||
164 | sk = __inet6_lookup_established(net, &tcp_hashinfo, | ||
165 | saddr, sport, daddr, ntohs(dport), | ||
166 | in->ifindex); | ||
167 | break; | ||
168 | default: | ||
169 | WARN_ON(1); | ||
170 | sk = NULL; | ||
171 | break; | ||
172 | } | ||
173 | break; | ||
174 | case IPPROTO_UDP: | ||
175 | sk = udp6_lib_lookup(net, saddr, sport, daddr, dport, | ||
176 | in->ifindex); | ||
177 | if (sk && lookup_type != NFT_LOOKUP_ANY) { | ||
178 | int connected = (sk->sk_state == TCP_ESTABLISHED); | ||
179 | int wildcard = ipv6_addr_any(&inet6_sk(sk)->rcv_saddr); | ||
180 | |||
181 | /* NOTE: we return listeners even if bound to | ||
182 | * 0.0.0.0, those are filtered out in | ||
183 | * xt_socket, since xt_TPROXY needs 0 bound | ||
184 | * listeners too */ | ||
185 | if ((lookup_type == NFT_LOOKUP_ESTABLISHED && (!connected || wildcard)) || | ||
186 | (lookup_type == NFT_LOOKUP_LISTENER && connected)) { | ||
187 | sock_put(sk); | ||
188 | sk = NULL; | ||
189 | } | ||
190 | } | ||
191 | break; | ||
192 | default: | ||
193 | WARN_ON(1); | ||
194 | sk = NULL; | ||
195 | } | ||
196 | |||
197 | pr_debug("tproxy socket lookup: proto %u %pI6:%u -> %pI6:%u, lookup type: %d, sock %p\n", | ||
198 | protocol, saddr, ntohs(sport), daddr, ntohs(dport), lookup_type, sk); | ||
199 | |||
200 | return sk; | ||
201 | } | ||
202 | #endif | ||
17 | 203 | ||
18 | static inline void | 204 | static inline void |
19 | nf_tproxy_put_sock(struct sock *sk) | 205 | nf_tproxy_put_sock(struct sock *sk) |
diff --git a/include/net/netfilter/xt_log.h b/include/net/netfilter/xt_log.h new file mode 100644 index 000000000000..0dfb34a5b53c --- /dev/null +++ b/include/net/netfilter/xt_log.h | |||
@@ -0,0 +1,54 @@ | |||
1 | #define S_SIZE (1024 - (sizeof(unsigned int) + 1)) | ||
2 | |||
3 | struct sbuff { | ||
4 | unsigned int count; | ||
5 | char buf[S_SIZE + 1]; | ||
6 | }; | ||
7 | static struct sbuff emergency, *emergency_ptr = &emergency; | ||
8 | |||
9 | static int sb_add(struct sbuff *m, const char *f, ...) | ||
10 | { | ||
11 | va_list args; | ||
12 | int len; | ||
13 | |||
14 | if (likely(m->count < S_SIZE)) { | ||
15 | va_start(args, f); | ||
16 | len = vsnprintf(m->buf + m->count, S_SIZE - m->count, f, args); | ||
17 | va_end(args); | ||
18 | if (likely(m->count + len < S_SIZE)) { | ||
19 | m->count += len; | ||
20 | return 0; | ||
21 | } | ||
22 | } | ||
23 | m->count = S_SIZE; | ||
24 | printk_once(KERN_ERR KBUILD_MODNAME " please increase S_SIZE\n"); | ||
25 | return -1; | ||
26 | } | ||
27 | |||
28 | static struct sbuff *sb_open(void) | ||
29 | { | ||
30 | struct sbuff *m = kmalloc(sizeof(*m), GFP_ATOMIC); | ||
31 | |||
32 | if (unlikely(!m)) { | ||
33 | local_bh_disable(); | ||
34 | do { | ||
35 | m = xchg(&emergency_ptr, NULL); | ||
36 | } while (!m); | ||
37 | } | ||
38 | m->count = 0; | ||
39 | return m; | ||
40 | } | ||
41 | |||
42 | static void sb_close(struct sbuff *m) | ||
43 | { | ||
44 | m->buf[m->count] = 0; | ||
45 | printk("%s\n", m->buf); | ||
46 | |||
47 | if (likely(m != &emergency)) | ||
48 | kfree(m); | ||
49 | else { | ||
50 | xchg(&emergency_ptr, m); | ||
51 | local_bh_enable(); | ||
52 | } | ||
53 | } | ||
54 | |||
diff --git a/include/net/netlink.h b/include/net/netlink.h index f3b201d335b3..9801c55de5d6 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h | |||
@@ -384,7 +384,7 @@ static inline int nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen, | |||
384 | * | 384 | * |
385 | * Returns the first attribute which matches the specified type. | 385 | * Returns the first attribute which matches the specified type. |
386 | */ | 386 | */ |
387 | static inline struct nlattr *nlmsg_find_attr(struct nlmsghdr *nlh, | 387 | static inline struct nlattr *nlmsg_find_attr(const struct nlmsghdr *nlh, |
388 | int hdrlen, int attrtype) | 388 | int hdrlen, int attrtype) |
389 | { | 389 | { |
390 | return nla_find(nlmsg_attrdata(nlh, hdrlen), | 390 | return nla_find(nlmsg_attrdata(nlh, hdrlen), |
diff --git a/include/net/netns/xfrm.h b/include/net/netns/xfrm.h index 74f119a2829a..748f91f87cd5 100644 --- a/include/net/netns/xfrm.h +++ b/include/net/netns/xfrm.h | |||
@@ -43,10 +43,6 @@ struct netns_xfrm { | |||
43 | unsigned int policy_count[XFRM_POLICY_MAX * 2]; | 43 | unsigned int policy_count[XFRM_POLICY_MAX * 2]; |
44 | struct work_struct policy_hash_work; | 44 | struct work_struct policy_hash_work; |
45 | 45 | ||
46 | struct dst_ops xfrm4_dst_ops; | ||
47 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
48 | struct dst_ops xfrm6_dst_ops; | ||
49 | #endif | ||
50 | 46 | ||
51 | struct sock *nlsk; | 47 | struct sock *nlsk; |
52 | struct sock *nlsk_stash; | 48 | struct sock *nlsk_stash; |
@@ -58,6 +54,11 @@ struct netns_xfrm { | |||
58 | #ifdef CONFIG_SYSCTL | 54 | #ifdef CONFIG_SYSCTL |
59 | struct ctl_table_header *sysctl_hdr; | 55 | struct ctl_table_header *sysctl_hdr; |
60 | #endif | 56 | #endif |
57 | |||
58 | struct dst_ops xfrm4_dst_ops; | ||
59 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
60 | struct dst_ops xfrm6_dst_ops; | ||
61 | #endif | ||
61 | }; | 62 | }; |
62 | 63 | ||
63 | #endif | 64 | #endif |
diff --git a/include/net/phonet/pep.h b/include/net/phonet/pep.h index 35672b1cf44a..b60b28c99e87 100644 --- a/include/net/phonet/pep.h +++ b/include/net/phonet/pep.h | |||
@@ -45,6 +45,10 @@ struct pep_sock { | |||
45 | u8 tx_fc; /* TX flow control */ | 45 | u8 tx_fc; /* TX flow control */ |
46 | u8 init_enable; /* auto-enable at creation */ | 46 | u8 init_enable; /* auto-enable at creation */ |
47 | u8 aligned; | 47 | u8 aligned; |
48 | #ifdef CONFIG_PHONET_PIPECTRLR | ||
49 | u8 pipe_state; | ||
50 | struct sockaddr_pn remote_pep; | ||
51 | #endif | ||
48 | }; | 52 | }; |
49 | 53 | ||
50 | static inline struct pep_sock *pep_sk(struct sock *sk) | 54 | static inline struct pep_sock *pep_sk(struct sock *sk) |
@@ -77,6 +81,11 @@ static inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb) | |||
77 | #define MAX_PNPIPE_HEADER (MAX_PHONET_HEADER + 4) | 81 | #define MAX_PNPIPE_HEADER (MAX_PHONET_HEADER + 4) |
78 | 82 | ||
79 | enum { | 83 | enum { |
84 | PNS_PIPE_CREATE_REQ = 0x00, | ||
85 | PNS_PIPE_CREATE_RESP, | ||
86 | PNS_PIPE_REMOVE_REQ, | ||
87 | PNS_PIPE_REMOVE_RESP, | ||
88 | |||
80 | PNS_PIPE_DATA = 0x20, | 89 | PNS_PIPE_DATA = 0x20, |
81 | PNS_PIPE_ALIGNED_DATA, | 90 | PNS_PIPE_ALIGNED_DATA, |
82 | 91 | ||
@@ -160,4 +169,21 @@ enum { | |||
160 | PEP_IND_READY, | 169 | PEP_IND_READY, |
161 | }; | 170 | }; |
162 | 171 | ||
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 | |||
163 | #endif | 189 | #endif |
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h index 7b114079a51b..d5df797f9540 100644 --- a/include/net/phonet/phonet.h +++ b/include/net/phonet/phonet.h | |||
@@ -54,6 +54,11 @@ void pn_sock_hash(struct sock *sk); | |||
54 | void pn_sock_unhash(struct sock *sk); | 54 | void pn_sock_unhash(struct sock *sk); |
55 | int pn_sock_get_port(struct sock *sk, unsigned short sport); | 55 | int pn_sock_get_port(struct sock *sk, unsigned short sport); |
56 | 56 | ||
57 | struct sock *pn_find_sock_by_res(struct net *net, u8 res); | ||
58 | int pn_sock_bind_res(struct sock *sock, u8 res); | ||
59 | int pn_sock_unbind_res(struct sock *sk, u8 res); | ||
60 | void pn_sock_unbind_all_res(struct sock *sk); | ||
61 | |||
57 | int pn_skb_send(struct sock *sk, struct sk_buff *skb, | 62 | int pn_skb_send(struct sock *sk, struct sk_buff *skb, |
58 | const struct sockaddr_pn *target); | 63 | const struct sockaddr_pn *target); |
59 | 64 | ||
diff --git a/include/net/phonet/pn_dev.h b/include/net/phonet/pn_dev.h index 2d16783d5e20..13649eb57413 100644 --- a/include/net/phonet/pn_dev.h +++ b/include/net/phonet/pn_dev.h | |||
@@ -57,5 +57,6 @@ struct net_device *phonet_route_output(struct net *net, u8 daddr); | |||
57 | #define PN_NO_ADDR 0xff | 57 | #define PN_NO_ADDR 0xff |
58 | 58 | ||
59 | extern const struct file_operations pn_sock_seq_fops; | 59 | extern const struct file_operations pn_sock_seq_fops; |
60 | extern const struct file_operations pn_res_seq_fops; | ||
60 | 61 | ||
61 | #endif | 62 | #endif |
diff --git a/include/net/protocol.h b/include/net/protocol.h index f1effdd3c265..dc07495bce4c 100644 --- a/include/net/protocol.h +++ b/include/net/protocol.h | |||
@@ -89,10 +89,10 @@ struct inet_protosw { | |||
89 | #define INET_PROTOSW_PERMANENT 0x02 /* Permanent protocols are unremovable. */ | 89 | #define INET_PROTOSW_PERMANENT 0x02 /* Permanent protocols are unremovable. */ |
90 | #define INET_PROTOSW_ICSK 0x04 /* Is this an inet_connection_sock? */ | 90 | #define INET_PROTOSW_ICSK 0x04 /* Is this an inet_connection_sock? */ |
91 | 91 | ||
92 | extern const struct net_protocol *inet_protos[MAX_INET_PROTOS]; | 92 | extern const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS]; |
93 | 93 | ||
94 | #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) | 94 | #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) |
95 | extern const struct inet6_protocol *inet6_protos[MAX_INET_PROTOS]; | 95 | extern const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS]; |
96 | #endif | 96 | #endif |
97 | 97 | ||
98 | extern int inet_add_protocol(const struct net_protocol *prot, unsigned char num); | 98 | extern int inet_add_protocol(const struct net_protocol *prot, unsigned char num); |
diff --git a/include/net/raw.h b/include/net/raw.h index 43c57502659b..42ce6fe7a2d5 100644 --- a/include/net/raw.h +++ b/include/net/raw.h | |||
@@ -45,7 +45,10 @@ struct raw_iter_state { | |||
45 | struct raw_hashinfo *h; | 45 | struct raw_hashinfo *h; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | #define raw_seq_private(seq) ((struct raw_iter_state *)(seq)->private) | 48 | static inline struct raw_iter_state *raw_seq_private(struct seq_file *seq) |
49 | { | ||
50 | return seq->private; | ||
51 | } | ||
49 | void *raw_seq_start(struct seq_file *seq, loff_t *pos); | 52 | void *raw_seq_start(struct seq_file *seq, loff_t *pos); |
50 | void *raw_seq_next(struct seq_file *seq, void *v, loff_t *pos); | 53 | void *raw_seq_next(struct seq_file *seq, void *v, loff_t *pos); |
51 | void raw_seq_stop(struct seq_file *seq, void *v); | 54 | void raw_seq_stop(struct seq_file *seq, void *v); |
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index af60fd050844..e013c68bfb00 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h | |||
@@ -79,7 +79,6 @@ struct rtnl_link_ops { | |||
79 | 79 | ||
80 | extern int __rtnl_link_register(struct rtnl_link_ops *ops); | 80 | extern int __rtnl_link_register(struct rtnl_link_ops *ops); |
81 | extern void __rtnl_link_unregister(struct rtnl_link_ops *ops); | 81 | extern void __rtnl_link_unregister(struct rtnl_link_ops *ops); |
82 | extern void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops); | ||
83 | 82 | ||
84 | extern int rtnl_link_register(struct rtnl_link_ops *ops); | 83 | extern int rtnl_link_register(struct rtnl_link_ops *ops); |
85 | extern void rtnl_link_unregister(struct rtnl_link_ops *ops); | 84 | extern void rtnl_link_unregister(struct rtnl_link_ops *ops); |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 3c8728aaab4e..ea1f8a83160d 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -328,8 +328,7 @@ extern void qdisc_destroy(struct Qdisc *qdisc); | |||
328 | extern void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n); | 328 | extern void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n); |
329 | extern struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, | 329 | extern struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, |
330 | struct Qdisc_ops *ops); | 330 | struct Qdisc_ops *ops); |
331 | extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, | 331 | extern struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, |
332 | struct netdev_queue *dev_queue, | ||
333 | struct Qdisc_ops *ops, u32 parentid); | 332 | struct Qdisc_ops *ops, u32 parentid); |
334 | extern void qdisc_calculate_pkt_len(struct sk_buff *skb, | 333 | extern void qdisc_calculate_pkt_len(struct sk_buff *skb, |
335 | struct qdisc_size_table *stab); | 334 | struct qdisc_size_table *stab); |
@@ -601,7 +600,7 @@ static inline u32 qdisc_l2t(struct qdisc_rate_table* rtab, unsigned int pktlen) | |||
601 | slot = 0; | 600 | slot = 0; |
602 | slot >>= rtab->rate.cell_log; | 601 | slot >>= rtab->rate.cell_log; |
603 | if (slot > 255) | 602 | if (slot > 255) |
604 | return (rtab->data[255]*(slot >> 8) + rtab->data[slot & 0xFF]); | 603 | return rtab->data[255]*(slot >> 8) + rtab->data[slot & 0xFF]; |
605 | return rtab->data[slot]; | 604 | return rtab->data[slot]; |
606 | } | 605 | } |
607 | 606 | ||
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 65946bc43d00..505845ddb0be 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
@@ -275,24 +275,35 @@ struct sctp_mib { | |||
275 | /* Print debugging messages. */ | 275 | /* Print debugging messages. */ |
276 | #if SCTP_DEBUG | 276 | #if SCTP_DEBUG |
277 | extern int sctp_debug_flag; | 277 | extern int sctp_debug_flag; |
278 | #define SCTP_DEBUG_PRINTK(whatever...) \ | 278 | #define SCTP_DEBUG_PRINTK(fmt, args...) \ |
279 | ((void) (sctp_debug_flag && printk(KERN_DEBUG whatever))) | 279 | do { \ |
280 | #define SCTP_DEBUG_PRINTK_IPADDR(lead, trail, leadparm, saddr, otherparms...) \ | 280 | if (sctp_debug_flag) \ |
281 | if (sctp_debug_flag) { \ | 281 | printk(KERN_DEBUG pr_fmt(fmt), ##args); \ |
282 | if (saddr->sa.sa_family == AF_INET6) { \ | 282 | } while (0) |
283 | printk(KERN_DEBUG \ | 283 | #define SCTP_DEBUG_PRINTK_CONT(fmt, args...) \ |
284 | lead "%pI6" trail, \ | 284 | do { \ |
285 | leadparm, \ | 285 | if (sctp_debug_flag) \ |
286 | &saddr->v6.sin6_addr, \ | 286 | pr_cont(fmt, ##args); \ |
287 | otherparms); \ | 287 | } while (0) |
288 | } else { \ | 288 | #define SCTP_DEBUG_PRINTK_IPADDR(fmt_lead, fmt_trail, \ |
289 | printk(KERN_DEBUG \ | 289 | args_lead, saddr, args_trail...) \ |
290 | lead "%pI4" trail, \ | 290 | do { \ |
291 | leadparm, \ | 291 | if (sctp_debug_flag) { \ |
292 | &saddr->v4.sin_addr.s_addr, \ | 292 | if (saddr->sa.sa_family == AF_INET6) { \ |
293 | otherparms); \ | 293 | printk(KERN_DEBUG \ |
294 | } \ | 294 | pr_fmt(fmt_lead "%pI6" fmt_trail), \ |
295 | } | 295 | args_lead, \ |
296 | &saddr->v6.sin6_addr, \ | ||
297 | args_trail); \ | ||
298 | } else { \ | ||
299 | printk(KERN_DEBUG \ | ||
300 | pr_fmt(fmt_lead "%pI4" fmt_trail), \ | ||
301 | args_lead, \ | ||
302 | &saddr->v4.sin_addr.s_addr, \ | ||
303 | args_trail); \ | ||
304 | } \ | ||
305 | } \ | ||
306 | } while (0) | ||
296 | #define SCTP_ENABLE_DEBUG { sctp_debug_flag = 1; } | 307 | #define SCTP_ENABLE_DEBUG { sctp_debug_flag = 1; } |
297 | #define SCTP_DISABLE_DEBUG { sctp_debug_flag = 0; } | 308 | #define SCTP_DISABLE_DEBUG { sctp_debug_flag = 0; } |
298 | 309 | ||
@@ -306,6 +317,7 @@ extern int sctp_debug_flag; | |||
306 | #else /* SCTP_DEBUG */ | 317 | #else /* SCTP_DEBUG */ |
307 | 318 | ||
308 | #define SCTP_DEBUG_PRINTK(whatever...) | 319 | #define SCTP_DEBUG_PRINTK(whatever...) |
320 | #define SCTP_DEBUG_PRINTK_CONT(fmt, args...) | ||
309 | #define SCTP_DEBUG_PRINTK_IPADDR(whatever...) | 321 | #define SCTP_DEBUG_PRINTK_IPADDR(whatever...) |
310 | #define SCTP_ENABLE_DEBUG | 322 | #define SCTP_ENABLE_DEBUG |
311 | #define SCTP_DISABLE_DEBUG | 323 | #define SCTP_DISABLE_DEBUG |
@@ -393,7 +405,7 @@ static inline void sctp_v6_del_protocol(void) { return; } | |||
393 | /* Map an association to an assoc_id. */ | 405 | /* Map an association to an assoc_id. */ |
394 | static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc) | 406 | static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc) |
395 | { | 407 | { |
396 | return (asoc?asoc->assoc_id:0); | 408 | return asoc ? asoc->assoc_id : 0; |
397 | } | 409 | } |
398 | 410 | ||
399 | /* Look up the association by its id. */ | 411 | /* Look up the association by its id. */ |
@@ -461,7 +473,7 @@ static inline void sctp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk) | |||
461 | /* Tests if the list has one and only one entry. */ | 473 | /* Tests if the list has one and only one entry. */ |
462 | static inline int sctp_list_single_entry(struct list_head *head) | 474 | static inline int sctp_list_single_entry(struct list_head *head) |
463 | { | 475 | { |
464 | return ((head->next != head) && (head->next == head->prev)); | 476 | return (head->next != head) && (head->next == head->prev); |
465 | } | 477 | } |
466 | 478 | ||
467 | /* Generate a random jitter in the range of -50% ~ +50% of input RTO. */ | 479 | /* Generate a random jitter in the range of -50% ~ +50% of input RTO. */ |
@@ -619,13 +631,13 @@ static inline int sctp_sanity_check(void) | |||
619 | /* This is the hash function for the SCTP port hash table. */ | 631 | /* This is the hash function for the SCTP port hash table. */ |
620 | static inline int sctp_phashfn(__u16 lport) | 632 | static inline int sctp_phashfn(__u16 lport) |
621 | { | 633 | { |
622 | return (lport & (sctp_port_hashsize - 1)); | 634 | return lport & (sctp_port_hashsize - 1); |
623 | } | 635 | } |
624 | 636 | ||
625 | /* This is the hash function for the endpoint hash table. */ | 637 | /* This is the hash function for the endpoint hash table. */ |
626 | static inline int sctp_ep_hashfn(__u16 lport) | 638 | static inline int sctp_ep_hashfn(__u16 lport) |
627 | { | 639 | { |
628 | return (lport & (sctp_ep_hashsize - 1)); | 640 | return lport & (sctp_ep_hashsize - 1); |
629 | } | 641 | } |
630 | 642 | ||
631 | /* This is the hash function for the association hash table. */ | 643 | /* This is the hash function for the association hash table. */ |
@@ -633,7 +645,7 @@ static inline int sctp_assoc_hashfn(__u16 lport, __u16 rport) | |||
633 | { | 645 | { |
634 | int h = (lport << 16) + rport; | 646 | int h = (lport << 16) + rport; |
635 | h ^= h>>8; | 647 | h ^= h>>8; |
636 | return (h & (sctp_assoc_hashsize - 1)); | 648 | return h & (sctp_assoc_hashsize - 1); |
637 | } | 649 | } |
638 | 650 | ||
639 | /* This is the hash function for the association hash table. This is | 651 | /* This is the hash function for the association hash table. This is |
@@ -644,7 +656,7 @@ static inline int sctp_vtag_hashfn(__u16 lport, __u16 rport, __u32 vtag) | |||
644 | { | 656 | { |
645 | int h = (lport << 16) + rport; | 657 | int h = (lport << 16) + rport; |
646 | h ^= vtag; | 658 | h ^= vtag; |
647 | return (h & (sctp_assoc_hashsize-1)); | 659 | return h & (sctp_assoc_hashsize - 1); |
648 | } | 660 | } |
649 | 661 | ||
650 | #define sctp_for_each_hentry(epb, node, head) \ | 662 | #define sctp_for_each_hentry(epb, node, head) \ |
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 4088c89a9055..9352d12f02de 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h | |||
@@ -345,12 +345,12 @@ enum { | |||
345 | 345 | ||
346 | static inline int TSN_lt(__u32 s, __u32 t) | 346 | static inline int TSN_lt(__u32 s, __u32 t) |
347 | { | 347 | { |
348 | return (((s) - (t)) & TSN_SIGN_BIT); | 348 | return ((s) - (t)) & TSN_SIGN_BIT; |
349 | } | 349 | } |
350 | 350 | ||
351 | static inline int TSN_lte(__u32 s, __u32 t) | 351 | static inline int TSN_lte(__u32 s, __u32 t) |
352 | { | 352 | { |
353 | return (((s) == (t)) || (((s) - (t)) & TSN_SIGN_BIT)); | 353 | return ((s) == (t)) || (((s) - (t)) & TSN_SIGN_BIT); |
354 | } | 354 | } |
355 | 355 | ||
356 | /* Compare two SSNs */ | 356 | /* Compare two SSNs */ |
@@ -369,12 +369,12 @@ enum { | |||
369 | 369 | ||
370 | static inline int SSN_lt(__u16 s, __u16 t) | 370 | static inline int SSN_lt(__u16 s, __u16 t) |
371 | { | 371 | { |
372 | return (((s) - (t)) & SSN_SIGN_BIT); | 372 | return ((s) - (t)) & SSN_SIGN_BIT; |
373 | } | 373 | } |
374 | 374 | ||
375 | static inline int SSN_lte(__u16 s, __u16 t) | 375 | static inline int SSN_lte(__u16 s, __u16 t) |
376 | { | 376 | { |
377 | return (((s) == (t)) || (((s) - (t)) & SSN_SIGN_BIT)); | 377 | return ((s) == (t)) || (((s) - (t)) & SSN_SIGN_BIT); |
378 | } | 378 | } |
379 | 379 | ||
380 | /* | 380 | /* |
@@ -388,7 +388,7 @@ enum { | |||
388 | 388 | ||
389 | static inline int ADDIP_SERIAL_gte(__u16 s, __u16 t) | 389 | static inline int ADDIP_SERIAL_gte(__u16 s, __u16 t) |
390 | { | 390 | { |
391 | return (((s) == (t)) || (((t) - (s)) & ADDIP_SERIAL_SIGN_BIT)); | 391 | return ((s) == (t)) || (((t) - (s)) & ADDIP_SERIAL_SIGN_BIT); |
392 | } | 392 | } |
393 | 393 | ||
394 | /* Check VTAG of the packet matches the sender's own tag. */ | 394 | /* Check VTAG of the packet matches the sender's own tag. */ |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index f9e7473613bd..69fef4fb79c0 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
@@ -847,7 +847,7 @@ void sctp_packet_free(struct sctp_packet *); | |||
847 | 847 | ||
848 | static inline int sctp_packet_empty(struct sctp_packet *packet) | 848 | static inline int sctp_packet_empty(struct sctp_packet *packet) |
849 | { | 849 | { |
850 | return (packet->size == packet->overhead); | 850 | return packet->size == packet->overhead; |
851 | } | 851 | } |
852 | 852 | ||
853 | /* This represents a remote transport address. | 853 | /* This represents a remote transport address. |
diff --git a/include/net/sctp/tsnmap.h b/include/net/sctp/tsnmap.h index 4aabc5a96cf6..e7728bc14ccf 100644 --- a/include/net/sctp/tsnmap.h +++ b/include/net/sctp/tsnmap.h | |||
@@ -157,7 +157,7 @@ __u16 sctp_tsnmap_pending(struct sctp_tsnmap *map); | |||
157 | /* Is there a gap in the TSN map? */ | 157 | /* Is there a gap in the TSN map? */ |
158 | static inline int sctp_tsnmap_has_gap(const struct sctp_tsnmap *map) | 158 | static inline int sctp_tsnmap_has_gap(const struct sctp_tsnmap *map) |
159 | { | 159 | { |
160 | return (map->cumulative_tsn_ack_point != map->max_tsn_seen); | 160 | return map->cumulative_tsn_ack_point != map->max_tsn_seen; |
161 | } | 161 | } |
162 | 162 | ||
163 | /* Mark a duplicate TSN. Note: limit the storage of duplicate TSN | 163 | /* Mark a duplicate TSN. Note: limit the storage of duplicate TSN |
diff --git a/include/net/sock.h b/include/net/sock.h index adab9dc58183..a6338d039857 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -301,7 +301,7 @@ struct sock { | |||
301 | const struct cred *sk_peer_cred; | 301 | const struct cred *sk_peer_cred; |
302 | long sk_rcvtimeo; | 302 | long sk_rcvtimeo; |
303 | long sk_sndtimeo; | 303 | long sk_sndtimeo; |
304 | struct sk_filter *sk_filter; | 304 | struct sk_filter __rcu *sk_filter; |
305 | void *sk_protinfo; | 305 | void *sk_protinfo; |
306 | struct timer_list sk_timer; | 306 | struct timer_list sk_timer; |
307 | ktime_t sk_stamp; | 307 | ktime_t sk_stamp; |
@@ -762,7 +762,7 @@ struct proto { | |||
762 | 762 | ||
763 | /* Memory pressure */ | 763 | /* Memory pressure */ |
764 | void (*enter_memory_pressure)(struct sock *sk); | 764 | void (*enter_memory_pressure)(struct sock *sk); |
765 | atomic_t *memory_allocated; /* Current allocated memory. */ | 765 | atomic_long_t *memory_allocated; /* Current allocated memory. */ |
766 | struct percpu_counter *sockets_allocated; /* Current number of sockets. */ | 766 | struct percpu_counter *sockets_allocated; /* Current number of sockets. */ |
767 | /* | 767 | /* |
768 | * Pressure flag: try to collapse. | 768 | * Pressure flag: try to collapse. |
@@ -771,7 +771,7 @@ struct proto { | |||
771 | * is strict, actions are advisory and have some latency. | 771 | * is strict, actions are advisory and have some latency. |
772 | */ | 772 | */ |
773 | int *memory_pressure; | 773 | int *memory_pressure; |
774 | int *sysctl_mem; | 774 | long *sysctl_mem; |
775 | int *sysctl_wmem; | 775 | int *sysctl_wmem; |
776 | int *sysctl_rmem; | 776 | int *sysctl_rmem; |
777 | int max_header; | 777 | int max_header; |
@@ -1558,7 +1558,11 @@ static inline void sk_wake_async(struct sock *sk, int how, int band) | |||
1558 | } | 1558 | } |
1559 | 1559 | ||
1560 | #define SOCK_MIN_SNDBUF 2048 | 1560 | #define SOCK_MIN_SNDBUF 2048 |
1561 | #define SOCK_MIN_RCVBUF 256 | 1561 | /* |
1562 | * Since sk_rmem_alloc sums skb->truesize, even a small frame might need | ||
1563 | * sizeof(sk_buff) + MTU + padding, unless net driver perform copybreak | ||
1564 | */ | ||
1565 | #define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff)) | ||
1562 | 1566 | ||
1563 | static inline void sk_stream_moderate_sndbuf(struct sock *sk) | 1567 | static inline void sk_stream_moderate_sndbuf(struct sock *sk) |
1564 | { | 1568 | { |
@@ -1670,17 +1674,13 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, | |||
1670 | 1674 | ||
1671 | /** | 1675 | /** |
1672 | * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped | 1676 | * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped |
1673 | * @msg: outgoing packet | ||
1674 | * @sk: socket sending this packet | 1677 | * @sk: socket sending this packet |
1675 | * @shtx: filled with instructions for time stamping | 1678 | * @tx_flags: filled with instructions for time stamping |
1676 | * | 1679 | * |
1677 | * Currently only depends on SOCK_TIMESTAMPING* flags. Returns error code if | 1680 | * Currently only depends on SOCK_TIMESTAMPING* flags. Returns error code if |
1678 | * parameters are invalid. | 1681 | * parameters are invalid. |
1679 | */ | 1682 | */ |
1680 | extern int sock_tx_timestamp(struct msghdr *msg, | 1683 | extern int sock_tx_timestamp(struct sock *sk, __u8 *tx_flags); |
1681 | struct sock *sk, | ||
1682 | union skb_shared_tx *shtx); | ||
1683 | |||
1684 | 1684 | ||
1685 | /** | 1685 | /** |
1686 | * sk_eat_skb - Release a skb if it is no longer needed | 1686 | * sk_eat_skb - Release a skb if it is no longer needed |
diff --git a/include/net/tc_act/tc_csum.h b/include/net/tc_act/tc_csum.h new file mode 100644 index 000000000000..9e8710be7a04 --- /dev/null +++ b/include/net/tc_act/tc_csum.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef __NET_TC_CSUM_H | ||
2 | #define __NET_TC_CSUM_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <net/act_api.h> | ||
6 | |||
7 | struct tcf_csum { | ||
8 | struct tcf_common common; | ||
9 | |||
10 | u32 update_flags; | ||
11 | }; | ||
12 | #define to_tcf_csum(pc) \ | ||
13 | container_of(pc,struct tcf_csum,common) | ||
14 | |||
15 | #endif /* __NET_TC_CSUM_H */ | ||
diff --git a/include/net/tcp.h b/include/net/tcp.h index 3e4b33e36602..e36c874c7fb1 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -224,7 +224,7 @@ extern int sysctl_tcp_fack; | |||
224 | extern int sysctl_tcp_reordering; | 224 | extern int sysctl_tcp_reordering; |
225 | extern int sysctl_tcp_ecn; | 225 | extern int sysctl_tcp_ecn; |
226 | extern int sysctl_tcp_dsack; | 226 | extern int sysctl_tcp_dsack; |
227 | extern int sysctl_tcp_mem[3]; | 227 | extern long sysctl_tcp_mem[3]; |
228 | extern int sysctl_tcp_wmem[3]; | 228 | extern int sysctl_tcp_wmem[3]; |
229 | extern int sysctl_tcp_rmem[3]; | 229 | extern int sysctl_tcp_rmem[3]; |
230 | extern int sysctl_tcp_app_win; | 230 | extern int sysctl_tcp_app_win; |
@@ -247,7 +247,7 @@ extern int sysctl_tcp_cookie_size; | |||
247 | extern int sysctl_tcp_thin_linear_timeouts; | 247 | extern int sysctl_tcp_thin_linear_timeouts; |
248 | extern int sysctl_tcp_thin_dupack; | 248 | extern int sysctl_tcp_thin_dupack; |
249 | 249 | ||
250 | extern atomic_t tcp_memory_allocated; | 250 | extern atomic_long_t tcp_memory_allocated; |
251 | extern struct percpu_counter tcp_sockets_allocated; | 251 | extern struct percpu_counter tcp_sockets_allocated; |
252 | extern int tcp_memory_pressure; | 252 | extern int tcp_memory_pressure; |
253 | 253 | ||
@@ -280,7 +280,7 @@ static inline bool tcp_too_many_orphans(struct sock *sk, int shift) | |||
280 | } | 280 | } |
281 | 281 | ||
282 | if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && | 282 | if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && |
283 | atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]) | 283 | atomic_long_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]) |
284 | return true; | 284 | return true; |
285 | return false; | 285 | return false; |
286 | } | 286 | } |
@@ -346,8 +346,6 @@ static inline void tcp_dec_quickack_mode(struct sock *sk, | |||
346 | } | 346 | } |
347 | } | 347 | } |
348 | 348 | ||
349 | extern void tcp_enter_quickack_mode(struct sock *sk); | ||
350 | |||
351 | #define TCP_ECN_OK 1 | 349 | #define TCP_ECN_OK 1 |
352 | #define TCP_ECN_QUEUE_CWR 2 | 350 | #define TCP_ECN_QUEUE_CWR 2 |
353 | #define TCP_ECN_DEMAND_CWR 4 | 351 | #define TCP_ECN_DEMAND_CWR 4 |
@@ -803,6 +801,15 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk) | |||
803 | /* Use define here intentionally to get WARN_ON location shown at the caller */ | 801 | /* Use define here intentionally to get WARN_ON location shown at the caller */ |
804 | #define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->packets_out) | 802 | #define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->packets_out) |
805 | 803 | ||
804 | /* | ||
805 | * Convert RFC 3390 larger initial window into an equivalent number of packets. | ||
806 | * This is based on the numbers specified in RFC 5681, 3.1. | ||
807 | */ | ||
808 | static inline u32 rfc3390_bytes_to_packets(const u32 smss) | ||
809 | { | ||
810 | return smss <= 1095 ? 4 : (smss > 2190 ? 2 : 3); | ||
811 | } | ||
812 | |||
806 | extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh); | 813 | extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh); |
807 | extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst); | 814 | extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst); |
808 | 815 | ||
diff --git a/include/net/tipc/tipc.h b/include/net/tipc/tipc.h index 15af6dca0b49..1e0645e1eed2 100644 --- a/include/net/tipc/tipc.h +++ b/include/net/tipc/tipc.h | |||
@@ -50,8 +50,6 @@ | |||
50 | * TIPC operating mode routines | 50 | * TIPC operating mode routines |
51 | */ | 51 | */ |
52 | 52 | ||
53 | u32 tipc_get_addr(void); | ||
54 | |||
55 | #define TIPC_NOT_RUNNING 0 | 53 | #define TIPC_NOT_RUNNING 0 |
56 | #define TIPC_NODE_MODE 1 | 54 | #define TIPC_NODE_MODE 1 |
57 | #define TIPC_NET_MODE 2 | 55 | #define TIPC_NET_MODE 2 |
@@ -62,8 +60,6 @@ int tipc_attach(unsigned int *userref, tipc_mode_event, void *usr_handle); | |||
62 | 60 | ||
63 | void tipc_detach(unsigned int userref); | 61 | void tipc_detach(unsigned int userref); |
64 | 62 | ||
65 | int tipc_get_mode(void); | ||
66 | |||
67 | /* | 63 | /* |
68 | * TIPC port manipulation routines | 64 | * TIPC port manipulation routines |
69 | */ | 65 | */ |
@@ -153,12 +149,6 @@ int tipc_disconnect(u32 portref); | |||
153 | 149 | ||
154 | int tipc_shutdown(u32 ref); | 150 | int tipc_shutdown(u32 ref); |
155 | 151 | ||
156 | int tipc_isconnected(u32 portref, int *isconnected); | ||
157 | |||
158 | int tipc_peer(u32 portref, struct tipc_portid *peer); | ||
159 | |||
160 | int tipc_ref_valid(u32 portref); | ||
161 | |||
162 | /* | 152 | /* |
163 | * TIPC messaging routines | 153 | * TIPC messaging routines |
164 | */ | 154 | */ |
@@ -170,38 +160,12 @@ int tipc_send(u32 portref, | |||
170 | unsigned int num_sect, | 160 | unsigned int num_sect, |
171 | struct iovec const *msg_sect); | 161 | struct iovec const *msg_sect); |
172 | 162 | ||
173 | int tipc_send_buf(u32 portref, | ||
174 | struct sk_buff *buf, | ||
175 | unsigned int dsz); | ||
176 | |||
177 | int tipc_send2name(u32 portref, | 163 | int tipc_send2name(u32 portref, |
178 | struct tipc_name const *name, | 164 | struct tipc_name const *name, |
179 | u32 domain, | 165 | u32 domain, |
180 | unsigned int num_sect, | 166 | unsigned int num_sect, |
181 | struct iovec const *msg_sect); | 167 | struct iovec const *msg_sect); |
182 | 168 | ||
183 | int tipc_send_buf2name(u32 portref, | ||
184 | struct tipc_name const *name, | ||
185 | u32 domain, | ||
186 | struct sk_buff *buf, | ||
187 | unsigned int dsz); | ||
188 | |||
189 | int tipc_forward2name(u32 portref, | ||
190 | struct tipc_name const *name, | ||
191 | u32 domain, | ||
192 | unsigned int section_count, | ||
193 | struct iovec const *msg_sect, | ||
194 | struct tipc_portid const *origin, | ||
195 | unsigned int importance); | ||
196 | |||
197 | int tipc_forward_buf2name(u32 portref, | ||
198 | struct tipc_name const *name, | ||
199 | u32 domain, | ||
200 | struct sk_buff *buf, | ||
201 | unsigned int dsz, | ||
202 | struct tipc_portid const *orig, | ||
203 | unsigned int importance); | ||
204 | |||
205 | int tipc_send2port(u32 portref, | 169 | int tipc_send2port(u32 portref, |
206 | struct tipc_portid const *dest, | 170 | struct tipc_portid const *dest, |
207 | unsigned int num_sect, | 171 | unsigned int num_sect, |
@@ -212,46 +176,11 @@ int tipc_send_buf2port(u32 portref, | |||
212 | struct sk_buff *buf, | 176 | struct sk_buff *buf, |
213 | unsigned int dsz); | 177 | unsigned int dsz); |
214 | 178 | ||
215 | int tipc_forward2port(u32 portref, | ||
216 | struct tipc_portid const *dest, | ||
217 | unsigned int num_sect, | ||
218 | struct iovec const *msg_sect, | ||
219 | struct tipc_portid const *origin, | ||
220 | unsigned int importance); | ||
221 | |||
222 | int tipc_forward_buf2port(u32 portref, | ||
223 | struct tipc_portid const *dest, | ||
224 | struct sk_buff *buf, | ||
225 | unsigned int dsz, | ||
226 | struct tipc_portid const *orig, | ||
227 | unsigned int importance); | ||
228 | |||
229 | int tipc_multicast(u32 portref, | 179 | int tipc_multicast(u32 portref, |
230 | struct tipc_name_seq const *seq, | 180 | struct tipc_name_seq const *seq, |
231 | u32 domain, /* currently unused */ | 181 | u32 domain, /* currently unused */ |
232 | unsigned int section_count, | 182 | unsigned int section_count, |
233 | struct iovec const *msg); | 183 | struct iovec const *msg); |
234 | |||
235 | #if 0 | ||
236 | int tipc_multicast_buf(u32 portref, | ||
237 | struct tipc_name_seq const *seq, | ||
238 | u32 domain, | ||
239 | void *buf, | ||
240 | unsigned int size); | ||
241 | #endif | ||
242 | |||
243 | /* | ||
244 | * TIPC subscription routines | ||
245 | */ | ||
246 | |||
247 | int tipc_ispublished(struct tipc_name const *name); | ||
248 | |||
249 | /* | ||
250 | * Get number of available nodes within specified domain (excluding own node) | ||
251 | */ | ||
252 | |||
253 | unsigned int tipc_available_nodes(const u32 domain); | ||
254 | |||
255 | #endif | 184 | #endif |
256 | 185 | ||
257 | #endif | 186 | #endif |
diff --git a/include/net/tipc/tipc_msg.h b/include/net/tipc/tipc_msg.h index 2e159a812f83..ffe50b4e7b93 100644 --- a/include/net/tipc/tipc_msg.h +++ b/include/net/tipc/tipc_msg.h | |||
@@ -107,7 +107,7 @@ static inline u32 msg_hdr_sz(struct tipc_msg *m) | |||
107 | 107 | ||
108 | static inline int msg_short(struct tipc_msg *m) | 108 | static inline int msg_short(struct tipc_msg *m) |
109 | { | 109 | { |
110 | return (msg_hdr_sz(m) == 24); | 110 | return msg_hdr_sz(m) == 24; |
111 | } | 111 | } |
112 | 112 | ||
113 | static inline u32 msg_size(struct tipc_msg *m) | 113 | static inline u32 msg_size(struct tipc_msg *m) |
@@ -117,7 +117,7 @@ static inline u32 msg_size(struct tipc_msg *m) | |||
117 | 117 | ||
118 | static inline u32 msg_data_sz(struct tipc_msg *m) | 118 | static inline u32 msg_data_sz(struct tipc_msg *m) |
119 | { | 119 | { |
120 | return (msg_size(m) - msg_hdr_sz(m)); | 120 | return msg_size(m) - msg_hdr_sz(m); |
121 | } | 121 | } |
122 | 122 | ||
123 | static inline unchar *msg_data(struct tipc_msg *m) | 123 | static inline unchar *msg_data(struct tipc_msg *m) |
@@ -132,17 +132,17 @@ static inline u32 msg_type(struct tipc_msg *m) | |||
132 | 132 | ||
133 | static inline u32 msg_named(struct tipc_msg *m) | 133 | static inline u32 msg_named(struct tipc_msg *m) |
134 | { | 134 | { |
135 | return (msg_type(m) == TIPC_NAMED_MSG); | 135 | return msg_type(m) == TIPC_NAMED_MSG; |
136 | } | 136 | } |
137 | 137 | ||
138 | static inline u32 msg_mcast(struct tipc_msg *m) | 138 | static inline u32 msg_mcast(struct tipc_msg *m) |
139 | { | 139 | { |
140 | return (msg_type(m) == TIPC_MCAST_MSG); | 140 | return msg_type(m) == TIPC_MCAST_MSG; |
141 | } | 141 | } |
142 | 142 | ||
143 | static inline u32 msg_connected(struct tipc_msg *m) | 143 | static inline u32 msg_connected(struct tipc_msg *m) |
144 | { | 144 | { |
145 | return (msg_type(m) == TIPC_CONN_MSG); | 145 | return msg_type(m) == TIPC_CONN_MSG; |
146 | } | 146 | } |
147 | 147 | ||
148 | static inline u32 msg_errcode(struct tipc_msg *m) | 148 | static inline u32 msg_errcode(struct tipc_msg *m) |
diff --git a/include/net/tipc/tipc_port.h b/include/net/tipc/tipc_port.h index c54917cbfa48..1893aaf49426 100644 --- a/include/net/tipc/tipc_port.h +++ b/include/net/tipc/tipc_port.h | |||
@@ -88,8 +88,6 @@ void tipc_acknowledge(u32 port_ref,u32 ack); | |||
88 | 88 | ||
89 | struct tipc_port *tipc_get_port(const u32 ref); | 89 | struct tipc_port *tipc_get_port(const u32 ref); |
90 | 90 | ||
91 | void *tipc_get_handle(const u32 ref); | ||
92 | |||
93 | /* | 91 | /* |
94 | * The following routines require that the port be locked on entry | 92 | * The following routines require that the port be locked on entry |
95 | */ | 93 | */ |
diff --git a/include/net/udp.h b/include/net/udp.h index a184d3496b13..bb967dd59bf7 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -105,10 +105,10 @@ static inline struct udp_hslot *udp_hashslot2(struct udp_table *table, | |||
105 | 105 | ||
106 | extern struct proto udp_prot; | 106 | extern struct proto udp_prot; |
107 | 107 | ||
108 | extern atomic_t udp_memory_allocated; | 108 | extern atomic_long_t udp_memory_allocated; |
109 | 109 | ||
110 | /* sysctl variables for udp */ | 110 | /* sysctl variables for udp */ |
111 | extern int sysctl_udp_mem[3]; | 111 | extern long sysctl_udp_mem[3]; |
112 | extern int sysctl_udp_rmem_min; | 112 | extern int sysctl_udp_rmem_min; |
113 | extern int sysctl_udp_wmem_min; | 113 | extern int sysctl_udp_wmem_min; |
114 | 114 | ||
@@ -183,6 +183,9 @@ extern int udp_lib_setsockopt(struct sock *sk, int level, int optname, | |||
183 | extern struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport, | 183 | extern struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport, |
184 | __be32 daddr, __be16 dport, | 184 | __be32 daddr, __be16 dport, |
185 | int dif); | 185 | int dif); |
186 | extern struct sock *udp6_lib_lookup(struct net *net, const struct in6_addr *saddr, __be16 sport, | ||
187 | const struct in6_addr *daddr, __be16 dport, | ||
188 | int dif); | ||
186 | 189 | ||
187 | /* | 190 | /* |
188 | * SNMP statistics for UDP and UDP-Lite | 191 | * SNMP statistics for UDP and UDP-Lite |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 4f53532d4c2f..bcfb6b24b019 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -1264,7 +1264,7 @@ struct xfrm_tunnel { | |||
1264 | int (*handler)(struct sk_buff *skb); | 1264 | int (*handler)(struct sk_buff *skb); |
1265 | int (*err_handler)(struct sk_buff *skb, u32 info); | 1265 | int (*err_handler)(struct sk_buff *skb, u32 info); |
1266 | 1266 | ||
1267 | struct xfrm_tunnel *next; | 1267 | struct xfrm_tunnel __rcu *next; |
1268 | int priority; | 1268 | int priority; |
1269 | }; | 1269 | }; |
1270 | 1270 | ||
@@ -1272,7 +1272,7 @@ struct xfrm6_tunnel { | |||
1272 | int (*handler)(struct sk_buff *skb); | 1272 | int (*handler)(struct sk_buff *skb); |
1273 | int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, | 1273 | int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, |
1274 | u8 type, u8 code, int offset, __be32 info); | 1274 | u8 type, u8 code, int offset, __be32 info); |
1275 | struct xfrm6_tunnel *next; | 1275 | struct xfrm6_tunnel __rcu *next; |
1276 | int priority; | 1276 | int priority; |
1277 | }; | 1277 | }; |
1278 | 1278 | ||
@@ -1419,7 +1419,6 @@ extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, | |||
1419 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); | 1419 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); |
1420 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); | 1420 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); |
1421 | extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); | 1421 | extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); |
1422 | extern void xfrm6_tunnel_free_spi(struct net *net, xfrm_address_t *saddr); | ||
1423 | extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr); | 1422 | extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr); |
1424 | extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); | 1423 | extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); |
1425 | extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); | 1424 | extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); |
@@ -1466,8 +1465,6 @@ struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, | |||
1466 | xfrm_address_t *saddr, int create, | 1465 | xfrm_address_t *saddr, int create, |
1467 | unsigned short family); | 1466 | unsigned short family); |
1468 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); | 1467 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); |
1469 | extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst, | ||
1470 | struct flowi *fl, int family, int strict); | ||
1471 | 1468 | ||
1472 | #ifdef CONFIG_XFRM_MIGRATE | 1469 | #ifdef CONFIG_XFRM_MIGRATE |
1473 | extern int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | 1470 | extern int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type, |
diff --git a/include/pcmcia/cs.h b/include/pcmcia/cs.h deleted file mode 100644 index 68d8bde7e8d6..000000000000 --- a/include/pcmcia/cs.h +++ /dev/null | |||
@@ -1,95 +0,0 @@ | |||
1 | /* | ||
2 | * cs.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 | * The initial developer of the original code is David A. Hinds | ||
9 | * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds | ||
10 | * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. | ||
11 | * | ||
12 | * (C) 1999 David A. Hinds | ||
13 | */ | ||
14 | |||
15 | #ifndef _LINUX_CS_H | ||
16 | #define _LINUX_CS_H | ||
17 | |||
18 | #ifdef __KERNEL__ | ||
19 | #include <linux/interrupt.h> | ||
20 | #endif | ||
21 | |||
22 | /* ModifyConfiguration */ | ||
23 | typedef struct modconf_t { | ||
24 | u_int Attributes; | ||
25 | u_int Vcc, Vpp1, Vpp2; | ||
26 | } modconf_t; | ||
27 | |||
28 | /* Attributes for ModifyConfiguration */ | ||
29 | #define CONF_IRQ_CHANGE_VALID 0x0100 | ||
30 | #define CONF_VCC_CHANGE_VALID 0x0200 | ||
31 | #define CONF_VPP1_CHANGE_VALID 0x0400 | ||
32 | #define CONF_VPP2_CHANGE_VALID 0x0800 | ||
33 | #define CONF_IO_CHANGE_WIDTH 0x1000 | ||
34 | |||
35 | /* For RequestConfiguration */ | ||
36 | typedef struct config_req_t { | ||
37 | u_int Attributes; | ||
38 | u_int Vpp; /* both Vpp1 and Vpp2 */ | ||
39 | u_int IntType; | ||
40 | u_int ConfigBase; | ||
41 | u_char Status, Pin, Copy, ExtStatus; | ||
42 | u_char ConfigIndex; | ||
43 | u_int Present; | ||
44 | } config_req_t; | ||
45 | |||
46 | /* Attributes for RequestConfiguration */ | ||
47 | #define CONF_ENABLE_IRQ 0x01 | ||
48 | #define CONF_ENABLE_DMA 0x02 | ||
49 | #define CONF_ENABLE_SPKR 0x04 | ||
50 | #define CONF_ENABLE_PULSE_IRQ 0x08 | ||
51 | #define CONF_VALID_CLIENT 0x100 | ||
52 | |||
53 | /* IntType field */ | ||
54 | #define INT_MEMORY 0x01 | ||
55 | #define INT_MEMORY_AND_IO 0x02 | ||
56 | #define INT_CARDBUS 0x04 | ||
57 | #define INT_ZOOMED_VIDEO 0x08 | ||
58 | |||
59 | /* Configuration registers present */ | ||
60 | #define PRESENT_OPTION 0x001 | ||
61 | #define PRESENT_STATUS 0x002 | ||
62 | #define PRESENT_PIN_REPLACE 0x004 | ||
63 | #define PRESENT_COPY 0x008 | ||
64 | #define PRESENT_EXT_STATUS 0x010 | ||
65 | #define PRESENT_IOBASE_0 0x020 | ||
66 | #define PRESENT_IOBASE_1 0x040 | ||
67 | #define PRESENT_IOBASE_2 0x080 | ||
68 | #define PRESENT_IOBASE_3 0x100 | ||
69 | #define PRESENT_IOSIZE 0x200 | ||
70 | |||
71 | /* For RequestWindow */ | ||
72 | typedef struct win_req_t { | ||
73 | u_int Attributes; | ||
74 | u_long Base; | ||
75 | u_int Size; | ||
76 | u_int AccessSpeed; | ||
77 | } win_req_t; | ||
78 | |||
79 | /* Attributes for RequestWindow */ | ||
80 | #define WIN_MEMORY_TYPE_CM 0x00 /* default */ | ||
81 | #define WIN_MEMORY_TYPE_AM 0x20 /* MAP_ATTRIB */ | ||
82 | #define WIN_DATA_WIDTH_8 0x00 /* default */ | ||
83 | #define WIN_DATA_WIDTH_16 0x02 /* MAP_16BIT */ | ||
84 | #define WIN_ENABLE 0x01 /* MAP_ACTIVE */ | ||
85 | #define WIN_USE_WAIT 0x40 /* MAP_USE_WAIT */ | ||
86 | |||
87 | #define WIN_FLAGS_MAP 0x63 /* MAP_ATTRIB | MAP_16BIT | MAP_ACTIVE | | ||
88 | MAP_USE_WAIT */ | ||
89 | #define WIN_FLAGS_REQ 0x1c /* mapping to socket->win[i]: | ||
90 | 0x04 -> 0 | ||
91 | 0x08 -> 1 | ||
92 | 0x0c -> 2 | ||
93 | 0x10 -> 3 */ | ||
94 | |||
95 | #endif /* _LINUX_CS_H */ | ||
diff --git a/include/pcmcia/ds.h b/include/pcmcia/ds.h index 70c58ed2278c..8479b66c067b 100644 --- a/include/pcmcia/ds.h +++ b/include/pcmcia/ds.h | |||
@@ -24,9 +24,11 @@ | |||
24 | 24 | ||
25 | #ifdef __KERNEL__ | 25 | #ifdef __KERNEL__ |
26 | #include <linux/device.h> | 26 | #include <linux/device.h> |
27 | #include <linux/interrupt.h> | ||
27 | #include <pcmcia/ss.h> | 28 | #include <pcmcia/ss.h> |
28 | #include <asm/atomic.h> | 29 | #include <asm/atomic.h> |
29 | 30 | ||
31 | |||
30 | /* | 32 | /* |
31 | * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus | 33 | * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus |
32 | * a.k.a. PCI drivers | 34 | * a.k.a. PCI drivers |
@@ -36,8 +38,6 @@ struct pcmcia_device; | |||
36 | struct config_t; | 38 | struct config_t; |
37 | struct net_device; | 39 | struct net_device; |
38 | 40 | ||
39 | typedef struct resource *window_handle_t; | ||
40 | |||
41 | /* dynamic device IDs for PCMCIA device drivers. See | 41 | /* dynamic device IDs for PCMCIA device drivers. See |
42 | * Documentation/pcmcia/driver.txt for details. | 42 | * Documentation/pcmcia/driver.txt for details. |
43 | */ | 43 | */ |
@@ -47,6 +47,8 @@ struct pcmcia_dynids { | |||
47 | }; | 47 | }; |
48 | 48 | ||
49 | struct pcmcia_driver { | 49 | struct pcmcia_driver { |
50 | const char *name; | ||
51 | |||
50 | int (*probe) (struct pcmcia_device *dev); | 52 | int (*probe) (struct pcmcia_device *dev); |
51 | void (*remove) (struct pcmcia_device *dev); | 53 | void (*remove) (struct pcmcia_device *dev); |
52 | 54 | ||
@@ -90,15 +92,17 @@ struct pcmcia_device { | |||
90 | 92 | ||
91 | struct list_head socket_device_list; | 93 | struct list_head socket_device_list; |
92 | 94 | ||
93 | /* deprecated, will be cleaned up soon */ | ||
94 | config_req_t conf; | ||
95 | window_handle_t win; | ||
96 | |||
97 | /* device setup */ | 95 | /* device setup */ |
98 | unsigned int irq; | 96 | unsigned int irq; |
99 | struct resource *resource[PCMCIA_NUM_RESOURCES]; | 97 | struct resource *resource[PCMCIA_NUM_RESOURCES]; |
98 | resource_size_t card_addr; /* for the 1st IOMEM resource */ | ||
99 | unsigned int vpp; | ||
100 | 100 | ||
101 | unsigned int io_lines; /* number of I/O lines */ | 101 | unsigned int config_flags; /* CONF_ENABLE_ flags below */ |
102 | unsigned int config_base; | ||
103 | unsigned int config_index; | ||
104 | unsigned int config_regs; /* PRESENT_ flags below */ | ||
105 | unsigned int io_lines; /* number of I/O lines */ | ||
102 | 106 | ||
103 | /* Is the device suspended? */ | 107 | /* Is the device suspended? */ |
104 | u16 suspended:1; | 108 | u16 suspended:1; |
@@ -174,9 +178,6 @@ int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse); | |||
174 | /* loop CIS entries for valid configuration */ | 178 | /* loop CIS entries for valid configuration */ |
175 | int pcmcia_loop_config(struct pcmcia_device *p_dev, | 179 | int pcmcia_loop_config(struct pcmcia_device *p_dev, |
176 | int (*conf_check) (struct pcmcia_device *p_dev, | 180 | int (*conf_check) (struct pcmcia_device *p_dev, |
177 | cistpl_cftable_entry_t *cf, | ||
178 | cistpl_cftable_entry_t *dflt, | ||
179 | unsigned int vcc, | ||
180 | void *priv_data), | 181 | void *priv_data), |
181 | void *priv_data); | 182 | void *priv_data); |
182 | 183 | ||
@@ -206,16 +207,17 @@ pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, | |||
206 | int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, | 207 | int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, |
207 | irq_handler_t handler); | 208 | irq_handler_t handler); |
208 | 209 | ||
209 | int pcmcia_request_configuration(struct pcmcia_device *p_dev, | 210 | int pcmcia_enable_device(struct pcmcia_device *p_dev); |
210 | config_req_t *req); | ||
211 | 211 | ||
212 | int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, | 212 | int pcmcia_request_window(struct pcmcia_device *p_dev, struct resource *res, |
213 | window_handle_t *wh); | 213 | unsigned int speed); |
214 | int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t win); | 214 | int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res); |
215 | int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win, | 215 | int pcmcia_map_mem_page(struct pcmcia_device *p_dev, struct resource *res, |
216 | unsigned int offset); | 216 | unsigned int offset); |
217 | 217 | ||
218 | int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); | 218 | int pcmcia_fixup_vpp(struct pcmcia_device *p_dev, unsigned char new_vpp); |
219 | int pcmcia_fixup_iowidth(struct pcmcia_device *p_dev); | ||
220 | |||
219 | void pcmcia_disable_device(struct pcmcia_device *p_dev); | 221 | void pcmcia_disable_device(struct pcmcia_device *p_dev); |
220 | 222 | ||
221 | /* IO ports */ | 223 | /* IO ports */ |
@@ -224,15 +226,48 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev); | |||
224 | #define IO_DATA_PATH_WIDTH_16 0x08 | 226 | #define IO_DATA_PATH_WIDTH_16 0x08 |
225 | #define IO_DATA_PATH_WIDTH_AUTO 0x10 | 227 | #define IO_DATA_PATH_WIDTH_AUTO 0x10 |
226 | 228 | ||
227 | /* convert flag found in cfgtable to data path width parameter */ | 229 | /* IO memory */ |
228 | static inline int pcmcia_io_cfg_data_width(unsigned int flags) | 230 | #define WIN_MEMORY_TYPE_CM 0x00 /* default */ |
229 | { | 231 | #define WIN_MEMORY_TYPE_AM 0x20 /* MAP_ATTRIB */ |
230 | if (!(flags & CISTPL_IO_8BIT)) | 232 | #define WIN_DATA_WIDTH_8 0x00 /* default */ |
231 | return IO_DATA_PATH_WIDTH_16; | 233 | #define WIN_DATA_WIDTH_16 0x02 /* MAP_16BIT */ |
232 | if (!(flags & CISTPL_IO_16BIT)) | 234 | #define WIN_ENABLE 0x01 /* MAP_ACTIVE */ |
233 | return IO_DATA_PATH_WIDTH_8; | 235 | #define WIN_USE_WAIT 0x40 /* MAP_USE_WAIT */ |
234 | return IO_DATA_PATH_WIDTH_AUTO; | 236 | |
235 | } | 237 | #define WIN_FLAGS_MAP 0x63 /* MAP_ATTRIB | MAP_16BIT | MAP_ACTIVE | |
238 | MAP_USE_WAIT */ | ||
239 | #define WIN_FLAGS_REQ 0x1c /* mapping to socket->win[i]: | ||
240 | 0x04 -> 0 | ||
241 | 0x08 -> 1 | ||
242 | 0x0c -> 2 | ||
243 | 0x10 -> 3 */ | ||
244 | |||
245 | /* config_reg{ister}s present for this PCMCIA device */ | ||
246 | #define PRESENT_OPTION 0x001 | ||
247 | #define PRESENT_STATUS 0x002 | ||
248 | #define PRESENT_PIN_REPLACE 0x004 | ||
249 | #define PRESENT_COPY 0x008 | ||
250 | #define PRESENT_EXT_STATUS 0x010 | ||
251 | #define PRESENT_IOBASE_0 0x020 | ||
252 | #define PRESENT_IOBASE_1 0x040 | ||
253 | #define PRESENT_IOBASE_2 0x080 | ||
254 | #define PRESENT_IOBASE_3 0x100 | ||
255 | #define PRESENT_IOSIZE 0x200 | ||
256 | |||
257 | /* flags to be passed to pcmcia_enable_device() */ | ||
258 | #define CONF_ENABLE_IRQ 0x0001 | ||
259 | #define CONF_ENABLE_SPKR 0x0002 | ||
260 | #define CONF_ENABLE_PULSE_IRQ 0x0004 | ||
261 | #define CONF_ENABLE_ESR 0x0008 | ||
262 | #define CONF_ENABLE_IOCARD 0x0010 /* auto-enabled if IO resources or IRQ | ||
263 | * (CONF_ENABLE_IRQ) in use */ | ||
264 | |||
265 | /* flags used by pcmcia_loop_config() autoconfiguration */ | ||
266 | #define CONF_AUTO_CHECK_VCC 0x0100 /* check for matching Vcc? */ | ||
267 | #define CONF_AUTO_SET_VPP 0x0200 /* set Vpp? */ | ||
268 | #define CONF_AUTO_AUDIO 0x0400 /* enable audio line? */ | ||
269 | #define CONF_AUTO_SET_IO 0x0800 /* set ->resource[0,1] */ | ||
270 | #define CONF_AUTO_SET_IOMEM 0x1000 /* set ->resource[2] */ | ||
236 | 271 | ||
237 | #endif /* __KERNEL__ */ | 272 | #endif /* __KERNEL__ */ |
238 | 273 | ||
diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h index 626b63c33d9e..731cde010f42 100644 --- a/include/pcmcia/ss.h +++ b/include/pcmcia/ss.h | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <linux/sched.h> /* task_struct, completion */ | 19 | #include <linux/sched.h> /* task_struct, completion */ |
20 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
21 | 21 | ||
22 | #include <pcmcia/cs.h> | ||
23 | #ifdef CONFIG_CARDBUS | 22 | #ifdef CONFIG_CARDBUS |
24 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
25 | #endif | 24 | #endif |
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index fa0d52b8e622..b5fc9f39122b 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h | |||
@@ -39,7 +39,9 @@ | |||
39 | #include <linux/if_arp.h> | 39 | #include <linux/if_arp.h> |
40 | #include <linux/netdevice.h> | 40 | #include <linux/netdevice.h> |
41 | #include <linux/socket.h> | 41 | #include <linux/socket.h> |
42 | #include <linux/if_vlan.h> | ||
42 | #include <rdma/ib_verbs.h> | 43 | #include <rdma/ib_verbs.h> |
44 | #include <rdma/ib_pack.h> | ||
43 | 45 | ||
44 | struct rdma_addr_client { | 46 | struct rdma_addr_client { |
45 | atomic_t refcount; | 47 | atomic_t refcount; |
@@ -63,6 +65,7 @@ struct rdma_dev_addr { | |||
63 | unsigned char broadcast[MAX_ADDR_LEN]; | 65 | unsigned char broadcast[MAX_ADDR_LEN]; |
64 | unsigned short dev_type; | 66 | unsigned short dev_type; |
65 | int bound_dev_if; | 67 | int bound_dev_if; |
68 | enum rdma_transport_type transport; | ||
66 | }; | 69 | }; |
67 | 70 | ||
68 | /** | 71 | /** |
@@ -127,9 +130,51 @@ static inline int rdma_addr_gid_offset(struct rdma_dev_addr *dev_addr) | |||
127 | return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0; | 130 | return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0; |
128 | } | 131 | } |
129 | 132 | ||
133 | static inline void iboe_mac_vlan_to_ll(union ib_gid *gid, u8 *mac, u16 vid) | ||
134 | { | ||
135 | memset(gid->raw, 0, 16); | ||
136 | *((__be32 *) gid->raw) = cpu_to_be32(0xfe800000); | ||
137 | if (vid < 0x1000) { | ||
138 | gid->raw[12] = vid & 0xff; | ||
139 | gid->raw[11] = vid >> 8; | ||
140 | } else { | ||
141 | gid->raw[12] = 0xfe; | ||
142 | gid->raw[11] = 0xff; | ||
143 | } | ||
144 | memcpy(gid->raw + 13, mac + 3, 3); | ||
145 | memcpy(gid->raw + 8, mac, 3); | ||
146 | gid->raw[8] ^= 2; | ||
147 | } | ||
148 | |||
149 | static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev) | ||
150 | { | ||
151 | return dev->priv_flags & IFF_802_1Q_VLAN ? | ||
152 | vlan_dev_vlan_id(dev) : 0xffff; | ||
153 | } | ||
154 | |||
155 | static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr, | ||
156 | union ib_gid *gid) | ||
157 | { | ||
158 | struct net_device *dev; | ||
159 | u16 vid = 0xffff; | ||
160 | |||
161 | dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if); | ||
162 | if (dev) { | ||
163 | vid = rdma_vlan_dev_vlan_id(dev); | ||
164 | dev_put(dev); | ||
165 | } | ||
166 | |||
167 | iboe_mac_vlan_to_ll(gid, dev_addr->src_dev_addr, vid); | ||
168 | } | ||
169 | |||
130 | static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) | 170 | static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) |
131 | { | 171 | { |
132 | memcpy(gid, dev_addr->src_dev_addr + rdma_addr_gid_offset(dev_addr), sizeof *gid); | 172 | if (dev_addr->transport == RDMA_TRANSPORT_IB && |
173 | dev_addr->dev_type != ARPHRD_INFINIBAND) | ||
174 | iboe_addr_get_sgid(dev_addr, gid); | ||
175 | else | ||
176 | memcpy(gid, dev_addr->src_dev_addr + | ||
177 | rdma_addr_gid_offset(dev_addr), sizeof *gid); | ||
133 | } | 178 | } |
134 | 179 | ||
135 | static inline void rdma_addr_set_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) | 180 | static inline void rdma_addr_set_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) |
@@ -147,4 +192,91 @@ static inline void rdma_addr_set_dgid(struct rdma_dev_addr *dev_addr, union ib_g | |||
147 | memcpy(dev_addr->dst_dev_addr + rdma_addr_gid_offset(dev_addr), gid, sizeof *gid); | 192 | memcpy(dev_addr->dst_dev_addr + rdma_addr_gid_offset(dev_addr), gid, sizeof *gid); |
148 | } | 193 | } |
149 | 194 | ||
195 | static inline enum ib_mtu iboe_get_mtu(int mtu) | ||
196 | { | ||
197 | /* | ||
198 | * reduce IB headers from effective IBoE MTU. 28 stands for | ||
199 | * atomic header which is the biggest possible header after BTH | ||
200 | */ | ||
201 | mtu = mtu - IB_GRH_BYTES - IB_BTH_BYTES - 28; | ||
202 | |||
203 | if (mtu >= ib_mtu_enum_to_int(IB_MTU_4096)) | ||
204 | return IB_MTU_4096; | ||
205 | else if (mtu >= ib_mtu_enum_to_int(IB_MTU_2048)) | ||
206 | return IB_MTU_2048; | ||
207 | else if (mtu >= ib_mtu_enum_to_int(IB_MTU_1024)) | ||
208 | return IB_MTU_1024; | ||
209 | else if (mtu >= ib_mtu_enum_to_int(IB_MTU_512)) | ||
210 | return IB_MTU_512; | ||
211 | else if (mtu >= ib_mtu_enum_to_int(IB_MTU_256)) | ||
212 | return IB_MTU_256; | ||
213 | else | ||
214 | return 0; | ||
215 | } | ||
216 | |||
217 | static inline int iboe_get_rate(struct net_device *dev) | ||
218 | { | ||
219 | struct ethtool_cmd cmd; | ||
220 | |||
221 | if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings || | ||
222 | dev->ethtool_ops->get_settings(dev, &cmd)) | ||
223 | return IB_RATE_PORT_CURRENT; | ||
224 | |||
225 | if (cmd.speed >= 40000) | ||
226 | return IB_RATE_40_GBPS; | ||
227 | else if (cmd.speed >= 30000) | ||
228 | return IB_RATE_30_GBPS; | ||
229 | else if (cmd.speed >= 20000) | ||
230 | return IB_RATE_20_GBPS; | ||
231 | else if (cmd.speed >= 10000) | ||
232 | return IB_RATE_10_GBPS; | ||
233 | else | ||
234 | return IB_RATE_PORT_CURRENT; | ||
235 | } | ||
236 | |||
237 | static inline int rdma_link_local_addr(struct in6_addr *addr) | ||
238 | { | ||
239 | if (addr->s6_addr32[0] == htonl(0xfe800000) && | ||
240 | addr->s6_addr32[1] == 0) | ||
241 | return 1; | ||
242 | |||
243 | return 0; | ||
244 | } | ||
245 | |||
246 | static inline void rdma_get_ll_mac(struct in6_addr *addr, u8 *mac) | ||
247 | { | ||
248 | memcpy(mac, &addr->s6_addr[8], 3); | ||
249 | memcpy(mac + 3, &addr->s6_addr[13], 3); | ||
250 | mac[0] ^= 2; | ||
251 | } | ||
252 | |||
253 | static inline int rdma_is_multicast_addr(struct in6_addr *addr) | ||
254 | { | ||
255 | return addr->s6_addr[0] == 0xff; | ||
256 | } | ||
257 | |||
258 | static inline void rdma_get_mcast_mac(struct in6_addr *addr, u8 *mac) | ||
259 | { | ||
260 | int i; | ||
261 | |||
262 | mac[0] = 0x33; | ||
263 | mac[1] = 0x33; | ||
264 | for (i = 2; i < 6; ++i) | ||
265 | mac[i] = addr->s6_addr[i + 10]; | ||
266 | } | ||
267 | |||
268 | static inline u16 rdma_get_vlan_id(union ib_gid *dgid) | ||
269 | { | ||
270 | u16 vid; | ||
271 | |||
272 | vid = dgid->raw[11] << 8 | dgid->raw[12]; | ||
273 | return vid < 0x1000 ? vid : 0xffff; | ||
274 | } | ||
275 | |||
276 | static inline struct net_device *rdma_vlan_dev_real_dev(const struct net_device *dev) | ||
277 | { | ||
278 | return dev->priv_flags & IFF_802_1Q_VLAN ? | ||
279 | vlan_dev_real_dev(dev) : 0; | ||
280 | } | ||
281 | |||
150 | #endif /* IB_ADDR_H */ | 282 | #endif /* IB_ADDR_H */ |
diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h index cbb50f4da3dd..b37fe3b10a9d 100644 --- a/include/rdma/ib_pack.h +++ b/include/rdma/ib_pack.h | |||
@@ -37,6 +37,8 @@ | |||
37 | 37 | ||
38 | enum { | 38 | enum { |
39 | IB_LRH_BYTES = 8, | 39 | IB_LRH_BYTES = 8, |
40 | IB_ETH_BYTES = 14, | ||
41 | IB_VLAN_BYTES = 4, | ||
40 | IB_GRH_BYTES = 40, | 42 | IB_GRH_BYTES = 40, |
41 | IB_BTH_BYTES = 12, | 43 | IB_BTH_BYTES = 12, |
42 | IB_DETH_BYTES = 8 | 44 | IB_DETH_BYTES = 8 |
@@ -210,14 +212,32 @@ struct ib_unpacked_deth { | |||
210 | __be32 source_qpn; | 212 | __be32 source_qpn; |
211 | }; | 213 | }; |
212 | 214 | ||
215 | struct ib_unpacked_eth { | ||
216 | u8 dmac_h[4]; | ||
217 | u8 dmac_l[2]; | ||
218 | u8 smac_h[2]; | ||
219 | u8 smac_l[4]; | ||
220 | __be16 type; | ||
221 | }; | ||
222 | |||
223 | struct ib_unpacked_vlan { | ||
224 | __be16 tag; | ||
225 | __be16 type; | ||
226 | }; | ||
227 | |||
213 | struct ib_ud_header { | 228 | struct ib_ud_header { |
229 | int lrh_present; | ||
214 | struct ib_unpacked_lrh lrh; | 230 | struct ib_unpacked_lrh lrh; |
215 | int grh_present; | 231 | int eth_present; |
216 | struct ib_unpacked_grh grh; | 232 | struct ib_unpacked_eth eth; |
217 | struct ib_unpacked_bth bth; | 233 | int vlan_present; |
234 | struct ib_unpacked_vlan vlan; | ||
235 | int grh_present; | ||
236 | struct ib_unpacked_grh grh; | ||
237 | struct ib_unpacked_bth bth; | ||
218 | struct ib_unpacked_deth deth; | 238 | struct ib_unpacked_deth deth; |
219 | int immediate_present; | 239 | int immediate_present; |
220 | __be32 immediate_data; | 240 | __be32 immediate_data; |
221 | }; | 241 | }; |
222 | 242 | ||
223 | void ib_pack(const struct ib_field *desc, | 243 | void ib_pack(const struct ib_field *desc, |
@@ -230,9 +250,12 @@ void ib_unpack(const struct ib_field *desc, | |||
230 | void *buf, | 250 | void *buf, |
231 | void *structure); | 251 | void *structure); |
232 | 252 | ||
233 | void ib_ud_header_init(int payload_bytes, | 253 | void ib_ud_header_init(int payload_bytes, |
234 | int grh_present, | 254 | int lrh_present, |
235 | int immediate_present, | 255 | int eth_present, |
256 | int vlan_present, | ||
257 | int grh_present, | ||
258 | int immediate_present, | ||
236 | struct ib_ud_header *header); | 259 | struct ib_ud_header *header); |
237 | 260 | ||
238 | int ib_ud_header_pack(struct ib_ud_header *header, | 261 | int ib_ud_header_pack(struct ib_ud_header *header, |
diff --git a/include/rdma/ib_user_verbs.h b/include/rdma/ib_user_verbs.h index a17f77106149..fe5b05177a2c 100644 --- a/include/rdma/ib_user_verbs.h +++ b/include/rdma/ib_user_verbs.h | |||
@@ -205,7 +205,8 @@ struct ib_uverbs_query_port_resp { | |||
205 | __u8 active_width; | 205 | __u8 active_width; |
206 | __u8 active_speed; | 206 | __u8 active_speed; |
207 | __u8 phys_state; | 207 | __u8 phys_state; |
208 | __u8 reserved[3]; | 208 | __u8 link_layer; |
209 | __u8 reserved[2]; | ||
209 | }; | 210 | }; |
210 | 211 | ||
211 | struct ib_uverbs_alloc_pd { | 212 | struct ib_uverbs_alloc_pd { |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 857b3b9cf120..e04c4888d1fd 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -75,6 +75,12 @@ enum rdma_transport_type { | |||
75 | enum rdma_transport_type | 75 | enum rdma_transport_type |
76 | rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__; | 76 | rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__; |
77 | 77 | ||
78 | enum rdma_link_layer { | ||
79 | IB_LINK_LAYER_UNSPECIFIED, | ||
80 | IB_LINK_LAYER_INFINIBAND, | ||
81 | IB_LINK_LAYER_ETHERNET, | ||
82 | }; | ||
83 | |||
78 | enum ib_device_cap_flags { | 84 | enum ib_device_cap_flags { |
79 | IB_DEVICE_RESIZE_MAX_WR = 1, | 85 | IB_DEVICE_RESIZE_MAX_WR = 1, |
80 | IB_DEVICE_BAD_PKEY_CNTR = (1<<1), | 86 | IB_DEVICE_BAD_PKEY_CNTR = (1<<1), |
@@ -1010,6 +1016,8 @@ struct ib_device { | |||
1010 | int (*query_port)(struct ib_device *device, | 1016 | int (*query_port)(struct ib_device *device, |
1011 | u8 port_num, | 1017 | u8 port_num, |
1012 | struct ib_port_attr *port_attr); | 1018 | struct ib_port_attr *port_attr); |
1019 | enum rdma_link_layer (*get_link_layer)(struct ib_device *device, | ||
1020 | u8 port_num); | ||
1013 | int (*query_gid)(struct ib_device *device, | 1021 | int (*query_gid)(struct ib_device *device, |
1014 | u8 port_num, int index, | 1022 | u8 port_num, int index, |
1015 | union ib_gid *gid); | 1023 | union ib_gid *gid); |
@@ -1222,6 +1230,9 @@ int ib_query_device(struct ib_device *device, | |||
1222 | int ib_query_port(struct ib_device *device, | 1230 | int ib_query_port(struct ib_device *device, |
1223 | u8 port_num, struct ib_port_attr *port_attr); | 1231 | u8 port_num, struct ib_port_attr *port_attr); |
1224 | 1232 | ||
1233 | enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, | ||
1234 | u8 port_num); | ||
1235 | |||
1225 | int ib_query_gid(struct ib_device *device, | 1236 | int ib_query_gid(struct ib_device *device, |
1226 | u8 port_num, int index, union ib_gid *gid); | 1237 | u8 port_num, int index, union ib_gid *gid); |
1227 | 1238 | ||
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index 14be49b44e84..f986ab7ffe6f 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h | |||
@@ -721,7 +721,7 @@ struct libfc_function_template { | |||
721 | * struct fc_disc - Discovery context | 721 | * struct fc_disc - Discovery context |
722 | * @retry_count: Number of retries | 722 | * @retry_count: Number of retries |
723 | * @pending: 1 if discovery is pending, 0 if not | 723 | * @pending: 1 if discovery is pending, 0 if not |
724 | * @requesting: 1 if discovery has been requested, 0 if not | 724 | * @requested: 1 if discovery has been requested, 0 if not |
725 | * @seq_count: Number of sequences used for discovery | 725 | * @seq_count: Number of sequences used for discovery |
726 | * @buf_len: Length of the discovery buffer | 726 | * @buf_len: Length of the discovery buffer |
727 | * @disc_id: Discovery ID | 727 | * @disc_id: Discovery ID |
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index d06e13be717b..3dec1949f69c 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h | |||
@@ -205,6 +205,7 @@ struct domain_device { | |||
205 | }; | 205 | }; |
206 | 206 | ||
207 | void *lldd_dev; | 207 | void *lldd_dev; |
208 | int gone; | ||
208 | }; | 209 | }; |
209 | 210 | ||
210 | struct sas_discovery_event { | 211 | struct sas_discovery_event { |
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h index a8f370126632..53a9e886612b 100644 --- a/include/scsi/osd_initiator.h +++ b/include/scsi/osd_initiator.h | |||
@@ -137,7 +137,7 @@ struct osd_request { | |||
137 | void *buff; | 137 | void *buff; |
138 | unsigned alloc_size; /* 0 here means: don't call kfree */ | 138 | unsigned alloc_size; /* 0 here means: don't call kfree */ |
139 | unsigned total_bytes; | 139 | unsigned total_bytes; |
140 | } set_attr, enc_get_attr, get_attr; | 140 | } cdb_cont, set_attr, enc_get_attr, get_attr; |
141 | 141 | ||
142 | struct _osd_io_info { | 142 | struct _osd_io_info { |
143 | struct bio *bio; | 143 | struct bio *bio; |
@@ -448,6 +448,20 @@ void osd_req_read(struct osd_request *or, | |||
448 | int osd_req_read_kern(struct osd_request *or, | 448 | int osd_req_read_kern(struct osd_request *or, |
449 | const struct osd_obj_id *obj, u64 offset, void *buff, u64 len); | 449 | const struct osd_obj_id *obj, u64 offset, void *buff, u64 len); |
450 | 450 | ||
451 | /* Scatter/Gather write/read commands */ | ||
452 | int osd_req_write_sg(struct osd_request *or, | ||
453 | const struct osd_obj_id *obj, struct bio *bio, | ||
454 | const struct osd_sg_entry *sglist, unsigned numentries); | ||
455 | int osd_req_read_sg(struct osd_request *or, | ||
456 | const struct osd_obj_id *obj, struct bio *bio, | ||
457 | const struct osd_sg_entry *sglist, unsigned numentries); | ||
458 | int osd_req_write_sg_kern(struct osd_request *or, | ||
459 | const struct osd_obj_id *obj, void **buff, | ||
460 | const struct osd_sg_entry *sglist, unsigned numentries); | ||
461 | int osd_req_read_sg_kern(struct osd_request *or, | ||
462 | const struct osd_obj_id *obj, void **buff, | ||
463 | const struct osd_sg_entry *sglist, unsigned numentries); | ||
464 | |||
451 | /* | 465 | /* |
452 | * Root/Partition/Collection/Object Attributes commands | 466 | * Root/Partition/Collection/Object Attributes commands |
453 | */ | 467 | */ |
diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h index 685661283540..a6026da25f3e 100644 --- a/include/scsi/osd_protocol.h +++ b/include/scsi/osd_protocol.h | |||
@@ -631,4 +631,46 @@ static inline void osd_sec_set_caps(struct osd_capability_head *cap, | |||
631 | put_unaligned_le16(bit_mask, &cap->permissions_bit_mask); | 631 | put_unaligned_le16(bit_mask, &cap->permissions_bit_mask); |
632 | } | 632 | } |
633 | 633 | ||
634 | /* osd2r05a sec 5.3: CDB continuation segment formats */ | ||
635 | enum osd_continuation_segment_format { | ||
636 | CDB_CONTINUATION_FORMAT_V2 = 0x01, | ||
637 | }; | ||
638 | |||
639 | struct osd_continuation_segment_header { | ||
640 | u8 format; | ||
641 | u8 reserved1; | ||
642 | __be16 service_action; | ||
643 | __be32 reserved2; | ||
644 | u8 integrity_check[OSDv2_CRYPTO_KEYID_SIZE]; | ||
645 | } __packed; | ||
646 | |||
647 | /* osd2r05a sec 5.4.1: CDB continuation descriptors */ | ||
648 | enum osd_continuation_descriptor_type { | ||
649 | NO_MORE_DESCRIPTORS = 0x0000, | ||
650 | SCATTER_GATHER_LIST = 0x0001, | ||
651 | QUERY_LIST = 0x0002, | ||
652 | USER_OBJECT = 0x0003, | ||
653 | COPY_USER_OBJECT_SOURCE = 0x0101, | ||
654 | EXTENSION_CAPABILITIES = 0xFFEE | ||
655 | }; | ||
656 | |||
657 | struct osd_continuation_descriptor_header { | ||
658 | __be16 type; | ||
659 | u8 reserved; | ||
660 | u8 pad_length; | ||
661 | __be32 length; | ||
662 | } __packed; | ||
663 | |||
664 | |||
665 | /* osd2r05a sec 5.4.2: Scatter/gather list */ | ||
666 | struct osd_sg_list_entry { | ||
667 | __be64 offset; | ||
668 | __be64 len; | ||
669 | }; | ||
670 | |||
671 | struct osd_sg_continuation_descriptor { | ||
672 | struct osd_continuation_descriptor_header hdr; | ||
673 | struct osd_sg_list_entry entries[]; | ||
674 | }; | ||
675 | |||
634 | #endif /* ndef __OSD_PROTOCOL_H__ */ | 676 | #endif /* ndef __OSD_PROTOCOL_H__ */ |
diff --git a/include/scsi/osd_types.h b/include/scsi/osd_types.h index 3f5e88cc75c0..bd0be7ed4bcf 100644 --- a/include/scsi/osd_types.h +++ b/include/scsi/osd_types.h | |||
@@ -37,4 +37,9 @@ struct osd_attr { | |||
37 | void *val_ptr; /* in network order */ | 37 | void *val_ptr; /* in network order */ |
38 | }; | 38 | }; |
39 | 39 | ||
40 | struct osd_sg_entry { | ||
41 | u64 offset; | ||
42 | u64 len; | ||
43 | }; | ||
44 | |||
40 | #endif /* ndef __OSD_TYPES_H__ */ | 45 | #endif /* ndef __OSD_TYPES_H__ */ |
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 8fcb6e0e9e72..216af8538cc9 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
@@ -32,6 +32,12 @@ struct scsi_cmnd; | |||
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | /* | 34 | /* |
35 | * DIX-capable adapters effectively support infinite chaining for the | ||
36 | * protection information scatterlist | ||
37 | */ | ||
38 | #define SCSI_MAX_PROT_SG_SEGMENTS 0xFFFF | ||
39 | |||
40 | /* | ||
35 | * Special value for scanning to specify scanning or rescanning of all | 41 | * Special value for scanning to specify scanning or rescanning of all |
36 | * possible channels, (target) ids, or luns on a given shost. | 42 | * possible channels, (target) ids, or luns on a given shost. |
37 | */ | 43 | */ |
@@ -67,6 +73,7 @@ struct scsi_cmnd; | |||
67 | #define SEND_DIAGNOSTIC 0x1d | 73 | #define SEND_DIAGNOSTIC 0x1d |
68 | #define ALLOW_MEDIUM_REMOVAL 0x1e | 74 | #define ALLOW_MEDIUM_REMOVAL 0x1e |
69 | 75 | ||
76 | #define READ_FORMAT_CAPACITIES 0x23 | ||
70 | #define SET_WINDOW 0x24 | 77 | #define SET_WINDOW 0x24 |
71 | #define READ_CAPACITY 0x25 | 78 | #define READ_CAPACITY 0x25 |
72 | #define READ_10 0x28 | 79 | #define READ_10 0x28 |
@@ -96,6 +103,7 @@ struct scsi_cmnd; | |||
96 | #define WRITE_SAME 0x41 | 103 | #define WRITE_SAME 0x41 |
97 | #define UNMAP 0x42 | 104 | #define UNMAP 0x42 |
98 | #define READ_TOC 0x43 | 105 | #define READ_TOC 0x43 |
106 | #define READ_HEADER 0x44 | ||
99 | #define LOG_SELECT 0x4c | 107 | #define LOG_SELECT 0x4c |
100 | #define LOG_SENSE 0x4d | 108 | #define LOG_SENSE 0x4d |
101 | #define XDWRITEREAD_10 0x53 | 109 | #define XDWRITEREAD_10 0x53 |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 50cb34ffef11..85867dcde335 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -148,6 +148,8 @@ struct scsi_device { | |||
148 | unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ | 148 | unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ |
149 | unsigned last_sector_bug:1; /* do not use multisector accesses on | 149 | unsigned last_sector_bug:1; /* do not use multisector accesses on |
150 | SD_LAST_BUGGY_SECTORS */ | 150 | SD_LAST_BUGGY_SECTORS */ |
151 | unsigned no_read_disc_info:1; /* Avoid READ_DISC_INFO cmds */ | ||
152 | unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */ | ||
151 | unsigned is_visible:1; /* is the device visible in sysfs */ | 153 | unsigned is_visible:1; /* is the device visible in sysfs */ |
152 | 154 | ||
153 | DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ | 155 | DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index b7bdecb7b76e..d0a6a845f204 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
@@ -388,6 +388,7 @@ struct scsi_host_template { | |||
388 | * of scatter-gather. | 388 | * of scatter-gather. |
389 | */ | 389 | */ |
390 | unsigned short sg_tablesize; | 390 | unsigned short sg_tablesize; |
391 | unsigned short sg_prot_tablesize; | ||
391 | 392 | ||
392 | /* | 393 | /* |
393 | * Set this if the host adapter has limitations beside segment count. | 394 | * Set this if the host adapter has limitations beside segment count. |
@@ -599,6 +600,7 @@ struct Scsi_Host { | |||
599 | int can_queue; | 600 | int can_queue; |
600 | short cmd_per_lun; | 601 | short cmd_per_lun; |
601 | short unsigned int sg_tablesize; | 602 | short unsigned int sg_tablesize; |
603 | short unsigned int sg_prot_tablesize; | ||
602 | short unsigned int max_sectors; | 604 | short unsigned int max_sectors; |
603 | unsigned long dma_boundary; | 605 | unsigned long dma_boundary; |
604 | /* | 606 | /* |
@@ -823,6 +825,11 @@ static inline unsigned int scsi_host_get_prot(struct Scsi_Host *shost) | |||
823 | return shost->prot_capabilities; | 825 | return shost->prot_capabilities; |
824 | } | 826 | } |
825 | 827 | ||
828 | static inline int scsi_host_prot_dma(struct Scsi_Host *shost) | ||
829 | { | ||
830 | return shost->prot_capabilities >= SHOST_DIX_TYPE0_PROTECTION; | ||
831 | } | ||
832 | |||
826 | static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type) | 833 | static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type) |
827 | { | 834 | { |
828 | static unsigned char cap[] = { 0, | 835 | static unsigned char cap[] = { 0, |
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h index 17231385cb37..d6e7994aa634 100644 --- a/include/scsi/scsi_tcq.h +++ b/include/scsi/scsi_tcq.h | |||
@@ -97,13 +97,9 @@ static inline void scsi_deactivate_tcq(struct scsi_device *sdev, int depth) | |||
97 | static inline int scsi_populate_tag_msg(struct scsi_cmnd *cmd, char *msg) | 97 | static inline int scsi_populate_tag_msg(struct scsi_cmnd *cmd, char *msg) |
98 | { | 98 | { |
99 | struct request *req = cmd->request; | 99 | struct request *req = cmd->request; |
100 | struct scsi_device *sdev = cmd->device; | ||
101 | 100 | ||
102 | if (blk_rq_tagged(req)) { | 101 | if (blk_rq_tagged(req)) { |
103 | if (sdev->ordered_tags && req->cmd_flags & REQ_HARDBARRIER) | 102 | *msg++ = MSG_SIMPLE_TAG; |
104 | *msg++ = MSG_ORDERED_TAG; | ||
105 | else | ||
106 | *msg++ = MSG_SIMPLE_TAG; | ||
107 | *msg++ = req->tag; | 103 | *msg++ = req->tag; |
108 | return 2; | 104 | return 2; |
109 | } | 105 | } |
diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 87d81b3ce564..59816fe31e68 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h | |||
@@ -496,6 +496,7 @@ struct fc_host_attrs { | |||
496 | u64 fabric_name; | 496 | u64 fabric_name; |
497 | char symbolic_name[FC_SYMBOLIC_NAME_SIZE]; | 497 | char symbolic_name[FC_SYMBOLIC_NAME_SIZE]; |
498 | char system_hostname[FC_SYMBOLIC_NAME_SIZE]; | 498 | char system_hostname[FC_SYMBOLIC_NAME_SIZE]; |
499 | u32 dev_loss_tmo; | ||
499 | 500 | ||
500 | /* Private (Transport-managed) Attributes */ | 501 | /* Private (Transport-managed) Attributes */ |
501 | enum fc_tgtid_binding_type tgtid_bind_type; | 502 | enum fc_tgtid_binding_type tgtid_bind_type; |
@@ -580,6 +581,8 @@ struct fc_host_attrs { | |||
580 | (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name) | 581 | (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name) |
581 | #define fc_host_devloss_work_q(x) \ | 582 | #define fc_host_devloss_work_q(x) \ |
582 | (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q) | 583 | (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q) |
584 | #define fc_host_dev_loss_tmo(x) \ | ||
585 | (((struct fc_host_attrs *)(x)->shost_data)->dev_loss_tmo) | ||
583 | 586 | ||
584 | 587 | ||
585 | struct fc_bsg_buffer { | 588 | struct fc_bsg_buffer { |
diff --git a/include/scsi/srp.h b/include/scsi/srp.h index ad178fa78f66..1ae84db4c9fb 100644 --- a/include/scsi/srp.h +++ b/include/scsi/srp.h | |||
@@ -239,4 +239,42 @@ struct srp_rsp { | |||
239 | u8 data[0]; | 239 | u8 data[0]; |
240 | } __attribute__((packed)); | 240 | } __attribute__((packed)); |
241 | 241 | ||
242 | struct srp_cred_req { | ||
243 | u8 opcode; | ||
244 | u8 sol_not; | ||
245 | u8 reserved[2]; | ||
246 | __be32 req_lim_delta; | ||
247 | u64 tag; | ||
248 | }; | ||
249 | |||
250 | struct srp_cred_rsp { | ||
251 | u8 opcode; | ||
252 | u8 reserved[7]; | ||
253 | u64 tag; | ||
254 | }; | ||
255 | |||
256 | /* | ||
257 | * The SRP spec defines the fixed portion of the AER_REQ structure to be | ||
258 | * 36 bytes, so it needs to be packed to avoid having it padded to 40 bytes | ||
259 | * on 64-bit architectures. | ||
260 | */ | ||
261 | struct srp_aer_req { | ||
262 | u8 opcode; | ||
263 | u8 sol_not; | ||
264 | u8 reserved[2]; | ||
265 | __be32 req_lim_delta; | ||
266 | u64 tag; | ||
267 | u32 reserved2; | ||
268 | __be64 lun; | ||
269 | __be32 sense_data_len; | ||
270 | u32 reserved3; | ||
271 | u8 sense_data[0]; | ||
272 | } __attribute__((packed)); | ||
273 | |||
274 | struct srp_aer_rsp { | ||
275 | u8 opcode; | ||
276 | u8 reserved[7]; | ||
277 | u64 tag; | ||
278 | }; | ||
279 | |||
242 | #endif /* SCSI_SRP_H */ | 280 | #endif /* SCSI_SRP_H */ |
diff --git a/include/sound/core.h b/include/sound/core.h index 89e0ac17f44a..1fa2407c966f 100644 --- a/include/sound/core.h +++ b/include/sound/core.h | |||
@@ -133,9 +133,7 @@ struct snd_card { | |||
133 | int free_on_last_close; /* free in context of file_release */ | 133 | int free_on_last_close; /* free in context of file_release */ |
134 | wait_queue_head_t shutdown_sleep; | 134 | wait_queue_head_t shutdown_sleep; |
135 | struct device *dev; /* device assigned to this card */ | 135 | struct device *dev; /* device assigned to this card */ |
136 | #ifndef CONFIG_SYSFS_DEPRECATED | ||
137 | struct device *card_dev; /* cardX object for sysfs */ | 136 | struct device *card_dev; /* cardX object for sysfs */ |
138 | #endif | ||
139 | 137 | ||
140 | #ifdef CONFIG_PM | 138 | #ifdef CONFIG_PM |
141 | unsigned int power_state; /* power state */ | 139 | unsigned int power_state; /* power state */ |
@@ -179,7 +177,7 @@ int snd_power_wait(struct snd_card *card, unsigned int power_state); | |||
179 | #define snd_power_lock(card) do { (void)(card); } while (0) | 177 | #define snd_power_lock(card) do { (void)(card); } while (0) |
180 | #define snd_power_unlock(card) do { (void)(card); } while (0) | 178 | #define snd_power_unlock(card) do { (void)(card); } while (0) |
181 | static inline int snd_power_wait(struct snd_card *card, unsigned int state) { return 0; } | 179 | static inline int snd_power_wait(struct snd_card *card, unsigned int state) { return 0; } |
182 | #define snd_power_get_state(card) SNDRV_CTL_POWER_D0 | 180 | #define snd_power_get_state(card) ({ (void)(card); SNDRV_CTL_POWER_D0; }) |
183 | #define snd_power_change_state(card, state) do { (void)(card); } while (0) | 181 | #define snd_power_change_state(card, state) do { (void)(card); } while (0) |
184 | 182 | ||
185 | #endif /* CONFIG_PM */ | 183 | #endif /* CONFIG_PM */ |
@@ -196,11 +194,7 @@ struct snd_minor { | |||
196 | /* return a device pointer linked to each sound device as a parent */ | 194 | /* return a device pointer linked to each sound device as a parent */ |
197 | static inline struct device *snd_card_get_device_link(struct snd_card *card) | 195 | static inline struct device *snd_card_get_device_link(struct snd_card *card) |
198 | { | 196 | { |
199 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
200 | return card ? card->dev : NULL; | ||
201 | #else | ||
202 | return card ? card->card_dev : NULL; | 197 | return card ? card->card_dev : NULL; |
203 | #endif | ||
204 | } | 198 | } |
205 | 199 | ||
206 | /* sound.c */ | 200 | /* sound.c */ |
diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h index 7dc97d12253c..4f865df42f0f 100644 --- a/include/sound/emu10k1.h +++ b/include/sound/emu10k1.h | |||
@@ -438,6 +438,8 @@ | |||
438 | #define CCCA_CURRADDR_MASK 0x00ffffff /* Current address of the selected channel */ | 438 | #define CCCA_CURRADDR_MASK 0x00ffffff /* Current address of the selected channel */ |
439 | #define CCCA_CURRADDR 0x18000008 | 439 | #define CCCA_CURRADDR 0x18000008 |
440 | 440 | ||
441 | /* undefine CCR to avoid conflict with the definition for SH */ | ||
442 | #undef CCR | ||
441 | #define CCR 0x09 /* Cache control register */ | 443 | #define CCR 0x09 /* Cache control register */ |
442 | #define CCR_CACHEINVALIDSIZE 0x07190009 | 444 | #define CCR_CACHEINVALIDSIZE 0x07190009 |
443 | #define CCR_CACHEINVALIDSIZE_MASK 0xfe000000 /* Number of invalid samples cache for this channel */ | 445 | #define CCR_CACHEINVALIDSIZE_MASK 0xfe000000 /* Number of invalid samples cache for this channel */ |
diff --git a/include/sound/jack.h b/include/sound/jack.h index d90b9fa32707..c140fc7cbd3f 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h | |||
@@ -47,6 +47,9 @@ enum snd_jack_types { | |||
47 | SND_JACK_BTN_0 = 0x4000, | 47 | SND_JACK_BTN_0 = 0x4000, |
48 | SND_JACK_BTN_1 = 0x2000, | 48 | SND_JACK_BTN_1 = 0x2000, |
49 | SND_JACK_BTN_2 = 0x1000, | 49 | SND_JACK_BTN_2 = 0x1000, |
50 | SND_JACK_BTN_3 = 0x0800, | ||
51 | SND_JACK_BTN_4 = 0x0400, | ||
52 | SND_JACK_BTN_5 = 0x0200, | ||
50 | }; | 53 | }; |
51 | 54 | ||
52 | struct snd_jack { | 55 | struct snd_jack { |
@@ -55,7 +58,7 @@ struct snd_jack { | |||
55 | int type; | 58 | int type; |
56 | const char *id; | 59 | const char *id; |
57 | char name[100]; | 60 | char name[100]; |
58 | unsigned int key[3]; /* Keep in sync with definitions above */ | 61 | unsigned int key[6]; /* Keep in sync with definitions above */ |
59 | void *private_data; | 62 | void *private_data; |
60 | void (*private_free)(struct snd_jack *); | 63 | void (*private_free)(struct snd_jack *); |
61 | }; | 64 | }; |
diff --git a/include/sound/max98088.h b/include/sound/max98088.h new file mode 100644 index 000000000000..c3ba8239182d --- /dev/null +++ b/include/sound/max98088.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Platform data for MAX98088 | ||
3 | * | ||
4 | * Copyright 2010 Maxim Integrated Products | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef __SOUND_MAX98088_PDATA_H__ | ||
14 | #define __SOUND_MAX98088_PDATA_H__ | ||
15 | |||
16 | /* Equalizer filter response configuration */ | ||
17 | struct max98088_eq_cfg { | ||
18 | const char *name; | ||
19 | unsigned int rate; | ||
20 | u16 band1[5]; | ||
21 | u16 band2[5]; | ||
22 | u16 band3[5]; | ||
23 | u16 band4[5]; | ||
24 | u16 band5[5]; | ||
25 | }; | ||
26 | |||
27 | /* codec platform data */ | ||
28 | struct max98088_pdata { | ||
29 | |||
30 | /* Equalizers for DAI1 and DAI2 */ | ||
31 | struct max98088_eq_cfg *eq_cfg; | ||
32 | unsigned int eq_cfgcnt; | ||
33 | |||
34 | /* Receiver output can be configured as power amplifier or LINE out */ | ||
35 | /* Set receiver_mode to: | ||
36 | * 0 = amplifier output, or | ||
37 | * 1 = LINE level output | ||
38 | */ | ||
39 | unsigned int receiver_mode:1; | ||
40 | |||
41 | /* Analog/digital microphone configuration: | ||
42 | * 0 = analog microphone input (normal setting) | ||
43 | * 1 = digital microphone input | ||
44 | */ | ||
45 | unsigned int digmic_left_mode:1; | ||
46 | unsigned int digmic_right_mode:1; | ||
47 | |||
48 | }; | ||
49 | |||
50 | #endif | ||
diff --git a/include/sound/pcm.h b/include/sound/pcm.h index 85f1c6bf8566..dfd9b76b1853 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h | |||
@@ -278,6 +278,7 @@ struct snd_pcm_runtime { | |||
278 | snd_pcm_uframes_t hw_ptr_base; /* Position at buffer restart */ | 278 | snd_pcm_uframes_t hw_ptr_base; /* Position at buffer restart */ |
279 | snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */ | 279 | snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */ |
280 | unsigned long hw_ptr_jiffies; /* Time when hw_ptr is updated */ | 280 | unsigned long hw_ptr_jiffies; /* Time when hw_ptr is updated */ |
281 | unsigned long hw_ptr_buffer_jiffies; /* buffer time in jiffies */ | ||
281 | snd_pcm_sframes_t delay; /* extra delay; typically FIFO size */ | 282 | snd_pcm_sframes_t delay; /* extra delay; typically FIFO size */ |
282 | 283 | ||
283 | /* -- HW params -- */ | 284 | /* -- HW params -- */ |
diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index 9d51d6f35893..fa60cbda90a4 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h | |||
@@ -114,7 +114,4 @@ struct sh_fsi_platform_info { | |||
114 | int (*set_rate)(int is_porta, int rate); /* for master mode */ | 114 | int (*set_rate)(int is_porta, int rate); /* for master mode */ |
115 | }; | 115 | }; |
116 | 116 | ||
117 | extern struct snd_soc_dai fsi_soc_dai[2]; | ||
118 | extern struct snd_soc_platform fsi_soc_platform; | ||
119 | |||
120 | #endif /* __SOUND_FSI_H */ | 117 | #endif /* __SOUND_FSI_H */ |
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 377693a14385..e7b680248006 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h | |||
@@ -91,15 +91,17 @@ struct snd_pcm_substream; | |||
91 | SNDRV_PCM_FMTBIT_S32_LE |\ | 91 | SNDRV_PCM_FMTBIT_S32_LE |\ |
92 | SNDRV_PCM_FMTBIT_S32_BE) | 92 | SNDRV_PCM_FMTBIT_S32_BE) |
93 | 93 | ||
94 | struct snd_soc_dai_ops; | 94 | struct snd_soc_dai_driver; |
95 | struct snd_soc_dai; | 95 | struct snd_soc_dai; |
96 | struct snd_ac97_bus_ops; | 96 | struct snd_ac97_bus_ops; |
97 | 97 | ||
98 | /* Digital Audio Interface registration */ | 98 | /* Digital Audio Interface registration */ |
99 | int snd_soc_register_dai(struct snd_soc_dai *dai); | 99 | int snd_soc_register_dai(struct device *dev, |
100 | void snd_soc_unregister_dai(struct snd_soc_dai *dai); | 100 | struct snd_soc_dai_driver *dai_drv); |
101 | int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count); | 101 | void snd_soc_unregister_dai(struct device *dev); |
102 | void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count); | 102 | int snd_soc_register_dais(struct device *dev, |
103 | struct snd_soc_dai_driver *dai_drv, size_t count); | ||
104 | void snd_soc_unregister_dais(struct device *dev, size_t count); | ||
103 | 105 | ||
104 | /* Digital Audio Interface clocking API.*/ | 106 | /* Digital Audio Interface clocking API.*/ |
105 | int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, | 107 | int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, |
@@ -126,16 +128,6 @@ int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate); | |||
126 | /* Digital Audio Interface mute */ | 128 | /* Digital Audio Interface mute */ |
127 | int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute); | 129 | int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute); |
128 | 130 | ||
129 | /* | ||
130 | * Digital Audio Interface. | ||
131 | * | ||
132 | * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97 | ||
133 | * operations and capabilities. Codec and platform drivers will register this | ||
134 | * structure for every DAI they have. | ||
135 | * | ||
136 | * This structure covers the clocking, formating and ALSA operations for each | ||
137 | * interface. | ||
138 | */ | ||
139 | struct snd_soc_dai_ops { | 131 | struct snd_soc_dai_ops { |
140 | /* | 132 | /* |
141 | * DAI clocking configuration, all optional. | 133 | * DAI clocking configuration, all optional. |
@@ -191,24 +183,24 @@ struct snd_soc_dai_ops { | |||
191 | }; | 183 | }; |
192 | 184 | ||
193 | /* | 185 | /* |
194 | * Digital Audio Interface runtime data. | 186 | * Digital Audio Interface Driver. |
195 | * | 187 | * |
196 | * Holds runtime data for a DAI. | 188 | * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97 |
189 | * operations and capabilities. Codec and platform drivers will register this | ||
190 | * structure for every DAI they have. | ||
191 | * | ||
192 | * This structure covers the clocking, formating and ALSA operations for each | ||
193 | * interface. | ||
197 | */ | 194 | */ |
198 | struct snd_soc_dai { | 195 | struct snd_soc_dai_driver { |
199 | /* DAI description */ | 196 | /* DAI description */ |
200 | char *name; | 197 | const char *name; |
201 | unsigned int id; | 198 | unsigned int id; |
202 | int ac97_control; | 199 | int ac97_control; |
203 | 200 | ||
204 | struct device *dev; | 201 | /* DAI driver callbacks */ |
205 | void *ac97_pdata; /* platform_data for the ac97 codec */ | 202 | int (*probe)(struct snd_soc_dai *dai); |
206 | 203 | int (*remove)(struct snd_soc_dai *dai); | |
207 | /* DAI callbacks */ | ||
208 | int (*probe)(struct platform_device *pdev, | ||
209 | struct snd_soc_dai *dai); | ||
210 | void (*remove)(struct platform_device *pdev, | ||
211 | struct snd_soc_dai *dai); | ||
212 | int (*suspend)(struct snd_soc_dai *dai); | 204 | int (*suspend)(struct snd_soc_dai *dai); |
213 | int (*resume)(struct snd_soc_dai *dai); | 205 | int (*resume)(struct snd_soc_dai *dai); |
214 | 206 | ||
@@ -219,26 +211,51 @@ struct snd_soc_dai { | |||
219 | struct snd_soc_pcm_stream capture; | 211 | struct snd_soc_pcm_stream capture; |
220 | struct snd_soc_pcm_stream playback; | 212 | struct snd_soc_pcm_stream playback; |
221 | unsigned int symmetric_rates:1; | 213 | unsigned int symmetric_rates:1; |
214 | }; | ||
215 | |||
216 | /* | ||
217 | * Digital Audio Interface runtime data. | ||
218 | * | ||
219 | * Holds runtime data for a DAI. | ||
220 | */ | ||
221 | struct snd_soc_dai { | ||
222 | const char *name; | ||
223 | int id; | ||
224 | struct device *dev; | ||
225 | void *ac97_pdata; /* platform_data for the ac97 codec */ | ||
226 | |||
227 | /* driver ops */ | ||
228 | struct snd_soc_dai_driver *driver; | ||
222 | 229 | ||
223 | /* DAI runtime info */ | 230 | /* DAI runtime info */ |
224 | struct snd_soc_codec *codec; | 231 | unsigned int capture_active:1; /* stream is in use */ |
232 | unsigned int playback_active:1; /* stream is in use */ | ||
233 | unsigned int symmetric_rates:1; | ||
234 | struct snd_pcm_runtime *runtime; | ||
225 | unsigned int active; | 235 | unsigned int active; |
226 | unsigned char pop_wait:1; | 236 | unsigned char pop_wait:1; |
237 | unsigned char probed:1; | ||
227 | 238 | ||
228 | /* DAI private data */ | 239 | /* DAI DMA data */ |
229 | void *private_data; | 240 | void *playback_dma_data; |
241 | void *capture_dma_data; | ||
230 | 242 | ||
231 | /* parent platform */ | 243 | /* parent platform/codec */ |
232 | struct snd_soc_platform *platform; | 244 | union { |
245 | struct snd_soc_platform *platform; | ||
246 | struct snd_soc_codec *codec; | ||
247 | }; | ||
248 | struct snd_soc_card *card; | ||
233 | 249 | ||
234 | struct list_head list; | 250 | struct list_head list; |
251 | struct list_head card_list; | ||
235 | }; | 252 | }; |
236 | 253 | ||
237 | static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai, | 254 | static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai, |
238 | const struct snd_pcm_substream *ss) | 255 | const struct snd_pcm_substream *ss) |
239 | { | 256 | { |
240 | return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | 257 | return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ? |
241 | dai->playback.dma_data : dai->capture.dma_data; | 258 | dai->playback_dma_data : dai->capture_dma_data; |
242 | } | 259 | } |
243 | 260 | ||
244 | static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai, | 261 | static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai, |
@@ -246,9 +263,20 @@ static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai, | |||
246 | void *data) | 263 | void *data) |
247 | { | 264 | { |
248 | if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) | 265 | if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) |
249 | dai->playback.dma_data = data; | 266 | dai->playback_dma_data = data; |
250 | else | 267 | else |
251 | dai->capture.dma_data = data; | 268 | dai->capture_dma_data = data; |
269 | } | ||
270 | |||
271 | static inline void snd_soc_dai_set_drvdata(struct snd_soc_dai *dai, | ||
272 | void *data) | ||
273 | { | ||
274 | dev_set_drvdata(dai->dev, data); | ||
275 | } | ||
276 | |||
277 | static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai) | ||
278 | { | ||
279 | return dev_get_drvdata(dai->dev); | ||
252 | } | 280 | } |
253 | 281 | ||
254 | #endif | 282 | #endif |
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index c5d9987bc897..8fd3b41b763f 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
@@ -172,9 +172,19 @@ | |||
172 | #define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert) \ | 172 | #define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert) \ |
173 | { .id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \ | 173 | { .id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \ |
174 | .reg = wreg, .shift = wshift, .invert = winvert } | 174 | .reg = wreg, .shift = wshift, .invert = winvert } |
175 | #define SND_SOC_DAPM_AIF_IN_E(wname, stname, wslot, wreg, wshift, winvert, \ | ||
176 | wevent, wflags) \ | ||
177 | { .id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \ | ||
178 | .reg = wreg, .shift = wshift, .invert = winvert, \ | ||
179 | .event = wevent, .event_flags = wflags } | ||
175 | #define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert) \ | 180 | #define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert) \ |
176 | { .id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \ | 181 | { .id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \ |
177 | .reg = wreg, .shift = wshift, .invert = winvert } | 182 | .reg = wreg, .shift = wshift, .invert = winvert } |
183 | #define SND_SOC_DAPM_AIF_OUT_E(wname, stname, wslot, wreg, wshift, winvert, \ | ||
184 | wevent, wflags) \ | ||
185 | { .id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \ | ||
186 | .reg = wreg, .shift = wshift, .invert = winvert, \ | ||
187 | .event = wevent, .event_flags = wflags } | ||
178 | #define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \ | 188 | #define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \ |
179 | { .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \ | 189 | { .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \ |
180 | .shift = wshift, .invert = winvert} | 190 | .shift = wshift, .invert = winvert} |
@@ -322,14 +332,14 @@ int snd_soc_dapm_new_controls(struct snd_soc_codec *codec, | |||
322 | 332 | ||
323 | /* dapm path setup */ | 333 | /* dapm path setup */ |
324 | int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec); | 334 | int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec); |
325 | void snd_soc_dapm_free(struct snd_soc_device *socdev); | 335 | void snd_soc_dapm_free(struct snd_soc_codec *codec); |
326 | int snd_soc_dapm_add_routes(struct snd_soc_codec *codec, | 336 | int snd_soc_dapm_add_routes(struct snd_soc_codec *codec, |
327 | const struct snd_soc_dapm_route *route, int num); | 337 | const struct snd_soc_dapm_route *route, int num); |
328 | 338 | ||
329 | /* dapm events */ | 339 | /* dapm events */ |
330 | int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream, | 340 | int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, |
331 | int event); | 341 | const char *stream, int event); |
332 | void snd_soc_dapm_shutdown(struct snd_soc_device *socdev); | 342 | void snd_soc_dapm_shutdown(struct snd_soc_card *card); |
333 | 343 | ||
334 | /* dapm sys fs - used by the core */ | 344 | /* dapm sys fs - used by the core */ |
335 | int snd_soc_dapm_sys_add(struct device *dev); | 345 | int snd_soc_dapm_sys_add(struct device *dev); |
diff --git a/include/sound/soc-of-simple.h b/include/sound/soc-of-simple.h deleted file mode 100644 index a064e1934a56..000000000000 --- a/include/sound/soc-of-simple.h +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * OF helpers for ALSA SoC | ||
3 | * | ||
4 | * Copyright (C) 2008, Secret Lab Technologies Ltd. | ||
5 | */ | ||
6 | |||
7 | #ifndef _INCLUDE_SOC_OF_H_ | ||
8 | #define _INCLUDE_SOC_OF_H_ | ||
9 | |||
10 | #if defined(CONFIG_SND_SOC_OF_SIMPLE) || defined(CONFIG_SND_SOC_OF_SIMPLE_MODULE) | ||
11 | |||
12 | #include <linux/of.h> | ||
13 | #include <sound/soc.h> | ||
14 | |||
15 | int of_snd_soc_register_codec(struct snd_soc_codec_device *codec_dev, | ||
16 | void *codec_data, struct snd_soc_dai *dai, | ||
17 | struct device_node *node); | ||
18 | |||
19 | int of_snd_soc_register_platform(struct snd_soc_platform *platform, | ||
20 | struct device_node *node, | ||
21 | struct snd_soc_dai *cpu_dai); | ||
22 | |||
23 | #endif | ||
24 | |||
25 | #endif /* _INCLUDE_SOC_OF_H_ */ | ||
diff --git a/include/sound/soc.h b/include/sound/soc.h index 65e9d03ed4f5..5c3bce83f28a 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -214,10 +214,10 @@ | |||
214 | * @OFF: Power Off. No restrictions on transition times. | 214 | * @OFF: Power Off. No restrictions on transition times. |
215 | */ | 215 | */ |
216 | enum snd_soc_bias_level { | 216 | enum snd_soc_bias_level { |
217 | SND_SOC_BIAS_ON, | ||
218 | SND_SOC_BIAS_PREPARE, | ||
219 | SND_SOC_BIAS_STANDBY, | ||
220 | SND_SOC_BIAS_OFF, | 217 | SND_SOC_BIAS_OFF, |
218 | SND_SOC_BIAS_STANDBY, | ||
219 | SND_SOC_BIAS_PREPARE, | ||
220 | SND_SOC_BIAS_ON, | ||
221 | }; | 221 | }; |
222 | 222 | ||
223 | struct snd_jack; | 223 | struct snd_jack; |
@@ -228,13 +228,17 @@ struct snd_soc_ops; | |||
228 | struct snd_soc_dai_mode; | 228 | struct snd_soc_dai_mode; |
229 | struct snd_soc_pcm_runtime; | 229 | struct snd_soc_pcm_runtime; |
230 | struct snd_soc_dai; | 230 | struct snd_soc_dai; |
231 | struct snd_soc_dai_driver; | ||
231 | struct snd_soc_platform; | 232 | struct snd_soc_platform; |
232 | struct snd_soc_dai_link; | 233 | struct snd_soc_dai_link; |
234 | struct snd_soc_platform_driver; | ||
233 | struct snd_soc_codec; | 235 | struct snd_soc_codec; |
236 | struct snd_soc_codec_driver; | ||
234 | struct soc_enum; | 237 | struct soc_enum; |
235 | struct snd_soc_ac97_ops; | 238 | struct snd_soc_ac97_ops; |
236 | struct snd_soc_jack; | 239 | struct snd_soc_jack; |
237 | struct snd_soc_jack_pin; | 240 | struct snd_soc_jack_pin; |
241 | |||
238 | #ifdef CONFIG_GPIOLIB | 242 | #ifdef CONFIG_GPIOLIB |
239 | struct snd_soc_jack_gpio; | 243 | struct snd_soc_jack_gpio; |
240 | #endif | 244 | #endif |
@@ -249,19 +253,18 @@ enum snd_soc_control_type { | |||
249 | SND_SOC_SPI, | 253 | SND_SOC_SPI, |
250 | }; | 254 | }; |
251 | 255 | ||
252 | int snd_soc_register_platform(struct snd_soc_platform *platform); | 256 | int snd_soc_register_platform(struct device *dev, |
253 | void snd_soc_unregister_platform(struct snd_soc_platform *platform); | 257 | struct snd_soc_platform_driver *platform_drv); |
254 | int snd_soc_register_codec(struct snd_soc_codec *codec); | 258 | void snd_soc_unregister_platform(struct device *dev); |
255 | void snd_soc_unregister_codec(struct snd_soc_codec *codec); | 259 | int snd_soc_register_codec(struct device *dev, |
260 | struct snd_soc_codec_driver *codec_drv, | ||
261 | struct snd_soc_dai_driver *dai_drv, int num_dai); | ||
262 | void snd_soc_unregister_codec(struct device *dev); | ||
256 | int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg); | 263 | int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg); |
257 | int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, | 264 | int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, |
258 | int addr_bits, int data_bits, | 265 | int addr_bits, int data_bits, |
259 | enum snd_soc_control_type control); | 266 | enum snd_soc_control_type control); |
260 | 267 | ||
261 | /* pcm <-> DAI connect */ | ||
262 | void snd_soc_free_pcms(struct snd_soc_device *socdev); | ||
263 | int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid); | ||
264 | |||
265 | /* Utility functions to get clock rates from various things */ | 268 | /* Utility functions to get clock rates from various things */ |
266 | int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots); | 269 | int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots); |
267 | int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params); | 270 | int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params); |
@@ -273,7 +276,7 @@ int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream, | |||
273 | const struct snd_pcm_hardware *hw); | 276 | const struct snd_pcm_hardware *hw); |
274 | 277 | ||
275 | /* Jack reporting */ | 278 | /* Jack reporting */ |
276 | int snd_soc_jack_new(struct snd_soc_card *card, const char *id, int type, | 279 | int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type, |
277 | struct snd_soc_jack *jack); | 280 | struct snd_soc_jack *jack); |
278 | void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask); | 281 | void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask); |
279 | int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count, | 282 | int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count, |
@@ -382,7 +385,7 @@ struct snd_soc_jack_gpio { | |||
382 | int invert; | 385 | int invert; |
383 | int debounce_time; | 386 | int debounce_time; |
384 | struct snd_soc_jack *jack; | 387 | struct snd_soc_jack *jack; |
385 | struct work_struct work; | 388 | struct delayed_work work; |
386 | 389 | ||
387 | int (*jack_status_check)(void); | 390 | int (*jack_status_check)(void); |
388 | }; | 391 | }; |
@@ -390,7 +393,7 @@ struct snd_soc_jack_gpio { | |||
390 | 393 | ||
391 | struct snd_soc_jack { | 394 | struct snd_soc_jack { |
392 | struct snd_jack *jack; | 395 | struct snd_jack *jack; |
393 | struct snd_soc_card *card; | 396 | struct snd_soc_codec *codec; |
394 | struct list_head pins; | 397 | struct list_head pins; |
395 | int status; | 398 | int status; |
396 | struct blocking_notifier_head notifier; | 399 | struct blocking_notifier_head notifier; |
@@ -398,15 +401,13 @@ struct snd_soc_jack { | |||
398 | 401 | ||
399 | /* SoC PCM stream information */ | 402 | /* SoC PCM stream information */ |
400 | struct snd_soc_pcm_stream { | 403 | struct snd_soc_pcm_stream { |
401 | char *stream_name; | 404 | const char *stream_name; |
402 | u64 formats; /* SNDRV_PCM_FMTBIT_* */ | 405 | u64 formats; /* SNDRV_PCM_FMTBIT_* */ |
403 | unsigned int rates; /* SNDRV_PCM_RATE_* */ | 406 | unsigned int rates; /* SNDRV_PCM_RATE_* */ |
404 | unsigned int rate_min; /* min rate */ | 407 | unsigned int rate_min; /* min rate */ |
405 | unsigned int rate_max; /* max rate */ | 408 | unsigned int rate_max; /* max rate */ |
406 | unsigned int channels_min; /* min channels */ | 409 | unsigned int channels_min; /* min channels */ |
407 | unsigned int channels_max; /* max channels */ | 410 | unsigned int channels_max; /* max channels */ |
408 | unsigned int active; /* stream is in use */ | ||
409 | void *dma_data; /* used by platform code */ | ||
410 | }; | 411 | }; |
411 | 412 | ||
412 | /* SoC audio ops */ | 413 | /* SoC audio ops */ |
@@ -419,44 +420,36 @@ struct snd_soc_ops { | |||
419 | int (*trigger)(struct snd_pcm_substream *, int); | 420 | int (*trigger)(struct snd_pcm_substream *, int); |
420 | }; | 421 | }; |
421 | 422 | ||
422 | /* SoC Audio Codec */ | 423 | /* SoC Audio Codec device */ |
423 | struct snd_soc_codec { | 424 | struct snd_soc_codec { |
424 | char *name; | 425 | const char *name; |
425 | struct module *owner; | 426 | int id; |
426 | struct mutex mutex; | ||
427 | struct device *dev; | 427 | struct device *dev; |
428 | struct snd_soc_device *socdev; | 428 | struct snd_soc_codec_driver *driver; |
429 | 429 | ||
430 | struct mutex mutex; | ||
431 | struct snd_soc_card *card; | ||
430 | struct list_head list; | 432 | struct list_head list; |
431 | 433 | struct list_head card_list; | |
432 | /* callbacks */ | 434 | int num_dai; |
433 | int (*set_bias_level)(struct snd_soc_codec *, | ||
434 | enum snd_soc_bias_level level); | ||
435 | 435 | ||
436 | /* runtime */ | 436 | /* runtime */ |
437 | struct snd_card *card; | ||
438 | struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ | 437 | struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ |
439 | unsigned int active; | 438 | unsigned int active; |
440 | unsigned int pcm_devs; | 439 | unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */ |
441 | void *drvdata; | 440 | unsigned int cache_only:1; /* Suppress writes to hardware */ |
441 | unsigned int cache_sync:1; /* Cache needs to be synced to hardware */ | ||
442 | unsigned int suspended:1; /* Codec is in suspend PM state */ | ||
443 | unsigned int probed:1; /* Codec has been probed */ | ||
444 | unsigned int ac97_registered:1; /* Codec has been AC97 registered */ | ||
445 | unsigned int ac97_created:1; /* Codec has been created by SoC */ | ||
446 | unsigned int sysfs_registered:1; /* codec has been sysfs registered */ | ||
442 | 447 | ||
443 | /* codec IO */ | 448 | /* codec IO */ |
444 | void *control_data; /* codec control (i2c/3wire) data */ | 449 | void *control_data; /* codec control (i2c/3wire) data */ |
445 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); | ||
446 | int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); | ||
447 | int (*display_register)(struct snd_soc_codec *, char *, | ||
448 | size_t, unsigned int); | ||
449 | int (*volatile_register)(unsigned int); | ||
450 | int (*readable_register)(unsigned int); | ||
451 | hw_write_t hw_write; | 450 | hw_write_t hw_write; |
452 | unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int); | 451 | unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int); |
453 | void *reg_cache; | 452 | void *reg_cache; |
454 | short reg_cache_size; | ||
455 | short reg_cache_step; | ||
456 | |||
457 | unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */ | ||
458 | unsigned int cache_only:1; /* Suppress writes to hardware */ | ||
459 | unsigned int cache_sync:1; /* Cache needs to be synced to hardware */ | ||
460 | 453 | ||
461 | /* dapm */ | 454 | /* dapm */ |
462 | u32 pop_time; | 455 | u32 pop_time; |
@@ -466,10 +459,6 @@ struct snd_soc_codec { | |||
466 | enum snd_soc_bias_level suspend_bias_level; | 459 | enum snd_soc_bias_level suspend_bias_level; |
467 | struct delayed_work delayed_work; | 460 | struct delayed_work delayed_work; |
468 | 461 | ||
469 | /* codec DAI's */ | ||
470 | struct snd_soc_dai *dai; | ||
471 | unsigned int num_dai; | ||
472 | |||
473 | #ifdef CONFIG_DEBUG_FS | 462 | #ifdef CONFIG_DEBUG_FS |
474 | struct dentry *debugfs_codec_root; | 463 | struct dentry *debugfs_codec_root; |
475 | struct dentry *debugfs_reg; | 464 | struct dentry *debugfs_reg; |
@@ -478,23 +467,40 @@ struct snd_soc_codec { | |||
478 | #endif | 467 | #endif |
479 | }; | 468 | }; |
480 | 469 | ||
481 | /* codec device */ | 470 | /* codec driver */ |
482 | struct snd_soc_codec_device { | 471 | struct snd_soc_codec_driver { |
483 | int (*probe)(struct platform_device *pdev); | 472 | |
484 | int (*remove)(struct platform_device *pdev); | 473 | /* driver ops */ |
485 | int (*suspend)(struct platform_device *pdev, pm_message_t state); | 474 | int (*probe)(struct snd_soc_codec *); |
486 | int (*resume)(struct platform_device *pdev); | 475 | int (*remove)(struct snd_soc_codec *); |
476 | int (*suspend)(struct snd_soc_codec *, | ||
477 | pm_message_t state); | ||
478 | int (*resume)(struct snd_soc_codec *); | ||
479 | |||
480 | /* codec IO */ | ||
481 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); | ||
482 | int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); | ||
483 | int (*display_register)(struct snd_soc_codec *, char *, | ||
484 | size_t, unsigned int); | ||
485 | int (*volatile_register)(unsigned int); | ||
486 | int (*readable_register)(unsigned int); | ||
487 | short reg_cache_size; | ||
488 | short reg_cache_step; | ||
489 | short reg_word_size; | ||
490 | const void *reg_cache_default; | ||
491 | |||
492 | /* codec bias level */ | ||
493 | int (*set_bias_level)(struct snd_soc_codec *, | ||
494 | enum snd_soc_bias_level level); | ||
487 | }; | 495 | }; |
488 | 496 | ||
489 | /* SoC platform interface */ | 497 | /* SoC platform interface */ |
490 | struct snd_soc_platform { | 498 | struct snd_soc_platform_driver { |
491 | char *name; | ||
492 | struct list_head list; | ||
493 | 499 | ||
494 | int (*probe)(struct platform_device *pdev); | 500 | int (*probe)(struct snd_soc_platform *); |
495 | int (*remove)(struct platform_device *pdev); | 501 | int (*remove)(struct snd_soc_platform *); |
496 | int (*suspend)(struct snd_soc_dai_link *dai_link); | 502 | int (*suspend)(struct snd_soc_dai *dai); |
497 | int (*resume)(struct snd_soc_dai_link *dai_link); | 503 | int (*resume)(struct snd_soc_dai *dai); |
498 | 504 | ||
499 | /* pcm creation and destruction */ | 505 | /* pcm creation and destruction */ |
500 | int (*pcm_new)(struct snd_card *, struct snd_soc_dai *, | 506 | int (*pcm_new)(struct snd_card *, struct snd_soc_dai *, |
@@ -509,23 +515,31 @@ struct snd_soc_platform { | |||
509 | struct snd_soc_dai *); | 515 | struct snd_soc_dai *); |
510 | 516 | ||
511 | /* platform stream ops */ | 517 | /* platform stream ops */ |
512 | struct snd_pcm_ops *pcm_ops; | 518 | struct snd_pcm_ops *ops; |
513 | }; | 519 | }; |
514 | 520 | ||
515 | /* SoC machine DAI configuration, glues a codec and cpu DAI together */ | 521 | struct snd_soc_platform { |
516 | struct snd_soc_dai_link { | 522 | const char *name; |
517 | char *name; /* Codec name */ | 523 | int id; |
518 | char *stream_name; /* Stream name */ | 524 | struct device *dev; |
525 | struct snd_soc_platform_driver *driver; | ||
519 | 526 | ||
520 | /* DAI */ | 527 | unsigned int suspended:1; /* platform is suspended */ |
521 | struct snd_soc_dai *codec_dai; | 528 | unsigned int probed:1; |
522 | struct snd_soc_dai *cpu_dai; | ||
523 | 529 | ||
524 | /* machine stream operations */ | 530 | struct snd_soc_card *card; |
525 | struct snd_soc_ops *ops; | 531 | struct list_head list; |
532 | struct list_head card_list; | ||
533 | }; | ||
526 | 534 | ||
527 | /* codec/machine specific init - e.g. add machine controls */ | 535 | struct snd_soc_dai_link { |
528 | int (*init)(struct snd_soc_codec *codec); | 536 | /* config - must be set by machine driver */ |
537 | const char *name; /* Codec name */ | ||
538 | const char *stream_name; /* Stream name */ | ||
539 | const char *codec_name; /* for multi-codec */ | ||
540 | const char *platform_name; /* for multi-platform */ | ||
541 | const char *cpu_dai_name; | ||
542 | const char *codec_dai_name; | ||
529 | 543 | ||
530 | /* Keep DAI active over suspend */ | 544 | /* Keep DAI active over suspend */ |
531 | unsigned int ignore_suspend:1; | 545 | unsigned int ignore_suspend:1; |
@@ -533,21 +547,24 @@ struct snd_soc_dai_link { | |||
533 | /* Symmetry requirements */ | 547 | /* Symmetry requirements */ |
534 | unsigned int symmetric_rates:1; | 548 | unsigned int symmetric_rates:1; |
535 | 549 | ||
536 | /* Symmetry data - only valid if symmetry is being enforced */ | 550 | /* codec/machine specific init - e.g. add machine controls */ |
537 | unsigned int rate; | 551 | int (*init)(struct snd_soc_pcm_runtime *rtd); |
538 | 552 | ||
539 | /* DAI pcm */ | 553 | /* machine stream operations */ |
540 | struct snd_pcm *pcm; | 554 | struct snd_soc_ops *ops; |
541 | }; | 555 | }; |
542 | 556 | ||
543 | /* SoC card */ | 557 | /* SoC card */ |
544 | struct snd_soc_card { | 558 | struct snd_soc_card { |
545 | char *name; | 559 | const char *name; |
546 | struct device *dev; | 560 | struct device *dev; |
561 | struct snd_card *snd_card; | ||
562 | struct module *owner; | ||
547 | 563 | ||
548 | struct list_head list; | 564 | struct list_head list; |
565 | struct mutex mutex; | ||
549 | 566 | ||
550 | int instantiated; | 567 | bool instantiated; |
551 | 568 | ||
552 | int (*probe)(struct platform_device *pdev); | 569 | int (*probe)(struct platform_device *pdev); |
553 | int (*remove)(struct platform_device *pdev); | 570 | int (*remove)(struct platform_device *pdev); |
@@ -568,28 +585,38 @@ struct snd_soc_card { | |||
568 | /* CPU <--> Codec DAI links */ | 585 | /* CPU <--> Codec DAI links */ |
569 | struct snd_soc_dai_link *dai_link; | 586 | struct snd_soc_dai_link *dai_link; |
570 | int num_links; | 587 | int num_links; |
588 | struct snd_soc_pcm_runtime *rtd; | ||
589 | int num_rtd; | ||
571 | 590 | ||
572 | struct snd_soc_device *socdev; | ||
573 | |||
574 | struct snd_soc_codec *codec; | ||
575 | |||
576 | struct snd_soc_platform *platform; | ||
577 | struct delayed_work delayed_work; | ||
578 | struct work_struct deferred_resume_work; | 591 | struct work_struct deferred_resume_work; |
592 | |||
593 | /* lists of probed devices belonging to this card */ | ||
594 | struct list_head codec_dev_list; | ||
595 | struct list_head platform_dev_list; | ||
596 | struct list_head dai_dev_list; | ||
579 | }; | 597 | }; |
580 | 598 | ||
581 | /* SoC Device - the audio subsystem */ | 599 | /* SoC machine DAI configuration, glues a codec and cpu DAI together */ |
582 | struct snd_soc_device { | 600 | struct snd_soc_pcm_runtime { |
583 | struct device *dev; | 601 | struct device dev; |
584 | struct snd_soc_card *card; | 602 | struct snd_soc_card *card; |
585 | struct snd_soc_codec_device *codec_dev; | 603 | struct snd_soc_dai_link *dai_link; |
586 | void *codec_data; | 604 | |
587 | }; | 605 | unsigned int complete:1; |
606 | unsigned int dev_registered:1; | ||
607 | |||
608 | /* Symmetry data - only valid if symmetry is being enforced */ | ||
609 | unsigned int rate; | ||
610 | long pmdown_time; | ||
588 | 611 | ||
589 | /* runtime channel data */ | 612 | /* runtime devices */ |
590 | struct snd_soc_pcm_runtime { | 613 | struct snd_pcm *pcm; |
591 | struct snd_soc_dai_link *dai; | 614 | struct snd_soc_codec *codec; |
592 | struct snd_soc_device *socdev; | 615 | struct snd_soc_platform *platform; |
616 | struct snd_soc_dai *codec_dai; | ||
617 | struct snd_soc_dai *cpu_dai; | ||
618 | |||
619 | struct delayed_work delayed_work; | ||
593 | }; | 620 | }; |
594 | 621 | ||
595 | /* mixer control */ | 622 | /* mixer control */ |
@@ -615,24 +642,48 @@ struct soc_enum { | |||
615 | static inline unsigned int snd_soc_read(struct snd_soc_codec *codec, | 642 | static inline unsigned int snd_soc_read(struct snd_soc_codec *codec, |
616 | unsigned int reg) | 643 | unsigned int reg) |
617 | { | 644 | { |
618 | return codec->read(codec, reg); | 645 | return codec->driver->read(codec, reg); |
619 | } | 646 | } |
620 | 647 | ||
621 | static inline unsigned int snd_soc_write(struct snd_soc_codec *codec, | 648 | static inline unsigned int snd_soc_write(struct snd_soc_codec *codec, |
622 | unsigned int reg, unsigned int val) | 649 | unsigned int reg, unsigned int val) |
623 | { | 650 | { |
624 | return codec->write(codec, reg, val); | 651 | return codec->driver->write(codec, reg, val); |
625 | } | 652 | } |
626 | 653 | ||
654 | /* device driver data */ | ||
655 | |||
627 | static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec, | 656 | static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec, |
628 | void *data) | 657 | void *data) |
629 | { | 658 | { |
630 | codec->drvdata = data; | 659 | dev_set_drvdata(codec->dev, data); |
631 | } | 660 | } |
632 | 661 | ||
633 | static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec) | 662 | static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec) |
634 | { | 663 | { |
635 | return codec->drvdata; | 664 | return dev_get_drvdata(codec->dev); |
665 | } | ||
666 | |||
667 | static inline void snd_soc_platform_set_drvdata(struct snd_soc_platform *platform, | ||
668 | void *data) | ||
669 | { | ||
670 | dev_set_drvdata(platform->dev, data); | ||
671 | } | ||
672 | |||
673 | static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platform) | ||
674 | { | ||
675 | return dev_get_drvdata(platform->dev); | ||
676 | } | ||
677 | |||
678 | static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd, | ||
679 | void *data) | ||
680 | { | ||
681 | dev_set_drvdata(&rtd->dev, data); | ||
682 | } | ||
683 | |||
684 | static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd) | ||
685 | { | ||
686 | return dev_get_drvdata(&rtd->dev); | ||
636 | } | 687 | } |
637 | 688 | ||
638 | #include <sound/soc-dai.h> | 689 | #include <sound/soc-dai.h> |
diff --git a/include/sound/tlv.h b/include/sound/tlv.h index 9fd5b19ccf5c..7067e2dfb0b9 100644 --- a/include/sound/tlv.h +++ b/include/sound/tlv.h | |||
@@ -38,9 +38,11 @@ | |||
38 | #define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */ | 38 | #define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */ |
39 | #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */ | 39 | #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */ |
40 | 40 | ||
41 | #define TLV_DB_SCALE_MASK 0xffff | ||
42 | #define TLV_DB_SCALE_MUTE 0x10000 | ||
41 | #define TLV_DB_SCALE_ITEM(min, step, mute) \ | 43 | #define TLV_DB_SCALE_ITEM(min, step, mute) \ |
42 | SNDRV_CTL_TLVT_DB_SCALE, 2 * sizeof(unsigned int), \ | 44 | SNDRV_CTL_TLVT_DB_SCALE, 2 * sizeof(unsigned int), \ |
43 | (min), ((step) & 0xffff) | ((mute) ? 0x10000 : 0) | 45 | (min), ((step) & TLV_DB_SCALE_MASK) | ((mute) ? TLV_DB_SCALE_MUTE : 0) |
44 | #define DECLARE_TLV_DB_SCALE(name, min, step, mute) \ | 46 | #define DECLARE_TLV_DB_SCALE(name, min, step, mute) \ |
45 | unsigned int name[] = { TLV_DB_SCALE_ITEM(min, step, mute) } | 47 | unsigned int name[] = { TLV_DB_SCALE_ITEM(min, step, mute) } |
46 | 48 | ||
diff --git a/include/sound/tlv320aic3x.h b/include/sound/tlv320aic3x.h index b1a5f34e5cfa..99e0308bf2c2 100644 --- a/include/sound/tlv320aic3x.h +++ b/include/sound/tlv320aic3x.h | |||
@@ -10,8 +10,49 @@ | |||
10 | #ifndef __TLV320AIC3x_H__ | 10 | #ifndef __TLV320AIC3x_H__ |
11 | #define __TLV320AIC3x_H__ | 11 | #define __TLV320AIC3x_H__ |
12 | 12 | ||
13 | /* GPIO API */ | ||
14 | enum { | ||
15 | AIC3X_GPIO1_FUNC_DISABLED = 0, | ||
16 | AIC3X_GPIO1_FUNC_AUDIO_WORDCLK_ADC = 1, | ||
17 | AIC3X_GPIO1_FUNC_CLOCK_MUX = 2, | ||
18 | AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV2 = 3, | ||
19 | AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV4 = 4, | ||
20 | AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV8 = 5, | ||
21 | AIC3X_GPIO1_FUNC_SHORT_CIRCUIT_IRQ = 6, | ||
22 | AIC3X_GPIO1_FUNC_AGC_NOISE_IRQ = 7, | ||
23 | AIC3X_GPIO1_FUNC_INPUT = 8, | ||
24 | AIC3X_GPIO1_FUNC_OUTPUT = 9, | ||
25 | AIC3X_GPIO1_FUNC_DIGITAL_MIC_MODCLK = 10, | ||
26 | AIC3X_GPIO1_FUNC_AUDIO_WORDCLK = 11, | ||
27 | AIC3X_GPIO1_FUNC_BUTTON_IRQ = 12, | ||
28 | AIC3X_GPIO1_FUNC_HEADSET_DETECT_IRQ = 13, | ||
29 | AIC3X_GPIO1_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 14, | ||
30 | AIC3X_GPIO1_FUNC_ALL_IRQ = 16 | ||
31 | }; | ||
32 | |||
33 | enum { | ||
34 | AIC3X_GPIO2_FUNC_DISABLED = 0, | ||
35 | AIC3X_GPIO2_FUNC_HEADSET_DETECT_IRQ = 2, | ||
36 | AIC3X_GPIO2_FUNC_INPUT = 3, | ||
37 | AIC3X_GPIO2_FUNC_OUTPUT = 4, | ||
38 | AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT = 5, | ||
39 | AIC3X_GPIO2_FUNC_AUDIO_BITCLK = 8, | ||
40 | AIC3X_GPIO2_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 9, | ||
41 | AIC3X_GPIO2_FUNC_ALL_IRQ = 10, | ||
42 | AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_OR_AGC_IRQ = 11, | ||
43 | AIC3X_GPIO2_FUNC_HEADSET_OR_BUTTON_PRESS_OR_SHORT_CIRCUIT_IRQ = 12, | ||
44 | AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_IRQ = 13, | ||
45 | AIC3X_GPIO2_FUNC_AGC_NOISE_IRQ = 14, | ||
46 | AIC3X_GPIO2_FUNC_BUTTON_PRESS_IRQ = 15 | ||
47 | }; | ||
48 | |||
49 | struct aic3x_setup_data { | ||
50 | unsigned int gpio_func[2]; | ||
51 | }; | ||
52 | |||
13 | struct aic3x_pdata { | 53 | struct aic3x_pdata { |
14 | int gpio_reset; /* < 0 if not used */ | 54 | int gpio_reset; /* < 0 if not used */ |
55 | struct aic3x_setup_data *setup; | ||
15 | }; | 56 | }; |
16 | 57 | ||
17 | #endif \ No newline at end of file | 58 | #endif |
diff --git a/include/sound/wm8962.h b/include/sound/wm8962.h new file mode 100644 index 000000000000..2b5306c503fb --- /dev/null +++ b/include/sound/wm8962.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * wm8962.h -- WM8962 Soc Audio driver platform data | ||
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 | |||
9 | #ifndef _WM8962_PDATA_H | ||
10 | #define _WM8962_PDATA_H | ||
11 | |||
12 | #define WM8962_MAX_GPIO 6 | ||
13 | |||
14 | /* Use to set GPIO default values to zero */ | ||
15 | #define WM8962_GPIO_SET 0x10000 | ||
16 | |||
17 | struct wm8962_pdata { | ||
18 | int gpio_base; | ||
19 | u32 gpio_init[WM8962_MAX_GPIO]; | ||
20 | |||
21 | /* Setup for microphone detection, raw value to be written to | ||
22 | * R48(0x30) - only microphone related bits will be updated. | ||
23 | * Detection may be enabled here for use with signals brought | ||
24 | * out on the GPIOs. */ | ||
25 | u32 mic_cfg; | ||
26 | |||
27 | bool irq_active_low; | ||
28 | |||
29 | bool spk_mono; /* Speaker outputs tied together as mono */ | ||
30 | }; | ||
31 | |||
32 | #endif | ||
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 01e9e0076a92..e5e345fb2a5c 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
@@ -21,7 +21,8 @@ TRACE_EVENT(ext4_free_inode, | |||
21 | TP_ARGS(inode), | 21 | TP_ARGS(inode), |
22 | 22 | ||
23 | TP_STRUCT__entry( | 23 | TP_STRUCT__entry( |
24 | __field( dev_t, dev ) | 24 | __field( int, dev_major ) |
25 | __field( int, dev_minor ) | ||
25 | __field( ino_t, ino ) | 26 | __field( ino_t, ino ) |
26 | __field( umode_t, mode ) | 27 | __field( umode_t, mode ) |
27 | __field( uid_t, uid ) | 28 | __field( uid_t, uid ) |
@@ -30,7 +31,8 @@ TRACE_EVENT(ext4_free_inode, | |||
30 | ), | 31 | ), |
31 | 32 | ||
32 | TP_fast_assign( | 33 | TP_fast_assign( |
33 | __entry->dev = inode->i_sb->s_dev; | 34 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
35 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
34 | __entry->ino = inode->i_ino; | 36 | __entry->ino = inode->i_ino; |
35 | __entry->mode = inode->i_mode; | 37 | __entry->mode = inode->i_mode; |
36 | __entry->uid = inode->i_uid; | 38 | __entry->uid = inode->i_uid; |
@@ -38,9 +40,10 @@ TRACE_EVENT(ext4_free_inode, | |||
38 | __entry->blocks = inode->i_blocks; | 40 | __entry->blocks = inode->i_blocks; |
39 | ), | 41 | ), |
40 | 42 | ||
41 | TP_printk("dev %s ino %lu mode 0%o uid %u gid %u blocks %llu", | 43 | TP_printk("dev %d,%d ino %lu mode 0%o uid %u gid %u blocks %llu", |
42 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 44 | __entry->dev_major, __entry->dev_minor, |
43 | __entry->mode, __entry->uid, __entry->gid, | 45 | (unsigned long) __entry->ino, __entry->mode, |
46 | __entry->uid, __entry->gid, | ||
44 | (unsigned long long) __entry->blocks) | 47 | (unsigned long long) __entry->blocks) |
45 | ); | 48 | ); |
46 | 49 | ||
@@ -50,20 +53,22 @@ TRACE_EVENT(ext4_request_inode, | |||
50 | TP_ARGS(dir, mode), | 53 | TP_ARGS(dir, mode), |
51 | 54 | ||
52 | TP_STRUCT__entry( | 55 | TP_STRUCT__entry( |
53 | __field( dev_t, dev ) | 56 | __field( int, dev_major ) |
57 | __field( int, dev_minor ) | ||
54 | __field( ino_t, dir ) | 58 | __field( ino_t, dir ) |
55 | __field( umode_t, mode ) | 59 | __field( umode_t, mode ) |
56 | ), | 60 | ), |
57 | 61 | ||
58 | TP_fast_assign( | 62 | TP_fast_assign( |
59 | __entry->dev = dir->i_sb->s_dev; | 63 | __entry->dev_major = MAJOR(dir->i_sb->s_dev); |
64 | __entry->dev_minor = MINOR(dir->i_sb->s_dev); | ||
60 | __entry->dir = dir->i_ino; | 65 | __entry->dir = dir->i_ino; |
61 | __entry->mode = mode; | 66 | __entry->mode = mode; |
62 | ), | 67 | ), |
63 | 68 | ||
64 | TP_printk("dev %s dir %lu mode 0%o", | 69 | TP_printk("dev %d,%d dir %lu mode 0%o", |
65 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->dir, | 70 | __entry->dev_major, __entry->dev_minor, |
66 | __entry->mode) | 71 | (unsigned long) __entry->dir, __entry->mode) |
67 | ); | 72 | ); |
68 | 73 | ||
69 | TRACE_EVENT(ext4_allocate_inode, | 74 | TRACE_EVENT(ext4_allocate_inode, |
@@ -72,24 +77,124 @@ TRACE_EVENT(ext4_allocate_inode, | |||
72 | TP_ARGS(inode, dir, mode), | 77 | TP_ARGS(inode, dir, mode), |
73 | 78 | ||
74 | TP_STRUCT__entry( | 79 | TP_STRUCT__entry( |
75 | __field( dev_t, dev ) | 80 | __field( int, dev_major ) |
81 | __field( int, dev_minor ) | ||
76 | __field( ino_t, ino ) | 82 | __field( ino_t, ino ) |
77 | __field( ino_t, dir ) | 83 | __field( ino_t, dir ) |
78 | __field( umode_t, mode ) | 84 | __field( umode_t, mode ) |
79 | ), | 85 | ), |
80 | 86 | ||
81 | TP_fast_assign( | 87 | TP_fast_assign( |
82 | __entry->dev = inode->i_sb->s_dev; | 88 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
89 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
83 | __entry->ino = inode->i_ino; | 90 | __entry->ino = inode->i_ino; |
84 | __entry->dir = dir->i_ino; | 91 | __entry->dir = dir->i_ino; |
85 | __entry->mode = mode; | 92 | __entry->mode = mode; |
86 | ), | 93 | ), |
87 | 94 | ||
88 | TP_printk("dev %s ino %lu dir %lu mode 0%o", | 95 | TP_printk("dev %d,%d ino %lu dir %lu mode 0%o", |
89 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 96 | __entry->dev_major, __entry->dev_minor, |
97 | (unsigned long) __entry->ino, | ||
90 | (unsigned long) __entry->dir, __entry->mode) | 98 | (unsigned long) __entry->dir, __entry->mode) |
91 | ); | 99 | ); |
92 | 100 | ||
101 | TRACE_EVENT(ext4_evict_inode, | ||
102 | TP_PROTO(struct inode *inode), | ||
103 | |||
104 | TP_ARGS(inode), | ||
105 | |||
106 | TP_STRUCT__entry( | ||
107 | __field( int, dev_major ) | ||
108 | __field( int, dev_minor ) | ||
109 | __field( ino_t, ino ) | ||
110 | __field( int, nlink ) | ||
111 | ), | ||
112 | |||
113 | TP_fast_assign( | ||
114 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); | ||
115 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
116 | __entry->ino = inode->i_ino; | ||
117 | __entry->nlink = inode->i_nlink; | ||
118 | ), | ||
119 | |||
120 | TP_printk("dev %d,%d ino %lu nlink %d", | ||
121 | __entry->dev_major, __entry->dev_minor, | ||
122 | (unsigned long) __entry->ino, __entry->nlink) | ||
123 | ); | ||
124 | |||
125 | TRACE_EVENT(ext4_drop_inode, | ||
126 | TP_PROTO(struct inode *inode, int drop), | ||
127 | |||
128 | TP_ARGS(inode, drop), | ||
129 | |||
130 | TP_STRUCT__entry( | ||
131 | __field( int, dev_major ) | ||
132 | __field( int, dev_minor ) | ||
133 | __field( ino_t, ino ) | ||
134 | __field( int, drop ) | ||
135 | ), | ||
136 | |||
137 | TP_fast_assign( | ||
138 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); | ||
139 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
140 | __entry->ino = inode->i_ino; | ||
141 | __entry->drop = drop; | ||
142 | ), | ||
143 | |||
144 | TP_printk("dev %d,%d ino %lu drop %d", | ||
145 | __entry->dev_major, __entry->dev_minor, | ||
146 | (unsigned long) __entry->ino, __entry->drop) | ||
147 | ); | ||
148 | |||
149 | TRACE_EVENT(ext4_mark_inode_dirty, | ||
150 | TP_PROTO(struct inode *inode, unsigned long IP), | ||
151 | |||
152 | TP_ARGS(inode, IP), | ||
153 | |||
154 | TP_STRUCT__entry( | ||
155 | __field( int, dev_major ) | ||
156 | __field( int, dev_minor ) | ||
157 | __field( ino_t, ino ) | ||
158 | __field(unsigned long, ip ) | ||
159 | ), | ||
160 | |||
161 | TP_fast_assign( | ||
162 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); | ||
163 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
164 | __entry->ino = inode->i_ino; | ||
165 | __entry->ip = IP; | ||
166 | ), | ||
167 | |||
168 | TP_printk("dev %d,%d ino %lu caller %pF", | ||
169 | __entry->dev_major, __entry->dev_minor, | ||
170 | (unsigned long) __entry->ino, (void *)__entry->ip) | ||
171 | ); | ||
172 | |||
173 | TRACE_EVENT(ext4_begin_ordered_truncate, | ||
174 | TP_PROTO(struct inode *inode, loff_t new_size), | ||
175 | |||
176 | TP_ARGS(inode, new_size), | ||
177 | |||
178 | TP_STRUCT__entry( | ||
179 | __field( int, dev_major ) | ||
180 | __field( int, dev_minor ) | ||
181 | __field( ino_t, ino ) | ||
182 | __field( loff_t, new_size ) | ||
183 | ), | ||
184 | |||
185 | TP_fast_assign( | ||
186 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); | ||
187 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
188 | __entry->ino = inode->i_ino; | ||
189 | __entry->new_size = new_size; | ||
190 | ), | ||
191 | |||
192 | TP_printk("dev %d,%d ino %lu new_size %lld", | ||
193 | __entry->dev_major, __entry->dev_minor, | ||
194 | (unsigned long) __entry->ino, | ||
195 | (long long) __entry->new_size) | ||
196 | ); | ||
197 | |||
93 | DECLARE_EVENT_CLASS(ext4__write_begin, | 198 | DECLARE_EVENT_CLASS(ext4__write_begin, |
94 | 199 | ||
95 | TP_PROTO(struct inode *inode, loff_t pos, unsigned int len, | 200 | TP_PROTO(struct inode *inode, loff_t pos, unsigned int len, |
@@ -98,7 +203,8 @@ DECLARE_EVENT_CLASS(ext4__write_begin, | |||
98 | TP_ARGS(inode, pos, len, flags), | 203 | TP_ARGS(inode, pos, len, flags), |
99 | 204 | ||
100 | TP_STRUCT__entry( | 205 | TP_STRUCT__entry( |
101 | __field( dev_t, dev ) | 206 | __field( int, dev_major ) |
207 | __field( int, dev_minor ) | ||
102 | __field( ino_t, ino ) | 208 | __field( ino_t, ino ) |
103 | __field( loff_t, pos ) | 209 | __field( loff_t, pos ) |
104 | __field( unsigned int, len ) | 210 | __field( unsigned int, len ) |
@@ -106,15 +212,17 @@ DECLARE_EVENT_CLASS(ext4__write_begin, | |||
106 | ), | 212 | ), |
107 | 213 | ||
108 | TP_fast_assign( | 214 | TP_fast_assign( |
109 | __entry->dev = inode->i_sb->s_dev; | 215 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
216 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
110 | __entry->ino = inode->i_ino; | 217 | __entry->ino = inode->i_ino; |
111 | __entry->pos = pos; | 218 | __entry->pos = pos; |
112 | __entry->len = len; | 219 | __entry->len = len; |
113 | __entry->flags = flags; | 220 | __entry->flags = flags; |
114 | ), | 221 | ), |
115 | 222 | ||
116 | TP_printk("dev %s ino %lu pos %llu len %u flags %u", | 223 | TP_printk("dev %d,%d ino %lu pos %llu len %u flags %u", |
117 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 224 | __entry->dev_major, __entry->dev_minor, |
225 | (unsigned long) __entry->ino, | ||
118 | __entry->pos, __entry->len, __entry->flags) | 226 | __entry->pos, __entry->len, __entry->flags) |
119 | ); | 227 | ); |
120 | 228 | ||
@@ -141,7 +249,8 @@ DECLARE_EVENT_CLASS(ext4__write_end, | |||
141 | TP_ARGS(inode, pos, len, copied), | 249 | TP_ARGS(inode, pos, len, copied), |
142 | 250 | ||
143 | TP_STRUCT__entry( | 251 | TP_STRUCT__entry( |
144 | __field( dev_t, dev ) | 252 | __field( int, dev_major ) |
253 | __field( int, dev_minor ) | ||
145 | __field( ino_t, ino ) | 254 | __field( ino_t, ino ) |
146 | __field( loff_t, pos ) | 255 | __field( loff_t, pos ) |
147 | __field( unsigned int, len ) | 256 | __field( unsigned int, len ) |
@@ -149,16 +258,18 @@ DECLARE_EVENT_CLASS(ext4__write_end, | |||
149 | ), | 258 | ), |
150 | 259 | ||
151 | TP_fast_assign( | 260 | TP_fast_assign( |
152 | __entry->dev = inode->i_sb->s_dev; | 261 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
262 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
153 | __entry->ino = inode->i_ino; | 263 | __entry->ino = inode->i_ino; |
154 | __entry->pos = pos; | 264 | __entry->pos = pos; |
155 | __entry->len = len; | 265 | __entry->len = len; |
156 | __entry->copied = copied; | 266 | __entry->copied = copied; |
157 | ), | 267 | ), |
158 | 268 | ||
159 | TP_printk("dev %s ino %lu pos %llu len %u copied %u", | 269 | TP_printk("dev %d,%d ino %lu pos %llu len %u copied %u", |
160 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 270 | __entry->dev_major, __entry->dev_minor, |
161 | __entry->pos, __entry->len, __entry->copied) | 271 | (unsigned long) __entry->ino, __entry->pos, |
272 | __entry->len, __entry->copied) | ||
162 | ); | 273 | ); |
163 | 274 | ||
164 | DEFINE_EVENT(ext4__write_end, ext4_ordered_write_end, | 275 | DEFINE_EVENT(ext4__write_end, ext4_ordered_write_end, |
@@ -199,21 +310,23 @@ TRACE_EVENT(ext4_writepage, | |||
199 | TP_ARGS(inode, page), | 310 | TP_ARGS(inode, page), |
200 | 311 | ||
201 | TP_STRUCT__entry( | 312 | TP_STRUCT__entry( |
202 | __field( dev_t, dev ) | 313 | __field( int, dev_major ) |
314 | __field( int, dev_minor ) | ||
203 | __field( ino_t, ino ) | 315 | __field( ino_t, ino ) |
204 | __field( pgoff_t, index ) | 316 | __field( pgoff_t, index ) |
205 | 317 | ||
206 | ), | 318 | ), |
207 | 319 | ||
208 | TP_fast_assign( | 320 | TP_fast_assign( |
209 | __entry->dev = inode->i_sb->s_dev; | 321 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
322 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
210 | __entry->ino = inode->i_ino; | 323 | __entry->ino = inode->i_ino; |
211 | __entry->index = page->index; | 324 | __entry->index = page->index; |
212 | ), | 325 | ), |
213 | 326 | ||
214 | TP_printk("dev %s ino %lu page_index %lu", | 327 | TP_printk("dev %d,%d ino %lu page_index %lu", |
215 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 328 | __entry->dev_major, __entry->dev_minor, |
216 | __entry->index) | 329 | (unsigned long) __entry->ino, __entry->index) |
217 | ); | 330 | ); |
218 | 331 | ||
219 | TRACE_EVENT(ext4_da_writepages, | 332 | TRACE_EVENT(ext4_da_writepages, |
@@ -222,13 +335,13 @@ TRACE_EVENT(ext4_da_writepages, | |||
222 | TP_ARGS(inode, wbc), | 335 | TP_ARGS(inode, wbc), |
223 | 336 | ||
224 | TP_STRUCT__entry( | 337 | TP_STRUCT__entry( |
225 | __field( dev_t, dev ) | 338 | __field( int, dev_major ) |
339 | __field( int, dev_minor ) | ||
226 | __field( ino_t, ino ) | 340 | __field( ino_t, ino ) |
227 | __field( long, nr_to_write ) | 341 | __field( long, nr_to_write ) |
228 | __field( long, pages_skipped ) | 342 | __field( long, pages_skipped ) |
229 | __field( loff_t, range_start ) | 343 | __field( loff_t, range_start ) |
230 | __field( loff_t, range_end ) | 344 | __field( loff_t, range_end ) |
231 | __field( char, nonblocking ) | ||
232 | __field( char, for_kupdate ) | 345 | __field( char, for_kupdate ) |
233 | __field( char, for_reclaim ) | 346 | __field( char, for_reclaim ) |
234 | __field( char, range_cyclic ) | 347 | __field( char, range_cyclic ) |
@@ -236,24 +349,27 @@ TRACE_EVENT(ext4_da_writepages, | |||
236 | ), | 349 | ), |
237 | 350 | ||
238 | TP_fast_assign( | 351 | TP_fast_assign( |
239 | __entry->dev = inode->i_sb->s_dev; | 352 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
353 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
240 | __entry->ino = inode->i_ino; | 354 | __entry->ino = inode->i_ino; |
241 | __entry->nr_to_write = wbc->nr_to_write; | 355 | __entry->nr_to_write = wbc->nr_to_write; |
242 | __entry->pages_skipped = wbc->pages_skipped; | 356 | __entry->pages_skipped = wbc->pages_skipped; |
243 | __entry->range_start = wbc->range_start; | 357 | __entry->range_start = wbc->range_start; |
244 | __entry->range_end = wbc->range_end; | 358 | __entry->range_end = wbc->range_end; |
245 | __entry->nonblocking = wbc->nonblocking; | ||
246 | __entry->for_kupdate = wbc->for_kupdate; | 359 | __entry->for_kupdate = wbc->for_kupdate; |
247 | __entry->for_reclaim = wbc->for_reclaim; | 360 | __entry->for_reclaim = wbc->for_reclaim; |
248 | __entry->range_cyclic = wbc->range_cyclic; | 361 | __entry->range_cyclic = wbc->range_cyclic; |
249 | __entry->writeback_index = inode->i_mapping->writeback_index; | 362 | __entry->writeback_index = inode->i_mapping->writeback_index; |
250 | ), | 363 | ), |
251 | 364 | ||
252 | TP_printk("dev %s ino %lu nr_to_write %ld pages_skipped %ld range_start %llu range_end %llu nonblocking %d for_kupdate %d for_reclaim %d range_cyclic %d writeback_index %lu", | 365 | TP_printk("dev %d,%d ino %lu nr_to_write %ld pages_skipped %ld " |
253 | jbd2_dev_to_name(__entry->dev), | 366 | "range_start %llu range_end %llu " |
367 | "for_kupdate %d for_reclaim %d " | ||
368 | "range_cyclic %d writeback_index %lu", | ||
369 | __entry->dev_major, __entry->dev_minor, | ||
254 | (unsigned long) __entry->ino, __entry->nr_to_write, | 370 | (unsigned long) __entry->ino, __entry->nr_to_write, |
255 | __entry->pages_skipped, __entry->range_start, | 371 | __entry->pages_skipped, __entry->range_start, |
256 | __entry->range_end, __entry->nonblocking, | 372 | __entry->range_end, |
257 | __entry->for_kupdate, __entry->for_reclaim, | 373 | __entry->for_kupdate, __entry->for_reclaim, |
258 | __entry->range_cyclic, | 374 | __entry->range_cyclic, |
259 | (unsigned long) __entry->writeback_index) | 375 | (unsigned long) __entry->writeback_index) |
@@ -265,7 +381,8 @@ TRACE_EVENT(ext4_da_write_pages, | |||
265 | TP_ARGS(inode, mpd), | 381 | TP_ARGS(inode, mpd), |
266 | 382 | ||
267 | TP_STRUCT__entry( | 383 | TP_STRUCT__entry( |
268 | __field( dev_t, dev ) | 384 | __field( int, dev_major ) |
385 | __field( int, dev_minor ) | ||
269 | __field( ino_t, ino ) | 386 | __field( ino_t, ino ) |
270 | __field( __u64, b_blocknr ) | 387 | __field( __u64, b_blocknr ) |
271 | __field( __u32, b_size ) | 388 | __field( __u32, b_size ) |
@@ -276,7 +393,8 @@ TRACE_EVENT(ext4_da_write_pages, | |||
276 | ), | 393 | ), |
277 | 394 | ||
278 | TP_fast_assign( | 395 | TP_fast_assign( |
279 | __entry->dev = inode->i_sb->s_dev; | 396 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
397 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
280 | __entry->ino = inode->i_ino; | 398 | __entry->ino = inode->i_ino; |
281 | __entry->b_blocknr = mpd->b_blocknr; | 399 | __entry->b_blocknr = mpd->b_blocknr; |
282 | __entry->b_size = mpd->b_size; | 400 | __entry->b_size = mpd->b_size; |
@@ -286,8 +404,9 @@ TRACE_EVENT(ext4_da_write_pages, | |||
286 | __entry->pages_written = mpd->pages_written; | 404 | __entry->pages_written = mpd->pages_written; |
287 | ), | 405 | ), |
288 | 406 | ||
289 | TP_printk("dev %s ino %lu b_blocknr %llu b_size %u b_state 0x%04x first_page %lu io_done %d pages_written %d", | 407 | TP_printk("dev %d,%d ino %lu b_blocknr %llu b_size %u b_state 0x%04x first_page %lu io_done %d pages_written %d", |
290 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 408 | __entry->dev_major, __entry->dev_minor, |
409 | (unsigned long) __entry->ino, | ||
291 | __entry->b_blocknr, __entry->b_size, | 410 | __entry->b_blocknr, __entry->b_size, |
292 | __entry->b_state, __entry->first_page, | 411 | __entry->b_state, __entry->first_page, |
293 | __entry->io_done, __entry->pages_written) | 412 | __entry->io_done, __entry->pages_written) |
@@ -300,7 +419,8 @@ TRACE_EVENT(ext4_da_writepages_result, | |||
300 | TP_ARGS(inode, wbc, ret, pages_written), | 419 | TP_ARGS(inode, wbc, ret, pages_written), |
301 | 420 | ||
302 | TP_STRUCT__entry( | 421 | TP_STRUCT__entry( |
303 | __field( dev_t, dev ) | 422 | __field( int, dev_major ) |
423 | __field( int, dev_minor ) | ||
304 | __field( ino_t, ino ) | 424 | __field( ino_t, ino ) |
305 | __field( int, ret ) | 425 | __field( int, ret ) |
306 | __field( int, pages_written ) | 426 | __field( int, pages_written ) |
@@ -310,7 +430,8 @@ TRACE_EVENT(ext4_da_writepages_result, | |||
310 | ), | 430 | ), |
311 | 431 | ||
312 | TP_fast_assign( | 432 | TP_fast_assign( |
313 | __entry->dev = inode->i_sb->s_dev; | 433 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
434 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
314 | __entry->ino = inode->i_ino; | 435 | __entry->ino = inode->i_ino; |
315 | __entry->ret = ret; | 436 | __entry->ret = ret; |
316 | __entry->pages_written = pages_written; | 437 | __entry->pages_written = pages_written; |
@@ -319,8 +440,8 @@ TRACE_EVENT(ext4_da_writepages_result, | |||
319 | __entry->writeback_index = inode->i_mapping->writeback_index; | 440 | __entry->writeback_index = inode->i_mapping->writeback_index; |
320 | ), | 441 | ), |
321 | 442 | ||
322 | TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", | 443 | TP_printk("dev %d,%d ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", |
323 | jbd2_dev_to_name(__entry->dev), | 444 | __entry->dev_major, __entry->dev_minor, |
324 | (unsigned long) __entry->ino, __entry->ret, | 445 | (unsigned long) __entry->ino, __entry->ret, |
325 | __entry->pages_written, __entry->pages_skipped, | 446 | __entry->pages_written, __entry->pages_skipped, |
326 | __entry->more_io, | 447 | __entry->more_io, |
@@ -334,20 +455,23 @@ TRACE_EVENT(ext4_discard_blocks, | |||
334 | TP_ARGS(sb, blk, count), | 455 | TP_ARGS(sb, blk, count), |
335 | 456 | ||
336 | TP_STRUCT__entry( | 457 | TP_STRUCT__entry( |
337 | __field( dev_t, dev ) | 458 | __field( int, dev_major ) |
459 | __field( int, dev_minor ) | ||
338 | __field( __u64, blk ) | 460 | __field( __u64, blk ) |
339 | __field( __u64, count ) | 461 | __field( __u64, count ) |
340 | 462 | ||
341 | ), | 463 | ), |
342 | 464 | ||
343 | TP_fast_assign( | 465 | TP_fast_assign( |
344 | __entry->dev = sb->s_dev; | 466 | __entry->dev_major = MAJOR(sb->s_dev); |
467 | __entry->dev_minor = MINOR(sb->s_dev); | ||
345 | __entry->blk = blk; | 468 | __entry->blk = blk; |
346 | __entry->count = count; | 469 | __entry->count = count; |
347 | ), | 470 | ), |
348 | 471 | ||
349 | TP_printk("dev %s blk %llu count %llu", | 472 | TP_printk("dev %d,%d blk %llu count %llu", |
350 | jbd2_dev_to_name(__entry->dev), __entry->blk, __entry->count) | 473 | __entry->dev_major, __entry->dev_minor, |
474 | __entry->blk, __entry->count) | ||
351 | ); | 475 | ); |
352 | 476 | ||
353 | DECLARE_EVENT_CLASS(ext4__mb_new_pa, | 477 | DECLARE_EVENT_CLASS(ext4__mb_new_pa, |
@@ -357,7 +481,8 @@ DECLARE_EVENT_CLASS(ext4__mb_new_pa, | |||
357 | TP_ARGS(ac, pa), | 481 | TP_ARGS(ac, pa), |
358 | 482 | ||
359 | TP_STRUCT__entry( | 483 | TP_STRUCT__entry( |
360 | __field( dev_t, dev ) | 484 | __field( int, dev_major ) |
485 | __field( int, dev_minor ) | ||
361 | __field( ino_t, ino ) | 486 | __field( ino_t, ino ) |
362 | __field( __u64, pa_pstart ) | 487 | __field( __u64, pa_pstart ) |
363 | __field( __u32, pa_len ) | 488 | __field( __u32, pa_len ) |
@@ -366,16 +491,18 @@ DECLARE_EVENT_CLASS(ext4__mb_new_pa, | |||
366 | ), | 491 | ), |
367 | 492 | ||
368 | TP_fast_assign( | 493 | TP_fast_assign( |
369 | __entry->dev = ac->ac_sb->s_dev; | 494 | __entry->dev_major = MAJOR(ac->ac_sb->s_dev); |
495 | __entry->dev_minor = MINOR(ac->ac_sb->s_dev); | ||
370 | __entry->ino = ac->ac_inode->i_ino; | 496 | __entry->ino = ac->ac_inode->i_ino; |
371 | __entry->pa_pstart = pa->pa_pstart; | 497 | __entry->pa_pstart = pa->pa_pstart; |
372 | __entry->pa_len = pa->pa_len; | 498 | __entry->pa_len = pa->pa_len; |
373 | __entry->pa_lstart = pa->pa_lstart; | 499 | __entry->pa_lstart = pa->pa_lstart; |
374 | ), | 500 | ), |
375 | 501 | ||
376 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", | 502 | TP_printk("dev %d,%d ino %lu pstart %llu len %u lstart %llu", |
377 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 503 | __entry->dev_major, __entry->dev_minor, |
378 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) | 504 | (unsigned long) __entry->ino, __entry->pa_pstart, |
505 | __entry->pa_len, __entry->pa_lstart) | ||
379 | ); | 506 | ); |
380 | 507 | ||
381 | DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_inode_pa, | 508 | DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_inode_pa, |
@@ -396,14 +523,15 @@ DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_group_pa, | |||
396 | 523 | ||
397 | TRACE_EVENT(ext4_mb_release_inode_pa, | 524 | TRACE_EVENT(ext4_mb_release_inode_pa, |
398 | TP_PROTO(struct super_block *sb, | 525 | TP_PROTO(struct super_block *sb, |
399 | struct ext4_allocation_context *ac, | 526 | struct inode *inode, |
400 | struct ext4_prealloc_space *pa, | 527 | struct ext4_prealloc_space *pa, |
401 | unsigned long long block, unsigned int count), | 528 | unsigned long long block, unsigned int count), |
402 | 529 | ||
403 | TP_ARGS(sb, ac, pa, block, count), | 530 | TP_ARGS(sb, inode, pa, block, count), |
404 | 531 | ||
405 | TP_STRUCT__entry( | 532 | TP_STRUCT__entry( |
406 | __field( dev_t, dev ) | 533 | __field( int, dev_major ) |
534 | __field( int, dev_minor ) | ||
407 | __field( ino_t, ino ) | 535 | __field( ino_t, ino ) |
408 | __field( __u64, block ) | 536 | __field( __u64, block ) |
409 | __field( __u32, count ) | 537 | __field( __u32, count ) |
@@ -411,43 +539,42 @@ TRACE_EVENT(ext4_mb_release_inode_pa, | |||
411 | ), | 539 | ), |
412 | 540 | ||
413 | TP_fast_assign( | 541 | TP_fast_assign( |
414 | __entry->dev = sb->s_dev; | 542 | __entry->dev_major = MAJOR(sb->s_dev); |
415 | __entry->ino = (ac && ac->ac_inode) ? | 543 | __entry->dev_minor = MINOR(sb->s_dev); |
416 | ac->ac_inode->i_ino : 0; | 544 | __entry->ino = inode->i_ino; |
417 | __entry->block = block; | 545 | __entry->block = block; |
418 | __entry->count = count; | 546 | __entry->count = count; |
419 | ), | 547 | ), |
420 | 548 | ||
421 | TP_printk("dev %s ino %lu block %llu count %u", | 549 | TP_printk("dev %d,%d ino %lu block %llu count %u", |
422 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 550 | __entry->dev_major, __entry->dev_minor, |
423 | __entry->block, __entry->count) | 551 | (unsigned long) __entry->ino, __entry->block, __entry->count) |
424 | ); | 552 | ); |
425 | 553 | ||
426 | TRACE_EVENT(ext4_mb_release_group_pa, | 554 | TRACE_EVENT(ext4_mb_release_group_pa, |
427 | TP_PROTO(struct super_block *sb, | 555 | TP_PROTO(struct super_block *sb, |
428 | struct ext4_allocation_context *ac, | ||
429 | struct ext4_prealloc_space *pa), | 556 | struct ext4_prealloc_space *pa), |
430 | 557 | ||
431 | TP_ARGS(sb, ac, pa), | 558 | TP_ARGS(sb, pa), |
432 | 559 | ||
433 | TP_STRUCT__entry( | 560 | TP_STRUCT__entry( |
434 | __field( dev_t, dev ) | 561 | __field( int, dev_major ) |
435 | __field( ino_t, ino ) | 562 | __field( int, dev_minor ) |
436 | __field( __u64, pa_pstart ) | 563 | __field( __u64, pa_pstart ) |
437 | __field( __u32, pa_len ) | 564 | __field( __u32, pa_len ) |
438 | 565 | ||
439 | ), | 566 | ), |
440 | 567 | ||
441 | TP_fast_assign( | 568 | TP_fast_assign( |
442 | __entry->dev = sb->s_dev; | 569 | __entry->dev_major = MAJOR(sb->s_dev); |
443 | __entry->ino = (ac && ac->ac_inode) ? | 570 | __entry->dev_minor = MINOR(sb->s_dev); |
444 | ac->ac_inode->i_ino : 0; | ||
445 | __entry->pa_pstart = pa->pa_pstart; | 571 | __entry->pa_pstart = pa->pa_pstart; |
446 | __entry->pa_len = pa->pa_len; | 572 | __entry->pa_len = pa->pa_len; |
447 | ), | 573 | ), |
448 | 574 | ||
449 | TP_printk("dev %s pstart %llu len %u", | 575 | TP_printk("dev %d,%d pstart %llu len %u", |
450 | jbd2_dev_to_name(__entry->dev), __entry->pa_pstart, __entry->pa_len) | 576 | __entry->dev_major, __entry->dev_minor, |
577 | __entry->pa_pstart, __entry->pa_len) | ||
451 | ); | 578 | ); |
452 | 579 | ||
453 | TRACE_EVENT(ext4_discard_preallocations, | 580 | TRACE_EVENT(ext4_discard_preallocations, |
@@ -456,18 +583,21 @@ TRACE_EVENT(ext4_discard_preallocations, | |||
456 | TP_ARGS(inode), | 583 | TP_ARGS(inode), |
457 | 584 | ||
458 | TP_STRUCT__entry( | 585 | TP_STRUCT__entry( |
459 | __field( dev_t, dev ) | 586 | __field( int, dev_major ) |
587 | __field( int, dev_minor ) | ||
460 | __field( ino_t, ino ) | 588 | __field( ino_t, ino ) |
461 | 589 | ||
462 | ), | 590 | ), |
463 | 591 | ||
464 | TP_fast_assign( | 592 | TP_fast_assign( |
465 | __entry->dev = inode->i_sb->s_dev; | 593 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
594 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
466 | __entry->ino = inode->i_ino; | 595 | __entry->ino = inode->i_ino; |
467 | ), | 596 | ), |
468 | 597 | ||
469 | TP_printk("dev %s ino %lu", | 598 | TP_printk("dev %d,%d ino %lu", |
470 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino) | 599 | __entry->dev_major, __entry->dev_minor, |
600 | (unsigned long) __entry->ino) | ||
471 | ); | 601 | ); |
472 | 602 | ||
473 | TRACE_EVENT(ext4_mb_discard_preallocations, | 603 | TRACE_EVENT(ext4_mb_discard_preallocations, |
@@ -476,18 +606,20 @@ TRACE_EVENT(ext4_mb_discard_preallocations, | |||
476 | TP_ARGS(sb, needed), | 606 | TP_ARGS(sb, needed), |
477 | 607 | ||
478 | TP_STRUCT__entry( | 608 | TP_STRUCT__entry( |
479 | __field( dev_t, dev ) | 609 | __field( int, dev_major ) |
610 | __field( int, dev_minor ) | ||
480 | __field( int, needed ) | 611 | __field( int, needed ) |
481 | 612 | ||
482 | ), | 613 | ), |
483 | 614 | ||
484 | TP_fast_assign( | 615 | TP_fast_assign( |
485 | __entry->dev = sb->s_dev; | 616 | __entry->dev_major = MAJOR(sb->s_dev); |
617 | __entry->dev_minor = MINOR(sb->s_dev); | ||
486 | __entry->needed = needed; | 618 | __entry->needed = needed; |
487 | ), | 619 | ), |
488 | 620 | ||
489 | TP_printk("dev %s needed %d", | 621 | TP_printk("dev %d,%d needed %d", |
490 | jbd2_dev_to_name(__entry->dev), __entry->needed) | 622 | __entry->dev_major, __entry->dev_minor, __entry->needed) |
491 | ); | 623 | ); |
492 | 624 | ||
493 | TRACE_EVENT(ext4_request_blocks, | 625 | TRACE_EVENT(ext4_request_blocks, |
@@ -496,7 +628,8 @@ TRACE_EVENT(ext4_request_blocks, | |||
496 | TP_ARGS(ar), | 628 | TP_ARGS(ar), |
497 | 629 | ||
498 | TP_STRUCT__entry( | 630 | TP_STRUCT__entry( |
499 | __field( dev_t, dev ) | 631 | __field( int, dev_major ) |
632 | __field( int, dev_minor ) | ||
500 | __field( ino_t, ino ) | 633 | __field( ino_t, ino ) |
501 | __field( unsigned int, flags ) | 634 | __field( unsigned int, flags ) |
502 | __field( unsigned int, len ) | 635 | __field( unsigned int, len ) |
@@ -509,7 +642,8 @@ TRACE_EVENT(ext4_request_blocks, | |||
509 | ), | 642 | ), |
510 | 643 | ||
511 | TP_fast_assign( | 644 | TP_fast_assign( |
512 | __entry->dev = ar->inode->i_sb->s_dev; | 645 | __entry->dev_major = MAJOR(ar->inode->i_sb->s_dev); |
646 | __entry->dev_minor = MINOR(ar->inode->i_sb->s_dev); | ||
513 | __entry->ino = ar->inode->i_ino; | 647 | __entry->ino = ar->inode->i_ino; |
514 | __entry->flags = ar->flags; | 648 | __entry->flags = ar->flags; |
515 | __entry->len = ar->len; | 649 | __entry->len = ar->len; |
@@ -521,8 +655,9 @@ TRACE_EVENT(ext4_request_blocks, | |||
521 | __entry->pright = ar->pright; | 655 | __entry->pright = ar->pright; |
522 | ), | 656 | ), |
523 | 657 | ||
524 | TP_printk("dev %s ino %lu flags %u len %u lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", | 658 | TP_printk("dev %d,%d ino %lu flags %u len %u lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", |
525 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 659 | __entry->dev_major, __entry->dev_minor, |
660 | (unsigned long) __entry->ino, | ||
526 | __entry->flags, __entry->len, | 661 | __entry->flags, __entry->len, |
527 | (unsigned long long) __entry->logical, | 662 | (unsigned long long) __entry->logical, |
528 | (unsigned long long) __entry->goal, | 663 | (unsigned long long) __entry->goal, |
@@ -538,7 +673,8 @@ TRACE_EVENT(ext4_allocate_blocks, | |||
538 | TP_ARGS(ar, block), | 673 | TP_ARGS(ar, block), |
539 | 674 | ||
540 | TP_STRUCT__entry( | 675 | TP_STRUCT__entry( |
541 | __field( dev_t, dev ) | 676 | __field( int, dev_major ) |
677 | __field( int, dev_minor ) | ||
542 | __field( ino_t, ino ) | 678 | __field( ino_t, ino ) |
543 | __field( __u64, block ) | 679 | __field( __u64, block ) |
544 | __field( unsigned int, flags ) | 680 | __field( unsigned int, flags ) |
@@ -552,7 +688,8 @@ TRACE_EVENT(ext4_allocate_blocks, | |||
552 | ), | 688 | ), |
553 | 689 | ||
554 | TP_fast_assign( | 690 | TP_fast_assign( |
555 | __entry->dev = ar->inode->i_sb->s_dev; | 691 | __entry->dev_major = MAJOR(ar->inode->i_sb->s_dev); |
692 | __entry->dev_minor = MINOR(ar->inode->i_sb->s_dev); | ||
556 | __entry->ino = ar->inode->i_ino; | 693 | __entry->ino = ar->inode->i_ino; |
557 | __entry->block = block; | 694 | __entry->block = block; |
558 | __entry->flags = ar->flags; | 695 | __entry->flags = ar->flags; |
@@ -565,9 +702,10 @@ TRACE_EVENT(ext4_allocate_blocks, | |||
565 | __entry->pright = ar->pright; | 702 | __entry->pright = ar->pright; |
566 | ), | 703 | ), |
567 | 704 | ||
568 | TP_printk("dev %s ino %lu flags %u len %u block %llu lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", | 705 | TP_printk("dev %d,%d ino %lu flags %u len %u block %llu lblk %llu goal %llu lleft %llu lright %llu pleft %llu pright %llu ", |
569 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 706 | __entry->dev_major, __entry->dev_minor, |
570 | __entry->flags, __entry->len, __entry->block, | 707 | (unsigned long) __entry->ino, __entry->flags, |
708 | __entry->len, __entry->block, | ||
571 | (unsigned long long) __entry->logical, | 709 | (unsigned long long) __entry->logical, |
572 | (unsigned long long) __entry->goal, | 710 | (unsigned long long) __entry->goal, |
573 | (unsigned long long) __entry->lleft, | 711 | (unsigned long long) __entry->lleft, |
@@ -583,7 +721,8 @@ TRACE_EVENT(ext4_free_blocks, | |||
583 | TP_ARGS(inode, block, count, flags), | 721 | TP_ARGS(inode, block, count, flags), |
584 | 722 | ||
585 | TP_STRUCT__entry( | 723 | TP_STRUCT__entry( |
586 | __field( dev_t, dev ) | 724 | __field( int, dev_major ) |
725 | __field( int, dev_minor ) | ||
587 | __field( ino_t, ino ) | 726 | __field( ino_t, ino ) |
588 | __field( umode_t, mode ) | 727 | __field( umode_t, mode ) |
589 | __field( __u64, block ) | 728 | __field( __u64, block ) |
@@ -592,7 +731,8 @@ TRACE_EVENT(ext4_free_blocks, | |||
592 | ), | 731 | ), |
593 | 732 | ||
594 | TP_fast_assign( | 733 | TP_fast_assign( |
595 | __entry->dev = inode->i_sb->s_dev; | 734 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
735 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
596 | __entry->ino = inode->i_ino; | 736 | __entry->ino = inode->i_ino; |
597 | __entry->mode = inode->i_mode; | 737 | __entry->mode = inode->i_mode; |
598 | __entry->block = block; | 738 | __entry->block = block; |
@@ -600,8 +740,9 @@ TRACE_EVENT(ext4_free_blocks, | |||
600 | __entry->flags = flags; | 740 | __entry->flags = flags; |
601 | ), | 741 | ), |
602 | 742 | ||
603 | TP_printk("dev %s ino %lu mode 0%o block %llu count %lu flags %d", | 743 | TP_printk("dev %d,%d ino %lu mode 0%o block %llu count %lu flags %d", |
604 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 744 | __entry->dev_major, __entry->dev_minor, |
745 | (unsigned long) __entry->ino, | ||
605 | __entry->mode, __entry->block, __entry->count, | 746 | __entry->mode, __entry->block, __entry->count, |
606 | __entry->flags) | 747 | __entry->flags) |
607 | ); | 748 | ); |
@@ -612,7 +753,8 @@ TRACE_EVENT(ext4_sync_file, | |||
612 | TP_ARGS(file, datasync), | 753 | TP_ARGS(file, datasync), |
613 | 754 | ||
614 | TP_STRUCT__entry( | 755 | TP_STRUCT__entry( |
615 | __field( dev_t, dev ) | 756 | __field( int, dev_major ) |
757 | __field( int, dev_minor ) | ||
616 | __field( ino_t, ino ) | 758 | __field( ino_t, ino ) |
617 | __field( ino_t, parent ) | 759 | __field( ino_t, parent ) |
618 | __field( int, datasync ) | 760 | __field( int, datasync ) |
@@ -621,14 +763,16 @@ TRACE_EVENT(ext4_sync_file, | |||
621 | TP_fast_assign( | 763 | TP_fast_assign( |
622 | struct dentry *dentry = file->f_path.dentry; | 764 | struct dentry *dentry = file->f_path.dentry; |
623 | 765 | ||
624 | __entry->dev = dentry->d_inode->i_sb->s_dev; | 766 | __entry->dev_major = MAJOR(dentry->d_inode->i_sb->s_dev); |
767 | __entry->dev_minor = MINOR(dentry->d_inode->i_sb->s_dev); | ||
625 | __entry->ino = dentry->d_inode->i_ino; | 768 | __entry->ino = dentry->d_inode->i_ino; |
626 | __entry->datasync = datasync; | 769 | __entry->datasync = datasync; |
627 | __entry->parent = dentry->d_parent->d_inode->i_ino; | 770 | __entry->parent = dentry->d_parent->d_inode->i_ino; |
628 | ), | 771 | ), |
629 | 772 | ||
630 | TP_printk("dev %s ino %ld parent %ld datasync %d ", | 773 | TP_printk("dev %d,%d ino %ld parent %ld datasync %d ", |
631 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 774 | __entry->dev_major, __entry->dev_minor, |
775 | (unsigned long) __entry->ino, | ||
632 | (unsigned long) __entry->parent, __entry->datasync) | 776 | (unsigned long) __entry->parent, __entry->datasync) |
633 | ); | 777 | ); |
634 | 778 | ||
@@ -638,18 +782,20 @@ TRACE_EVENT(ext4_sync_fs, | |||
638 | TP_ARGS(sb, wait), | 782 | TP_ARGS(sb, wait), |
639 | 783 | ||
640 | TP_STRUCT__entry( | 784 | TP_STRUCT__entry( |
641 | __field( dev_t, dev ) | 785 | __field( int, dev_major ) |
786 | __field( int, dev_minor ) | ||
642 | __field( int, wait ) | 787 | __field( int, wait ) |
643 | 788 | ||
644 | ), | 789 | ), |
645 | 790 | ||
646 | TP_fast_assign( | 791 | TP_fast_assign( |
647 | __entry->dev = sb->s_dev; | 792 | __entry->dev_major = MAJOR(sb->s_dev); |
793 | __entry->dev_minor = MINOR(sb->s_dev); | ||
648 | __entry->wait = wait; | 794 | __entry->wait = wait; |
649 | ), | 795 | ), |
650 | 796 | ||
651 | TP_printk("dev %s wait %d", jbd2_dev_to_name(__entry->dev), | 797 | TP_printk("dev %d,%d wait %d", __entry->dev_major, |
652 | __entry->wait) | 798 | __entry->dev_minor, __entry->wait) |
653 | ); | 799 | ); |
654 | 800 | ||
655 | TRACE_EVENT(ext4_alloc_da_blocks, | 801 | TRACE_EVENT(ext4_alloc_da_blocks, |
@@ -658,21 +804,24 @@ TRACE_EVENT(ext4_alloc_da_blocks, | |||
658 | TP_ARGS(inode), | 804 | TP_ARGS(inode), |
659 | 805 | ||
660 | TP_STRUCT__entry( | 806 | TP_STRUCT__entry( |
661 | __field( dev_t, dev ) | 807 | __field( int, dev_major ) |
808 | __field( int, dev_minor ) | ||
662 | __field( ino_t, ino ) | 809 | __field( ino_t, ino ) |
663 | __field( unsigned int, data_blocks ) | 810 | __field( unsigned int, data_blocks ) |
664 | __field( unsigned int, meta_blocks ) | 811 | __field( unsigned int, meta_blocks ) |
665 | ), | 812 | ), |
666 | 813 | ||
667 | TP_fast_assign( | 814 | TP_fast_assign( |
668 | __entry->dev = inode->i_sb->s_dev; | 815 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
816 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
669 | __entry->ino = inode->i_ino; | 817 | __entry->ino = inode->i_ino; |
670 | __entry->data_blocks = EXT4_I(inode)->i_reserved_data_blocks; | 818 | __entry->data_blocks = EXT4_I(inode)->i_reserved_data_blocks; |
671 | __entry->meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks; | 819 | __entry->meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks; |
672 | ), | 820 | ), |
673 | 821 | ||
674 | TP_printk("dev %s ino %lu data_blocks %u meta_blocks %u", | 822 | TP_printk("dev %d,%d ino %lu data_blocks %u meta_blocks %u", |
675 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 823 | __entry->dev_major, __entry->dev_minor, |
824 | (unsigned long) __entry->ino, | ||
676 | __entry->data_blocks, __entry->meta_blocks) | 825 | __entry->data_blocks, __entry->meta_blocks) |
677 | ); | 826 | ); |
678 | 827 | ||
@@ -682,7 +831,8 @@ TRACE_EVENT(ext4_mballoc_alloc, | |||
682 | TP_ARGS(ac), | 831 | TP_ARGS(ac), |
683 | 832 | ||
684 | TP_STRUCT__entry( | 833 | TP_STRUCT__entry( |
685 | __field( dev_t, dev ) | 834 | __field( int, dev_major ) |
835 | __field( int, dev_minor ) | ||
686 | __field( ino_t, ino ) | 836 | __field( ino_t, ino ) |
687 | __field( __u16, found ) | 837 | __field( __u16, found ) |
688 | __field( __u16, groups ) | 838 | __field( __u16, groups ) |
@@ -705,7 +855,8 @@ TRACE_EVENT(ext4_mballoc_alloc, | |||
705 | ), | 855 | ), |
706 | 856 | ||
707 | TP_fast_assign( | 857 | TP_fast_assign( |
708 | __entry->dev = ac->ac_inode->i_sb->s_dev; | 858 | __entry->dev_major = MAJOR(ac->ac_inode->i_sb->s_dev); |
859 | __entry->dev_minor = MINOR(ac->ac_inode->i_sb->s_dev); | ||
709 | __entry->ino = ac->ac_inode->i_ino; | 860 | __entry->ino = ac->ac_inode->i_ino; |
710 | __entry->found = ac->ac_found; | 861 | __entry->found = ac->ac_found; |
711 | __entry->flags = ac->ac_flags; | 862 | __entry->flags = ac->ac_flags; |
@@ -727,10 +878,11 @@ TRACE_EVENT(ext4_mballoc_alloc, | |||
727 | __entry->result_len = ac->ac_f_ex.fe_len; | 878 | __entry->result_len = ac->ac_f_ex.fe_len; |
728 | ), | 879 | ), |
729 | 880 | ||
730 | TP_printk("dev %s inode %lu orig %u/%d/%u@%u goal %u/%d/%u@%u " | 881 | TP_printk("dev %d,%d inode %lu orig %u/%d/%u@%u goal %u/%d/%u@%u " |
731 | "result %u/%d/%u@%u blks %u grps %u cr %u flags 0x%04x " | 882 | "result %u/%d/%u@%u blks %u grps %u cr %u flags 0x%04x " |
732 | "tail %u broken %u", | 883 | "tail %u broken %u", |
733 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 884 | __entry->dev_major, __entry->dev_minor, |
885 | (unsigned long) __entry->ino, | ||
734 | __entry->orig_group, __entry->orig_start, | 886 | __entry->orig_group, __entry->orig_start, |
735 | __entry->orig_len, __entry->orig_logical, | 887 | __entry->orig_len, __entry->orig_logical, |
736 | __entry->goal_group, __entry->goal_start, | 888 | __entry->goal_group, __entry->goal_start, |
@@ -748,7 +900,8 @@ TRACE_EVENT(ext4_mballoc_prealloc, | |||
748 | TP_ARGS(ac), | 900 | TP_ARGS(ac), |
749 | 901 | ||
750 | TP_STRUCT__entry( | 902 | TP_STRUCT__entry( |
751 | __field( dev_t, dev ) | 903 | __field( int, dev_major ) |
904 | __field( int, dev_minor ) | ||
752 | __field( ino_t, ino ) | 905 | __field( ino_t, ino ) |
753 | __field( __u32, orig_logical ) | 906 | __field( __u32, orig_logical ) |
754 | __field( int, orig_start ) | 907 | __field( int, orig_start ) |
@@ -761,7 +914,8 @@ TRACE_EVENT(ext4_mballoc_prealloc, | |||
761 | ), | 914 | ), |
762 | 915 | ||
763 | TP_fast_assign( | 916 | TP_fast_assign( |
764 | __entry->dev = ac->ac_inode->i_sb->s_dev; | 917 | __entry->dev_major = MAJOR(ac->ac_inode->i_sb->s_dev); |
918 | __entry->dev_minor = MINOR(ac->ac_inode->i_sb->s_dev); | ||
765 | __entry->ino = ac->ac_inode->i_ino; | 919 | __entry->ino = ac->ac_inode->i_ino; |
766 | __entry->orig_logical = ac->ac_o_ex.fe_logical; | 920 | __entry->orig_logical = ac->ac_o_ex.fe_logical; |
767 | __entry->orig_start = ac->ac_o_ex.fe_start; | 921 | __entry->orig_start = ac->ac_o_ex.fe_start; |
@@ -773,8 +927,9 @@ TRACE_EVENT(ext4_mballoc_prealloc, | |||
773 | __entry->result_len = ac->ac_b_ex.fe_len; | 927 | __entry->result_len = ac->ac_b_ex.fe_len; |
774 | ), | 928 | ), |
775 | 929 | ||
776 | TP_printk("dev %s inode %lu orig %u/%d/%u@%u result %u/%d/%u@%u", | 930 | TP_printk("dev %d,%d inode %lu orig %u/%d/%u@%u result %u/%d/%u@%u", |
777 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 931 | __entry->dev_major, __entry->dev_minor, |
932 | (unsigned long) __entry->ino, | ||
778 | __entry->orig_group, __entry->orig_start, | 933 | __entry->orig_group, __entry->orig_start, |
779 | __entry->orig_len, __entry->orig_logical, | 934 | __entry->orig_len, __entry->orig_logical, |
780 | __entry->result_group, __entry->result_start, | 935 | __entry->result_group, __entry->result_start, |
@@ -782,46 +937,59 @@ TRACE_EVENT(ext4_mballoc_prealloc, | |||
782 | ); | 937 | ); |
783 | 938 | ||
784 | DECLARE_EVENT_CLASS(ext4__mballoc, | 939 | DECLARE_EVENT_CLASS(ext4__mballoc, |
785 | TP_PROTO(struct ext4_allocation_context *ac), | 940 | TP_PROTO(struct super_block *sb, |
941 | struct inode *inode, | ||
942 | ext4_group_t group, | ||
943 | ext4_grpblk_t start, | ||
944 | ext4_grpblk_t len), | ||
786 | 945 | ||
787 | TP_ARGS(ac), | 946 | TP_ARGS(sb, inode, group, start, len), |
788 | 947 | ||
789 | TP_STRUCT__entry( | 948 | TP_STRUCT__entry( |
790 | __field( dev_t, dev ) | 949 | __field( int, dev_major ) |
950 | __field( int, dev_minor ) | ||
791 | __field( ino_t, ino ) | 951 | __field( ino_t, ino ) |
792 | __field( __u32, result_logical ) | ||
793 | __field( int, result_start ) | 952 | __field( int, result_start ) |
794 | __field( __u32, result_group ) | 953 | __field( __u32, result_group ) |
795 | __field( int, result_len ) | 954 | __field( int, result_len ) |
796 | ), | 955 | ), |
797 | 956 | ||
798 | TP_fast_assign( | 957 | TP_fast_assign( |
799 | __entry->dev = ac->ac_inode->i_sb->s_dev; | 958 | __entry->dev_major = MAJOR(sb->s_dev); |
800 | __entry->ino = ac->ac_inode->i_ino; | 959 | __entry->dev_minor = MINOR(sb->s_dev); |
801 | __entry->result_logical = ac->ac_b_ex.fe_logical; | 960 | __entry->ino = inode ? inode->i_ino : 0; |
802 | __entry->result_start = ac->ac_b_ex.fe_start; | 961 | __entry->result_start = start; |
803 | __entry->result_group = ac->ac_b_ex.fe_group; | 962 | __entry->result_group = group; |
804 | __entry->result_len = ac->ac_b_ex.fe_len; | 963 | __entry->result_len = len; |
805 | ), | 964 | ), |
806 | 965 | ||
807 | TP_printk("dev %s inode %lu extent %u/%d/%u@%u ", | 966 | TP_printk("dev %d,%d inode %lu extent %u/%d/%u ", |
808 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 967 | __entry->dev_major, __entry->dev_minor, |
968 | (unsigned long) __entry->ino, | ||
809 | __entry->result_group, __entry->result_start, | 969 | __entry->result_group, __entry->result_start, |
810 | __entry->result_len, __entry->result_logical) | 970 | __entry->result_len) |
811 | ); | 971 | ); |
812 | 972 | ||
813 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_discard, | 973 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_discard, |
814 | 974 | ||
815 | TP_PROTO(struct ext4_allocation_context *ac), | 975 | TP_PROTO(struct super_block *sb, |
976 | struct inode *inode, | ||
977 | ext4_group_t group, | ||
978 | ext4_grpblk_t start, | ||
979 | ext4_grpblk_t len), | ||
816 | 980 | ||
817 | TP_ARGS(ac) | 981 | TP_ARGS(sb, inode, group, start, len) |
818 | ); | 982 | ); |
819 | 983 | ||
820 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_free, | 984 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_free, |
821 | 985 | ||
822 | TP_PROTO(struct ext4_allocation_context *ac), | 986 | TP_PROTO(struct super_block *sb, |
987 | struct inode *inode, | ||
988 | ext4_group_t group, | ||
989 | ext4_grpblk_t start, | ||
990 | ext4_grpblk_t len), | ||
823 | 991 | ||
824 | TP_ARGS(ac) | 992 | TP_ARGS(sb, inode, group, start, len) |
825 | ); | 993 | ); |
826 | 994 | ||
827 | TRACE_EVENT(ext4_forget, | 995 | TRACE_EVENT(ext4_forget, |
@@ -830,7 +998,8 @@ TRACE_EVENT(ext4_forget, | |||
830 | TP_ARGS(inode, is_metadata, block), | 998 | TP_ARGS(inode, is_metadata, block), |
831 | 999 | ||
832 | TP_STRUCT__entry( | 1000 | TP_STRUCT__entry( |
833 | __field( dev_t, dev ) | 1001 | __field( int, dev_major ) |
1002 | __field( int, dev_minor ) | ||
834 | __field( ino_t, ino ) | 1003 | __field( ino_t, ino ) |
835 | __field( umode_t, mode ) | 1004 | __field( umode_t, mode ) |
836 | __field( int, is_metadata ) | 1005 | __field( int, is_metadata ) |
@@ -838,16 +1007,18 @@ TRACE_EVENT(ext4_forget, | |||
838 | ), | 1007 | ), |
839 | 1008 | ||
840 | TP_fast_assign( | 1009 | TP_fast_assign( |
841 | __entry->dev = inode->i_sb->s_dev; | 1010 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
1011 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
842 | __entry->ino = inode->i_ino; | 1012 | __entry->ino = inode->i_ino; |
843 | __entry->mode = inode->i_mode; | 1013 | __entry->mode = inode->i_mode; |
844 | __entry->is_metadata = is_metadata; | 1014 | __entry->is_metadata = is_metadata; |
845 | __entry->block = block; | 1015 | __entry->block = block; |
846 | ), | 1016 | ), |
847 | 1017 | ||
848 | TP_printk("dev %s ino %lu mode 0%o is_metadata %d block %llu", | 1018 | TP_printk("dev %d,%d ino %lu mode 0%o is_metadata %d block %llu", |
849 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 1019 | __entry->dev_major, __entry->dev_minor, |
850 | __entry->mode, __entry->is_metadata, __entry->block) | 1020 | (unsigned long) __entry->ino, __entry->mode, |
1021 | __entry->is_metadata, __entry->block) | ||
851 | ); | 1022 | ); |
852 | 1023 | ||
853 | TRACE_EVENT(ext4_da_update_reserve_space, | 1024 | TRACE_EVENT(ext4_da_update_reserve_space, |
@@ -856,7 +1027,8 @@ TRACE_EVENT(ext4_da_update_reserve_space, | |||
856 | TP_ARGS(inode, used_blocks), | 1027 | TP_ARGS(inode, used_blocks), |
857 | 1028 | ||
858 | TP_STRUCT__entry( | 1029 | TP_STRUCT__entry( |
859 | __field( dev_t, dev ) | 1030 | __field( int, dev_major ) |
1031 | __field( int, dev_minor ) | ||
860 | __field( ino_t, ino ) | 1032 | __field( ino_t, ino ) |
861 | __field( umode_t, mode ) | 1033 | __field( umode_t, mode ) |
862 | __field( __u64, i_blocks ) | 1034 | __field( __u64, i_blocks ) |
@@ -867,7 +1039,8 @@ TRACE_EVENT(ext4_da_update_reserve_space, | |||
867 | ), | 1039 | ), |
868 | 1040 | ||
869 | TP_fast_assign( | 1041 | TP_fast_assign( |
870 | __entry->dev = inode->i_sb->s_dev; | 1042 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
1043 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
871 | __entry->ino = inode->i_ino; | 1044 | __entry->ino = inode->i_ino; |
872 | __entry->mode = inode->i_mode; | 1045 | __entry->mode = inode->i_mode; |
873 | __entry->i_blocks = inode->i_blocks; | 1046 | __entry->i_blocks = inode->i_blocks; |
@@ -877,9 +1050,10 @@ TRACE_EVENT(ext4_da_update_reserve_space, | |||
877 | __entry->allocated_meta_blocks = EXT4_I(inode)->i_allocated_meta_blocks; | 1050 | __entry->allocated_meta_blocks = EXT4_I(inode)->i_allocated_meta_blocks; |
878 | ), | 1051 | ), |
879 | 1052 | ||
880 | TP_printk("dev %s ino %lu mode 0%o i_blocks %llu used_blocks %d reserved_data_blocks %d reserved_meta_blocks %d allocated_meta_blocks %d", | 1053 | TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu used_blocks %d reserved_data_blocks %d reserved_meta_blocks %d allocated_meta_blocks %d", |
881 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 1054 | __entry->dev_major, __entry->dev_minor, |
882 | __entry->mode, (unsigned long long) __entry->i_blocks, | 1055 | (unsigned long) __entry->ino, __entry->mode, |
1056 | (unsigned long long) __entry->i_blocks, | ||
883 | __entry->used_blocks, __entry->reserved_data_blocks, | 1057 | __entry->used_blocks, __entry->reserved_data_blocks, |
884 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) | 1058 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) |
885 | ); | 1059 | ); |
@@ -890,7 +1064,8 @@ TRACE_EVENT(ext4_da_reserve_space, | |||
890 | TP_ARGS(inode, md_needed), | 1064 | TP_ARGS(inode, md_needed), |
891 | 1065 | ||
892 | TP_STRUCT__entry( | 1066 | TP_STRUCT__entry( |
893 | __field( dev_t, dev ) | 1067 | __field( int, dev_major ) |
1068 | __field( int, dev_minor ) | ||
894 | __field( ino_t, ino ) | 1069 | __field( ino_t, ino ) |
895 | __field( umode_t, mode ) | 1070 | __field( umode_t, mode ) |
896 | __field( __u64, i_blocks ) | 1071 | __field( __u64, i_blocks ) |
@@ -900,7 +1075,8 @@ TRACE_EVENT(ext4_da_reserve_space, | |||
900 | ), | 1075 | ), |
901 | 1076 | ||
902 | TP_fast_assign( | 1077 | TP_fast_assign( |
903 | __entry->dev = inode->i_sb->s_dev; | 1078 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
1079 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
904 | __entry->ino = inode->i_ino; | 1080 | __entry->ino = inode->i_ino; |
905 | __entry->mode = inode->i_mode; | 1081 | __entry->mode = inode->i_mode; |
906 | __entry->i_blocks = inode->i_blocks; | 1082 | __entry->i_blocks = inode->i_blocks; |
@@ -909,8 +1085,9 @@ TRACE_EVENT(ext4_da_reserve_space, | |||
909 | __entry->reserved_meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks; | 1085 | __entry->reserved_meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks; |
910 | ), | 1086 | ), |
911 | 1087 | ||
912 | TP_printk("dev %s ino %lu mode 0%o i_blocks %llu md_needed %d reserved_data_blocks %d reserved_meta_blocks %d", | 1088 | TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu md_needed %d reserved_data_blocks %d reserved_meta_blocks %d", |
913 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 1089 | __entry->dev_major, __entry->dev_minor, |
1090 | (unsigned long) __entry->ino, | ||
914 | __entry->mode, (unsigned long long) __entry->i_blocks, | 1091 | __entry->mode, (unsigned long long) __entry->i_blocks, |
915 | __entry->md_needed, __entry->reserved_data_blocks, | 1092 | __entry->md_needed, __entry->reserved_data_blocks, |
916 | __entry->reserved_meta_blocks) | 1093 | __entry->reserved_meta_blocks) |
@@ -922,7 +1099,8 @@ TRACE_EVENT(ext4_da_release_space, | |||
922 | TP_ARGS(inode, freed_blocks), | 1099 | TP_ARGS(inode, freed_blocks), |
923 | 1100 | ||
924 | TP_STRUCT__entry( | 1101 | TP_STRUCT__entry( |
925 | __field( dev_t, dev ) | 1102 | __field( int, dev_major ) |
1103 | __field( int, dev_minor ) | ||
926 | __field( ino_t, ino ) | 1104 | __field( ino_t, ino ) |
927 | __field( umode_t, mode ) | 1105 | __field( umode_t, mode ) |
928 | __field( __u64, i_blocks ) | 1106 | __field( __u64, i_blocks ) |
@@ -933,7 +1111,8 @@ TRACE_EVENT(ext4_da_release_space, | |||
933 | ), | 1111 | ), |
934 | 1112 | ||
935 | TP_fast_assign( | 1113 | TP_fast_assign( |
936 | __entry->dev = inode->i_sb->s_dev; | 1114 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
1115 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
937 | __entry->ino = inode->i_ino; | 1116 | __entry->ino = inode->i_ino; |
938 | __entry->mode = inode->i_mode; | 1117 | __entry->mode = inode->i_mode; |
939 | __entry->i_blocks = inode->i_blocks; | 1118 | __entry->i_blocks = inode->i_blocks; |
@@ -943,8 +1122,9 @@ TRACE_EVENT(ext4_da_release_space, | |||
943 | __entry->allocated_meta_blocks = EXT4_I(inode)->i_allocated_meta_blocks; | 1122 | __entry->allocated_meta_blocks = EXT4_I(inode)->i_allocated_meta_blocks; |
944 | ), | 1123 | ), |
945 | 1124 | ||
946 | TP_printk("dev %s ino %lu mode 0%o i_blocks %llu freed_blocks %d reserved_data_blocks %d reserved_meta_blocks %d allocated_meta_blocks %d", | 1125 | TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu freed_blocks %d reserved_data_blocks %d reserved_meta_blocks %d allocated_meta_blocks %d", |
947 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | 1126 | __entry->dev_major, __entry->dev_minor, |
1127 | (unsigned long) __entry->ino, | ||
948 | __entry->mode, (unsigned long long) __entry->i_blocks, | 1128 | __entry->mode, (unsigned long long) __entry->i_blocks, |
949 | __entry->freed_blocks, __entry->reserved_data_blocks, | 1129 | __entry->freed_blocks, __entry->reserved_data_blocks, |
950 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) | 1130 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) |
@@ -956,18 +1136,20 @@ DECLARE_EVENT_CLASS(ext4__bitmap_load, | |||
956 | TP_ARGS(sb, group), | 1136 | TP_ARGS(sb, group), |
957 | 1137 | ||
958 | TP_STRUCT__entry( | 1138 | TP_STRUCT__entry( |
959 | __field( dev_t, dev ) | 1139 | __field( int, dev_major ) |
1140 | __field( int, dev_minor ) | ||
960 | __field( __u32, group ) | 1141 | __field( __u32, group ) |
961 | 1142 | ||
962 | ), | 1143 | ), |
963 | 1144 | ||
964 | TP_fast_assign( | 1145 | TP_fast_assign( |
965 | __entry->dev = sb->s_dev; | 1146 | __entry->dev_major = MAJOR(sb->s_dev); |
1147 | __entry->dev_minor = MINOR(sb->s_dev); | ||
966 | __entry->group = group; | 1148 | __entry->group = group; |
967 | ), | 1149 | ), |
968 | 1150 | ||
969 | TP_printk("dev %s group %u", | 1151 | TP_printk("dev %d,%d group %u", |
970 | jbd2_dev_to_name(__entry->dev), __entry->group) | 1152 | __entry->dev_major, __entry->dev_minor, __entry->group) |
971 | ); | 1153 | ); |
972 | 1154 | ||
973 | DEFINE_EVENT(ext4__bitmap_load, ext4_mb_bitmap_load, | 1155 | DEFINE_EVENT(ext4__bitmap_load, ext4_mb_bitmap_load, |
diff --git a/include/trace/events/irq.h b/include/trace/events/irq.h index 0e4cfb694fe7..1c09820df585 100644 --- a/include/trace/events/irq.h +++ b/include/trace/events/irq.h | |||
@@ -5,7 +5,9 @@ | |||
5 | #define _TRACE_IRQ_H | 5 | #define _TRACE_IRQ_H |
6 | 6 | ||
7 | #include <linux/tracepoint.h> | 7 | #include <linux/tracepoint.h> |
8 | #include <linux/interrupt.h> | 8 | |
9 | struct irqaction; | ||
10 | struct softirq_action; | ||
9 | 11 | ||
10 | #define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq } | 12 | #define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq } |
11 | #define show_softirq_name(val) \ | 13 | #define show_softirq_name(val) \ |
@@ -84,56 +86,62 @@ TRACE_EVENT(irq_handler_exit, | |||
84 | 86 | ||
85 | DECLARE_EVENT_CLASS(softirq, | 87 | DECLARE_EVENT_CLASS(softirq, |
86 | 88 | ||
87 | TP_PROTO(struct softirq_action *h, struct softirq_action *vec), | 89 | TP_PROTO(unsigned int vec_nr), |
88 | 90 | ||
89 | TP_ARGS(h, vec), | 91 | TP_ARGS(vec_nr), |
90 | 92 | ||
91 | TP_STRUCT__entry( | 93 | TP_STRUCT__entry( |
92 | __field( int, vec ) | 94 | __field( unsigned int, vec ) |
93 | ), | 95 | ), |
94 | 96 | ||
95 | TP_fast_assign( | 97 | TP_fast_assign( |
96 | __entry->vec = (int)(h - vec); | 98 | __entry->vec = vec_nr; |
97 | ), | 99 | ), |
98 | 100 | ||
99 | TP_printk("vec=%d [action=%s]", __entry->vec, | 101 | TP_printk("vec=%u [action=%s]", __entry->vec, |
100 | show_softirq_name(__entry->vec)) | 102 | show_softirq_name(__entry->vec)) |
101 | ); | 103 | ); |
102 | 104 | ||
103 | /** | 105 | /** |
104 | * softirq_entry - called immediately before the softirq handler | 106 | * softirq_entry - called immediately before the softirq handler |
105 | * @h: pointer to struct softirq_action | 107 | * @vec_nr: softirq vector number |
106 | * @vec: pointer to first struct softirq_action in softirq_vec array | ||
107 | * | 108 | * |
108 | * The @h parameter, contains a pointer to the struct softirq_action | 109 | * When used in combination with the softirq_exit tracepoint |
109 | * which has a pointer to the action handler that is called. By subtracting | 110 | * we can determine the softirq handler runtine. |
110 | * the @vec pointer from the @h pointer, we can determine the softirq | ||
111 | * number. Also, when used in combination with the softirq_exit tracepoint | ||
112 | * we can determine the softirq latency. | ||
113 | */ | 111 | */ |
114 | DEFINE_EVENT(softirq, softirq_entry, | 112 | DEFINE_EVENT(softirq, softirq_entry, |
115 | 113 | ||
116 | TP_PROTO(struct softirq_action *h, struct softirq_action *vec), | 114 | TP_PROTO(unsigned int vec_nr), |
117 | 115 | ||
118 | TP_ARGS(h, vec) | 116 | TP_ARGS(vec_nr) |
119 | ); | 117 | ); |
120 | 118 | ||
121 | /** | 119 | /** |
122 | * softirq_exit - called immediately after the softirq handler returns | 120 | * softirq_exit - called immediately after the softirq handler returns |
123 | * @h: pointer to struct softirq_action | 121 | * @vec_nr: softirq vector number |
124 | * @vec: pointer to first struct softirq_action in softirq_vec array | ||
125 | * | 122 | * |
126 | * The @h parameter contains a pointer to the struct softirq_action | 123 | * When used in combination with the softirq_entry tracepoint |
127 | * that has handled the softirq. By subtracting the @vec pointer from | 124 | * we can determine the softirq handler runtine. |
128 | * the @h pointer, we can determine the softirq number. Also, when used in | ||
129 | * combination with the softirq_entry tracepoint we can determine the softirq | ||
130 | * latency. | ||
131 | */ | 125 | */ |
132 | DEFINE_EVENT(softirq, softirq_exit, | 126 | DEFINE_EVENT(softirq, softirq_exit, |
133 | 127 | ||
134 | TP_PROTO(struct softirq_action *h, struct softirq_action *vec), | 128 | TP_PROTO(unsigned int vec_nr), |
129 | |||
130 | TP_ARGS(vec_nr) | ||
131 | ); | ||
132 | |||
133 | /** | ||
134 | * softirq_raise - called immediately when a softirq is raised | ||
135 | * @vec_nr: softirq vector number | ||
136 | * | ||
137 | * When used in combination with the softirq_entry tracepoint | ||
138 | * we can determine the softirq raise to run latency. | ||
139 | */ | ||
140 | DEFINE_EVENT(softirq, softirq_raise, | ||
141 | |||
142 | TP_PROTO(unsigned int vec_nr), | ||
135 | 143 | ||
136 | TP_ARGS(h, vec) | 144 | TP_ARGS(vec_nr) |
137 | ); | 145 | ); |
138 | 146 | ||
139 | #endif /* _TRACE_IRQ_H */ | 147 | #endif /* _TRACE_IRQ_H */ |
diff --git a/include/trace/events/jbd2.h b/include/trace/events/jbd2.h index bf16545cc977..7447ea9305b5 100644 --- a/include/trace/events/jbd2.h +++ b/include/trace/events/jbd2.h | |||
@@ -17,17 +17,19 @@ TRACE_EVENT(jbd2_checkpoint, | |||
17 | TP_ARGS(journal, result), | 17 | TP_ARGS(journal, result), |
18 | 18 | ||
19 | TP_STRUCT__entry( | 19 | TP_STRUCT__entry( |
20 | __field( dev_t, dev ) | 20 | __field( int, dev_major ) |
21 | __field( int, dev_minor ) | ||
21 | __field( int, result ) | 22 | __field( int, result ) |
22 | ), | 23 | ), |
23 | 24 | ||
24 | TP_fast_assign( | 25 | TP_fast_assign( |
25 | __entry->dev = journal->j_fs_dev->bd_dev; | 26 | __entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev); |
27 | __entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev); | ||
26 | __entry->result = result; | 28 | __entry->result = result; |
27 | ), | 29 | ), |
28 | 30 | ||
29 | TP_printk("dev %s result %d", | 31 | TP_printk("dev %d,%d result %d", |
30 | jbd2_dev_to_name(__entry->dev), __entry->result) | 32 | __entry->dev_major, __entry->dev_minor, __entry->result) |
31 | ); | 33 | ); |
32 | 34 | ||
33 | DECLARE_EVENT_CLASS(jbd2_commit, | 35 | DECLARE_EVENT_CLASS(jbd2_commit, |
@@ -37,20 +39,22 @@ DECLARE_EVENT_CLASS(jbd2_commit, | |||
37 | TP_ARGS(journal, commit_transaction), | 39 | TP_ARGS(journal, commit_transaction), |
38 | 40 | ||
39 | TP_STRUCT__entry( | 41 | TP_STRUCT__entry( |
40 | __field( dev_t, dev ) | 42 | __field( int, dev_major ) |
43 | __field( int, dev_minor ) | ||
41 | __field( char, sync_commit ) | 44 | __field( char, sync_commit ) |
42 | __field( int, transaction ) | 45 | __field( int, transaction ) |
43 | ), | 46 | ), |
44 | 47 | ||
45 | TP_fast_assign( | 48 | TP_fast_assign( |
46 | __entry->dev = journal->j_fs_dev->bd_dev; | 49 | __entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev); |
50 | __entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev); | ||
47 | __entry->sync_commit = commit_transaction->t_synchronous_commit; | 51 | __entry->sync_commit = commit_transaction->t_synchronous_commit; |
48 | __entry->transaction = commit_transaction->t_tid; | 52 | __entry->transaction = commit_transaction->t_tid; |
49 | ), | 53 | ), |
50 | 54 | ||
51 | TP_printk("dev %s transaction %d sync %d", | 55 | TP_printk("dev %d,%d transaction %d sync %d", |
52 | jbd2_dev_to_name(__entry->dev), __entry->transaction, | 56 | __entry->dev_major, __entry->dev_minor, |
53 | __entry->sync_commit) | 57 | __entry->transaction, __entry->sync_commit) |
54 | ); | 58 | ); |
55 | 59 | ||
56 | DEFINE_EVENT(jbd2_commit, jbd2_start_commit, | 60 | DEFINE_EVENT(jbd2_commit, jbd2_start_commit, |
@@ -87,22 +91,24 @@ TRACE_EVENT(jbd2_end_commit, | |||
87 | TP_ARGS(journal, commit_transaction), | 91 | TP_ARGS(journal, commit_transaction), |
88 | 92 | ||
89 | TP_STRUCT__entry( | 93 | TP_STRUCT__entry( |
90 | __field( dev_t, dev ) | 94 | __field( int, dev_major ) |
95 | __field( int, dev_minor ) | ||
91 | __field( char, sync_commit ) | 96 | __field( char, sync_commit ) |
92 | __field( int, transaction ) | 97 | __field( int, transaction ) |
93 | __field( int, head ) | 98 | __field( int, head ) |
94 | ), | 99 | ), |
95 | 100 | ||
96 | TP_fast_assign( | 101 | TP_fast_assign( |
97 | __entry->dev = journal->j_fs_dev->bd_dev; | 102 | __entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev); |
103 | __entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev); | ||
98 | __entry->sync_commit = commit_transaction->t_synchronous_commit; | 104 | __entry->sync_commit = commit_transaction->t_synchronous_commit; |
99 | __entry->transaction = commit_transaction->t_tid; | 105 | __entry->transaction = commit_transaction->t_tid; |
100 | __entry->head = journal->j_tail_sequence; | 106 | __entry->head = journal->j_tail_sequence; |
101 | ), | 107 | ), |
102 | 108 | ||
103 | TP_printk("dev %s transaction %d sync %d head %d", | 109 | TP_printk("dev %d,%d transaction %d sync %d head %d", |
104 | jbd2_dev_to_name(__entry->dev), __entry->transaction, | 110 | __entry->dev_major, __entry->dev_minor, |
105 | __entry->sync_commit, __entry->head) | 111 | __entry->transaction, __entry->sync_commit, __entry->head) |
106 | ); | 112 | ); |
107 | 113 | ||
108 | TRACE_EVENT(jbd2_submit_inode_data, | 114 | TRACE_EVENT(jbd2_submit_inode_data, |
@@ -111,17 +117,20 @@ TRACE_EVENT(jbd2_submit_inode_data, | |||
111 | TP_ARGS(inode), | 117 | TP_ARGS(inode), |
112 | 118 | ||
113 | TP_STRUCT__entry( | 119 | TP_STRUCT__entry( |
114 | __field( dev_t, dev ) | 120 | __field( int, dev_major ) |
121 | __field( int, dev_minor ) | ||
115 | __field( ino_t, ino ) | 122 | __field( ino_t, ino ) |
116 | ), | 123 | ), |
117 | 124 | ||
118 | TP_fast_assign( | 125 | TP_fast_assign( |
119 | __entry->dev = inode->i_sb->s_dev; | 126 | __entry->dev_major = MAJOR(inode->i_sb->s_dev); |
127 | __entry->dev_minor = MINOR(inode->i_sb->s_dev); | ||
120 | __entry->ino = inode->i_ino; | 128 | __entry->ino = inode->i_ino; |
121 | ), | 129 | ), |
122 | 130 | ||
123 | TP_printk("dev %s ino %lu", | 131 | TP_printk("dev %d,%d ino %lu", |
124 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino) | 132 | __entry->dev_major, __entry->dev_minor, |
133 | (unsigned long) __entry->ino) | ||
125 | ); | 134 | ); |
126 | 135 | ||
127 | TRACE_EVENT(jbd2_run_stats, | 136 | TRACE_EVENT(jbd2_run_stats, |
@@ -131,7 +140,8 @@ TRACE_EVENT(jbd2_run_stats, | |||
131 | TP_ARGS(dev, tid, stats), | 140 | TP_ARGS(dev, tid, stats), |
132 | 141 | ||
133 | TP_STRUCT__entry( | 142 | TP_STRUCT__entry( |
134 | __field( dev_t, dev ) | 143 | __field( int, dev_major ) |
144 | __field( int, dev_minor ) | ||
135 | __field( unsigned long, tid ) | 145 | __field( unsigned long, tid ) |
136 | __field( unsigned long, wait ) | 146 | __field( unsigned long, wait ) |
137 | __field( unsigned long, running ) | 147 | __field( unsigned long, running ) |
@@ -144,7 +154,8 @@ TRACE_EVENT(jbd2_run_stats, | |||
144 | ), | 154 | ), |
145 | 155 | ||
146 | TP_fast_assign( | 156 | TP_fast_assign( |
147 | __entry->dev = dev; | 157 | __entry->dev_major = MAJOR(dev); |
158 | __entry->dev_minor = MINOR(dev); | ||
148 | __entry->tid = tid; | 159 | __entry->tid = tid; |
149 | __entry->wait = stats->rs_wait; | 160 | __entry->wait = stats->rs_wait; |
150 | __entry->running = stats->rs_running; | 161 | __entry->running = stats->rs_running; |
@@ -156,9 +167,9 @@ TRACE_EVENT(jbd2_run_stats, | |||
156 | __entry->blocks_logged = stats->rs_blocks_logged; | 167 | __entry->blocks_logged = stats->rs_blocks_logged; |
157 | ), | 168 | ), |
158 | 169 | ||
159 | TP_printk("dev %s tid %lu wait %u running %u locked %u flushing %u " | 170 | TP_printk("dev %d,%d tid %lu wait %u running %u locked %u flushing %u " |
160 | "logging %u handle_count %u blocks %u blocks_logged %u", | 171 | "logging %u handle_count %u blocks %u blocks_logged %u", |
161 | jbd2_dev_to_name(__entry->dev), __entry->tid, | 172 | __entry->dev_major, __entry->dev_minor, __entry->tid, |
162 | jiffies_to_msecs(__entry->wait), | 173 | jiffies_to_msecs(__entry->wait), |
163 | jiffies_to_msecs(__entry->running), | 174 | jiffies_to_msecs(__entry->running), |
164 | jiffies_to_msecs(__entry->locked), | 175 | jiffies_to_msecs(__entry->locked), |
@@ -175,7 +186,8 @@ TRACE_EVENT(jbd2_checkpoint_stats, | |||
175 | TP_ARGS(dev, tid, stats), | 186 | TP_ARGS(dev, tid, stats), |
176 | 187 | ||
177 | TP_STRUCT__entry( | 188 | TP_STRUCT__entry( |
178 | __field( dev_t, dev ) | 189 | __field( int, dev_major ) |
190 | __field( int, dev_minor ) | ||
179 | __field( unsigned long, tid ) | 191 | __field( unsigned long, tid ) |
180 | __field( unsigned long, chp_time ) | 192 | __field( unsigned long, chp_time ) |
181 | __field( __u32, forced_to_close ) | 193 | __field( __u32, forced_to_close ) |
@@ -184,7 +196,8 @@ TRACE_EVENT(jbd2_checkpoint_stats, | |||
184 | ), | 196 | ), |
185 | 197 | ||
186 | TP_fast_assign( | 198 | TP_fast_assign( |
187 | __entry->dev = dev; | 199 | __entry->dev_major = MAJOR(dev); |
200 | __entry->dev_minor = MINOR(dev); | ||
188 | __entry->tid = tid; | 201 | __entry->tid = tid; |
189 | __entry->chp_time = stats->cs_chp_time; | 202 | __entry->chp_time = stats->cs_chp_time; |
190 | __entry->forced_to_close= stats->cs_forced_to_close; | 203 | __entry->forced_to_close= stats->cs_forced_to_close; |
@@ -192,9 +205,9 @@ TRACE_EVENT(jbd2_checkpoint_stats, | |||
192 | __entry->dropped = stats->cs_dropped; | 205 | __entry->dropped = stats->cs_dropped; |
193 | ), | 206 | ), |
194 | 207 | ||
195 | TP_printk("dev %s tid %lu chp_time %u forced_to_close %u " | 208 | TP_printk("dev %d,%d tid %lu chp_time %u forced_to_close %u " |
196 | "written %u dropped %u", | 209 | "written %u dropped %u", |
197 | jbd2_dev_to_name(__entry->dev), __entry->tid, | 210 | __entry->dev_major, __entry->dev_minor, __entry->tid, |
198 | jiffies_to_msecs(__entry->chp_time), | 211 | jiffies_to_msecs(__entry->chp_time), |
199 | __entry->forced_to_close, __entry->written, __entry->dropped) | 212 | __entry->forced_to_close, __entry->written, __entry->dropped) |
200 | ); | 213 | ); |
@@ -207,7 +220,8 @@ TRACE_EVENT(jbd2_cleanup_journal_tail, | |||
207 | TP_ARGS(journal, first_tid, block_nr, freed), | 220 | TP_ARGS(journal, first_tid, block_nr, freed), |
208 | 221 | ||
209 | TP_STRUCT__entry( | 222 | TP_STRUCT__entry( |
210 | __field( dev_t, dev ) | 223 | __field( int, dev_major ) |
224 | __field( int, dev_minor ) | ||
211 | __field( tid_t, tail_sequence ) | 225 | __field( tid_t, tail_sequence ) |
212 | __field( tid_t, first_tid ) | 226 | __field( tid_t, first_tid ) |
213 | __field(unsigned long, block_nr ) | 227 | __field(unsigned long, block_nr ) |
@@ -215,16 +229,18 @@ TRACE_EVENT(jbd2_cleanup_journal_tail, | |||
215 | ), | 229 | ), |
216 | 230 | ||
217 | TP_fast_assign( | 231 | TP_fast_assign( |
218 | __entry->dev = journal->j_fs_dev->bd_dev; | 232 | __entry->dev_major = MAJOR(journal->j_fs_dev->bd_dev); |
233 | __entry->dev_minor = MINOR(journal->j_fs_dev->bd_dev); | ||
219 | __entry->tail_sequence = journal->j_tail_sequence; | 234 | __entry->tail_sequence = journal->j_tail_sequence; |
220 | __entry->first_tid = first_tid; | 235 | __entry->first_tid = first_tid; |
221 | __entry->block_nr = block_nr; | 236 | __entry->block_nr = block_nr; |
222 | __entry->freed = freed; | 237 | __entry->freed = freed; |
223 | ), | 238 | ), |
224 | 239 | ||
225 | TP_printk("dev %s from %u to %u offset %lu freed %lu", | 240 | TP_printk("dev %d,%d from %u to %u offset %lu freed %lu", |
226 | jbd2_dev_to_name(__entry->dev), __entry->tail_sequence, | 241 | __entry->dev_major, __entry->dev_minor, |
227 | __entry->first_tid, __entry->block_nr, __entry->freed) | 242 | __entry->tail_sequence, __entry->first_tid, |
243 | __entry->block_nr, __entry->freed) | ||
228 | ); | 244 | ); |
229 | 245 | ||
230 | #endif /* _TRACE_JBD2_H */ | 246 | #endif /* _TRACE_JBD2_H */ |
diff --git a/include/trace/events/napi.h b/include/trace/events/napi.h index 188deca2f3c7..8fe1e93f531d 100644 --- a/include/trace/events/napi.h +++ b/include/trace/events/napi.h | |||
@@ -6,10 +6,31 @@ | |||
6 | 6 | ||
7 | #include <linux/netdevice.h> | 7 | #include <linux/netdevice.h> |
8 | #include <linux/tracepoint.h> | 8 | #include <linux/tracepoint.h> |
9 | #include <linux/ftrace.h> | ||
10 | |||
11 | #define NO_DEV "(no_device)" | ||
12 | |||
13 | TRACE_EVENT(napi_poll, | ||
9 | 14 | ||
10 | DECLARE_TRACE(napi_poll, | ||
11 | TP_PROTO(struct napi_struct *napi), | 15 | TP_PROTO(struct napi_struct *napi), |
12 | TP_ARGS(napi)); | 16 | |
17 | TP_ARGS(napi), | ||
18 | |||
19 | TP_STRUCT__entry( | ||
20 | __field( struct napi_struct *, napi) | ||
21 | __string( dev_name, napi->dev ? napi->dev->name : NO_DEV) | ||
22 | ), | ||
23 | |||
24 | TP_fast_assign( | ||
25 | __entry->napi = napi; | ||
26 | __assign_str(dev_name, napi->dev ? napi->dev->name : NO_DEV); | ||
27 | ), | ||
28 | |||
29 | TP_printk("napi poll on napi struct %p for device %s", | ||
30 | __entry->napi, __get_str(dev_name)) | ||
31 | ); | ||
32 | |||
33 | #undef NO_DEV | ||
13 | 34 | ||
14 | #endif /* _TRACE_NAPI_H_ */ | 35 | #endif /* _TRACE_NAPI_H_ */ |
15 | 36 | ||
diff --git a/include/trace/events/net.h b/include/trace/events/net.h new file mode 100644 index 000000000000..5f247f5ffc56 --- /dev/null +++ b/include/trace/events/net.h | |||
@@ -0,0 +1,82 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM net | ||
3 | |||
4 | #if !defined(_TRACE_NET_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_NET_H | ||
6 | |||
7 | #include <linux/skbuff.h> | ||
8 | #include <linux/netdevice.h> | ||
9 | #include <linux/ip.h> | ||
10 | #include <linux/tracepoint.h> | ||
11 | |||
12 | TRACE_EVENT(net_dev_xmit, | ||
13 | |||
14 | TP_PROTO(struct sk_buff *skb, | ||
15 | int rc), | ||
16 | |||
17 | TP_ARGS(skb, rc), | ||
18 | |||
19 | TP_STRUCT__entry( | ||
20 | __field( void *, skbaddr ) | ||
21 | __field( unsigned int, len ) | ||
22 | __field( int, rc ) | ||
23 | __string( name, skb->dev->name ) | ||
24 | ), | ||
25 | |||
26 | TP_fast_assign( | ||
27 | __entry->skbaddr = skb; | ||
28 | __entry->len = skb->len; | ||
29 | __entry->rc = rc; | ||
30 | __assign_str(name, skb->dev->name); | ||
31 | ), | ||
32 | |||
33 | TP_printk("dev=%s skbaddr=%p len=%u rc=%d", | ||
34 | __get_str(name), __entry->skbaddr, __entry->len, __entry->rc) | ||
35 | ); | ||
36 | |||
37 | DECLARE_EVENT_CLASS(net_dev_template, | ||
38 | |||
39 | TP_PROTO(struct sk_buff *skb), | ||
40 | |||
41 | TP_ARGS(skb), | ||
42 | |||
43 | TP_STRUCT__entry( | ||
44 | __field( void *, skbaddr ) | ||
45 | __field( unsigned int, len ) | ||
46 | __string( name, skb->dev->name ) | ||
47 | ), | ||
48 | |||
49 | TP_fast_assign( | ||
50 | __entry->skbaddr = skb; | ||
51 | __entry->len = skb->len; | ||
52 | __assign_str(name, skb->dev->name); | ||
53 | ), | ||
54 | |||
55 | TP_printk("dev=%s skbaddr=%p len=%u", | ||
56 | __get_str(name), __entry->skbaddr, __entry->len) | ||
57 | ) | ||
58 | |||
59 | DEFINE_EVENT(net_dev_template, net_dev_queue, | ||
60 | |||
61 | TP_PROTO(struct sk_buff *skb), | ||
62 | |||
63 | TP_ARGS(skb) | ||
64 | ); | ||
65 | |||
66 | DEFINE_EVENT(net_dev_template, netif_receive_skb, | ||
67 | |||
68 | TP_PROTO(struct sk_buff *skb), | ||
69 | |||
70 | TP_ARGS(skb) | ||
71 | ); | ||
72 | |||
73 | DEFINE_EVENT(net_dev_template, netif_rx, | ||
74 | |||
75 | TP_PROTO(struct sk_buff *skb), | ||
76 | |||
77 | TP_ARGS(skb) | ||
78 | ); | ||
79 | #endif /* _TRACE_NET_H */ | ||
80 | |||
81 | /* This part must be outside protection */ | ||
82 | #include <trace/define_trace.h> | ||
diff --git a/include/trace/events/power.h b/include/trace/events/power.h index 35a2a6e7bf1e..286784d69b8f 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h | |||
@@ -10,12 +10,17 @@ | |||
10 | #ifndef _TRACE_POWER_ENUM_ | 10 | #ifndef _TRACE_POWER_ENUM_ |
11 | #define _TRACE_POWER_ENUM_ | 11 | #define _TRACE_POWER_ENUM_ |
12 | enum { | 12 | enum { |
13 | POWER_NONE = 0, | 13 | POWER_NONE = 0, |
14 | POWER_CSTATE = 1, | 14 | POWER_CSTATE = 1, /* C-State */ |
15 | POWER_PSTATE = 2, | 15 | POWER_PSTATE = 2, /* Fequency change or DVFS */ |
16 | POWER_SSTATE = 3, /* Suspend */ | ||
16 | }; | 17 | }; |
17 | #endif | 18 | #endif |
18 | 19 | ||
20 | /* | ||
21 | * The power events are used for cpuidle & suspend (power_start, power_end) | ||
22 | * and for cpufreq (power_frequency) | ||
23 | */ | ||
19 | DECLARE_EVENT_CLASS(power, | 24 | DECLARE_EVENT_CLASS(power, |
20 | 25 | ||
21 | TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id), | 26 | TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id), |
@@ -70,6 +75,85 @@ TRACE_EVENT(power_end, | |||
70 | 75 | ||
71 | ); | 76 | ); |
72 | 77 | ||
78 | /* | ||
79 | * The clock events are used for clock enable/disable and for | ||
80 | * clock rate change | ||
81 | */ | ||
82 | DECLARE_EVENT_CLASS(clock, | ||
83 | |||
84 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | ||
85 | |||
86 | TP_ARGS(name, state, cpu_id), | ||
87 | |||
88 | TP_STRUCT__entry( | ||
89 | __string( name, name ) | ||
90 | __field( u64, state ) | ||
91 | __field( u64, cpu_id ) | ||
92 | ), | ||
93 | |||
94 | TP_fast_assign( | ||
95 | __assign_str(name, name); | ||
96 | __entry->state = state; | ||
97 | __entry->cpu_id = cpu_id; | ||
98 | ), | ||
99 | |||
100 | TP_printk("%s state=%lu cpu_id=%lu", __get_str(name), | ||
101 | (unsigned long)__entry->state, (unsigned long)__entry->cpu_id) | ||
102 | ); | ||
103 | |||
104 | DEFINE_EVENT(clock, clock_enable, | ||
105 | |||
106 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | ||
107 | |||
108 | TP_ARGS(name, state, cpu_id) | ||
109 | ); | ||
110 | |||
111 | DEFINE_EVENT(clock, clock_disable, | ||
112 | |||
113 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | ||
114 | |||
115 | TP_ARGS(name, state, cpu_id) | ||
116 | ); | ||
117 | |||
118 | DEFINE_EVENT(clock, clock_set_rate, | ||
119 | |||
120 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | ||
121 | |||
122 | TP_ARGS(name, state, cpu_id) | ||
123 | ); | ||
124 | |||
125 | /* | ||
126 | * The power domain events are used for power domains transitions | ||
127 | */ | ||
128 | DECLARE_EVENT_CLASS(power_domain, | ||
129 | |||
130 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | ||
131 | |||
132 | TP_ARGS(name, state, cpu_id), | ||
133 | |||
134 | TP_STRUCT__entry( | ||
135 | __string( name, name ) | ||
136 | __field( u64, state ) | ||
137 | __field( u64, cpu_id ) | ||
138 | ), | ||
139 | |||
140 | TP_fast_assign( | ||
141 | __assign_str(name, name); | ||
142 | __entry->state = state; | ||
143 | __entry->cpu_id = cpu_id; | ||
144 | ), | ||
145 | |||
146 | TP_printk("%s state=%lu cpu_id=%lu", __get_str(name), | ||
147 | (unsigned long)__entry->state, (unsigned long)__entry->cpu_id) | ||
148 | ); | ||
149 | |||
150 | DEFINE_EVENT(power_domain, power_domain_target, | ||
151 | |||
152 | TP_PROTO(const char *name, unsigned int state, unsigned int cpu_id), | ||
153 | |||
154 | TP_ARGS(name, state, cpu_id) | ||
155 | ); | ||
156 | |||
73 | #endif /* _TRACE_POWER_H */ | 157 | #endif /* _TRACE_POWER_H */ |
74 | 158 | ||
75 | /* This part must be outside protection */ | 159 | /* This part must be outside protection */ |
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 9208c92aeab5..f6334782a593 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h | |||
@@ -362,6 +362,35 @@ TRACE_EVENT(sched_stat_runtime, | |||
362 | (unsigned long long)__entry->vruntime) | 362 | (unsigned long long)__entry->vruntime) |
363 | ); | 363 | ); |
364 | 364 | ||
365 | /* | ||
366 | * Tracepoint for showing priority inheritance modifying a tasks | ||
367 | * priority. | ||
368 | */ | ||
369 | TRACE_EVENT(sched_pi_setprio, | ||
370 | |||
371 | TP_PROTO(struct task_struct *tsk, int newprio), | ||
372 | |||
373 | TP_ARGS(tsk, newprio), | ||
374 | |||
375 | TP_STRUCT__entry( | ||
376 | __array( char, comm, TASK_COMM_LEN ) | ||
377 | __field( pid_t, pid ) | ||
378 | __field( int, oldprio ) | ||
379 | __field( int, newprio ) | ||
380 | ), | ||
381 | |||
382 | TP_fast_assign( | ||
383 | memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN); | ||
384 | __entry->pid = tsk->pid; | ||
385 | __entry->oldprio = tsk->prio; | ||
386 | __entry->newprio = newprio; | ||
387 | ), | ||
388 | |||
389 | TP_printk("comm=%s pid=%d oldprio=%d newprio=%d", | ||
390 | __entry->comm, __entry->pid, | ||
391 | __entry->oldprio, __entry->newprio) | ||
392 | ); | ||
393 | |||
365 | #endif /* _TRACE_SCHED_H */ | 394 | #endif /* _TRACE_SCHED_H */ |
366 | 395 | ||
367 | /* This part must be outside protection */ | 396 | /* This part must be outside protection */ |
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h index 4b2be6dc76f0..75ce9d500d8e 100644 --- a/include/trace/events/skb.h +++ b/include/trace/events/skb.h | |||
@@ -35,6 +35,23 @@ TRACE_EVENT(kfree_skb, | |||
35 | __entry->skbaddr, __entry->protocol, __entry->location) | 35 | __entry->skbaddr, __entry->protocol, __entry->location) |
36 | ); | 36 | ); |
37 | 37 | ||
38 | TRACE_EVENT(consume_skb, | ||
39 | |||
40 | TP_PROTO(struct sk_buff *skb), | ||
41 | |||
42 | TP_ARGS(skb), | ||
43 | |||
44 | TP_STRUCT__entry( | ||
45 | __field( void *, skbaddr ) | ||
46 | ), | ||
47 | |||
48 | TP_fast_assign( | ||
49 | __entry->skbaddr = skb; | ||
50 | ), | ||
51 | |||
52 | TP_printk("skbaddr=%p", __entry->skbaddr) | ||
53 | ); | ||
54 | |||
38 | TRACE_EVENT(skb_copy_datagram_iovec, | 55 | TRACE_EVENT(skb_copy_datagram_iovec, |
39 | 56 | ||
40 | TP_PROTO(const struct sk_buff *skb, int len), | 57 | TP_PROTO(const struct sk_buff *skb, int len), |
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h index 370aa5a87322..c255fcc587bf 100644 --- a/include/trace/events/vmscan.h +++ b/include/trace/events/vmscan.h | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #define RECLAIM_WB_ANON 0x0001u | 11 | #define RECLAIM_WB_ANON 0x0001u |
12 | #define RECLAIM_WB_FILE 0x0002u | 12 | #define RECLAIM_WB_FILE 0x0002u |
13 | #define RECLAIM_WB_MIXED 0x0010u | ||
13 | #define RECLAIM_WB_SYNC 0x0004u | 14 | #define RECLAIM_WB_SYNC 0x0004u |
14 | #define RECLAIM_WB_ASYNC 0x0008u | 15 | #define RECLAIM_WB_ASYNC 0x0008u |
15 | 16 | ||
@@ -17,13 +18,20 @@ | |||
17 | (flags) ? __print_flags(flags, "|", \ | 18 | (flags) ? __print_flags(flags, "|", \ |
18 | {RECLAIM_WB_ANON, "RECLAIM_WB_ANON"}, \ | 19 | {RECLAIM_WB_ANON, "RECLAIM_WB_ANON"}, \ |
19 | {RECLAIM_WB_FILE, "RECLAIM_WB_FILE"}, \ | 20 | {RECLAIM_WB_FILE, "RECLAIM_WB_FILE"}, \ |
21 | {RECLAIM_WB_MIXED, "RECLAIM_WB_MIXED"}, \ | ||
20 | {RECLAIM_WB_SYNC, "RECLAIM_WB_SYNC"}, \ | 22 | {RECLAIM_WB_SYNC, "RECLAIM_WB_SYNC"}, \ |
21 | {RECLAIM_WB_ASYNC, "RECLAIM_WB_ASYNC"} \ | 23 | {RECLAIM_WB_ASYNC, "RECLAIM_WB_ASYNC"} \ |
22 | ) : "RECLAIM_WB_NONE" | 24 | ) : "RECLAIM_WB_NONE" |
23 | 25 | ||
24 | #define trace_reclaim_flags(page, sync) ( \ | 26 | #define trace_reclaim_flags(page, sync) ( \ |
25 | (page_is_file_cache(page) ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \ | 27 | (page_is_file_cache(page) ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \ |
26 | (sync == PAGEOUT_IO_SYNC ? RECLAIM_WB_SYNC : RECLAIM_WB_ASYNC) \ | 28 | (sync == LUMPY_MODE_SYNC ? RECLAIM_WB_SYNC : RECLAIM_WB_ASYNC) \ |
29 | ) | ||
30 | |||
31 | #define trace_shrink_flags(file, sync) ( \ | ||
32 | (sync == LUMPY_MODE_SYNC ? RECLAIM_WB_MIXED : \ | ||
33 | (file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON)) | \ | ||
34 | (sync == LUMPY_MODE_SYNC ? RECLAIM_WB_SYNC : RECLAIM_WB_ASYNC) \ | ||
27 | ) | 35 | ) |
28 | 36 | ||
29 | TRACE_EVENT(mm_vmscan_kswapd_sleep, | 37 | TRACE_EVENT(mm_vmscan_kswapd_sleep, |
@@ -269,6 +277,40 @@ TRACE_EVENT(mm_vmscan_writepage, | |||
269 | show_reclaim_flags(__entry->reclaim_flags)) | 277 | show_reclaim_flags(__entry->reclaim_flags)) |
270 | ); | 278 | ); |
271 | 279 | ||
280 | TRACE_EVENT(mm_vmscan_lru_shrink_inactive, | ||
281 | |||
282 | TP_PROTO(int nid, int zid, | ||
283 | unsigned long nr_scanned, unsigned long nr_reclaimed, | ||
284 | int priority, int reclaim_flags), | ||
285 | |||
286 | TP_ARGS(nid, zid, nr_scanned, nr_reclaimed, priority, reclaim_flags), | ||
287 | |||
288 | TP_STRUCT__entry( | ||
289 | __field(int, nid) | ||
290 | __field(int, zid) | ||
291 | __field(unsigned long, nr_scanned) | ||
292 | __field(unsigned long, nr_reclaimed) | ||
293 | __field(int, priority) | ||
294 | __field(int, reclaim_flags) | ||
295 | ), | ||
296 | |||
297 | TP_fast_assign( | ||
298 | __entry->nid = nid; | ||
299 | __entry->zid = zid; | ||
300 | __entry->nr_scanned = nr_scanned; | ||
301 | __entry->nr_reclaimed = nr_reclaimed; | ||
302 | __entry->priority = priority; | ||
303 | __entry->reclaim_flags = reclaim_flags; | ||
304 | ), | ||
305 | |||
306 | TP_printk("nid=%d zid=%d nr_scanned=%ld nr_reclaimed=%ld priority=%d flags=%s", | ||
307 | __entry->nid, __entry->zid, | ||
308 | __entry->nr_scanned, __entry->nr_reclaimed, | ||
309 | __entry->priority, | ||
310 | show_reclaim_flags(__entry->reclaim_flags)) | ||
311 | ); | ||
312 | |||
313 | |||
272 | #endif /* _TRACE_VMSCAN_H */ | 314 | #endif /* _TRACE_VMSCAN_H */ |
273 | 315 | ||
274 | /* This part must be outside protection */ | 316 | /* This part must be outside protection */ |
diff --git a/include/trace/events/workqueue.h b/include/trace/events/workqueue.h index 49682d7e9d60..7d497291c85d 100644 --- a/include/trace/events/workqueue.h +++ b/include/trace/events/workqueue.h | |||
@@ -7,38 +7,83 @@ | |||
7 | #include <linux/tracepoint.h> | 7 | #include <linux/tracepoint.h> |
8 | #include <linux/workqueue.h> | 8 | #include <linux/workqueue.h> |
9 | 9 | ||
10 | DECLARE_EVENT_CLASS(workqueue_work, | ||
11 | |||
12 | TP_PROTO(struct work_struct *work), | ||
13 | |||
14 | TP_ARGS(work), | ||
15 | |||
16 | TP_STRUCT__entry( | ||
17 | __field( void *, work ) | ||
18 | ), | ||
19 | |||
20 | TP_fast_assign( | ||
21 | __entry->work = work; | ||
22 | ), | ||
23 | |||
24 | TP_printk("work struct %p", __entry->work) | ||
25 | ); | ||
26 | |||
10 | /** | 27 | /** |
11 | * workqueue_execute_start - called immediately before the workqueue callback | 28 | * workqueue_queue_work - called when a work gets queued |
29 | * @req_cpu: the requested cpu | ||
30 | * @cwq: pointer to struct cpu_workqueue_struct | ||
12 | * @work: pointer to struct work_struct | 31 | * @work: pointer to struct work_struct |
13 | * | 32 | * |
14 | * Allows to track workqueue execution. | 33 | * This event occurs when a work is queued immediately or once a |
34 | * delayed work is actually queued on a workqueue (ie: once the delay | ||
35 | * has been reached). | ||
15 | */ | 36 | */ |
16 | TRACE_EVENT(workqueue_execute_start, | 37 | TRACE_EVENT(workqueue_queue_work, |
17 | 38 | ||
18 | TP_PROTO(struct work_struct *work), | 39 | TP_PROTO(unsigned int req_cpu, struct cpu_workqueue_struct *cwq, |
40 | struct work_struct *work), | ||
19 | 41 | ||
20 | TP_ARGS(work), | 42 | TP_ARGS(req_cpu, cwq, work), |
21 | 43 | ||
22 | TP_STRUCT__entry( | 44 | TP_STRUCT__entry( |
23 | __field( void *, work ) | 45 | __field( void *, work ) |
24 | __field( void *, function) | 46 | __field( void *, function) |
47 | __field( void *, workqueue) | ||
48 | __field( unsigned int, req_cpu ) | ||
49 | __field( unsigned int, cpu ) | ||
25 | ), | 50 | ), |
26 | 51 | ||
27 | TP_fast_assign( | 52 | TP_fast_assign( |
28 | __entry->work = work; | 53 | __entry->work = work; |
29 | __entry->function = work->func; | 54 | __entry->function = work->func; |
55 | __entry->workqueue = cwq->wq; | ||
56 | __entry->req_cpu = req_cpu; | ||
57 | __entry->cpu = cwq->gcwq->cpu; | ||
30 | ), | 58 | ), |
31 | 59 | ||
32 | TP_printk("work struct %p: function %pf", __entry->work, __entry->function) | 60 | TP_printk("work struct=%p function=%pf workqueue=%p req_cpu=%u cpu=%u", |
61 | __entry->work, __entry->function, __entry->workqueue, | ||
62 | __entry->req_cpu, __entry->cpu) | ||
33 | ); | 63 | ); |
34 | 64 | ||
35 | /** | 65 | /** |
36 | * workqueue_execute_end - called immediately before the workqueue callback | 66 | * workqueue_activate_work - called when a work gets activated |
67 | * @work: pointer to struct work_struct | ||
68 | * | ||
69 | * This event occurs when a queued work is put on the active queue, | ||
70 | * which happens immediately after queueing unless @max_active limit | ||
71 | * is reached. | ||
72 | */ | ||
73 | DEFINE_EVENT(workqueue_work, workqueue_activate_work, | ||
74 | |||
75 | TP_PROTO(struct work_struct *work), | ||
76 | |||
77 | TP_ARGS(work) | ||
78 | ); | ||
79 | |||
80 | /** | ||
81 | * workqueue_execute_start - called immediately before the workqueue callback | ||
37 | * @work: pointer to struct work_struct | 82 | * @work: pointer to struct work_struct |
38 | * | 83 | * |
39 | * Allows to track workqueue execution. | 84 | * Allows to track workqueue execution. |
40 | */ | 85 | */ |
41 | TRACE_EVENT(workqueue_execute_end, | 86 | TRACE_EVENT(workqueue_execute_start, |
42 | 87 | ||
43 | TP_PROTO(struct work_struct *work), | 88 | TP_PROTO(struct work_struct *work), |
44 | 89 | ||
@@ -46,15 +91,29 @@ TRACE_EVENT(workqueue_execute_end, | |||
46 | 91 | ||
47 | TP_STRUCT__entry( | 92 | TP_STRUCT__entry( |
48 | __field( void *, work ) | 93 | __field( void *, work ) |
94 | __field( void *, function) | ||
49 | ), | 95 | ), |
50 | 96 | ||
51 | TP_fast_assign( | 97 | TP_fast_assign( |
52 | __entry->work = work; | 98 | __entry->work = work; |
99 | __entry->function = work->func; | ||
53 | ), | 100 | ), |
54 | 101 | ||
55 | TP_printk("work struct %p", __entry->work) | 102 | TP_printk("work struct %p: function %pf", __entry->work, __entry->function) |
56 | ); | 103 | ); |
57 | 104 | ||
105 | /** | ||
106 | * workqueue_execute_end - called immediately before the workqueue callback | ||
107 | * @work: pointer to struct work_struct | ||
108 | * | ||
109 | * Allows to track workqueue execution. | ||
110 | */ | ||
111 | DEFINE_EVENT(workqueue_work, workqueue_execute_end, | ||
112 | |||
113 | TP_PROTO(struct work_struct *work), | ||
114 | |||
115 | TP_ARGS(work) | ||
116 | ); | ||
58 | 117 | ||
59 | #endif /* _TRACE_WORKQUEUE_H */ | 118 | #endif /* _TRACE_WORKQUEUE_H */ |
60 | 119 | ||
diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index f345f66ae9d1..89a2b2db4375 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h | |||
@@ -96,8 +96,6 @@ DECLARE_EVENT_CLASS(wbc_class, | |||
96 | __field(long, nr_to_write) | 96 | __field(long, nr_to_write) |
97 | __field(long, pages_skipped) | 97 | __field(long, pages_skipped) |
98 | __field(int, sync_mode) | 98 | __field(int, sync_mode) |
99 | __field(int, nonblocking) | ||
100 | __field(int, encountered_congestion) | ||
101 | __field(int, for_kupdate) | 99 | __field(int, for_kupdate) |
102 | __field(int, for_background) | 100 | __field(int, for_background) |
103 | __field(int, for_reclaim) | 101 | __field(int, for_reclaim) |
@@ -153,6 +151,41 @@ DEFINE_WBC_EVENT(wbc_balance_dirty_written); | |||
153 | DEFINE_WBC_EVENT(wbc_balance_dirty_wait); | 151 | DEFINE_WBC_EVENT(wbc_balance_dirty_wait); |
154 | DEFINE_WBC_EVENT(wbc_writepage); | 152 | DEFINE_WBC_EVENT(wbc_writepage); |
155 | 153 | ||
154 | DECLARE_EVENT_CLASS(writeback_congest_waited_template, | ||
155 | |||
156 | TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), | ||
157 | |||
158 | TP_ARGS(usec_timeout, usec_delayed), | ||
159 | |||
160 | TP_STRUCT__entry( | ||
161 | __field( unsigned int, usec_timeout ) | ||
162 | __field( unsigned int, usec_delayed ) | ||
163 | ), | ||
164 | |||
165 | TP_fast_assign( | ||
166 | __entry->usec_timeout = usec_timeout; | ||
167 | __entry->usec_delayed = usec_delayed; | ||
168 | ), | ||
169 | |||
170 | TP_printk("usec_timeout=%u usec_delayed=%u", | ||
171 | __entry->usec_timeout, | ||
172 | __entry->usec_delayed) | ||
173 | ); | ||
174 | |||
175 | DEFINE_EVENT(writeback_congest_waited_template, writeback_congestion_wait, | ||
176 | |||
177 | TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), | ||
178 | |||
179 | TP_ARGS(usec_timeout, usec_delayed) | ||
180 | ); | ||
181 | |||
182 | DEFINE_EVENT(writeback_congest_waited_template, writeback_wait_iff_congested, | ||
183 | |||
184 | TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), | ||
185 | |||
186 | TP_ARGS(usec_timeout, usec_delayed) | ||
187 | ); | ||
188 | |||
156 | #endif /* _TRACE_WRITEBACK_H */ | 189 | #endif /* _TRACE_WRITEBACK_H */ |
157 | 190 | ||
158 | /* This part must be outside protection */ | 191 | /* This part must be outside protection */ |
diff --git a/include/video/sh_mobile_hdmi.h b/include/video/sh_mobile_hdmi.h index 577cf18cce89..1e1aa54ab2e4 100644 --- a/include/video/sh_mobile_hdmi.h +++ b/include/video/sh_mobile_hdmi.h | |||
@@ -14,9 +14,25 @@ | |||
14 | struct sh_mobile_lcdc_chan_cfg; | 14 | struct sh_mobile_lcdc_chan_cfg; |
15 | struct device; | 15 | struct device; |
16 | 16 | ||
17 | /* | ||
18 | * flags format | ||
19 | * | ||
20 | * 0x0000000A | ||
21 | * | ||
22 | * A: Audio source select | ||
23 | */ | ||
24 | |||
25 | /* Audio source select */ | ||
26 | #define HDMI_SND_SRC_MASK (0xF << 0) | ||
27 | #define HDMI_SND_SRC_I2S (0 << 0) /* default */ | ||
28 | #define HDMI_SND_SRC_SPDIF (1 << 0) | ||
29 | #define HDMI_SND_SRC_DSD (2 << 0) | ||
30 | #define HDMI_SND_SRC_HBR (3 << 0) | ||
31 | |||
17 | struct sh_mobile_hdmi_info { | 32 | struct sh_mobile_hdmi_info { |
18 | struct sh_mobile_lcdc_chan_cfg *lcd_chan; | 33 | struct sh_mobile_lcdc_chan_cfg *lcd_chan; |
19 | struct device *lcd_dev; | 34 | struct device *lcd_dev; |
35 | unsigned int flags; | ||
20 | }; | 36 | }; |
21 | 37 | ||
22 | #endif | 38 | #endif |
diff --git a/include/video/sh_mobile_lcdc.h b/include/video/sh_mobile_lcdc.h index 55d700e8566e..daabae5817c6 100644 --- a/include/video/sh_mobile_lcdc.h +++ b/include/video/sh_mobile_lcdc.h | |||
@@ -49,7 +49,9 @@ struct sh_mobile_lcdc_sys_bus_ops { | |||
49 | unsigned long (*read_data)(void *handle); | 49 | unsigned long (*read_data)(void *handle); |
50 | }; | 50 | }; |
51 | 51 | ||
52 | struct module; | ||
52 | struct sh_mobile_lcdc_board_cfg { | 53 | struct sh_mobile_lcdc_board_cfg { |
54 | struct module *owner; | ||
53 | void *board_data; | 55 | void *board_data; |
54 | int (*setup_sys)(void *board_data, void *sys_ops_handle, | 56 | int (*setup_sys)(void *board_data, void *sys_ops_handle, |
55 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); | 57 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); |
@@ -70,7 +72,8 @@ struct sh_mobile_lcdc_chan_cfg { | |||
70 | int interface_type; /* selects RGBn or SYSn I/F, see above */ | 72 | int interface_type; /* selects RGBn or SYSn I/F, see above */ |
71 | int clock_divider; | 73 | int clock_divider; |
72 | unsigned long flags; /* LCDC_FLAGS_... */ | 74 | unsigned long flags; /* LCDC_FLAGS_... */ |
73 | struct fb_videomode lcd_cfg; | 75 | const struct fb_videomode *lcd_cfg; |
76 | int num_cfg; | ||
74 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; | 77 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; |
75 | struct sh_mobile_lcdc_board_cfg board_cfg; | 78 | struct sh_mobile_lcdc_board_cfg board_cfg; |
76 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ | 79 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ |
diff --git a/include/video/vga.h b/include/video/vga.h index b49a5120ca2d..2b8691f7d256 100644 --- a/include/video/vga.h +++ b/include/video/vga.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Copyright history from vga16fb.c: | 6 | * Copyright history from vga16fb.c: |
7 | * Copyright 1999 Ben Pfaff and Petr Vandrovec | 7 | * Copyright 1999 Ben Pfaff and Petr Vandrovec |
8 | * Based on VGA info at http://www.goodnet.com/~tinara/FreeVGA/home.htm | 8 | * Based on VGA info at http://www.osdever.net/FreeVGA/home.htm |
9 | * Based on VESA framebuffer (c) 1998 Gerd Knorr | 9 | * Based on VESA framebuffer (c) 1998 Gerd Knorr |
10 | * | 10 | * |
11 | * This file is subject to the terms and conditions of the GNU General | 11 | * This file is subject to the terms and conditions of the GNU General |
diff --git a/include/xen/events.h b/include/xen/events.h index a15d93262e30..646dd17d3aa4 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
@@ -12,6 +12,7 @@ int bind_evtchn_to_irqhandler(unsigned int evtchn, | |||
12 | irq_handler_t handler, | 12 | irq_handler_t handler, |
13 | unsigned long irqflags, const char *devname, | 13 | unsigned long irqflags, const char *devname, |
14 | void *dev_id); | 14 | void *dev_id); |
15 | int bind_virq_to_irq(unsigned int virq, unsigned int cpu); | ||
15 | int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu, | 16 | int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu, |
16 | irq_handler_t handler, | 17 | irq_handler_t handler, |
17 | unsigned long irqflags, const char *devname, | 18 | unsigned long irqflags, const char *devname, |
@@ -53,6 +54,10 @@ bool xen_test_irq_pending(int irq); | |||
53 | irq will be disabled so it won't deliver an interrupt. */ | 54 | irq will be disabled so it won't deliver an interrupt. */ |
54 | void xen_poll_irq(int irq); | 55 | void xen_poll_irq(int irq); |
55 | 56 | ||
57 | /* Poll waiting for an irq to become pending with a timeout. In the usual case, | ||
58 | * the irq will be disabled so it won't deliver an interrupt. */ | ||
59 | void xen_poll_irq_timeout(int irq, u64 timeout); | ||
60 | |||
56 | /* Determine the IRQ which is bound to an event channel */ | 61 | /* Determine the IRQ which is bound to an event channel */ |
57 | unsigned irq_from_evtchn(unsigned int evtchn); | 62 | unsigned irq_from_evtchn(unsigned int evtchn); |
58 | 63 | ||
@@ -63,4 +68,25 @@ int xen_set_callback_via(uint64_t via); | |||
63 | void xen_evtchn_do_upcall(struct pt_regs *regs); | 68 | void xen_evtchn_do_upcall(struct pt_regs *regs); |
64 | void xen_hvm_evtchn_do_upcall(void); | 69 | void xen_hvm_evtchn_do_upcall(void); |
65 | 70 | ||
71 | /* Allocate an irq for a physical interrupt, given a gsi. "Legacy" | ||
72 | * GSIs are identity mapped; others are dynamically allocated as | ||
73 | * usual. */ | ||
74 | int xen_allocate_pirq(unsigned gsi, int shareable, char *name); | ||
75 | int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name); | ||
76 | |||
77 | #ifdef CONFIG_PCI_MSI | ||
78 | /* Allocate an irq and a pirq to be used with MSIs. */ | ||
79 | void xen_allocate_pirq_msi(char *name, int *irq, int *pirq); | ||
80 | int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type); | ||
81 | #endif | ||
82 | |||
83 | /* De-allocates the above mentioned physical interrupt. */ | ||
84 | int xen_destroy_irq(int irq); | ||
85 | |||
86 | /* Return vector allocated to pirq */ | ||
87 | int xen_vector_from_irq(unsigned pirq); | ||
88 | |||
89 | /* Return gsi allocated to pirq */ | ||
90 | int xen_gsi_from_irq(unsigned pirq); | ||
91 | |||
66 | #endif /* _XEN_EVENTS_H */ | 92 | #endif /* _XEN_EVENTS_H */ |
diff --git a/include/xen/interface/features.h b/include/xen/interface/features.h index 70d2563ab166..b6ca39a069d8 100644 --- a/include/xen/interface/features.h +++ b/include/xen/interface/features.h | |||
@@ -47,6 +47,9 @@ | |||
47 | /* x86: pvclock algorithm is safe to use on HVM */ | 47 | /* x86: pvclock algorithm is safe to use on HVM */ |
48 | #define XENFEAT_hvm_safe_pvclock 9 | 48 | #define XENFEAT_hvm_safe_pvclock 9 |
49 | 49 | ||
50 | /* x86: pirq can be used by HVM guests */ | ||
51 | #define XENFEAT_hvm_pirqs 10 | ||
52 | |||
50 | #define XENFEAT_NR_SUBMAPS 1 | 53 | #define XENFEAT_NR_SUBMAPS 1 |
51 | 54 | ||
52 | #endif /* __XEN_PUBLIC_FEATURES_H__ */ | 55 | #endif /* __XEN_PUBLIC_FEATURES_H__ */ |
diff --git a/include/xen/interface/io/pciif.h b/include/xen/interface/io/pciif.h new file mode 100644 index 000000000000..d9922ae36eb5 --- /dev/null +++ b/include/xen/interface/io/pciif.h | |||
@@ -0,0 +1,112 @@ | |||
1 | /* | ||
2 | * PCI Backend/Frontend Common Data Structures & Macros | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
5 | * of this software and associated documentation files (the "Software"), to | ||
6 | * deal in the Software without restriction, including without limitation the | ||
7 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
8 | * sell copies of the Software, and to permit persons to whom the Software is | ||
9 | * furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
17 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
18 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
19 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
20 | * DEALINGS IN THE SOFTWARE. | ||
21 | * | ||
22 | * Author: Ryan Wilson <hap9@epoch.ncsc.mil> | ||
23 | */ | ||
24 | #ifndef __XEN_PCI_COMMON_H__ | ||
25 | #define __XEN_PCI_COMMON_H__ | ||
26 | |||
27 | /* Be sure to bump this number if you change this file */ | ||
28 | #define XEN_PCI_MAGIC "7" | ||
29 | |||
30 | /* xen_pci_sharedinfo flags */ | ||
31 | #define _XEN_PCIF_active (0) | ||
32 | #define XEN_PCIF_active (1<<_XEN_PCIF_active) | ||
33 | #define _XEN_PCIB_AERHANDLER (1) | ||
34 | #define XEN_PCIB_AERHANDLER (1<<_XEN_PCIB_AERHANDLER) | ||
35 | #define _XEN_PCIB_active (2) | ||
36 | #define XEN_PCIB_active (1<<_XEN_PCIB_active) | ||
37 | |||
38 | /* xen_pci_op commands */ | ||
39 | #define XEN_PCI_OP_conf_read (0) | ||
40 | #define XEN_PCI_OP_conf_write (1) | ||
41 | #define XEN_PCI_OP_enable_msi (2) | ||
42 | #define XEN_PCI_OP_disable_msi (3) | ||
43 | #define XEN_PCI_OP_enable_msix (4) | ||
44 | #define XEN_PCI_OP_disable_msix (5) | ||
45 | #define XEN_PCI_OP_aer_detected (6) | ||
46 | #define XEN_PCI_OP_aer_resume (7) | ||
47 | #define XEN_PCI_OP_aer_mmio (8) | ||
48 | #define XEN_PCI_OP_aer_slotreset (9) | ||
49 | |||
50 | /* xen_pci_op error numbers */ | ||
51 | #define XEN_PCI_ERR_success (0) | ||
52 | #define XEN_PCI_ERR_dev_not_found (-1) | ||
53 | #define XEN_PCI_ERR_invalid_offset (-2) | ||
54 | #define XEN_PCI_ERR_access_denied (-3) | ||
55 | #define XEN_PCI_ERR_not_implemented (-4) | ||
56 | /* XEN_PCI_ERR_op_failed - backend failed to complete the operation */ | ||
57 | #define XEN_PCI_ERR_op_failed (-5) | ||
58 | |||
59 | /* | ||
60 | * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry)) | ||
61 | * Should not exceed 128 | ||
62 | */ | ||
63 | #define SH_INFO_MAX_VEC 128 | ||
64 | |||
65 | struct xen_msix_entry { | ||
66 | uint16_t vector; | ||
67 | uint16_t entry; | ||
68 | }; | ||
69 | struct xen_pci_op { | ||
70 | /* IN: what action to perform: XEN_PCI_OP_* */ | ||
71 | uint32_t cmd; | ||
72 | |||
73 | /* OUT: will contain an error number (if any) from errno.h */ | ||
74 | int32_t err; | ||
75 | |||
76 | /* IN: which device to touch */ | ||
77 | uint32_t domain; /* PCI Domain/Segment */ | ||
78 | uint32_t bus; | ||
79 | uint32_t devfn; | ||
80 | |||
81 | /* IN: which configuration registers to touch */ | ||
82 | int32_t offset; | ||
83 | int32_t size; | ||
84 | |||
85 | /* IN/OUT: Contains the result after a READ or the value to WRITE */ | ||
86 | uint32_t value; | ||
87 | /* IN: Contains extra infor for this operation */ | ||
88 | uint32_t info; | ||
89 | /*IN: param for msi-x */ | ||
90 | struct xen_msix_entry msix_entries[SH_INFO_MAX_VEC]; | ||
91 | }; | ||
92 | |||
93 | /*used for pcie aer handling*/ | ||
94 | struct xen_pcie_aer_op { | ||
95 | /* IN: what action to perform: XEN_PCI_OP_* */ | ||
96 | uint32_t cmd; | ||
97 | /*IN/OUT: return aer_op result or carry error_detected state as input*/ | ||
98 | int32_t err; | ||
99 | |||
100 | /* IN: which device to touch */ | ||
101 | uint32_t domain; /* PCI Domain/Segment*/ | ||
102 | uint32_t bus; | ||
103 | uint32_t devfn; | ||
104 | }; | ||
105 | struct xen_pci_sharedinfo { | ||
106 | /* flags - XEN_PCIF_* */ | ||
107 | uint32_t flags; | ||
108 | struct xen_pci_op op; | ||
109 | struct xen_pcie_aer_op aer_op; | ||
110 | }; | ||
111 | |||
112 | #endif /* __XEN_PCI_COMMON_H__ */ | ||
diff --git a/include/xen/interface/io/xenbus.h b/include/xen/interface/io/xenbus.h index 46508c7fa399..9fda532973a5 100644 --- a/include/xen/interface/io/xenbus.h +++ b/include/xen/interface/io/xenbus.h | |||
@@ -27,8 +27,14 @@ enum xenbus_state | |||
27 | XenbusStateClosing = 5, /* The device is being closed | 27 | XenbusStateClosing = 5, /* The device is being closed |
28 | due to an error or an unplug | 28 | due to an error or an unplug |
29 | event. */ | 29 | event. */ |
30 | XenbusStateClosed = 6 | 30 | XenbusStateClosed = 6, |
31 | 31 | ||
32 | /* | ||
33 | * Reconfiguring: The device is being reconfigured. | ||
34 | */ | ||
35 | XenbusStateReconfiguring = 7, | ||
36 | |||
37 | XenbusStateReconfigured = 8 | ||
32 | }; | 38 | }; |
33 | 39 | ||
34 | #endif /* _XEN_PUBLIC_IO_XENBUS_H */ | 40 | #endif /* _XEN_PUBLIC_IO_XENBUS_H */ |
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index d3938d3e71f8..d7a6c13bde69 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h | |||
@@ -186,6 +186,35 @@ struct xen_translate_gpfn_list { | |||
186 | }; | 186 | }; |
187 | DEFINE_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list); | 187 | DEFINE_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list); |
188 | 188 | ||
189 | /* | ||
190 | * Returns the pseudo-physical memory map as it was when the domain | ||
191 | * was started (specified by XENMEM_set_memory_map). | ||
192 | * arg == addr of struct xen_memory_map. | ||
193 | */ | ||
194 | #define XENMEM_memory_map 9 | ||
195 | struct xen_memory_map { | ||
196 | /* | ||
197 | * On call the number of entries which can be stored in buffer. On | ||
198 | * return the number of entries which have been stored in | ||
199 | * buffer. | ||
200 | */ | ||
201 | unsigned int nr_entries; | ||
202 | |||
203 | /* | ||
204 | * Entries in the buffer are in the same format as returned by the | ||
205 | * BIOS INT 0x15 EAX=0xE820 call. | ||
206 | */ | ||
207 | GUEST_HANDLE(void) buffer; | ||
208 | }; | ||
209 | DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map); | ||
210 | |||
211 | /* | ||
212 | * Returns the real physical memory map. Passes the same structure as | ||
213 | * XENMEM_memory_map. | ||
214 | * arg == addr of struct xen_memory_map. | ||
215 | */ | ||
216 | #define XENMEM_machine_memory_map 10 | ||
217 | |||
189 | 218 | ||
190 | /* | 219 | /* |
191 | * Prevent the balloon driver from changing the memory reservation | 220 | * Prevent the balloon driver from changing the memory reservation |
diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h index cd6939147cb6..2b2c66c3df00 100644 --- a/include/xen/interface/physdev.h +++ b/include/xen/interface/physdev.h | |||
@@ -106,6 +106,57 @@ struct physdev_irq { | |||
106 | uint32_t vector; | 106 | uint32_t vector; |
107 | }; | 107 | }; |
108 | 108 | ||
109 | #define MAP_PIRQ_TYPE_MSI 0x0 | ||
110 | #define MAP_PIRQ_TYPE_GSI 0x1 | ||
111 | #define MAP_PIRQ_TYPE_UNKNOWN 0x2 | ||
112 | |||
113 | #define PHYSDEVOP_map_pirq 13 | ||
114 | struct physdev_map_pirq { | ||
115 | domid_t domid; | ||
116 | /* IN */ | ||
117 | int type; | ||
118 | /* IN */ | ||
119 | int index; | ||
120 | /* IN or OUT */ | ||
121 | int pirq; | ||
122 | /* IN */ | ||
123 | int bus; | ||
124 | /* IN */ | ||
125 | int devfn; | ||
126 | /* IN */ | ||
127 | int entry_nr; | ||
128 | /* IN */ | ||
129 | uint64_t table_base; | ||
130 | }; | ||
131 | |||
132 | #define PHYSDEVOP_unmap_pirq 14 | ||
133 | struct physdev_unmap_pirq { | ||
134 | domid_t domid; | ||
135 | /* IN */ | ||
136 | int pirq; | ||
137 | }; | ||
138 | |||
139 | #define PHYSDEVOP_manage_pci_add 15 | ||
140 | #define PHYSDEVOP_manage_pci_remove 16 | ||
141 | struct physdev_manage_pci { | ||
142 | /* IN */ | ||
143 | uint8_t bus; | ||
144 | uint8_t devfn; | ||
145 | }; | ||
146 | |||
147 | #define PHYSDEVOP_manage_pci_add_ext 20 | ||
148 | struct physdev_manage_pci_ext { | ||
149 | /* IN */ | ||
150 | uint8_t bus; | ||
151 | uint8_t devfn; | ||
152 | unsigned is_extfn; | ||
153 | unsigned is_virtfn; | ||
154 | struct { | ||
155 | uint8_t bus; | ||
156 | uint8_t devfn; | ||
157 | } physfn; | ||
158 | }; | ||
159 | |||
109 | /* | 160 | /* |
110 | * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op() | 161 | * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op() |
111 | * hypercall since 0x00030202. | 162 | * hypercall since 0x00030202. |
@@ -121,6 +172,22 @@ struct physdev_op { | |||
121 | } u; | 172 | } u; |
122 | }; | 173 | }; |
123 | 174 | ||
175 | #define PHYSDEVOP_setup_gsi 21 | ||
176 | struct physdev_setup_gsi { | ||
177 | int gsi; | ||
178 | /* IN */ | ||
179 | uint8_t triggering; | ||
180 | /* IN */ | ||
181 | uint8_t polarity; | ||
182 | /* IN */ | ||
183 | }; | ||
184 | |||
185 | #define PHYSDEVOP_get_nr_pirqs 22 | ||
186 | struct physdev_nr_pirqs { | ||
187 | /* OUT */ | ||
188 | uint32_t nr_pirqs; | ||
189 | }; | ||
190 | |||
124 | /* | 191 | /* |
125 | * Notify that some PIRQ-bound event channels have been unmasked. | 192 | * Notify that some PIRQ-bound event channels have been unmasked. |
126 | * ** This command is obsolete since interface version 0x00030202 and is ** | 193 | * ** This command is obsolete since interface version 0x00030202 and is ** |