Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0115-2.6.27.16-all-fixes.patch
Parent Directory | Revision Log
Revision 1176 -
(hide annotations)
(download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 80124 byte(s)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 80124 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 | niro | 1176 | diff --git a/Documentation/filesystems/sysfs-pci.txt b/Documentation/filesystems/sysfs-pci.txt |
2 | index 68ef488..de99749 100644 | ||
3 | --- a/Documentation/filesystems/sysfs-pci.txt | ||
4 | +++ b/Documentation/filesystems/sysfs-pci.txt | ||
5 | @@ -9,6 +9,7 @@ that support it. For example, a given bus might look like this: | ||
6 | | |-- class | ||
7 | | |-- config | ||
8 | | |-- device | ||
9 | + | |-- enable | ||
10 | | |-- irq | ||
11 | | |-- local_cpus | ||
12 | | |-- resource | ||
13 | @@ -32,6 +33,7 @@ files, each with their own function. | ||
14 | class PCI class (ascii, ro) | ||
15 | config PCI config space (binary, rw) | ||
16 | device PCI device (ascii, ro) | ||
17 | + enable Whether the device is enabled (ascii, rw) | ||
18 | irq IRQ number (ascii, ro) | ||
19 | local_cpus nearby CPU mask (cpumask, ro) | ||
20 | resource PCI resource host addresses (ascii, ro) | ||
21 | @@ -57,10 +59,19 @@ used to do actual device programming from userspace. Note that some platforms | ||
22 | don't support mmapping of certain resources, so be sure to check the return | ||
23 | value from any attempted mmap. | ||
24 | |||
25 | +The 'enable' file provides a counter that indicates how many times the device | ||
26 | +has been enabled. If the 'enable' file currently returns '4', and a '1' is | ||
27 | +echoed into it, it will then return '5'. Echoing a '0' into it will decrease | ||
28 | +the count. Even when it returns to 0, though, some of the initialisation | ||
29 | +may not be reversed. | ||
30 | + | ||
31 | The 'rom' file is special in that it provides read-only access to the device's | ||
32 | ROM file, if available. It's disabled by default, however, so applications | ||
33 | should write the string "1" to the file to enable it before attempting a read | ||
34 | -call, and disable it following the access by writing "0" to the file. | ||
35 | +call, and disable it following the access by writing "0" to the file. Note | ||
36 | +that the device must be enabled for a rom read to return data succesfully. | ||
37 | +In the event a driver is not bound to the device, it can be enabled using the | ||
38 | +'enable' file, documented above. | ||
39 | |||
40 | Accessing legacy resources through sysfs | ||
41 | ---------------------------------------- | ||
42 | diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c | ||
43 | index a15baac..0c3f2a0 100644 | ||
44 | --- a/arch/ia64/sn/kernel/io_acpi_init.c | ||
45 | +++ b/arch/ia64/sn/kernel/io_acpi_init.c | ||
46 | @@ -434,7 +434,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev) | ||
47 | size = pci_resource_len(dev, PCI_ROM_RESOURCE); | ||
48 | addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE], | ||
49 | size); | ||
50 | - image_size = pci_get_rom_size(addr, size); | ||
51 | + image_size = pci_get_rom_size(dev, addr, size); | ||
52 | dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr; | ||
53 | dev->resource[PCI_ROM_RESOURCE].end = | ||
54 | (unsigned long) addr + image_size - 1; | ||
55 | diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c | ||
56 | index c3aa851..1a3ed90 100644 | ||
57 | --- a/arch/ia64/sn/kernel/io_init.c | ||
58 | +++ b/arch/ia64/sn/kernel/io_init.c | ||
59 | @@ -269,7 +269,7 @@ sn_io_slot_fixup(struct pci_dev *dev) | ||
60 | |||
61 | rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE), | ||
62 | size + 1); | ||
63 | - image_size = pci_get_rom_size(rom, size + 1); | ||
64 | + image_size = pci_get_rom_size(dev, rom, size + 1); | ||
65 | dev->resource[PCI_ROM_RESOURCE].end = | ||
66 | dev->resource[PCI_ROM_RESOURCE].start + | ||
67 | image_size - 1; | ||
68 | diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c | ||
69 | index f88bd0d..ffc633c 100644 | ||
70 | --- a/arch/x86/kernel/apic_32.c | ||
71 | +++ b/arch/x86/kernel/apic_32.c | ||
72 | @@ -1115,7 +1115,7 @@ static int __init detect_init_APIC(void) | ||
73 | switch (boot_cpu_data.x86_vendor) { | ||
74 | case X86_VENDOR_AMD: | ||
75 | if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) || | ||
76 | - (boot_cpu_data.x86 == 15)) | ||
77 | + (boot_cpu_data.x86 >= 15)) | ||
78 | break; | ||
79 | goto no_apic; | ||
80 | case X86_VENDOR_INTEL: | ||
81 | diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | ||
82 | index dd097b8..9943b4c 100644 | ||
83 | --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | ||
84 | +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | ||
85 | @@ -779,6 +779,9 @@ static int __init acpi_cpufreq_init(void) | ||
86 | { | ||
87 | int ret; | ||
88 | |||
89 | + if (acpi_disabled) | ||
90 | + return 0; | ||
91 | + | ||
92 | dprintk("acpi_cpufreq_init\n"); | ||
93 | |||
94 | ret = acpi_cpufreq_early_init(); | ||
95 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c | ||
96 | index da1973b..3384255 100644 | ||
97 | --- a/arch/x86/mm/fault.c | ||
98 | +++ b/arch/x86/mm/fault.c | ||
99 | @@ -607,8 +607,6 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | ||
100 | |||
101 | si_code = SEGV_MAPERR; | ||
102 | |||
103 | - if (notify_page_fault(regs)) | ||
104 | - return; | ||
105 | if (unlikely(kmmio_fault(regs, address))) | ||
106 | return; | ||
107 | |||
108 | @@ -638,6 +636,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | ||
109 | if (spurious_fault(address, error_code)) | ||
110 | return; | ||
111 | |||
112 | + /* kprobes don't want to hook the spurious faults. */ | ||
113 | + if (notify_page_fault(regs)) | ||
114 | + return; | ||
115 | /* | ||
116 | * Don't take the mm semaphore here. If we fixup a prefetch | ||
117 | * fault we could otherwise deadlock. | ||
118 | @@ -645,6 +646,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | ||
119 | goto bad_area_nosemaphore; | ||
120 | } | ||
121 | |||
122 | + /* kprobes don't want to hook the spurious faults. */ | ||
123 | + if (notify_page_fault(regs)) | ||
124 | + return; | ||
125 | |||
126 | #ifdef CONFIG_X86_32 | ||
127 | /* It's safe to allow irq's after cr2 has been saved and the vmalloc | ||
128 | diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c | ||
129 | index e28469e..eab790f 100644 | ||
130 | --- a/drivers/acpi/dock.c | ||
131 | +++ b/drivers/acpi/dock.c | ||
132 | @@ -691,8 +691,14 @@ fdd_out: | ||
133 | static ssize_t show_docked(struct device *dev, | ||
134 | struct device_attribute *attr, char *buf) | ||
135 | { | ||
136 | - return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station)); | ||
137 | + struct acpi_device *tmp; | ||
138 | + | ||
139 | + struct dock_station *dock_station = *((struct dock_station **) | ||
140 | + dev->platform_data); | ||
141 | |||
142 | + if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp))) | ||
143 | + return snprintf(buf, PAGE_SIZE, "1\n"); | ||
144 | + return snprintf(buf, PAGE_SIZE, "0\n"); | ||
145 | } | ||
146 | static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL); | ||
147 | |||
148 | diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c | ||
149 | index 8892b98..331a114 100644 | ||
150 | --- a/drivers/acpi/executer/exconfig.c | ||
151 | +++ b/drivers/acpi/executer/exconfig.c | ||
152 | @@ -280,6 +280,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | ||
153 | struct acpi_walk_state *walk_state) | ||
154 | { | ||
155 | union acpi_operand_object *ddb_handle; | ||
156 | + struct acpi_table_header *table; | ||
157 | struct acpi_table_desc table_desc; | ||
158 | u32 table_index; | ||
159 | acpi_status status; | ||
160 | @@ -294,9 +295,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | ||
161 | switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { | ||
162 | case ACPI_TYPE_REGION: | ||
163 | |||
164 | - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Load from Region %p %s\n", | ||
165 | - obj_desc, | ||
166 | - acpi_ut_get_object_type_name(obj_desc))); | ||
167 | + ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
168 | + "Load table from Region %p\n", obj_desc)); | ||
169 | |||
170 | /* Region must be system_memory (from ACPI spec) */ | ||
171 | |||
172 | @@ -316,61 +316,112 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | ||
173 | } | ||
174 | |||
175 | /* | ||
176 | - * We will simply map the memory region for the table. However, the | ||
177 | - * memory region is technically not guaranteed to remain stable and | ||
178 | - * we may eventually have to copy the table to a local buffer. | ||
179 | + * Map the table header and get the actual table length. The region | ||
180 | + * length is not guaranteed to be the same as the table length. | ||
181 | + */ | ||
182 | + table = acpi_os_map_memory(obj_desc->region.address, | ||
183 | + sizeof(struct acpi_table_header)); | ||
184 | + if (!table) { | ||
185 | + return_ACPI_STATUS(AE_NO_MEMORY); | ||
186 | + } | ||
187 | + | ||
188 | + length = table->length; | ||
189 | + acpi_os_unmap_memory(table, sizeof(struct acpi_table_header)); | ||
190 | + | ||
191 | + /* Must have at least an ACPI table header */ | ||
192 | + | ||
193 | + if (length < sizeof(struct acpi_table_header)) { | ||
194 | + return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); | ||
195 | + } | ||
196 | + | ||
197 | + /* | ||
198 | + * The memory region is not guaranteed to remain stable and we must | ||
199 | + * copy the table to a local buffer. For example, the memory region | ||
200 | + * is corrupted after suspend on some machines. Dynamically loaded | ||
201 | + * tables are usually small, so this overhead is minimal. | ||
202 | */ | ||
203 | + | ||
204 | + /* Allocate a buffer for the table */ | ||
205 | + | ||
206 | + table_desc.pointer = ACPI_ALLOCATE(length); | ||
207 | + if (!table_desc.pointer) { | ||
208 | + return_ACPI_STATUS(AE_NO_MEMORY); | ||
209 | + } | ||
210 | + | ||
211 | + /* Map the entire table and copy it */ | ||
212 | + | ||
213 | + table = acpi_os_map_memory(obj_desc->region.address, length); | ||
214 | + if (!table) { | ||
215 | + ACPI_FREE(table_desc.pointer); | ||
216 | + return_ACPI_STATUS(AE_NO_MEMORY); | ||
217 | + } | ||
218 | + | ||
219 | + ACPI_MEMCPY(table_desc.pointer, table, length); | ||
220 | + acpi_os_unmap_memory(table, length); | ||
221 | + | ||
222 | table_desc.address = obj_desc->region.address; | ||
223 | - table_desc.length = obj_desc->region.length; | ||
224 | - table_desc.flags = ACPI_TABLE_ORIGIN_MAPPED; | ||
225 | break; | ||
226 | |||
227 | case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */ | ||
228 | |||
229 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
230 | - "Load from Buffer or Field %p %s\n", obj_desc, | ||
231 | - acpi_ut_get_object_type_name(obj_desc))); | ||
232 | - | ||
233 | - length = obj_desc->buffer.length; | ||
234 | + "Load table from Buffer or Field %p\n", | ||
235 | + obj_desc)); | ||
236 | |||
237 | /* Must have at least an ACPI table header */ | ||
238 | |||
239 | - if (length < sizeof(struct acpi_table_header)) { | ||
240 | + if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) { | ||
241 | return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); | ||
242 | } | ||
243 | |||
244 | - /* Validate checksum here. It won't get validated in tb_add_table */ | ||
245 | + /* Get the actual table length from the table header */ | ||
246 | |||
247 | - status = | ||
248 | - acpi_tb_verify_checksum(ACPI_CAST_PTR | ||
249 | - (struct acpi_table_header, | ||
250 | - obj_desc->buffer.pointer), length); | ||
251 | - if (ACPI_FAILURE(status)) { | ||
252 | - return_ACPI_STATUS(status); | ||
253 | + table = | ||
254 | + ACPI_CAST_PTR(struct acpi_table_header, | ||
255 | + obj_desc->buffer.pointer); | ||
256 | + length = table->length; | ||
257 | + | ||
258 | + /* Table cannot extend beyond the buffer */ | ||
259 | + | ||
260 | + if (length > obj_desc->buffer.length) { | ||
261 | + return_ACPI_STATUS(AE_AML_BUFFER_LIMIT); | ||
262 | + } | ||
263 | + if (length < sizeof(struct acpi_table_header)) { | ||
264 | + return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); | ||
265 | } | ||
266 | |||
267 | /* | ||
268 | - * We need to copy the buffer since the original buffer could be | ||
269 | - * changed or deleted in the future | ||
270 | + * Copy the table from the buffer because the buffer could be modified | ||
271 | + * or even deleted in the future | ||
272 | */ | ||
273 | table_desc.pointer = ACPI_ALLOCATE(length); | ||
274 | if (!table_desc.pointer) { | ||
275 | return_ACPI_STATUS(AE_NO_MEMORY); | ||
276 | } | ||
277 | |||
278 | - ACPI_MEMCPY(table_desc.pointer, obj_desc->buffer.pointer, | ||
279 | - length); | ||
280 | - table_desc.length = length; | ||
281 | - table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED; | ||
282 | + ACPI_MEMCPY(table_desc.pointer, table, length); | ||
283 | + table_desc.address = ACPI_TO_INTEGER(table_desc.pointer); | ||
284 | break; | ||
285 | |||
286 | default: | ||
287 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | ||
288 | } | ||
289 | |||
290 | - /* | ||
291 | - * Install the new table into the local data structures | ||
292 | - */ | ||
293 | + /* Validate table checksum (will not get validated in tb_add_table) */ | ||
294 | + | ||
295 | + status = acpi_tb_verify_checksum(table_desc.pointer, length); | ||
296 | + if (ACPI_FAILURE(status)) { | ||
297 | + ACPI_FREE(table_desc.pointer); | ||
298 | + return_ACPI_STATUS(status); | ||
299 | + } | ||
300 | + | ||
301 | + /* Complete the table descriptor */ | ||
302 | + | ||
303 | + table_desc.length = length; | ||
304 | + table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED; | ||
305 | + | ||
306 | + /* Install the new table into the local data structures */ | ||
307 | + | ||
308 | status = acpi_tb_add_table(&table_desc, &table_index); | ||
309 | if (ACPI_FAILURE(status)) { | ||
310 | goto cleanup; | ||
311 | @@ -379,7 +430,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | ||
312 | /* | ||
313 | * Add the table to the namespace. | ||
314 | * | ||
315 | - * Note: We load the table objects relative to the root of the namespace. | ||
316 | + * Note: Load the table objects relative to the root of the namespace. | ||
317 | * This appears to go against the ACPI specification, but we do it for | ||
318 | * compatibility with other ACPI implementations. | ||
319 | */ | ||
320 | @@ -415,7 +466,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | ||
321 | cleanup: | ||
322 | if (ACPI_FAILURE(status)) { | ||
323 | |||
324 | - /* Delete allocated buffer or mapping */ | ||
325 | + /* Delete allocated table buffer */ | ||
326 | |||
327 | acpi_tb_delete_table(&table_desc); | ||
328 | } | ||
329 | diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c | ||
330 | index 38be586..f3cc376 100644 | ||
331 | --- a/drivers/acpi/namespace/nsxfeval.c | ||
332 | +++ b/drivers/acpi/namespace/nsxfeval.c | ||
333 | @@ -45,9 +45,14 @@ | ||
334 | #include <acpi/acpi.h> | ||
335 | #include <acpi/acnamesp.h> | ||
336 | #include <acpi/acinterp.h> | ||
337 | +#include <acpi/amlcode.h> | ||
338 | |||
339 | #define _COMPONENT ACPI_NAMESPACE | ||
340 | ACPI_MODULE_NAME("nsxfeval") | ||
341 | + | ||
342 | +/* Local prototypes */ | ||
343 | +static void acpi_ns_resolve_references(struct acpi_evaluate_info *info); | ||
344 | + | ||
345 | #ifdef ACPI_FUTURE_USAGE | ||
346 | /******************************************************************************* | ||
347 | * | ||
348 | @@ -69,6 +74,7 @@ ACPI_MODULE_NAME("nsxfeval") | ||
349 | * be valid (non-null) | ||
350 | * | ||
351 | ******************************************************************************/ | ||
352 | + | ||
353 | acpi_status | ||
354 | acpi_evaluate_object_typed(acpi_handle handle, | ||
355 | acpi_string pathname, | ||
356 | @@ -283,6 +289,10 @@ acpi_evaluate_object(acpi_handle handle, | ||
357 | |||
358 | if (ACPI_SUCCESS(status)) { | ||
359 | |||
360 | + /* Dereference Index and ref_of references */ | ||
361 | + | ||
362 | + acpi_ns_resolve_references(info); | ||
363 | + | ||
364 | /* Get the size of the returned object */ | ||
365 | |||
366 | status = | ||
367 | @@ -352,6 +362,74 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object) | ||
368 | |||
369 | /******************************************************************************* | ||
370 | * | ||
371 | + * FUNCTION: acpi_ns_resolve_references | ||
372 | + * | ||
373 | + * PARAMETERS: Info - Evaluation info block | ||
374 | + * | ||
375 | + * RETURN: Info->return_object is replaced with the dereferenced object | ||
376 | + * | ||
377 | + * DESCRIPTION: Dereference certain reference objects. Called before an | ||
378 | + * internal return object is converted to an external union acpi_object. | ||
379 | + * | ||
380 | + * Performs an automatic dereference of Index and ref_of reference objects. | ||
381 | + * These reference objects are not supported by the union acpi_object, so this is a | ||
382 | + * last resort effort to return something useful. Also, provides compatibility | ||
383 | + * with other ACPI implementations. | ||
384 | + * | ||
385 | + * NOTE: does not handle references within returned package objects or nested | ||
386 | + * references, but this support could be added later if found to be necessary. | ||
387 | + * | ||
388 | + ******************************************************************************/ | ||
389 | +static void acpi_ns_resolve_references(struct acpi_evaluate_info *info) | ||
390 | +{ | ||
391 | + union acpi_operand_object *obj_desc = NULL; | ||
392 | + struct acpi_namespace_node *node; | ||
393 | + | ||
394 | + /* We are interested in reference objects only */ | ||
395 | + | ||
396 | + if (ACPI_GET_OBJECT_TYPE(info->return_object) != | ||
397 | + ACPI_TYPE_LOCAL_REFERENCE) { | ||
398 | + return; | ||
399 | + } | ||
400 | + | ||
401 | + /* | ||
402 | + * Two types of references are supported - those created by Index and | ||
403 | + * ref_of operators. A name reference (AML_NAMEPATH_OP) can be converted | ||
404 | + * to an union acpi_object, so it is not dereferenced here. A ddb_handle | ||
405 | + * (AML_LOAD_OP) cannot be dereferenced, nor can it be converted to | ||
406 | + * an union acpi_object. | ||
407 | + */ | ||
408 | + switch (info->return_object->reference.opcode) { | ||
409 | + case AML_INDEX_OP: | ||
410 | + | ||
411 | + obj_desc = *(info->return_object->reference.where); | ||
412 | + break; | ||
413 | + | ||
414 | + case AML_REF_OF_OP: | ||
415 | + | ||
416 | + node = info->return_object->reference.object; | ||
417 | + if (node) { | ||
418 | + obj_desc = node->object; | ||
419 | + } | ||
420 | + break; | ||
421 | + | ||
422 | + default: | ||
423 | + return; | ||
424 | + } | ||
425 | + | ||
426 | + /* Replace the existing reference object */ | ||
427 | + | ||
428 | + if (obj_desc) { | ||
429 | + acpi_ut_add_reference(obj_desc); | ||
430 | + acpi_ut_remove_reference(info->return_object); | ||
431 | + info->return_object = obj_desc; | ||
432 | + } | ||
433 | + | ||
434 | + return; | ||
435 | +} | ||
436 | + | ||
437 | +/******************************************************************************* | ||
438 | + * | ||
439 | * FUNCTION: acpi_walk_namespace | ||
440 | * | ||
441 | * PARAMETERS: Type - acpi_object_type to search for | ||
442 | @@ -379,6 +457,7 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object) | ||
443 | * function, etc. | ||
444 | * | ||
445 | ******************************************************************************/ | ||
446 | + | ||
447 | acpi_status | ||
448 | acpi_walk_namespace(acpi_object_type type, | ||
449 | acpi_handle start_object, | ||
450 | diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c | ||
451 | index 775c97a..a885295 100644 | ||
452 | --- a/drivers/acpi/tables.c | ||
453 | +++ b/drivers/acpi/tables.c | ||
454 | @@ -293,7 +293,12 @@ static void __init check_multiple_madt(void) | ||
455 | |||
456 | int __init acpi_table_init(void) | ||
457 | { | ||
458 | - acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); | ||
459 | + acpi_status status; | ||
460 | + | ||
461 | + status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); | ||
462 | + if (ACPI_FAILURE(status)) | ||
463 | + return 1; | ||
464 | + | ||
465 | check_multiple_madt(); | ||
466 | return 0; | ||
467 | } | ||
468 | diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c | ||
469 | index 0cc92ef..f5d7aec 100644 | ||
470 | --- a/drivers/acpi/tables/tbutils.c | ||
471 | +++ b/drivers/acpi/tables/tbutils.c | ||
472 | @@ -512,10 +512,9 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags) | ||
473 | if (ACPI_FAILURE(status)) { | ||
474 | ACPI_WARNING((AE_INFO, | ||
475 | "Truncating %u table entries!", | ||
476 | - (unsigned) | ||
477 | - (acpi_gbl_root_table_list.size - | ||
478 | - acpi_gbl_root_table_list. | ||
479 | - count))); | ||
480 | + (unsigned) (table_count - | ||
481 | + (acpi_gbl_root_table_list. | ||
482 | + count - 2)))); | ||
483 | break; | ||
484 | } | ||
485 | } | ||
486 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c | ||
487 | index 42e1e84..a953b5d 100644 | ||
488 | --- a/drivers/acpi/video.c | ||
489 | +++ b/drivers/acpi/video.c | ||
490 | @@ -36,6 +36,7 @@ | ||
491 | #include <linux/backlight.h> | ||
492 | #include <linux/thermal.h> | ||
493 | #include <linux/video_output.h> | ||
494 | +#include <linux/sort.h> | ||
495 | #include <asm/uaccess.h> | ||
496 | |||
497 | #include <acpi/acpi_bus.h> | ||
498 | @@ -632,6 +633,16 @@ acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) | ||
499 | } | ||
500 | |||
501 | /* | ||
502 | + * Simple comparison function used to sort backlight levels. | ||
503 | + */ | ||
504 | + | ||
505 | +static int | ||
506 | +acpi_video_cmp_level(const void *a, const void *b) | ||
507 | +{ | ||
508 | + return *(int *)a - *(int *)b; | ||
509 | +} | ||
510 | + | ||
511 | +/* | ||
512 | * Arg: | ||
513 | * device : video output device (LCD, CRT, ..) | ||
514 | * | ||
515 | @@ -682,6 +693,10 @@ acpi_video_init_brightness(struct acpi_video_device *device) | ||
516 | count++; | ||
517 | } | ||
518 | |||
519 | + /* don't sort the first two brightness levels */ | ||
520 | + sort(&br->levels[2], count - 2, sizeof(br->levels[2]), | ||
521 | + acpi_video_cmp_level, NULL); | ||
522 | + | ||
523 | if (count < 2) | ||
524 | goto out_free_levels; | ||
525 | |||
526 | @@ -997,7 +1012,7 @@ acpi_video_device_brightness_seq_show(struct seq_file *seq, void *offset) | ||
527 | } | ||
528 | |||
529 | seq_printf(seq, "levels: "); | ||
530 | - for (i = 0; i < dev->brightness->count; i++) | ||
531 | + for (i = 2; i < dev->brightness->count; i++) | ||
532 | seq_printf(seq, " %d", dev->brightness->levels[i]); | ||
533 | seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr); | ||
534 | |||
535 | @@ -1036,7 +1051,7 @@ acpi_video_device_write_brightness(struct file *file, | ||
536 | return -EFAULT; | ||
537 | |||
538 | /* validate through the list of available levels */ | ||
539 | - for (i = 0; i < dev->brightness->count; i++) | ||
540 | + for (i = 2; i < dev->brightness->count; i++) | ||
541 | if (level == dev->brightness->levels[i]) { | ||
542 | if (ACPI_SUCCESS | ||
543 | (acpi_video_device_lcd_set_level(dev, level))) | ||
544 | @@ -1689,7 +1704,7 @@ acpi_video_get_next_level(struct acpi_video_device *device, | ||
545 | max = max_below = 0; | ||
546 | min = min_above = 255; | ||
547 | /* Find closest level to level_current */ | ||
548 | - for (i = 0; i < device->brightness->count; i++) { | ||
549 | + for (i = 2; i < device->brightness->count; i++) { | ||
550 | l = device->brightness->levels[i]; | ||
551 | if (abs(l - level_current) < abs(delta)) { | ||
552 | delta = l - level_current; | ||
553 | @@ -1699,7 +1714,7 @@ acpi_video_get_next_level(struct acpi_video_device *device, | ||
554 | } | ||
555 | /* Ajust level_current to closest available level */ | ||
556 | level_current += delta; | ||
557 | - for (i = 0; i < device->brightness->count; i++) { | ||
558 | + for (i = 2; i < device->brightness->count; i++) { | ||
559 | l = device->brightness->levels[i]; | ||
560 | if (l < min) | ||
561 | min = l; | ||
562 | @@ -1983,6 +1998,12 @@ static int acpi_video_bus_add(struct acpi_device *device) | ||
563 | device->pnp.bus_id[3] = '0' + instance; | ||
564 | instance ++; | ||
565 | } | ||
566 | + /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */ | ||
567 | + if (!strcmp(device->pnp.bus_id, "VGA")) { | ||
568 | + if (instance) | ||
569 | + device->pnp.bus_id[3] = '0' + instance; | ||
570 | + instance++; | ||
571 | + } | ||
572 | |||
573 | video->device = device; | ||
574 | strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME); | ||
575 | diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c | ||
576 | index f1fe749..5eb23fa 100644 | ||
577 | --- a/drivers/char/agp/intel-agp.c | ||
578 | +++ b/drivers/char/agp/intel-agp.c | ||
579 | @@ -40,6 +40,8 @@ | ||
580 | #define PCI_DEVICE_ID_INTEL_Q45_IG 0x2E12 | ||
581 | #define PCI_DEVICE_ID_INTEL_G45_HB 0x2E20 | ||
582 | #define PCI_DEVICE_ID_INTEL_G45_IG 0x2E22 | ||
583 | +#define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30 | ||
584 | +#define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32 | ||
585 | |||
586 | /* cover 915 and 945 variants */ | ||
587 | #define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \ | ||
588 | @@ -63,7 +65,8 @@ | ||
589 | #define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_E_HB || \ | ||
590 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \ | ||
591 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \ | ||
592 | - agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB) | ||
593 | + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \ | ||
594 | + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB) | ||
595 | |||
596 | extern int agp_memory_reserved; | ||
597 | |||
598 | @@ -214,8 +217,8 @@ static int intel_i810_configure(void) | ||
599 | if (agp_bridge->driver->needs_scratch_page) { | ||
600 | for (i = 0; i < current_size->num_entries; i++) { | ||
601 | writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4)); | ||
602 | - readl(intel_private.registers+I810_PTE_BASE+(i*4)); /* PCI posting. */ | ||
603 | } | ||
604 | + readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI posting. */ | ||
605 | } | ||
606 | global_cache_flush(); | ||
607 | return 0; | ||
608 | @@ -775,8 +778,8 @@ static int intel_i830_configure(void) | ||
609 | if (agp_bridge->driver->needs_scratch_page) { | ||
610 | for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) { | ||
611 | writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4)); | ||
612 | - readl(intel_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ | ||
613 | } | ||
614 | + readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */ | ||
615 | } | ||
616 | |||
617 | global_cache_flush(); | ||
618 | @@ -991,8 +994,8 @@ static int intel_i915_configure(void) | ||
619 | if (agp_bridge->driver->needs_scratch_page) { | ||
620 | for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) { | ||
621 | writel(agp_bridge->scratch_page, intel_private.gtt+i); | ||
622 | - readl(intel_private.gtt+i); /* PCI Posting. */ | ||
623 | } | ||
624 | + readl(intel_private.gtt+i-1); /* PCI Posting. */ | ||
625 | } | ||
626 | |||
627 | global_cache_flush(); | ||
628 | @@ -1196,6 +1199,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) | ||
629 | case PCI_DEVICE_ID_INTEL_IGD_E_HB: | ||
630 | case PCI_DEVICE_ID_INTEL_Q45_HB: | ||
631 | case PCI_DEVICE_ID_INTEL_G45_HB: | ||
632 | + case PCI_DEVICE_ID_INTEL_G41_HB: | ||
633 | *gtt_offset = *gtt_size = MB(2); | ||
634 | break; | ||
635 | default: | ||
636 | @@ -2128,13 +2132,15 @@ static const struct intel_driver_description { | ||
637 | { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33", | ||
638 | NULL, &intel_g33_driver }, | ||
639 | { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG, 0, | ||
640 | - "Mobile Intel? GM45 Express", NULL, &intel_i965_driver }, | ||
641 | + "Mobile Intel® GM45 Express", NULL, &intel_i965_driver }, | ||
642 | { PCI_DEVICE_ID_INTEL_IGD_E_HB, PCI_DEVICE_ID_INTEL_IGD_E_IG, 0, | ||
643 | "Intel Integrated Graphics Device", NULL, &intel_i965_driver }, | ||
644 | { PCI_DEVICE_ID_INTEL_Q45_HB, PCI_DEVICE_ID_INTEL_Q45_IG, 0, | ||
645 | "Q45/Q43", NULL, &intel_i965_driver }, | ||
646 | { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0, | ||
647 | "G45/G43", NULL, &intel_i965_driver }, | ||
648 | + { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0, | ||
649 | + "G41", NULL, &intel_i965_driver }, | ||
650 | { 0, 0, 0, NULL, NULL, NULL } | ||
651 | }; | ||
652 | |||
653 | @@ -2332,6 +2338,7 @@ static struct pci_device_id agp_intel_pci_table[] = { | ||
654 | ID(PCI_DEVICE_ID_INTEL_IGD_E_HB), | ||
655 | ID(PCI_DEVICE_ID_INTEL_Q45_HB), | ||
656 | ID(PCI_DEVICE_ID_INTEL_G45_HB), | ||
657 | + ID(PCI_DEVICE_ID_INTEL_G41_HB), | ||
658 | { } | ||
659 | }; | ||
660 | |||
661 | diff --git a/drivers/char/vt.c b/drivers/char/vt.c | ||
662 | index d429499..372267d 100644 | ||
663 | --- a/drivers/char/vt.c | ||
664 | +++ b/drivers/char/vt.c | ||
665 | @@ -301,7 +301,7 @@ static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr) | ||
666 | d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); | ||
667 | s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr)); | ||
668 | scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row); | ||
669 | - scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_scrl_erase_char, | ||
670 | + scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char, | ||
671 | vc->vc_size_row * nr); | ||
672 | } | ||
673 | |||
674 | @@ -319,7 +319,7 @@ static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr) | ||
675 | s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); | ||
676 | step = vc->vc_cols * nr; | ||
677 | scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row); | ||
678 | - scr_memsetw(s, vc->vc_scrl_erase_char, 2 * step); | ||
679 | + scr_memsetw(s, vc->vc_video_erase_char, 2 * step); | ||
680 | } | ||
681 | |||
682 | static void do_update_region(struct vc_data *vc, unsigned long start, int count) | ||
683 | @@ -434,7 +434,6 @@ static void update_attr(struct vc_data *vc) | ||
684 | vc->vc_blink, vc->vc_underline, | ||
685 | vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic); | ||
686 | vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' '; | ||
687 | - vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' '; | ||
688 | } | ||
689 | |||
690 | /* Note: inverting the screen twice should revert to the original state */ | ||
691 | diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c | ||
692 | index 595759c..cd589ca 100644 | ||
693 | --- a/drivers/firewire/fw-ohci.c | ||
694 | +++ b/drivers/firewire/fw-ohci.c | ||
695 | @@ -226,7 +226,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card) | ||
696 | #define CONTEXT_DEAD 0x0800 | ||
697 | #define CONTEXT_ACTIVE 0x0400 | ||
698 | |||
699 | -#define OHCI1394_MAX_AT_REQ_RETRIES 0x2 | ||
700 | +#define OHCI1394_MAX_AT_REQ_RETRIES 0xf | ||
701 | #define OHCI1394_MAX_AT_RESP_RETRIES 0x2 | ||
702 | #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8 | ||
703 | |||
704 | diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c | ||
705 | index 64142c1..716370c 100644 | ||
706 | --- a/drivers/firewire/fw-sbp2.c | ||
707 | +++ b/drivers/firewire/fw-sbp2.c | ||
708 | @@ -350,15 +350,17 @@ static const struct { | ||
709 | .model = ~0, | ||
710 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | ||
711 | }, | ||
712 | - | ||
713 | /* | ||
714 | - * There are iPods (2nd gen, 3rd gen) with model_id == 0, but | ||
715 | - * these iPods do not feature the read_capacity bug according | ||
716 | - * to one report. Read_capacity behaviour as well as model_id | ||
717 | - * could change due to Apple-supplied firmware updates though. | ||
718 | + * iPod 2nd generation: needs 128k max transfer size workaround | ||
719 | + * iPod 3rd generation: needs fix capacity workaround | ||
720 | */ | ||
721 | - | ||
722 | - /* iPod 4th generation. */ { | ||
723 | + { | ||
724 | + .firmware_revision = 0x0a2700, | ||
725 | + .model = 0x000000, | ||
726 | + .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS | | ||
727 | + SBP2_WORKAROUND_FIX_CAPACITY, | ||
728 | + }, | ||
729 | + /* iPod 4th generation */ { | ||
730 | .firmware_revision = 0x0a2700, | ||
731 | .model = 0x000021, | ||
732 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
733 | @@ -1293,6 +1295,19 @@ static struct fw_driver sbp2_driver = { | ||
734 | .id_table = sbp2_id_table, | ||
735 | }; | ||
736 | |||
737 | +static void sbp2_unmap_scatterlist(struct device *card_device, | ||
738 | + struct sbp2_command_orb *orb) | ||
739 | +{ | ||
740 | + if (scsi_sg_count(orb->cmd)) | ||
741 | + dma_unmap_sg(card_device, scsi_sglist(orb->cmd), | ||
742 | + scsi_sg_count(orb->cmd), | ||
743 | + orb->cmd->sc_data_direction); | ||
744 | + | ||
745 | + if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT)) | ||
746 | + dma_unmap_single(card_device, orb->page_table_bus, | ||
747 | + sizeof(orb->page_table), DMA_TO_DEVICE); | ||
748 | +} | ||
749 | + | ||
750 | static unsigned int | ||
751 | sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data) | ||
752 | { | ||
753 | @@ -1372,15 +1387,7 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status) | ||
754 | |||
755 | dma_unmap_single(device->card->device, orb->base.request_bus, | ||
756 | sizeof(orb->request), DMA_TO_DEVICE); | ||
757 | - | ||
758 | - if (scsi_sg_count(orb->cmd) > 0) | ||
759 | - dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd), | ||
760 | - scsi_sg_count(orb->cmd), | ||
761 | - orb->cmd->sc_data_direction); | ||
762 | - | ||
763 | - if (orb->page_table_bus != 0) | ||
764 | - dma_unmap_single(device->card->device, orb->page_table_bus, | ||
765 | - sizeof(orb->page_table), DMA_TO_DEVICE); | ||
766 | + sbp2_unmap_scatterlist(device->card->device, orb); | ||
767 | |||
768 | orb->cmd->result = result; | ||
769 | orb->done(orb->cmd); | ||
770 | @@ -1530,8 +1537,10 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | ||
771 | orb->base.request_bus = | ||
772 | dma_map_single(device->card->device, &orb->request, | ||
773 | sizeof(orb->request), DMA_TO_DEVICE); | ||
774 | - if (dma_mapping_error(device->card->device, orb->base.request_bus)) | ||
775 | + if (dma_mapping_error(device->card->device, orb->base.request_bus)) { | ||
776 | + sbp2_unmap_scatterlist(device->card->device, orb); | ||
777 | goto out; | ||
778 | + } | ||
779 | |||
780 | sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, lu->generation, | ||
781 | lu->command_block_agent_address + SBP2_ORB_POINTER); | ||
782 | diff --git a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h | ||
783 | index 4320bf0..7fb8ab9 100644 | ||
784 | --- a/drivers/ieee1394/ohci1394.h | ||
785 | +++ b/drivers/ieee1394/ohci1394.h | ||
786 | @@ -26,7 +26,7 @@ | ||
787 | |||
788 | #define OHCI1394_DRIVER_NAME "ohci1394" | ||
789 | |||
790 | -#define OHCI1394_MAX_AT_REQ_RETRIES 0x2 | ||
791 | +#define OHCI1394_MAX_AT_REQ_RETRIES 0xf | ||
792 | #define OHCI1394_MAX_AT_RESP_RETRIES 0x2 | ||
793 | #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8 | ||
794 | #define OHCI1394_MAX_SELF_ID_ERRORS 16 | ||
795 | diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c | ||
796 | index bad46ea..0c0fdbb 100644 | ||
797 | --- a/drivers/ieee1394/sbp2.c | ||
798 | +++ b/drivers/ieee1394/sbp2.c | ||
799 | @@ -395,6 +395,16 @@ static const struct { | ||
800 | .model_id = SBP2_ROM_VALUE_WILDCARD, | ||
801 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | ||
802 | }, | ||
803 | + /* | ||
804 | + * iPod 2nd generation: needs 128k max transfer size workaround | ||
805 | + * iPod 3rd generation: needs fix capacity workaround | ||
806 | + */ | ||
807 | + { | ||
808 | + .firmware_revision = 0x0a2700, | ||
809 | + .model_id = 0x000000, | ||
810 | + .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS | | ||
811 | + SBP2_WORKAROUND_FIX_CAPACITY, | ||
812 | + }, | ||
813 | /* iPod 4th generation */ { | ||
814 | .firmware_revision = 0x0a2700, | ||
815 | .model_id = 0x000021, | ||
816 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c | ||
817 | index c2fcf28..61f5753 100644 | ||
818 | --- a/drivers/md/dm-mpath.c | ||
819 | +++ b/drivers/md/dm-mpath.c | ||
820 | @@ -427,13 +427,13 @@ static void process_queued_ios(struct work_struct *work) | ||
821 | __choose_pgpath(m); | ||
822 | |||
823 | pgpath = m->current_pgpath; | ||
824 | - m->pgpath_to_activate = m->current_pgpath; | ||
825 | |||
826 | if ((pgpath && !m->queue_io) || | ||
827 | (!pgpath && !m->queue_if_no_path)) | ||
828 | must_queue = 0; | ||
829 | |||
830 | - if (m->pg_init_required && !m->pg_init_in_progress) { | ||
831 | + if (m->pg_init_required && !m->pg_init_in_progress && pgpath) { | ||
832 | + m->pgpath_to_activate = pgpath; | ||
833 | m->pg_init_count++; | ||
834 | m->pg_init_required = 0; | ||
835 | m->pg_init_in_progress = 1; | ||
836 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
837 | index fe6eccd..60f3e59 100644 | ||
838 | --- a/drivers/md/md.c | ||
839 | +++ b/drivers/md/md.c | ||
840 | @@ -1454,6 +1454,11 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | ||
841 | if (find_rdev_nr(mddev, rdev->desc_nr)) | ||
842 | return -EBUSY; | ||
843 | } | ||
844 | + if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { | ||
845 | + printk(KERN_WARNING "md: %s: array is limited to %d devices\n", | ||
846 | + mdname(mddev), mddev->max_disks); | ||
847 | + return -EBUSY; | ||
848 | + } | ||
849 | bdevname(rdev->bdev,b); | ||
850 | while ( (s=strchr(b, '/')) != NULL) | ||
851 | *s = '!'; | ||
852 | @@ -2362,6 +2367,15 @@ static void analyze_sbs(mddev_t * mddev) | ||
853 | |||
854 | i = 0; | ||
855 | rdev_for_each(rdev, tmp, mddev) { | ||
856 | + if (rdev->desc_nr >= mddev->max_disks || | ||
857 | + i > mddev->max_disks) { | ||
858 | + printk(KERN_WARNING | ||
859 | + "md: %s: %s: only %d devices permitted\n", | ||
860 | + mdname(mddev), bdevname(rdev->bdev, b), | ||
861 | + mddev->max_disks); | ||
862 | + kick_rdev_from_array(rdev); | ||
863 | + continue; | ||
864 | + } | ||
865 | if (rdev != freshest) | ||
866 | if (super_types[mddev->major_version]. | ||
867 | validate_super(mddev, rdev)) { | ||
868 | @@ -2728,9 +2742,9 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | ||
869 | break; | ||
870 | case read_auto: | ||
871 | if (mddev->pers) { | ||
872 | - if (mddev->ro != 1) | ||
873 | + if (mddev->ro == 0) | ||
874 | err = do_md_stop(mddev, 1, 0); | ||
875 | - else | ||
876 | + else if (mddev->ro == 1) | ||
877 | err = restart_array(mddev); | ||
878 | if (err == 0) { | ||
879 | mddev->ro = 2; | ||
880 | @@ -2946,7 +2960,13 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len) | ||
881 | { | ||
882 | int major, minor; | ||
883 | char *e; | ||
884 | - if (!list_empty(&mddev->disks)) | ||
885 | + /* Changing the details of 'external' metadata is | ||
886 | + * always permitted. Otherwise there must be | ||
887 | + * no devices attached to the array. | ||
888 | + */ | ||
889 | + if (mddev->external && strncmp(buf, "external:", 9) == 0) | ||
890 | + ; | ||
891 | + else if (!list_empty(&mddev->disks)) | ||
892 | return -EBUSY; | ||
893 | |||
894 | if (cmd_match(buf, "none")) { | ||
895 | @@ -4450,13 +4470,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev) | ||
896 | * noticed in interrupt contexts ... | ||
897 | */ | ||
898 | |||
899 | - if (rdev->desc_nr == mddev->max_disks) { | ||
900 | - printk(KERN_WARNING "%s: can not hot-add to full array!\n", | ||
901 | - mdname(mddev)); | ||
902 | - err = -EBUSY; | ||
903 | - goto abort_unbind_export; | ||
904 | - } | ||
905 | - | ||
906 | rdev->raid_disk = -1; | ||
907 | |||
908 | md_update_sb(mddev, 1); | ||
909 | @@ -4470,9 +4483,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev) | ||
910 | md_new_event(mddev); | ||
911 | return 0; | ||
912 | |||
913 | -abort_unbind_export: | ||
914 | - unbind_rdev_from_array(rdev); | ||
915 | - | ||
916 | abort_export: | ||
917 | export_rdev(rdev); | ||
918 | return err; | ||
919 | diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c | ||
920 | index 616bcbd..13a8996 100644 | ||
921 | --- a/drivers/misc/eeepc-laptop.c | ||
922 | +++ b/drivers/misc/eeepc-laptop.c | ||
923 | @@ -381,7 +381,8 @@ static void notify_wlan(u32 *event) | ||
924 | static void notify_brn(void) | ||
925 | { | ||
926 | struct backlight_device *bd = eeepc_backlight_device; | ||
927 | - bd->props.brightness = read_brightness(bd); | ||
928 | + if (bd) | ||
929 | + bd->props.brightness = read_brightness(bd); | ||
930 | } | ||
931 | |||
932 | static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data) | ||
933 | diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h | ||
934 | index 619208d..bcf3782 100644 | ||
935 | --- a/drivers/misc/sgi-xp/xpc.h | ||
936 | +++ b/drivers/misc/sgi-xp/xpc.h | ||
937 | @@ -3,7 +3,7 @@ | ||
938 | * License. See the file "COPYING" in the main directory of this archive | ||
939 | * for more details. | ||
940 | * | ||
941 | - * Copyright (c) 2004-2008 Silicon Graphics, Inc. All Rights Reserved. | ||
942 | + * Copyright (c) 2004-2009 Silicon Graphics, Inc. All Rights Reserved. | ||
943 | */ | ||
944 | |||
945 | /* | ||
946 | @@ -502,7 +502,8 @@ struct xpc_channel_uv { | ||
947 | /* partition's notify mq */ | ||
948 | |||
949 | struct xpc_send_msg_slot_uv *send_msg_slots; | ||
950 | - struct xpc_notify_mq_msg_uv *recv_msg_slots; | ||
951 | + void *recv_msg_slots; /* each slot will hold a xpc_notify_mq_msg_uv */ | ||
952 | + /* structure plus the user's payload */ | ||
953 | |||
954 | struct xpc_fifo_head_uv msg_slot_free_list; | ||
955 | struct xpc_fifo_head_uv recv_msg_list; /* deliverable payloads */ | ||
956 | diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c | ||
957 | index b8f8d50..1bb8bc5 100644 | ||
958 | --- a/drivers/misc/sgi-xp/xpc_uv.c | ||
959 | +++ b/drivers/misc/sgi-xp/xpc_uv.c | ||
960 | @@ -3,7 +3,7 @@ | ||
961 | * License. See the file "COPYING" in the main directory of this archive | ||
962 | * for more details. | ||
963 | * | ||
964 | - * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. | ||
965 | + * Copyright (c) 2008-2009 Silicon Graphics, Inc. All Rights Reserved. | ||
966 | */ | ||
967 | |||
968 | /* | ||
969 | @@ -825,8 +825,8 @@ xpc_allocate_recv_msg_slot_uv(struct xpc_channel *ch) | ||
970 | continue; | ||
971 | |||
972 | for (entry = 0; entry < nentries; entry++) { | ||
973 | - msg_slot = ch_uv->recv_msg_slots + entry * | ||
974 | - ch->entry_size; | ||
975 | + msg_slot = ch_uv->recv_msg_slots + | ||
976 | + entry * ch->entry_size; | ||
977 | |||
978 | msg_slot->hdr.msg_slot_number = entry; | ||
979 | } | ||
980 | @@ -1123,9 +1123,8 @@ xpc_handle_notify_mq_msg_uv(struct xpc_partition *part, | ||
981 | /* we're dealing with a normal message sent via the notify_mq */ | ||
982 | ch_uv = &ch->sn.uv; | ||
983 | |||
984 | - msg_slot = (struct xpc_notify_mq_msg_uv *)((u64)ch_uv->recv_msg_slots + | ||
985 | - (msg->hdr.msg_slot_number % ch->remote_nentries) * | ||
986 | - ch->entry_size); | ||
987 | + msg_slot = ch_uv->recv_msg_slots + | ||
988 | + (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size; | ||
989 | |||
990 | BUG_ON(msg->hdr.msg_slot_number != msg_slot->hdr.msg_slot_number); | ||
991 | BUG_ON(msg_slot->hdr.size != 0); | ||
992 | diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c | ||
993 | index 872ea58..6b96357 100644 | ||
994 | --- a/drivers/net/e1000/e1000_main.c | ||
995 | +++ b/drivers/net/e1000/e1000_main.c | ||
996 | @@ -31,7 +31,7 @@ | ||
997 | |||
998 | char e1000_driver_name[] = "e1000"; | ||
999 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | ||
1000 | -#define DRV_VERSION "7.3.20-k3-NAPI" | ||
1001 | +#define DRV_VERSION "7.3.21-k3-NAPI" | ||
1002 | const char e1000_driver_version[] = DRV_VERSION; | ||
1003 | static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; | ||
1004 | |||
1005 | @@ -927,7 +927,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | ||
1006 | err = pci_enable_device(pdev); | ||
1007 | } else { | ||
1008 | bars = pci_select_bars(pdev, IORESOURCE_MEM); | ||
1009 | - err = pci_enable_device(pdev); | ||
1010 | + err = pci_enable_device_mem(pdev); | ||
1011 | } | ||
1012 | if (err) | ||
1013 | return err; | ||
1014 | @@ -3835,7 +3835,7 @@ static irqreturn_t e1000_intr(int irq, void *data) | ||
1015 | struct e1000_hw *hw = &adapter->hw; | ||
1016 | u32 rctl, icr = er32(ICR); | ||
1017 | |||
1018 | - if (unlikely(!icr)) | ||
1019 | + if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags))) | ||
1020 | return IRQ_NONE; /* Not our interrupt */ | ||
1021 | |||
1022 | /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is | ||
1023 | diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c | ||
1024 | index 6e42b5a..5790194 100644 | ||
1025 | --- a/drivers/net/usb/hso.c | ||
1026 | +++ b/drivers/net/usb/hso.c | ||
1027 | @@ -2047,7 +2047,7 @@ static void hso_create_rfkill(struct hso_device *hso_dev, | ||
1028 | char *rfkn; | ||
1029 | |||
1030 | hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev, | ||
1031 | - RFKILL_TYPE_WLAN); | ||
1032 | + RFKILL_TYPE_WWAN); | ||
1033 | if (!hso_net->rfkill) { | ||
1034 | dev_err(dev, "%s - Out of memory", __func__); | ||
1035 | return; | ||
1036 | diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c | ||
1037 | index dcce354..966c86c 100644 | ||
1038 | --- a/drivers/net/wireless/ipw2200.c | ||
1039 | +++ b/drivers/net/wireless/ipw2200.c | ||
1040 | @@ -4346,7 +4346,8 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv, | ||
1041 | return; | ||
1042 | } | ||
1043 | |||
1044 | - if (priv->status & STATUS_SCANNING) { | ||
1045 | + if (priv->status & STATUS_SCANNING && | ||
1046 | + missed_count > IPW_MB_SCAN_CANCEL_THRESHOLD) { | ||
1047 | /* Stop scan to keep fw from getting | ||
1048 | * stuck (only if we aren't roaming -- | ||
1049 | * otherwise we'll never scan more than 2 or 3 | ||
1050 | @@ -6276,6 +6277,20 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | ||
1051 | } | ||
1052 | } | ||
1053 | |||
1054 | +static int ipw_passive_dwell_time(struct ipw_priv *priv) | ||
1055 | +{ | ||
1056 | + /* staying on passive channels longer than the DTIM interval during a | ||
1057 | + * scan, while associated, causes the firmware to cancel the scan | ||
1058 | + * without notification. Hence, don't stay on passive channels longer | ||
1059 | + * than the beacon interval. | ||
1060 | + */ | ||
1061 | + if (priv->status & STATUS_ASSOCIATED | ||
1062 | + && priv->assoc_network->beacon_interval > 10) | ||
1063 | + return priv->assoc_network->beacon_interval - 10; | ||
1064 | + else | ||
1065 | + return 120; | ||
1066 | +} | ||
1067 | + | ||
1068 | static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) | ||
1069 | { | ||
1070 | struct ipw_scan_request_ext scan; | ||
1071 | @@ -6319,16 +6334,16 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) | ||
1072 | scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); | ||
1073 | |||
1074 | if (type == IW_SCAN_TYPE_PASSIVE) { | ||
1075 | - IPW_DEBUG_WX("use passive scanning\n"); | ||
1076 | - scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN; | ||
1077 | + IPW_DEBUG_WX("use passive scanning\n"); | ||
1078 | + scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN; | ||
1079 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = | ||
1080 | - cpu_to_le16(120); | ||
1081 | + cpu_to_le16(ipw_passive_dwell_time(priv)); | ||
1082 | ipw_add_scan_channels(priv, &scan, scan_type); | ||
1083 | goto send_request; | ||
1084 | } | ||
1085 | |||
1086 | /* Use active scan by default. */ | ||
1087 | - if (priv->config & CFG_SPEED_SCAN) | ||
1088 | + if (priv->config & CFG_SPEED_SCAN) | ||
1089 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = | ||
1090 | cpu_to_le16(30); | ||
1091 | else | ||
1092 | @@ -6338,7 +6353,8 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) | ||
1093 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = | ||
1094 | cpu_to_le16(20); | ||
1095 | |||
1096 | - scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); | ||
1097 | + scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = | ||
1098 | + cpu_to_le16(ipw_passive_dwell_time(priv)); | ||
1099 | scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20); | ||
1100 | |||
1101 | #ifdef CONFIG_IPW2200_MONITOR | ||
1102 | diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h | ||
1103 | index d4ab28b..60b4e71 100644 | ||
1104 | --- a/drivers/net/wireless/ipw2200.h | ||
1105 | +++ b/drivers/net/wireless/ipw2200.h | ||
1106 | @@ -244,6 +244,7 @@ enum connection_manager_assoc_states { | ||
1107 | #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED 31 | ||
1108 | |||
1109 | #define HOST_NOTIFICATION_STATUS_BEACON_MISSING 1 | ||
1110 | +#define IPW_MB_SCAN_CANCEL_THRESHOLD 3 | ||
1111 | #define IPW_MB_ROAMING_THRESHOLD_MIN 1 | ||
1112 | #define IPW_MB_ROAMING_THRESHOLD_DEFAULT 8 | ||
1113 | #define IPW_MB_ROAMING_THRESHOLD_MAX 30 | ||
1114 | diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c | ||
1115 | index 77baff0..3f2309f 100644 | ||
1116 | --- a/drivers/pci/pci-sysfs.c | ||
1117 | +++ b/drivers/pci/pci-sysfs.c | ||
1118 | @@ -694,8 +694,8 @@ pci_read_rom(struct kobject *kobj, struct bin_attribute *bin_attr, | ||
1119 | return -EINVAL; | ||
1120 | |||
1121 | rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */ | ||
1122 | - if (!rom) | ||
1123 | - return 0; | ||
1124 | + if (!rom || !size) | ||
1125 | + return -EIO; | ||
1126 | |||
1127 | if (off >= size) | ||
1128 | count = 0; | ||
1129 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c | ||
1130 | index 8a82a62..e4df84b 100644 | ||
1131 | --- a/drivers/pci/pcie/aspm.c | ||
1132 | +++ b/drivers/pci/pcie/aspm.c | ||
1133 | @@ -713,9 +713,9 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev) | ||
1134 | |||
1135 | /* | ||
1136 | * All PCIe functions are in one slot, remove one function will remove | ||
1137 | - * the the whole slot, so just wait | ||
1138 | + * the whole slot, so just wait until we are the last function left. | ||
1139 | */ | ||
1140 | - if (!list_empty(&parent->subordinate->devices)) | ||
1141 | + if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices)) | ||
1142 | goto out; | ||
1143 | |||
1144 | /* All functions are removed, so just disable ASPM for the link */ | ||
1145 | diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c | ||
1146 | index bd5c0e0..b2bac71 100644 | ||
1147 | --- a/drivers/pci/rom.c | ||
1148 | +++ b/drivers/pci/rom.c | ||
1149 | @@ -63,7 +63,7 @@ static void pci_disable_rom(struct pci_dev *pdev) | ||
1150 | * The PCI window size could be much larger than the | ||
1151 | * actual image size. | ||
1152 | */ | ||
1153 | -size_t pci_get_rom_size(void __iomem *rom, size_t size) | ||
1154 | +size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) | ||
1155 | { | ||
1156 | void __iomem *image; | ||
1157 | int last_image; | ||
1158 | @@ -72,8 +72,10 @@ size_t pci_get_rom_size(void __iomem *rom, size_t size) | ||
1159 | do { | ||
1160 | void __iomem *pds; | ||
1161 | /* Standard PCI ROMs start out with these bytes 55 AA */ | ||
1162 | - if (readb(image) != 0x55) | ||
1163 | + if (readb(image) != 0x55) { | ||
1164 | + dev_err(&pdev->dev, "Invalid ROM contents\n"); | ||
1165 | break; | ||
1166 | + } | ||
1167 | if (readb(image + 1) != 0xAA) | ||
1168 | break; | ||
1169 | /* get the PCI data structure and check its signature */ | ||
1170 | @@ -158,7 +160,7 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | ||
1171 | * size is much larger than the actual size of the ROM. | ||
1172 | * True size is important if the ROM is going to be copied. | ||
1173 | */ | ||
1174 | - *size = pci_get_rom_size(rom, *size); | ||
1175 | + *size = pci_get_rom_size(pdev, rom, *size); | ||
1176 | return rom; | ||
1177 | } | ||
1178 | |||
1179 | diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c | ||
1180 | index fd0695b..056071d 100644 | ||
1181 | --- a/drivers/serial/8250_pci.c | ||
1182 | +++ b/drivers/serial/8250_pci.c | ||
1183 | @@ -599,6 +599,10 @@ static int pci_netmos_init(struct pci_dev *dev) | ||
1184 | /* subdevice 0x00PS means <P> parallel, <S> serial */ | ||
1185 | unsigned int num_serial = dev->subsystem_device & 0xf; | ||
1186 | |||
1187 | + if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM && | ||
1188 | + dev->subsystem_device == 0x0299) | ||
1189 | + return 0; | ||
1190 | + | ||
1191 | if (num_serial == 0) | ||
1192 | return -ENODEV; | ||
1193 | return num_serial; | ||
1194 | @@ -766,6 +770,8 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board, | ||
1195 | #define PCI_SUBDEVICE_ID_OCTPRO422 0x0208 | ||
1196 | #define PCI_SUBDEVICE_ID_POCTAL232 0x0308 | ||
1197 | #define PCI_SUBDEVICE_ID_POCTAL422 0x0408 | ||
1198 | +#define PCI_VENDOR_ID_ADVANTECH 0x13fe | ||
1199 | +#define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620 | ||
1200 | |||
1201 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ | ||
1202 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 | ||
1203 | @@ -2051,6 +2057,10 @@ static int pciserial_resume_one(struct pci_dev *dev) | ||
1204 | #endif | ||
1205 | |||
1206 | static struct pci_device_id serial_pci_tbl[] = { | ||
1207 | + /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */ | ||
1208 | + { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620, | ||
1209 | + PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0, | ||
1210 | + pbn_b2_8_921600 }, | ||
1211 | { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, | ||
1212 | PCI_SUBVENDOR_ID_CONNECT_TECH, | ||
1213 | PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0, | ||
1214 | @@ -2294,6 +2304,9 @@ static struct pci_device_id serial_pci_tbl[] = { | ||
1215 | * For now just used the hex ID 0x950a. | ||
1216 | */ | ||
1217 | { PCI_VENDOR_ID_OXSEMI, 0x950a, | ||
1218 | + PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL, 0, 0, | ||
1219 | + pbn_b0_2_115200 }, | ||
1220 | + { PCI_VENDOR_ID_OXSEMI, 0x950a, | ||
1221 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
1222 | pbn_b0_2_1130000 }, | ||
1223 | { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954, | ||
1224 | @@ -2846,6 +2859,10 @@ static struct pci_device_id serial_pci_tbl[] = { | ||
1225 | 0, | ||
1226 | pbn_b0_8_115200 }, | ||
1227 | |||
1228 | + { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, | ||
1229 | + PCI_VENDOR_ID_IBM, 0x0299, | ||
1230 | + 0, 0, pbn_b0_bt_2_115200 }, | ||
1231 | + | ||
1232 | /* | ||
1233 | * These entries match devices with class COMMUNICATION_SERIAL, | ||
1234 | * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL | ||
1235 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
1236 | index b205311..876bf36 100644 | ||
1237 | --- a/drivers/usb/serial/option.c | ||
1238 | +++ b/drivers/usb/serial/option.c | ||
1239 | @@ -192,14 +192,15 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | ||
1240 | #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 | ||
1241 | |||
1242 | /* FUTURE NOVATEL PRODUCTS */ | ||
1243 | -#define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000 | ||
1244 | -#define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000 | ||
1245 | -#define NOVATELWIRELESS_PRODUCT_EMBEDDED_1 0x8000 | ||
1246 | -#define NOVATELWIRELESS_PRODUCT_GLOBAL_1 0x9000 | ||
1247 | -#define NOVATELWIRELESS_PRODUCT_EVDO_2 0x6001 | ||
1248 | -#define NOVATELWIRELESS_PRODUCT_HSPA_2 0x7001 | ||
1249 | -#define NOVATELWIRELESS_PRODUCT_EMBEDDED_2 0x8001 | ||
1250 | -#define NOVATELWIRELESS_PRODUCT_GLOBAL_2 0x9001 | ||
1251 | +#define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED 0X6000 | ||
1252 | +#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED 0X6001 | ||
1253 | +#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED 0X7000 | ||
1254 | +#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED 0X7001 | ||
1255 | +#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED 0X8000 | ||
1256 | +#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0X8001 | ||
1257 | +#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0X9000 | ||
1258 | +#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0X9001 | ||
1259 | +#define NOVATELWIRELESS_PRODUCT_GLOBAL 0XA001 | ||
1260 | |||
1261 | /* AMOI PRODUCTS */ | ||
1262 | #define AMOI_VENDOR_ID 0x1614 | ||
1263 | @@ -209,6 +210,27 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | ||
1264 | |||
1265 | #define DELL_VENDOR_ID 0x413C | ||
1266 | |||
1267 | +/* Dell modems */ | ||
1268 | +#define DELL_PRODUCT_5700_MINICARD 0x8114 | ||
1269 | +#define DELL_PRODUCT_5500_MINICARD 0x8115 | ||
1270 | +#define DELL_PRODUCT_5505_MINICARD 0x8116 | ||
1271 | +#define DELL_PRODUCT_5700_EXPRESSCARD 0x8117 | ||
1272 | +#define DELL_PRODUCT_5510_EXPRESSCARD 0x8118 | ||
1273 | + | ||
1274 | +#define DELL_PRODUCT_5700_MINICARD_SPRINT 0x8128 | ||
1275 | +#define DELL_PRODUCT_5700_MINICARD_TELUS 0x8129 | ||
1276 | + | ||
1277 | +#define DELL_PRODUCT_5720_MINICARD_VZW 0x8133 | ||
1278 | +#define DELL_PRODUCT_5720_MINICARD_SPRINT 0x8134 | ||
1279 | +#define DELL_PRODUCT_5720_MINICARD_TELUS 0x8135 | ||
1280 | +#define DELL_PRODUCT_5520_MINICARD_CINGULAR 0x8136 | ||
1281 | +#define DELL_PRODUCT_5520_MINICARD_GENERIC_L 0x8137 | ||
1282 | +#define DELL_PRODUCT_5520_MINICARD_GENERIC_I 0x8138 | ||
1283 | + | ||
1284 | +#define DELL_PRODUCT_5730_MINICARD_SPRINT 0x8180 | ||
1285 | +#define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181 | ||
1286 | +#define DELL_PRODUCT_5730_MINICARD_VZW 0x8182 | ||
1287 | + | ||
1288 | #define KYOCERA_VENDOR_ID 0x0c88 | ||
1289 | #define KYOCERA_PRODUCT_KPC650 0x17da | ||
1290 | #define KYOCERA_PRODUCT_KPC680 0x180a | ||
1291 | @@ -267,12 +289,6 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | ||
1292 | #define ERICSSON_VENDOR_ID 0x0bdb | ||
1293 | #define ERICSSON_PRODUCT_F3507G 0x1900 | ||
1294 | |||
1295 | -/* Pantech products */ | ||
1296 | -#define PANTECH_VENDOR_ID 0x106c | ||
1297 | -#define PANTECH_PRODUCT_PC5740 0x3701 | ||
1298 | -#define PANTECH_PRODUCT_PC5750 0x3702 /* PX-500 */ | ||
1299 | -#define PANTECH_PRODUCT_UM150 0x3711 | ||
1300 | - | ||
1301 | static struct usb_device_id option_ids[] = { | ||
1302 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | ||
1303 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | ||
1304 | @@ -383,31 +399,37 @@ static struct usb_device_id option_ids[] = { | ||
1305 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ | ||
1306 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ | ||
1307 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ | ||
1308 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */ | ||
1309 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */ | ||
1310 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */ | ||
1311 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */ | ||
1312 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */ | ||
1313 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */ | ||
1314 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */ | ||
1315 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */ | ||
1316 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */ | ||
1317 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */ | ||
1318 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */ | ||
1319 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */ | ||
1320 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */ | ||
1321 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */ | ||
1322 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */ | ||
1323 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */ | ||
1324 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */ | ||
1325 | |||
1326 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) }, | ||
1327 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) }, | ||
1328 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) }, | ||
1329 | |||
1330 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */ | ||
1331 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | ||
1332 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | ||
1333 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */ | ||
1334 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */ | ||
1335 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */ | ||
1336 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */ | ||
1337 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ | ||
1338 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ | ||
1339 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ | ||
1340 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ | ||
1341 | - { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */ | ||
1342 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */ | ||
1343 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | ||
1344 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | ||
1345 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */ | ||
1346 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */ | ||
1347 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */ | ||
1348 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */ | ||
1349 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ | ||
1350 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ | ||
1351 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ | ||
1352 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ | ||
1353 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) }, /* Dell Wireless HSDPA 5520 */ | ||
1354 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ | ||
1355 | + { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */ | ||
1356 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ | ||
1357 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ | ||
1358 | + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ | ||
1359 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ | ||
1360 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | ||
1361 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, | ||
1362 | @@ -476,9 +498,6 @@ static struct usb_device_id option_ids[] = { | ||
1363 | { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) }, | ||
1364 | { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) }, | ||
1365 | { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) }, | ||
1366 | - { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) }, | ||
1367 | - { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) }, | ||
1368 | - { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) }, | ||
1369 | { } /* Terminating entry */ | ||
1370 | }; | ||
1371 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
1372 | diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c | ||
1373 | index 9a3e495..d8c41ae 100644 | ||
1374 | --- a/drivers/usb/serial/ti_usb_3410_5052.c | ||
1375 | +++ b/drivers/usb/serial/ti_usb_3410_5052.c | ||
1376 | @@ -227,25 +227,32 @@ static unsigned int product_5052_count; | ||
1377 | /* the array dimension is the number of default entries plus */ | ||
1378 | /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */ | ||
1379 | /* null entry */ | ||
1380 | -static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = { | ||
1381 | +static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = { | ||
1382 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | ||
1383 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | ||
1384 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, | ||
1385 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, | ||
1386 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, | ||
1387 | }; | ||
1388 | |||
1389 | -static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { | ||
1390 | +static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = { | ||
1391 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, | ||
1392 | { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, | ||
1393 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, | ||
1394 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, | ||
1395 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, | ||
1396 | }; | ||
1397 | |||
1398 | -static struct usb_device_id ti_id_table_combined[] = { | ||
1399 | +static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = { | ||
1400 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | ||
1401 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | ||
1402 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, | ||
1403 | { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, | ||
1404 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, | ||
1405 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, | ||
1406 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, | ||
1407 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, | ||
1408 | + { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, | ||
1409 | { } | ||
1410 | }; | ||
1411 | |||
1412 | diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h | ||
1413 | index b5541bf..d4e4d7e 100644 | ||
1414 | --- a/drivers/usb/serial/ti_usb_3410_5052.h | ||
1415 | +++ b/drivers/usb/serial/ti_usb_3410_5052.h | ||
1416 | @@ -27,7 +27,11 @@ | ||
1417 | |||
1418 | /* Vendor and product ids */ | ||
1419 | #define TI_VENDOR_ID 0x0451 | ||
1420 | +#define IBM_VENDOR_ID 0x04b3 | ||
1421 | #define TI_3410_PRODUCT_ID 0x3410 | ||
1422 | +#define IBM_4543_PRODUCT_ID 0x4543 | ||
1423 | +#define IBM_454B_PRODUCT_ID 0x454b | ||
1424 | +#define IBM_454C_PRODUCT_ID 0x454c | ||
1425 | #define TI_3410_EZ430_ID 0xF430 /* TI ez430 development tool */ | ||
1426 | #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */ | ||
1427 | #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */ | ||
1428 | diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c | ||
1429 | index 620c2b5..8daaace 100644 | ||
1430 | --- a/drivers/usb/storage/scsiglue.c | ||
1431 | +++ b/drivers/usb/storage/scsiglue.c | ||
1432 | @@ -64,6 +64,7 @@ | ||
1433 | */ | ||
1434 | #define VENDOR_ID_NOKIA 0x0421 | ||
1435 | #define VENDOR_ID_NIKON 0x04b0 | ||
1436 | +#define VENDOR_ID_PENTAX 0x0a17 | ||
1437 | #define VENDOR_ID_MOTOROLA 0x22b8 | ||
1438 | |||
1439 | /*********************************************************************** | ||
1440 | @@ -150,6 +151,7 @@ static int slave_configure(struct scsi_device *sdev) | ||
1441 | switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) { | ||
1442 | case VENDOR_ID_NOKIA: | ||
1443 | case VENDOR_ID_NIKON: | ||
1444 | + case VENDOR_ID_PENTAX: | ||
1445 | case VENDOR_ID_MOTOROLA: | ||
1446 | if (!(us->fflags & (US_FL_FIX_CAPACITY | | ||
1447 | US_FL_CAPACITY_OK))) | ||
1448 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h | ||
1449 | index aae786c..d775cfe 100644 | ||
1450 | --- a/drivers/usb/storage/unusual_devs.h | ||
1451 | +++ b/drivers/usb/storage/unusual_devs.h | ||
1452 | @@ -1381,21 +1381,6 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000, | ||
1453 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1454 | US_FL_FIX_INQUIRY ), | ||
1455 | |||
1456 | - | ||
1457 | -/* Submitted by Per Winkvist <per.winkvist@uk.com> */ | ||
1458 | -UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff, | ||
1459 | - "Pentax", | ||
1460 | - "Optio S/S4", | ||
1461 | - US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1462 | - US_FL_FIX_INQUIRY ), | ||
1463 | - | ||
1464 | -/* Reported by Jaak Ristioja <Ristioja@gmail.com> */ | ||
1465 | -UNUSUAL_DEV( 0x0a17, 0x006e, 0x0100, 0x0100, | ||
1466 | - "Pentax", | ||
1467 | - "K10D", | ||
1468 | - US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1469 | - US_FL_FIX_CAPACITY ), | ||
1470 | - | ||
1471 | /* These are virtual windows driver CDs, which the zd1211rw driver | ||
1472 | * automatically converts into WLAN devices. */ | ||
1473 | UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101, | ||
1474 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c | ||
1475 | index 038ea62..93a080e 100644 | ||
1476 | --- a/drivers/video/console/fbcon.c | ||
1477 | +++ b/drivers/video/console/fbcon.c | ||
1478 | @@ -1855,8 +1855,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | ||
1479 | struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; | ||
1480 | struct display *p = &fb_display[vc->vc_num]; | ||
1481 | int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK; | ||
1482 | - unsigned short saved_ec; | ||
1483 | - int ret; | ||
1484 | |||
1485 | if (fbcon_is_inactive(vc, info)) | ||
1486 | return -EINVAL; | ||
1487 | @@ -1869,11 +1867,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | ||
1488 | * whole screen (prevents flicker). | ||
1489 | */ | ||
1490 | |||
1491 | - saved_ec = vc->vc_video_erase_char; | ||
1492 | - vc->vc_video_erase_char = vc->vc_scrl_erase_char; | ||
1493 | - | ||
1494 | - ret = 0; | ||
1495 | - | ||
1496 | switch (dir) { | ||
1497 | case SM_UP: | ||
1498 | if (count > vc->vc_rows) /* Maximum realistic size */ | ||
1499 | @@ -1890,9 +1883,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | ||
1500 | scr_memsetw((unsigned short *) (vc->vc_origin + | ||
1501 | vc->vc_size_row * | ||
1502 | (b - count)), | ||
1503 | - vc->vc_scrl_erase_char, | ||
1504 | + vc->vc_video_erase_char, | ||
1505 | vc->vc_size_row * count); | ||
1506 | - ret = 1; | ||
1507 | + return 1; | ||
1508 | break; | ||
1509 | |||
1510 | case SCROLL_WRAP_MOVE: | ||
1511 | @@ -1962,10 +1955,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | ||
1512 | scr_memsetw((unsigned short *) (vc->vc_origin + | ||
1513 | vc->vc_size_row * | ||
1514 | (b - count)), | ||
1515 | - vc->vc_scrl_erase_char, | ||
1516 | + vc->vc_video_erase_char, | ||
1517 | vc->vc_size_row * count); | ||
1518 | - ret = 1; | ||
1519 | - break; | ||
1520 | + return 1; | ||
1521 | } | ||
1522 | break; | ||
1523 | |||
1524 | @@ -1982,9 +1974,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | ||
1525 | scr_memsetw((unsigned short *) (vc->vc_origin + | ||
1526 | vc->vc_size_row * | ||
1527 | t), | ||
1528 | - vc->vc_scrl_erase_char, | ||
1529 | + vc->vc_video_erase_char, | ||
1530 | vc->vc_size_row * count); | ||
1531 | - ret = 1; | ||
1532 | + return 1; | ||
1533 | break; | ||
1534 | |||
1535 | case SCROLL_WRAP_MOVE: | ||
1536 | @@ -2052,15 +2044,12 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | ||
1537 | scr_memsetw((unsigned short *) (vc->vc_origin + | ||
1538 | vc->vc_size_row * | ||
1539 | t), | ||
1540 | - vc->vc_scrl_erase_char, | ||
1541 | + vc->vc_video_erase_char, | ||
1542 | vc->vc_size_row * count); | ||
1543 | - ret = 1; | ||
1544 | - break; | ||
1545 | + return 1; | ||
1546 | } | ||
1547 | - break; | ||
1548 | } | ||
1549 | - vc->vc_video_erase_char = saved_ec; | ||
1550 | - return ret; | ||
1551 | + return 0; | ||
1552 | } | ||
1553 | |||
1554 | |||
1555 | @@ -2522,9 +2511,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, | ||
1556 | c = vc->vc_video_erase_char; | ||
1557 | vc->vc_video_erase_char = | ||
1558 | ((c & 0xfe00) >> 1) | (c & 0xff); | ||
1559 | - c = vc->vc_scrl_erase_char; | ||
1560 | - vc->vc_scrl_erase_char = | ||
1561 | - ((c & 0xFE00) >> 1) | (c & 0xFF); | ||
1562 | vc->vc_attr >>= 1; | ||
1563 | } | ||
1564 | } else if (!vc->vc_hi_font_mask && cnt == 512) { | ||
1565 | @@ -2555,14 +2541,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, | ||
1566 | if (vc->vc_can_do_color) { | ||
1567 | vc->vc_video_erase_char = | ||
1568 | ((c & 0xff00) << 1) | (c & 0xff); | ||
1569 | - c = vc->vc_scrl_erase_char; | ||
1570 | - vc->vc_scrl_erase_char = | ||
1571 | - ((c & 0xFF00) << 1) | (c & 0xFF); | ||
1572 | vc->vc_attr <<= 1; | ||
1573 | - } else { | ||
1574 | + } else | ||
1575 | vc->vc_video_erase_char = c & ~0x100; | ||
1576 | - vc->vc_scrl_erase_char = c & ~0x100; | ||
1577 | - } | ||
1578 | } | ||
1579 | |||
1580 | } | ||
1581 | diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c | ||
1582 | index 9901064..dd3eaaa 100644 | ||
1583 | --- a/drivers/video/console/mdacon.c | ||
1584 | +++ b/drivers/video/console/mdacon.c | ||
1585 | @@ -533,7 +533,7 @@ static void mdacon_cursor(struct vc_data *c, int mode) | ||
1586 | |||
1587 | static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines) | ||
1588 | { | ||
1589 | - u16 eattr = mda_convert_attr(c->vc_scrl_erase_char); | ||
1590 | + u16 eattr = mda_convert_attr(c->vc_video_erase_char); | ||
1591 | |||
1592 | if (!lines) | ||
1593 | return 0; | ||
1594 | diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c | ||
1595 | index 4055dbd..491c1c1 100644 | ||
1596 | --- a/drivers/video/console/sticon.c | ||
1597 | +++ b/drivers/video/console/sticon.c | ||
1598 | @@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count) | ||
1599 | switch (dir) { | ||
1600 | case SM_UP: | ||
1601 | sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols); | ||
1602 | - sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_scrl_erase_char); | ||
1603 | + sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char); | ||
1604 | break; | ||
1605 | |||
1606 | case SM_DOWN: | ||
1607 | sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols); | ||
1608 | - sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_scrl_erase_char); | ||
1609 | + sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char); | ||
1610 | break; | ||
1611 | } | ||
1612 | |||
1613 | diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c | ||
1614 | index bd1f57b..6df29a6 100644 | ||
1615 | --- a/drivers/video/console/vgacon.c | ||
1616 | +++ b/drivers/video/console/vgacon.c | ||
1617 | @@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir, | ||
1618 | } else | ||
1619 | c->vc_origin += delta; | ||
1620 | scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size - | ||
1621 | - delta), c->vc_scrl_erase_char, | ||
1622 | + delta), c->vc_video_erase_char, | ||
1623 | delta); | ||
1624 | } else { | ||
1625 | if (oldo - delta < vga_vram_base) { | ||
1626 | @@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir, | ||
1627 | } else | ||
1628 | c->vc_origin -= delta; | ||
1629 | c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; | ||
1630 | - scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char, | ||
1631 | + scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char, | ||
1632 | delta); | ||
1633 | } | ||
1634 | c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; | ||
1635 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c | ||
1636 | index 655ed8d..e57df48 100644 | ||
1637 | --- a/fs/binfmt_elf.c | ||
1638 | +++ b/fs/binfmt_elf.c | ||
1639 | @@ -1188,9 +1188,11 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma, | ||
1640 | * check for an ELF header. If we find one, dump the first page to | ||
1641 | * aid in determining what was mapped here. | ||
1642 | */ | ||
1643 | - if (FILTER(ELF_HEADERS) && vma->vm_file != NULL && vma->vm_pgoff == 0) { | ||
1644 | + if (FILTER(ELF_HEADERS) && | ||
1645 | + vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) { | ||
1646 | u32 __user *header = (u32 __user *) vma->vm_start; | ||
1647 | u32 word; | ||
1648 | + mm_segment_t fs = get_fs(); | ||
1649 | /* | ||
1650 | * Doing it this way gets the constant folded by GCC. | ||
1651 | */ | ||
1652 | @@ -1203,7 +1205,15 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma, | ||
1653 | magic.elfmag[EI_MAG1] = ELFMAG1; | ||
1654 | magic.elfmag[EI_MAG2] = ELFMAG2; | ||
1655 | magic.elfmag[EI_MAG3] = ELFMAG3; | ||
1656 | - if (get_user(word, header) == 0 && word == magic.cmp) | ||
1657 | + /* | ||
1658 | + * Switch to the user "segment" for get_user(), | ||
1659 | + * then put back what elf_core_dump() had in place. | ||
1660 | + */ | ||
1661 | + set_fs(USER_DS); | ||
1662 | + if (unlikely(get_user(word, header))) | ||
1663 | + word = 0; | ||
1664 | + set_fs(fs); | ||
1665 | + if (word == magic.cmp) | ||
1666 | return PAGE_SIZE; | ||
1667 | } | ||
1668 | |||
1669 | diff --git a/fs/seq_file.c b/fs/seq_file.c | ||
1670 | index bd20f7f..ef4d497 100644 | ||
1671 | --- a/fs/seq_file.c | ||
1672 | +++ b/fs/seq_file.c | ||
1673 | @@ -54,6 +54,64 @@ int seq_open(struct file *file, const struct seq_operations *op) | ||
1674 | } | ||
1675 | EXPORT_SYMBOL(seq_open); | ||
1676 | |||
1677 | +static int traverse(struct seq_file *m, loff_t offset) | ||
1678 | +{ | ||
1679 | + loff_t pos = 0, index; | ||
1680 | + int error = 0; | ||
1681 | + void *p; | ||
1682 | + | ||
1683 | + m->version = 0; | ||
1684 | + index = 0; | ||
1685 | + m->count = m->from = 0; | ||
1686 | + if (!offset) { | ||
1687 | + m->index = index; | ||
1688 | + return 0; | ||
1689 | + } | ||
1690 | + if (!m->buf) { | ||
1691 | + m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL); | ||
1692 | + if (!m->buf) | ||
1693 | + return -ENOMEM; | ||
1694 | + } | ||
1695 | + p = m->op->start(m, &index); | ||
1696 | + while (p) { | ||
1697 | + error = PTR_ERR(p); | ||
1698 | + if (IS_ERR(p)) | ||
1699 | + break; | ||
1700 | + error = m->op->show(m, p); | ||
1701 | + if (error < 0) | ||
1702 | + break; | ||
1703 | + if (unlikely(error)) { | ||
1704 | + error = 0; | ||
1705 | + m->count = 0; | ||
1706 | + } | ||
1707 | + if (m->count == m->size) | ||
1708 | + goto Eoverflow; | ||
1709 | + if (pos + m->count > offset) { | ||
1710 | + m->from = offset - pos; | ||
1711 | + m->count -= m->from; | ||
1712 | + m->index = index; | ||
1713 | + break; | ||
1714 | + } | ||
1715 | + pos += m->count; | ||
1716 | + m->count = 0; | ||
1717 | + if (pos == offset) { | ||
1718 | + index++; | ||
1719 | + m->index = index; | ||
1720 | + break; | ||
1721 | + } | ||
1722 | + p = m->op->next(m, p, &index); | ||
1723 | + } | ||
1724 | + m->op->stop(m, p); | ||
1725 | + m->index = index; | ||
1726 | + return error; | ||
1727 | + | ||
1728 | +Eoverflow: | ||
1729 | + m->op->stop(m, p); | ||
1730 | + kfree(m->buf); | ||
1731 | + m->buf = kmalloc(m->size <<= 1, GFP_KERNEL); | ||
1732 | + return !m->buf ? -ENOMEM : -EAGAIN; | ||
1733 | +} | ||
1734 | + | ||
1735 | /** | ||
1736 | * seq_read - ->read() method for sequential files. | ||
1737 | * @file: the file to read from | ||
1738 | @@ -186,63 +244,6 @@ Efault: | ||
1739 | } | ||
1740 | EXPORT_SYMBOL(seq_read); | ||
1741 | |||
1742 | -static int traverse(struct seq_file *m, loff_t offset) | ||
1743 | -{ | ||
1744 | - loff_t pos = 0, index; | ||
1745 | - int error = 0; | ||
1746 | - void *p; | ||
1747 | - | ||
1748 | - m->version = 0; | ||
1749 | - index = 0; | ||
1750 | - m->count = m->from = 0; | ||
1751 | - if (!offset) { | ||
1752 | - m->index = index; | ||
1753 | - return 0; | ||
1754 | - } | ||
1755 | - if (!m->buf) { | ||
1756 | - m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL); | ||
1757 | - if (!m->buf) | ||
1758 | - return -ENOMEM; | ||
1759 | - } | ||
1760 | - p = m->op->start(m, &index); | ||
1761 | - while (p) { | ||
1762 | - error = PTR_ERR(p); | ||
1763 | - if (IS_ERR(p)) | ||
1764 | - break; | ||
1765 | - error = m->op->show(m, p); | ||
1766 | - if (error < 0) | ||
1767 | - break; | ||
1768 | - if (unlikely(error)) { | ||
1769 | - error = 0; | ||
1770 | - m->count = 0; | ||
1771 | - } | ||
1772 | - if (m->count == m->size) | ||
1773 | - goto Eoverflow; | ||
1774 | - if (pos + m->count > offset) { | ||
1775 | - m->from = offset - pos; | ||
1776 | - m->count -= m->from; | ||
1777 | - m->index = index; | ||
1778 | - break; | ||
1779 | - } | ||
1780 | - pos += m->count; | ||
1781 | - m->count = 0; | ||
1782 | - if (pos == offset) { | ||
1783 | - index++; | ||
1784 | - m->index = index; | ||
1785 | - break; | ||
1786 | - } | ||
1787 | - p = m->op->next(m, p, &index); | ||
1788 | - } | ||
1789 | - m->op->stop(m, p); | ||
1790 | - return error; | ||
1791 | - | ||
1792 | -Eoverflow: | ||
1793 | - m->op->stop(m, p); | ||
1794 | - kfree(m->buf); | ||
1795 | - m->buf = kmalloc(m->size <<= 1, GFP_KERNEL); | ||
1796 | - return !m->buf ? -ENOMEM : -EAGAIN; | ||
1797 | -} | ||
1798 | - | ||
1799 | /** | ||
1800 | * seq_lseek - ->llseek() method for sequential files. | ||
1801 | * @file: the file in question | ||
1802 | diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c | ||
1803 | index 36d5fcd..8454dee 100644 | ||
1804 | --- a/fs/xfs/linux-2.6/xfs_buf.c | ||
1805 | +++ b/fs/xfs/linux-2.6/xfs_buf.c | ||
1806 | @@ -1114,8 +1114,7 @@ xfs_buf_bio_end_io( | ||
1807 | unsigned int blocksize = bp->b_target->bt_bsize; | ||
1808 | struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; | ||
1809 | |||
1810 | - if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | ||
1811 | - bp->b_error = EIO; | ||
1812 | + xfs_buf_ioerror(bp, -error); | ||
1813 | |||
1814 | do { | ||
1815 | struct page *page = bvec->bv_page; | ||
1816 | diff --git a/include/acpi/pdc_intel.h b/include/acpi/pdc_intel.h | ||
1817 | index e72bfdd..552637b 100644 | ||
1818 | --- a/include/acpi/pdc_intel.h | ||
1819 | +++ b/include/acpi/pdc_intel.h | ||
1820 | @@ -14,6 +14,7 @@ | ||
1821 | #define ACPI_PDC_SMP_T_SWCOORD (0x0080) | ||
1822 | #define ACPI_PDC_C_C1_FFH (0x0100) | ||
1823 | #define ACPI_PDC_C_C2C3_FFH (0x0200) | ||
1824 | +#define ACPI_PDC_SMP_P_HWCOORD (0x0800) | ||
1825 | |||
1826 | #define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \ | ||
1827 | ACPI_PDC_C_C1_HALT | \ | ||
1828 | @@ -22,6 +23,7 @@ | ||
1829 | #define ACPI_PDC_EST_CAPABILITY_SWSMP (ACPI_PDC_SMP_C1PT | \ | ||
1830 | ACPI_PDC_C_C1_HALT | \ | ||
1831 | ACPI_PDC_SMP_P_SWCOORD | \ | ||
1832 | + ACPI_PDC_SMP_P_HWCOORD | \ | ||
1833 | ACPI_PDC_P_FFH) | ||
1834 | |||
1835 | #define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \ | ||
1836 | diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h | ||
1837 | index b03f80a..d71f7c0 100644 | ||
1838 | --- a/include/linux/console_struct.h | ||
1839 | +++ b/include/linux/console_struct.h | ||
1840 | @@ -53,7 +53,6 @@ struct vc_data { | ||
1841 | unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */ | ||
1842 | struct console_font vc_font; /* Current VC font set */ | ||
1843 | unsigned short vc_video_erase_char; /* Background erase character */ | ||
1844 | - unsigned short vc_scrl_erase_char; /* Erase character for scroll */ | ||
1845 | /* VT terminal data */ | ||
1846 | unsigned int vc_state; /* Escape sequence parser state */ | ||
1847 | unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ | ||
1848 | diff --git a/include/linux/module.h b/include/linux/module.h | ||
1849 | index 68e0955..760a41b 100644 | ||
1850 | --- a/include/linux/module.h | ||
1851 | +++ b/include/linux/module.h | ||
1852 | @@ -387,7 +387,6 @@ void symbol_put_addr(void *addr); | ||
1853 | static inline void __module_get(struct module *module) | ||
1854 | { | ||
1855 | if (module) { | ||
1856 | - BUG_ON(module_refcount(module) == 0); | ||
1857 | local_inc(&module->ref[get_cpu()].count); | ||
1858 | put_cpu(); | ||
1859 | } | ||
1860 | diff --git a/include/linux/pci.h b/include/linux/pci.h | ||
1861 | index 426e029..911b99d 100644 | ||
1862 | --- a/include/linux/pci.h | ||
1863 | +++ b/include/linux/pci.h | ||
1864 | @@ -639,7 +639,7 @@ int pci_select_bars(struct pci_dev *dev, unsigned long flags); | ||
1865 | /* ROM control related routines */ | ||
1866 | void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size); | ||
1867 | void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom); | ||
1868 | -size_t pci_get_rom_size(void __iomem *rom, size_t size); | ||
1869 | +size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size); | ||
1870 | |||
1871 | /* Power management related routines */ | ||
1872 | int pci_save_state(struct pci_dev *dev); | ||
1873 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h | ||
1874 | index 26b59cb..794e546 100644 | ||
1875 | --- a/include/linux/pci_ids.h | ||
1876 | +++ b/include/linux/pci_ids.h | ||
1877 | @@ -1755,6 +1755,7 @@ | ||
1878 | #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081 | ||
1879 | #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082 | ||
1880 | #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050 | ||
1881 | +#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530 | ||
1882 | |||
1883 | #define PCI_VENDOR_ID_RADISYS 0x1331 | ||
1884 | |||
1885 | diff --git a/include/linux/wait.h b/include/linux/wait.h | ||
1886 | index 0081147..3c2f411 100644 | ||
1887 | --- a/include/linux/wait.h | ||
1888 | +++ b/include/linux/wait.h | ||
1889 | @@ -141,6 +141,8 @@ static inline void __remove_wait_queue(wait_queue_head_t *head, | ||
1890 | list_del(&old->task_list); | ||
1891 | } | ||
1892 | |||
1893 | +void __wake_up_common(wait_queue_head_t *q, unsigned int mode, | ||
1894 | + int nr_exclusive, int sync, void *key); | ||
1895 | void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key); | ||
1896 | extern void __wake_up_locked(wait_queue_head_t *q, unsigned int mode); | ||
1897 | extern void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr); | ||
1898 | @@ -342,16 +344,19 @@ do { \ | ||
1899 | for (;;) { \ | ||
1900 | prepare_to_wait_exclusive(&wq, &__wait, \ | ||
1901 | TASK_INTERRUPTIBLE); \ | ||
1902 | - if (condition) \ | ||
1903 | + if (condition) { \ | ||
1904 | + finish_wait(&wq, &__wait); \ | ||
1905 | break; \ | ||
1906 | + } \ | ||
1907 | if (!signal_pending(current)) { \ | ||
1908 | schedule(); \ | ||
1909 | continue; \ | ||
1910 | } \ | ||
1911 | ret = -ERESTARTSYS; \ | ||
1912 | + abort_exclusive_wait(&wq, &__wait, \ | ||
1913 | + TASK_INTERRUPTIBLE, NULL); \ | ||
1914 | break; \ | ||
1915 | } \ | ||
1916 | - finish_wait(&wq, &__wait); \ | ||
1917 | } while (0) | ||
1918 | |||
1919 | #define wait_event_interruptible_exclusive(wq, condition) \ | ||
1920 | @@ -440,6 +445,8 @@ extern long interruptible_sleep_on_timeout(wait_queue_head_t *q, | ||
1921 | void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state); | ||
1922 | void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state); | ||
1923 | void finish_wait(wait_queue_head_t *q, wait_queue_t *wait); | ||
1924 | +void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait, | ||
1925 | + unsigned int mode, void *key); | ||
1926 | int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); | ||
1927 | int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); | ||
1928 | |||
1929 | diff --git a/ipc/shm.c b/ipc/shm.c | ||
1930 | index f00c897..35a65be 100644 | ||
1931 | --- a/ipc/shm.c | ||
1932 | +++ b/ipc/shm.c | ||
1933 | @@ -565,11 +565,15 @@ static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss, | ||
1934 | struct hstate *h = hstate_file(shp->shm_file); | ||
1935 | *rss += pages_per_huge_page(h) * mapping->nrpages; | ||
1936 | } else { | ||
1937 | +#ifdef CONFIG_SHMEM | ||
1938 | struct shmem_inode_info *info = SHMEM_I(inode); | ||
1939 | spin_lock(&info->lock); | ||
1940 | *rss += inode->i_mapping->nrpages; | ||
1941 | *swp += info->swapped; | ||
1942 | spin_unlock(&info->lock); | ||
1943 | +#else | ||
1944 | + *rss += inode->i_mapping->nrpages; | ||
1945 | +#endif | ||
1946 | } | ||
1947 | |||
1948 | total++; | ||
1949 | diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c | ||
1950 | index 3cd441e..48c58fe 100644 | ||
1951 | --- a/kernel/irq/chip.c | ||
1952 | +++ b/kernel/irq/chip.c | ||
1953 | @@ -78,6 +78,7 @@ void dynamic_irq_cleanup(unsigned int irq) | ||
1954 | desc->chip_data = NULL; | ||
1955 | desc->handle_irq = handle_bad_irq; | ||
1956 | desc->chip = &no_irq_chip; | ||
1957 | + desc->name = NULL; | ||
1958 | spin_unlock_irqrestore(&desc->lock, flags); | ||
1959 | } | ||
1960 | |||
1961 | diff --git a/kernel/sched.c b/kernel/sched.c | ||
1962 | index 2a09e44..98c0cdc 100644 | ||
1963 | --- a/kernel/sched.c | ||
1964 | +++ b/kernel/sched.c | ||
1965 | @@ -4556,8 +4556,8 @@ EXPORT_SYMBOL(default_wake_function); | ||
1966 | * started to run but is not in state TASK_RUNNING. try_to_wake_up() returns | ||
1967 | * zero in this (rare) case, and we handle it by continuing to scan the queue. | ||
1968 | */ | ||
1969 | -static void __wake_up_common(wait_queue_head_t *q, unsigned int mode, | ||
1970 | - int nr_exclusive, int sync, void *key) | ||
1971 | +void __wake_up_common(wait_queue_head_t *q, unsigned int mode, | ||
1972 | + int nr_exclusive, int sync, void *key) | ||
1973 | { | ||
1974 | wait_queue_t *curr, *next; | ||
1975 | |||
1976 | diff --git a/kernel/wait.c b/kernel/wait.c | ||
1977 | index c275c56..24688c7 100644 | ||
1978 | --- a/kernel/wait.c | ||
1979 | +++ b/kernel/wait.c | ||
1980 | @@ -101,6 +101,15 @@ prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state) | ||
1981 | } | ||
1982 | EXPORT_SYMBOL(prepare_to_wait_exclusive); | ||
1983 | |||
1984 | +/* | ||
1985 | + * finish_wait - clean up after waiting in a queue | ||
1986 | + * @q: waitqueue waited on | ||
1987 | + * @wait: wait descriptor | ||
1988 | + * | ||
1989 | + * Sets current thread back to running state and removes | ||
1990 | + * the wait descriptor from the given waitqueue if still | ||
1991 | + * queued. | ||
1992 | + */ | ||
1993 | void finish_wait(wait_queue_head_t *q, wait_queue_t *wait) | ||
1994 | { | ||
1995 | unsigned long flags; | ||
1996 | @@ -127,6 +136,39 @@ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait) | ||
1997 | } | ||
1998 | EXPORT_SYMBOL(finish_wait); | ||
1999 | |||
2000 | +/* | ||
2001 | + * abort_exclusive_wait - abort exclusive waiting in a queue | ||
2002 | + * @q: waitqueue waited on | ||
2003 | + * @wait: wait descriptor | ||
2004 | + * @state: runstate of the waiter to be woken | ||
2005 | + * @key: key to identify a wait bit queue or %NULL | ||
2006 | + * | ||
2007 | + * Sets current thread back to running state and removes | ||
2008 | + * the wait descriptor from the given waitqueue if still | ||
2009 | + * queued. | ||
2010 | + * | ||
2011 | + * Wakes up the next waiter if the caller is concurrently | ||
2012 | + * woken up through the queue. | ||
2013 | + * | ||
2014 | + * This prevents waiter starvation where an exclusive waiter | ||
2015 | + * aborts and is woken up concurrently and noone wakes up | ||
2016 | + * the next waiter. | ||
2017 | + */ | ||
2018 | +void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait, | ||
2019 | + unsigned int mode, void *key) | ||
2020 | +{ | ||
2021 | + unsigned long flags; | ||
2022 | + | ||
2023 | + __set_current_state(TASK_RUNNING); | ||
2024 | + spin_lock_irqsave(&q->lock, flags); | ||
2025 | + if (!list_empty(&wait->task_list)) | ||
2026 | + list_del_init(&wait->task_list); | ||
2027 | + else if (waitqueue_active(q)) | ||
2028 | + __wake_up_common(q, mode, 1, 0, key); | ||
2029 | + spin_unlock_irqrestore(&q->lock, flags); | ||
2030 | +} | ||
2031 | +EXPORT_SYMBOL(abort_exclusive_wait); | ||
2032 | + | ||
2033 | int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key) | ||
2034 | { | ||
2035 | int ret = default_wake_function(wait, mode, sync, key); | ||
2036 | @@ -187,17 +229,20 @@ int __sched | ||
2037 | __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, | ||
2038 | int (*action)(void *), unsigned mode) | ||
2039 | { | ||
2040 | - int ret = 0; | ||
2041 | - | ||
2042 | do { | ||
2043 | + int ret; | ||
2044 | + | ||
2045 | prepare_to_wait_exclusive(wq, &q->wait, mode); | ||
2046 | - if (test_bit(q->key.bit_nr, q->key.flags)) { | ||
2047 | - if ((ret = (*action)(q->key.flags))) | ||
2048 | - break; | ||
2049 | - } | ||
2050 | + if (!test_bit(q->key.bit_nr, q->key.flags)) | ||
2051 | + continue; | ||
2052 | + ret = action(q->key.flags); | ||
2053 | + if (!ret) | ||
2054 | + continue; | ||
2055 | + abort_exclusive_wait(wq, &q->wait, mode, &q->key); | ||
2056 | + return ret; | ||
2057 | } while (test_and_set_bit(q->key.bit_nr, q->key.flags)); | ||
2058 | finish_wait(wq, &q->wait); | ||
2059 | - return ret; | ||
2060 | + return 0; | ||
2061 | } | ||
2062 | EXPORT_SYMBOL(__wait_on_bit_lock); | ||
2063 | |||
2064 | diff --git a/mm/swap.c b/mm/swap.c | ||
2065 | index 9e0cb31..65e6825 100644 | ||
2066 | --- a/mm/swap.c | ||
2067 | +++ b/mm/swap.c | ||
2068 | @@ -244,7 +244,6 @@ void lru_add_drain(void) | ||
2069 | put_cpu(); | ||
2070 | } | ||
2071 | |||
2072 | -#ifdef CONFIG_NUMA | ||
2073 | static void lru_add_drain_per_cpu(struct work_struct *dummy) | ||
2074 | { | ||
2075 | lru_add_drain(); | ||
2076 | @@ -258,18 +257,6 @@ int lru_add_drain_all(void) | ||
2077 | return schedule_on_each_cpu(lru_add_drain_per_cpu); | ||
2078 | } | ||
2079 | |||
2080 | -#else | ||
2081 | - | ||
2082 | -/* | ||
2083 | - * Returns 0 for success | ||
2084 | - */ | ||
2085 | -int lru_add_drain_all(void) | ||
2086 | -{ | ||
2087 | - lru_add_drain(); | ||
2088 | - return 0; | ||
2089 | -} | ||
2090 | -#endif | ||
2091 | - | ||
2092 | /* | ||
2093 | * Batched page_cache_release(). Decrement the reference count on all the | ||
2094 | * passed pages. If it fell to zero then remove the page from the LRU and | ||
2095 | diff --git a/net/sctp/input.c b/net/sctp/input.c | ||
2096 | index a49fa80..be736af 100644 | ||
2097 | --- a/net/sctp/input.c | ||
2098 | +++ b/net/sctp/input.c | ||
2099 | @@ -249,6 +249,19 @@ int sctp_rcv(struct sk_buff *skb) | ||
2100 | */ | ||
2101 | sctp_bh_lock_sock(sk); | ||
2102 | |||
2103 | + if (sk != rcvr->sk) { | ||
2104 | + /* Our cached sk is different from the rcvr->sk. This is | ||
2105 | + * because migrate()/accept() may have moved the association | ||
2106 | + * to a new socket and released all the sockets. So now we | ||
2107 | + * are holding a lock on the old socket while the user may | ||
2108 | + * be doing something with the new socket. Switch our veiw | ||
2109 | + * of the current sk. | ||
2110 | + */ | ||
2111 | + sctp_bh_unlock_sock(sk); | ||
2112 | + sk = rcvr->sk; | ||
2113 | + sctp_bh_lock_sock(sk); | ||
2114 | + } | ||
2115 | + | ||
2116 | if (sock_owned_by_user(sk)) { | ||
2117 | SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG); | ||
2118 | sctp_add_backlog(sk, skb); | ||
2119 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c | ||
2120 | index 3e65719..e4c27c1 100644 | ||
2121 | --- a/net/sunrpc/svcsock.c | ||
2122 | +++ b/net/sunrpc/svcsock.c | ||
2123 | @@ -1171,7 +1171,11 @@ int svc_addsock(struct svc_serv *serv, | ||
2124 | else if (so->state > SS_UNCONNECTED) | ||
2125 | err = -EISCONN; | ||
2126 | else { | ||
2127 | - svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS); | ||
2128 | + if (!try_module_get(THIS_MODULE)) | ||
2129 | + err = -ENOENT; | ||
2130 | + else | ||
2131 | + svsk = svc_setup_socket(serv, so, &err, | ||
2132 | + SVC_SOCK_DEFAULTS); | ||
2133 | if (svsk) { | ||
2134 | struct sockaddr_storage addr; | ||
2135 | struct sockaddr *sin = (struct sockaddr *)&addr; | ||
2136 | @@ -1184,7 +1188,8 @@ int svc_addsock(struct svc_serv *serv, | ||
2137 | spin_unlock_bh(&serv->sv_lock); | ||
2138 | svc_xprt_received(&svsk->sk_xprt); | ||
2139 | err = 0; | ||
2140 | - } | ||
2141 | + } else | ||
2142 | + module_put(THIS_MODULE); | ||
2143 | } | ||
2144 | if (err) { | ||
2145 | sockfd_put(so); | ||
2146 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
2147 | index aa7dc03..db9c702 100644 | ||
2148 | --- a/sound/pci/hda/patch_realtek.c | ||
2149 | +++ b/sound/pci/hda/patch_realtek.c | ||
2150 | @@ -920,6 +920,7 @@ do_sku: | ||
2151 | case 0x10ec0267: | ||
2152 | case 0x10ec0268: | ||
2153 | case 0x10ec0269: | ||
2154 | + case 0x10ec0272: | ||
2155 | case 0x10ec0660: | ||
2156 | case 0x10ec0662: | ||
2157 | case 0x10ec0663: | ||
2158 | @@ -948,6 +949,7 @@ do_sku: | ||
2159 | case 0x10ec0882: | ||
2160 | case 0x10ec0883: | ||
2161 | case 0x10ec0885: | ||
2162 | + case 0x10ec0887: | ||
2163 | case 0x10ec0889: | ||
2164 | snd_hda_codec_write(codec, 0x20, 0, | ||
2165 | AC_VERB_SET_COEF_INDEX, 7); | ||
2166 | @@ -8059,6 +8061,8 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | ||
2167 | SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD), | ||
2168 | SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), | ||
2169 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), | ||
2170 | + SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550", | ||
2171 | + ALC883_FUJITSU_PI2515), | ||
2172 | SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515), | ||
2173 | SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), | ||
2174 | SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), | ||
2175 | diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c | ||
2176 | index b8cfb7c..7a1a8c8 100644 | ||
2177 | --- a/sound/usb/usbaudio.c | ||
2178 | +++ b/sound/usb/usbaudio.c | ||
2179 | @@ -2958,6 +2958,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | ||
2180 | return -EINVAL; | ||
2181 | } | ||
2182 | alts = &iface->altsetting[fp->altset_idx]; | ||
2183 | + fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | ||
2184 | usb_set_interface(chip->dev, fp->iface, 0); | ||
2185 | init_usb_pitch(chip->dev, fp->iface, alts, fp); | ||
2186 | init_usb_sample_rate(chip->dev, fp->iface, alts, fp, fp->rate_max); |