Contents of /trunk/kernel26-magellan/patches-2.6.39-r2/0101-2.6.39.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1424 -
(show annotations)
(download)
Mon Jul 18 14:29:21 2011 UTC (13 years, 2 months ago) by niro
File size: 97911 byte(s)
Mon Jul 18 14:29:21 2011 UTC (13 years, 2 months ago) by niro
File size: 97911 byte(s)
-2.6.39-magellan-r2: -using linux-2.6.39.3 and removed deprecated acpi procfs options from config
1 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index cc85a92..066b642 100644 |
3 | --- a/Documentation/kernel-parameters.txt |
4 | +++ b/Documentation/kernel-parameters.txt |
5 | @@ -2590,6 +2590,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. |
6 | unlock ejectable media); |
7 | m = MAX_SECTORS_64 (don't transfer more |
8 | than 64 sectors = 32 KB at a time); |
9 | + n = INITIAL_READ10 (force a retry of the |
10 | + initial READ(10) command); |
11 | o = CAPACITY_OK (accept the capacity |
12 | reported by the device); |
13 | r = IGNORE_RESIDUE (the device reports |
14 | diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S |
15 | index c5c24be..727f40a 100644 |
16 | --- a/arch/powerpc/kernel/head_32.S |
17 | +++ b/arch/powerpc/kernel/head_32.S |
18 | @@ -896,7 +896,7 @@ _GLOBAL(start_secondary_resume) |
19 | rlwinm r1,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ |
20 | addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD |
21 | li r3,0 |
22 | - std r3,0(r1) /* Zero the stack frame pointer */ |
23 | + stw r3,0(r1) /* Zero the stack frame pointer */ |
24 | bl start_secondary |
25 | b . |
26 | #endif /* CONFIG_SMP */ |
27 | diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c |
28 | index cbdbb14..f2dcab7 100644 |
29 | --- a/arch/powerpc/kernel/smp.c |
30 | +++ b/arch/powerpc/kernel/smp.c |
31 | @@ -410,8 +410,6 @@ int __cpuinit __cpu_up(unsigned int cpu) |
32 | { |
33 | int rc, c; |
34 | |
35 | - secondary_ti = current_set[cpu]; |
36 | - |
37 | if (smp_ops == NULL || |
38 | (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu))) |
39 | return -EINVAL; |
40 | @@ -421,6 +419,8 @@ int __cpuinit __cpu_up(unsigned int cpu) |
41 | if (rc) |
42 | return rc; |
43 | |
44 | + secondary_ti = current_set[cpu]; |
45 | + |
46 | /* Make sure callin-map entry is 0 (can be leftover a CPU |
47 | * hotplug |
48 | */ |
49 | diff --git a/arch/tile/kernel/pci.c b/arch/tile/kernel/pci.c |
50 | index ea38f0c..1073269 100644 |
51 | --- a/arch/tile/kernel/pci.c |
52 | +++ b/arch/tile/kernel/pci.c |
53 | @@ -179,12 +179,6 @@ int __init tile_pci_init(void) |
54 | |
55 | controller = &controllers[num_controllers]; |
56 | |
57 | - if (tile_init_irqs(i, controller)) { |
58 | - pr_err("PCI: Could not initialize " |
59 | - "IRQs, aborting.\n"); |
60 | - goto err_cont; |
61 | - } |
62 | - |
63 | controller->index = num_controllers; |
64 | controller->hv_cfg_fd[0] = hv_cfg_fd0; |
65 | controller->hv_cfg_fd[1] = hv_cfg_fd1; |
66 | @@ -300,6 +294,11 @@ static int __init pcibios_init(void) |
67 | struct pci_controller *controller = &controllers[i]; |
68 | struct pci_bus *bus; |
69 | |
70 | + if (tile_init_irqs(i, controller)) { |
71 | + pr_err("PCI: Could not initialize IRQS\n"); |
72 | + continue; |
73 | + } |
74 | + |
75 | pr_info("PCI: initializing controller #%d\n", i); |
76 | |
77 | /* |
78 | diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c |
79 | index 57ca777..e7115c8 100644 |
80 | --- a/arch/x86/kernel/amd_iommu.c |
81 | +++ b/arch/x86/kernel/amd_iommu.c |
82 | @@ -28,6 +28,7 @@ |
83 | #include <asm/proto.h> |
84 | #include <asm/iommu.h> |
85 | #include <asm/gart.h> |
86 | +#include <asm/dma.h> |
87 | #include <asm/amd_iommu_proto.h> |
88 | #include <asm/amd_iommu_types.h> |
89 | #include <asm/amd_iommu.h> |
90 | @@ -153,6 +154,10 @@ static int iommu_init_device(struct device *dev) |
91 | pdev = pci_get_bus_and_slot(PCI_BUS(alias), alias & 0xff); |
92 | if (pdev) |
93 | dev_data->alias = &pdev->dev; |
94 | + else { |
95 | + kfree(dev_data); |
96 | + return -ENOTSUPP; |
97 | + } |
98 | |
99 | atomic_set(&dev_data->bind, 0); |
100 | |
101 | @@ -162,6 +167,20 @@ static int iommu_init_device(struct device *dev) |
102 | return 0; |
103 | } |
104 | |
105 | +static void iommu_ignore_device(struct device *dev) |
106 | +{ |
107 | + u16 devid, alias; |
108 | + |
109 | + devid = get_device_id(dev); |
110 | + alias = amd_iommu_alias_table[devid]; |
111 | + |
112 | + memset(&amd_iommu_dev_table[devid], 0, sizeof(struct dev_table_entry)); |
113 | + memset(&amd_iommu_dev_table[alias], 0, sizeof(struct dev_table_entry)); |
114 | + |
115 | + amd_iommu_rlookup_table[devid] = NULL; |
116 | + amd_iommu_rlookup_table[alias] = NULL; |
117 | +} |
118 | + |
119 | static void iommu_uninit_device(struct device *dev) |
120 | { |
121 | kfree(dev->archdata.iommu); |
122 | @@ -191,7 +210,9 @@ int __init amd_iommu_init_devices(void) |
123 | continue; |
124 | |
125 | ret = iommu_init_device(&pdev->dev); |
126 | - if (ret) |
127 | + if (ret == -ENOTSUPP) |
128 | + iommu_ignore_device(&pdev->dev); |
129 | + else if (ret) |
130 | goto out_free; |
131 | } |
132 | |
133 | @@ -2296,6 +2317,23 @@ static struct dma_map_ops amd_iommu_dma_ops = { |
134 | .dma_supported = amd_iommu_dma_supported, |
135 | }; |
136 | |
137 | +static unsigned device_dma_ops_init(void) |
138 | +{ |
139 | + struct pci_dev *pdev = NULL; |
140 | + unsigned unhandled = 0; |
141 | + |
142 | + for_each_pci_dev(pdev) { |
143 | + if (!check_device(&pdev->dev)) { |
144 | + unhandled += 1; |
145 | + continue; |
146 | + } |
147 | + |
148 | + pdev->dev.archdata.dma_ops = &amd_iommu_dma_ops; |
149 | + } |
150 | + |
151 | + return unhandled; |
152 | +} |
153 | + |
154 | /* |
155 | * The function which clues the AMD IOMMU driver into dma_ops. |
156 | */ |
157 | @@ -2308,7 +2346,7 @@ void __init amd_iommu_init_api(void) |
158 | int __init amd_iommu_init_dma_ops(void) |
159 | { |
160 | struct amd_iommu *iommu; |
161 | - int ret; |
162 | + int ret, unhandled; |
163 | |
164 | /* |
165 | * first allocate a default protection domain for every IOMMU we |
166 | @@ -2334,7 +2372,11 @@ int __init amd_iommu_init_dma_ops(void) |
167 | swiotlb = 0; |
168 | |
169 | /* Make the driver finally visible to the drivers */ |
170 | - dma_ops = &amd_iommu_dma_ops; |
171 | + unhandled = device_dma_ops_init(); |
172 | + if (unhandled && max_pfn > MAX_DMA32_PFN) { |
173 | + /* There are unhandled devices - initialize swiotlb for them */ |
174 | + swiotlb = 1; |
175 | + } |
176 | |
177 | amd_iommu_stats_init(); |
178 | |
179 | diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c |
180 | index 246d727..b9e207e 100644 |
181 | --- a/arch/x86/kernel/amd_iommu_init.c |
182 | +++ b/arch/x86/kernel/amd_iommu_init.c |
183 | @@ -701,8 +701,8 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, |
184 | { |
185 | u8 *p = (u8 *)h; |
186 | u8 *end = p, flags = 0; |
187 | - u16 dev_i, devid = 0, devid_start = 0, devid_to = 0; |
188 | - u32 ext_flags = 0; |
189 | + u16 devid = 0, devid_start = 0, devid_to = 0; |
190 | + u32 dev_i, ext_flags = 0; |
191 | bool alias = false; |
192 | struct ivhd_entry *e; |
193 | |
194 | @@ -857,7 +857,7 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, |
195 | /* Initializes the device->iommu mapping for the driver */ |
196 | static int __init init_iommu_devices(struct amd_iommu *iommu) |
197 | { |
198 | - u16 i; |
199 | + u32 i; |
200 | |
201 | for (i = iommu->first_device; i <= iommu->last_device; ++i) |
202 | set_iommu_for_device(iommu, i); |
203 | @@ -1146,7 +1146,7 @@ static int __init init_memory_definitions(struct acpi_table_header *table) |
204 | */ |
205 | static void init_device_table(void) |
206 | { |
207 | - u16 devid; |
208 | + u32 devid; |
209 | |
210 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { |
211 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); |
212 | diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c |
213 | index e90f084..bea9c03 100644 |
214 | --- a/arch/x86/kernel/devicetree.c |
215 | +++ b/arch/x86/kernel/devicetree.c |
216 | @@ -13,6 +13,7 @@ |
217 | #include <linux/slab.h> |
218 | #include <linux/pci.h> |
219 | #include <linux/of_pci.h> |
220 | +#include <linux/initrd.h> |
221 | |
222 | #include <asm/hpet.h> |
223 | #include <asm/irq_controller.h> |
224 | @@ -98,6 +99,16 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) |
225 | return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); |
226 | } |
227 | |
228 | +#ifdef CONFIG_BLK_DEV_INITRD |
229 | +void __init early_init_dt_setup_initrd_arch(unsigned long start, |
230 | + unsigned long end) |
231 | +{ |
232 | + initrd_start = (unsigned long)__va(start); |
233 | + initrd_end = (unsigned long)__va(end); |
234 | + initrd_below_start_ok = 1; |
235 | +} |
236 | +#endif |
237 | + |
238 | void __init add_dtb(u64 data) |
239 | { |
240 | initial_dtb = data + offsetof(struct setup_data, data); |
241 | diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c |
242 | index 8d12878..a3d0dc5 100644 |
243 | --- a/arch/x86/kernel/process_32.c |
244 | +++ b/arch/x86/kernel/process_32.c |
245 | @@ -245,7 +245,6 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) |
246 | { |
247 | set_user_gs(regs, 0); |
248 | regs->fs = 0; |
249 | - set_fs(USER_DS); |
250 | regs->ds = __USER_DS; |
251 | regs->es = __USER_DS; |
252 | regs->ss = __USER_DS; |
253 | diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c |
254 | index 6c9dd92..ca6f7ab 100644 |
255 | --- a/arch/x86/kernel/process_64.c |
256 | +++ b/arch/x86/kernel/process_64.c |
257 | @@ -338,7 +338,6 @@ start_thread_common(struct pt_regs *regs, unsigned long new_ip, |
258 | regs->cs = _cs; |
259 | regs->ss = _ss; |
260 | regs->flags = X86_EFLAGS_IF; |
261 | - set_fs(USER_DS); |
262 | /* |
263 | * Free the old FP and other extended state |
264 | */ |
265 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c |
266 | index c6724e4..4be9b39 100644 |
267 | --- a/arch/x86/kernel/setup.c |
268 | +++ b/arch/x86/kernel/setup.c |
269 | @@ -912,13 +912,6 @@ void __init setup_arch(char **cmdline_p) |
270 | memblock.current_limit = get_max_mapped(); |
271 | memblock_x86_fill(); |
272 | |
273 | - /* |
274 | - * The EFI specification says that boot service code won't be called |
275 | - * after ExitBootServices(). This is, in fact, a lie. |
276 | - */ |
277 | - if (efi_enabled) |
278 | - efi_reserve_boot_services(); |
279 | - |
280 | /* preallocate 4k for mptable mpc */ |
281 | early_reserve_e820_mpc_new(); |
282 | |
283 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c |
284 | index c2871d3..c58d144 100644 |
285 | --- a/arch/x86/kernel/smpboot.c |
286 | +++ b/arch/x86/kernel/smpboot.c |
287 | @@ -285,6 +285,19 @@ notrace static void __cpuinit start_secondary(void *unused) |
288 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
289 | x86_platform.nmi_init(); |
290 | |
291 | + /* |
292 | + * Wait until the cpu which brought this one up marked it |
293 | + * online before enabling interrupts. If we don't do that then |
294 | + * we can end up waking up the softirq thread before this cpu |
295 | + * reached the active state, which makes the scheduler unhappy |
296 | + * and schedule the softirq thread on the wrong cpu. This is |
297 | + * only observable with forced threaded interrupts, but in |
298 | + * theory it could also happen w/o them. It's just way harder |
299 | + * to achieve. |
300 | + */ |
301 | + while (!cpumask_test_cpu(smp_processor_id(), cpu_active_mask)) |
302 | + cpu_relax(); |
303 | + |
304 | /* enable local interrupts */ |
305 | local_irq_enable(); |
306 | |
307 | diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c |
308 | index 1cd6089..493ea1f 100644 |
309 | --- a/arch/x86/lguest/boot.c |
310 | +++ b/arch/x86/lguest/boot.c |
311 | @@ -995,6 +995,7 @@ static void lguest_time_irq(unsigned int irq, struct irq_desc *desc) |
312 | static void lguest_time_init(void) |
313 | { |
314 | /* Set up the timer interrupt (0) to go to our simple timer routine */ |
315 | + lguest_setup_irq(0); |
316 | irq_set_handler(0, lguest_time_irq); |
317 | |
318 | clocksource_register(&lguest_clock); |
319 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c |
320 | index b00c4ea..0fe27d7 100644 |
321 | --- a/arch/x86/platform/efi/efi.c |
322 | +++ b/arch/x86/platform/efi/efi.c |
323 | @@ -315,40 +315,6 @@ static void __init print_efi_memmap(void) |
324 | } |
325 | #endif /* EFI_DEBUG */ |
326 | |
327 | -void __init efi_reserve_boot_services(void) |
328 | -{ |
329 | - void *p; |
330 | - |
331 | - for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
332 | - efi_memory_desc_t *md = p; |
333 | - unsigned long long start = md->phys_addr; |
334 | - unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; |
335 | - |
336 | - if (md->type != EFI_BOOT_SERVICES_CODE && |
337 | - md->type != EFI_BOOT_SERVICES_DATA) |
338 | - continue; |
339 | - |
340 | - memblock_x86_reserve_range(start, start + size, "EFI Boot"); |
341 | - } |
342 | -} |
343 | - |
344 | -static void __init efi_free_boot_services(void) |
345 | -{ |
346 | - void *p; |
347 | - |
348 | - for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
349 | - efi_memory_desc_t *md = p; |
350 | - unsigned long long start = md->phys_addr; |
351 | - unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; |
352 | - |
353 | - if (md->type != EFI_BOOT_SERVICES_CODE && |
354 | - md->type != EFI_BOOT_SERVICES_DATA) |
355 | - continue; |
356 | - |
357 | - free_bootmem_late(start, size); |
358 | - } |
359 | -} |
360 | - |
361 | void __init efi_init(void) |
362 | { |
363 | efi_config_table_t *config_tables; |
364 | @@ -541,9 +507,7 @@ void __init efi_enter_virtual_mode(void) |
365 | efi.systab = NULL; |
366 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
367 | md = p; |
368 | - if (!(md->attribute & EFI_MEMORY_RUNTIME) && |
369 | - md->type != EFI_BOOT_SERVICES_CODE && |
370 | - md->type != EFI_BOOT_SERVICES_DATA) |
371 | + if (!(md->attribute & EFI_MEMORY_RUNTIME)) |
372 | continue; |
373 | |
374 | size = md->num_pages << EFI_PAGE_SHIFT; |
375 | @@ -594,13 +558,6 @@ void __init efi_enter_virtual_mode(void) |
376 | } |
377 | |
378 | /* |
379 | - * Thankfully, it does seem that no runtime services other than |
380 | - * SetVirtualAddressMap() will touch boot services code, so we can |
381 | - * get rid of it all at this point |
382 | - */ |
383 | - efi_free_boot_services(); |
384 | - |
385 | - /* |
386 | * Now that EFI is in virtual mode, update the function |
387 | * pointers in the runtime service table to the new virtual addresses. |
388 | * |
389 | diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c |
390 | index 641264c..ac0621a 100644 |
391 | --- a/arch/x86/platform/efi/efi_64.c |
392 | +++ b/arch/x86/platform/efi/efi_64.c |
393 | @@ -64,11 +64,10 @@ static void __init early_runtime_code_mapping_set_exec(int executable) |
394 | if (!(__supported_pte_mask & _PAGE_NX)) |
395 | return; |
396 | |
397 | - /* Make EFI service code area executable */ |
398 | + /* Make EFI runtime service code area executable */ |
399 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
400 | md = p; |
401 | - if (md->type == EFI_RUNTIME_SERVICES_CODE || |
402 | - md->type == EFI_BOOT_SERVICES_CODE) { |
403 | + if (md->type == EFI_RUNTIME_SERVICES_CODE) { |
404 | unsigned long end; |
405 | end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT); |
406 | early_mapping_set_exec(md->phys_addr, end, executable); |
407 | diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c |
408 | index 8bff7e7..1b2b73f 100644 |
409 | --- a/arch/x86/xen/multicalls.c |
410 | +++ b/arch/x86/xen/multicalls.c |
411 | @@ -189,10 +189,10 @@ struct multicall_space __xen_mc_entry(size_t args) |
412 | unsigned argidx = roundup(b->argidx, sizeof(u64)); |
413 | |
414 | BUG_ON(preemptible()); |
415 | - BUG_ON(b->argidx > MC_ARGS); |
416 | + BUG_ON(b->argidx >= MC_ARGS); |
417 | |
418 | if (b->mcidx == MC_BATCH || |
419 | - (argidx + args) > MC_ARGS) { |
420 | + (argidx + args) >= MC_ARGS) { |
421 | mc_stats_flush(b->mcidx == MC_BATCH ? FL_SLOTS : FL_ARGS); |
422 | xen_mc_flush(); |
423 | argidx = roundup(b->argidx, sizeof(u64)); |
424 | @@ -206,7 +206,7 @@ struct multicall_space __xen_mc_entry(size_t args) |
425 | ret.args = &b->args[argidx]; |
426 | b->argidx = argidx + args; |
427 | |
428 | - BUG_ON(b->argidx > MC_ARGS); |
429 | + BUG_ON(b->argidx >= MC_ARGS); |
430 | return ret; |
431 | } |
432 | |
433 | @@ -216,7 +216,7 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size) |
434 | struct multicall_space ret = { NULL, NULL }; |
435 | |
436 | BUG_ON(preemptible()); |
437 | - BUG_ON(b->argidx > MC_ARGS); |
438 | + BUG_ON(b->argidx >= MC_ARGS); |
439 | |
440 | if (b->mcidx == 0) |
441 | return ret; |
442 | @@ -224,14 +224,14 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size) |
443 | if (b->entries[b->mcidx - 1].op != op) |
444 | return ret; |
445 | |
446 | - if ((b->argidx + size) > MC_ARGS) |
447 | + if ((b->argidx + size) >= MC_ARGS) |
448 | return ret; |
449 | |
450 | ret.mc = &b->entries[b->mcidx - 1]; |
451 | ret.args = &b->args[b->argidx]; |
452 | b->argidx += size; |
453 | |
454 | - BUG_ON(b->argidx > MC_ARGS); |
455 | + BUG_ON(b->argidx >= MC_ARGS); |
456 | return ret; |
457 | } |
458 | |
459 | diff --git a/block/blk-core.c b/block/blk-core.c |
460 | index 3fe00a1..5323076 100644 |
461 | --- a/block/blk-core.c |
462 | +++ b/block/blk-core.c |
463 | @@ -345,6 +345,7 @@ void blk_put_queue(struct request_queue *q) |
464 | { |
465 | kobject_put(&q->kobj); |
466 | } |
467 | +EXPORT_SYMBOL(blk_put_queue); |
468 | |
469 | /* |
470 | * Note: If a driver supplied the queue lock, it should not zap that lock |
471 | @@ -566,6 +567,7 @@ int blk_get_queue(struct request_queue *q) |
472 | |
473 | return 1; |
474 | } |
475 | +EXPORT_SYMBOL(blk_get_queue); |
476 | |
477 | static inline void blk_free_request(struct request_queue *q, struct request *rq) |
478 | { |
479 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c |
480 | index e6fc716..a576406 100644 |
481 | --- a/drivers/block/nbd.c |
482 | +++ b/drivers/block/nbd.c |
483 | @@ -756,6 +756,12 @@ static int __init nbd_init(void) |
484 | if (max_part > 0) |
485 | part_shift = fls(max_part); |
486 | |
487 | + if ((1UL << part_shift) > DISK_MAX_PARTS) |
488 | + return -EINVAL; |
489 | + |
490 | + if (nbds_max > 1UL << (MINORBITS - part_shift)) |
491 | + return -EINVAL; |
492 | + |
493 | for (i = 0; i < nbds_max; i++) { |
494 | struct gendisk *disk = alloc_disk(1 << part_shift); |
495 | if (!disk) |
496 | diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c |
497 | index 4f1b8de..7c7a1e4 100644 |
498 | --- a/drivers/cpufreq/cpufreq_stats.c |
499 | +++ b/drivers/cpufreq/cpufreq_stats.c |
500 | @@ -388,6 +388,7 @@ static void __exit cpufreq_stats_exit(void) |
501 | unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier); |
502 | for_each_online_cpu(cpu) { |
503 | cpufreq_stats_free_table(cpu); |
504 | + cpufreq_stats_free_sysfs(cpu); |
505 | } |
506 | } |
507 | |
508 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
509 | index 67cb076..b28f7bd 100644 |
510 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
511 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
512 | @@ -727,6 +727,14 @@ static const struct dmi_system_id intel_no_lvds[] = { |
513 | DMI_MATCH(DMI_PRODUCT_NAME, "U800"), |
514 | }, |
515 | }, |
516 | + { |
517 | + .callback = intel_no_lvds_dmi_callback, |
518 | + .ident = "Asus EeeBox PC EB1007", |
519 | + .matches = { |
520 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."), |
521 | + DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"), |
522 | + }, |
523 | + }, |
524 | |
525 | { } /* terminating entry */ |
526 | }; |
527 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
528 | index 529a3a7..02705c7 100644 |
529 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
530 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
531 | @@ -1011,7 +1011,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, |
532 | uint64_t fb_location; |
533 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
534 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); |
535 | - u32 tmp; |
536 | + u32 tmp, viewport_w, viewport_h; |
537 | int r; |
538 | |
539 | /* no fb bound */ |
540 | @@ -1137,8 +1137,10 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, |
541 | y &= ~1; |
542 | WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, |
543 | (x << 16) | y); |
544 | + viewport_w = crtc->mode.hdisplay; |
545 | + viewport_h = (crtc->mode.vdisplay + 1) & ~1; |
546 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
547 | - (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
548 | + (viewport_w << 16) | viewport_h); |
549 | |
550 | /* pageflip setup */ |
551 | /* make sure flip is at vb rather than hb */ |
552 | @@ -1179,7 +1181,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, |
553 | uint64_t fb_location; |
554 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
555 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; |
556 | - u32 tmp; |
557 | + u32 tmp, viewport_w, viewport_h; |
558 | int r; |
559 | |
560 | /* no fb bound */ |
561 | @@ -1304,8 +1306,10 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, |
562 | y &= ~1; |
563 | WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, |
564 | (x << 16) | y); |
565 | + viewport_w = crtc->mode.hdisplay; |
566 | + viewport_h = (crtc->mode.vdisplay + 1) & ~1; |
567 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
568 | - (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
569 | + (viewport_w << 16) | viewport_h); |
570 | |
571 | /* pageflip setup */ |
572 | /* make sure flip is at vb rather than hb */ |
573 | diff --git a/drivers/gpu/drm/radeon/r100_track.h b/drivers/gpu/drm/radeon/r100_track.h |
574 | index 2fef9de..686f9dc 100644 |
575 | --- a/drivers/gpu/drm/radeon/r100_track.h |
576 | +++ b/drivers/gpu/drm/radeon/r100_track.h |
577 | @@ -63,7 +63,7 @@ struct r100_cs_track { |
578 | unsigned num_arrays; |
579 | unsigned max_indx; |
580 | unsigned color_channel_mask; |
581 | - struct r100_cs_track_array arrays[11]; |
582 | + struct r100_cs_track_array arrays[16]; |
583 | struct r100_cs_track_cb cb[R300_MAX_CB]; |
584 | struct r100_cs_track_cb zb; |
585 | struct r100_cs_track_cb aa; |
586 | @@ -146,6 +146,12 @@ static inline int r100_packet3_load_vbpntr(struct radeon_cs_parser *p, |
587 | ib = p->ib->ptr; |
588 | track = (struct r100_cs_track *)p->track; |
589 | c = radeon_get_ib_value(p, idx++) & 0x1F; |
590 | + if (c > 16) { |
591 | + DRM_ERROR("Only 16 vertex buffers are allowed %d\n", |
592 | + pkt->opcode); |
593 | + r100_cs_dump_packet(p, pkt); |
594 | + return -EINVAL; |
595 | + } |
596 | track->num_arrays = c; |
597 | for (i = 0; i < (c - 1); i+=2, idx+=3) { |
598 | r = r100_cs_packet_next_reloc(p, &reloc); |
599 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
600 | index 890217e..5d6ccc3 100644 |
601 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
602 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
603 | @@ -752,6 +752,7 @@ int radeon_device_init(struct radeon_device *rdev, |
604 | dma_bits = rdev->need_dma32 ? 32 : 40; |
605 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
606 | if (r) { |
607 | + rdev->need_dma32 = true; |
608 | printk(KERN_WARNING "radeon: No suitable DMA available.\n"); |
609 | } |
610 | |
611 | diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c |
612 | index 194ca0a..08cea44 100644 |
613 | --- a/drivers/hwmon/coretemp.c |
614 | +++ b/drivers/hwmon/coretemp.c |
615 | @@ -263,7 +263,7 @@ static int __devinit get_tjmax(struct cpuinfo_x86 *c, u32 id, |
616 | * If the TjMax is not plausible, an assumption |
617 | * will be used |
618 | */ |
619 | - if ((val > 80) && (val < 120)) { |
620 | + if (val >= 70 && val <= 125) { |
621 | dev_info(dev, "TjMax is %d C.\n", val); |
622 | return val * 1000; |
623 | } |
624 | @@ -271,24 +271,9 @@ static int __devinit get_tjmax(struct cpuinfo_x86 *c, u32 id, |
625 | |
626 | /* |
627 | * An assumption is made for early CPUs and unreadable MSR. |
628 | - * NOTE: the given value may not be correct. |
629 | + * NOTE: the calculated value may not be correct. |
630 | */ |
631 | - |
632 | - switch (c->x86_model) { |
633 | - case 0xe: |
634 | - case 0xf: |
635 | - case 0x16: |
636 | - case 0x1a: |
637 | - dev_warn(dev, "TjMax is assumed as 100 C!\n"); |
638 | - return 100000; |
639 | - case 0x17: |
640 | - case 0x1c: /* Atom CPUs */ |
641 | - return adjust_tjmax(c, id, dev); |
642 | - default: |
643 | - dev_warn(dev, "CPU (model=0x%x) is not supported yet," |
644 | - " using default TjMax of 100C.\n", c->x86_model); |
645 | - return 100000; |
646 | - } |
647 | + return adjust_tjmax(c, id, dev); |
648 | } |
649 | |
650 | static void __devinit get_ucode_rev_on_cpu(void *edx) |
651 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
652 | index 4a4c0f8..9930792 100644 |
653 | --- a/drivers/md/md.c |
654 | +++ b/drivers/md/md.c |
655 | @@ -2462,7 +2462,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) |
656 | if (rdev->raid_disk == -1) |
657 | return -EEXIST; |
658 | /* personality does all needed checks */ |
659 | - if (rdev->mddev->pers->hot_add_disk == NULL) |
660 | + if (rdev->mddev->pers->hot_remove_disk == NULL) |
661 | return -EINVAL; |
662 | err = rdev->mddev->pers-> |
663 | hot_remove_disk(rdev->mddev, rdev->raid_disk); |
664 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
665 | index 49bf5f8..3d13d11 100644 |
666 | --- a/drivers/md/raid5.c |
667 | +++ b/drivers/md/raid5.c |
668 | @@ -129,7 +129,7 @@ static inline int raid5_dec_bi_hw_segments(struct bio *bio) |
669 | |
670 | static inline void raid5_set_bi_hw_segments(struct bio *bio, unsigned int cnt) |
671 | { |
672 | - bio->bi_phys_segments = raid5_bi_phys_segments(bio) || (cnt << 16); |
673 | + bio->bi_phys_segments = raid5_bi_phys_segments(bio) | (cnt << 16); |
674 | } |
675 | |
676 | /* Find first data disk in a raid6 stripe */ |
677 | @@ -514,7 +514,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) |
678 | bi = &sh->dev[i].req; |
679 | |
680 | bi->bi_rw = rw; |
681 | - if (rw == WRITE) |
682 | + if (rw & WRITE) |
683 | bi->bi_end_io = raid5_end_write_request; |
684 | else |
685 | bi->bi_end_io = raid5_end_read_request; |
686 | @@ -548,13 +548,13 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) |
687 | bi->bi_io_vec[0].bv_offset = 0; |
688 | bi->bi_size = STRIPE_SIZE; |
689 | bi->bi_next = NULL; |
690 | - if (rw == WRITE && |
691 | + if ((rw & WRITE) && |
692 | test_bit(R5_ReWrite, &sh->dev[i].flags)) |
693 | atomic_add(STRIPE_SECTORS, |
694 | &rdev->corrected_errors); |
695 | generic_make_request(bi); |
696 | } else { |
697 | - if (rw == WRITE) |
698 | + if (rw & WRITE) |
699 | set_bit(STRIPE_DEGRADED, &sh->state); |
700 | pr_debug("skip op %ld on disc %d for sector %llu\n", |
701 | bi->bi_rw, i, (unsigned long long)sh->sector); |
702 | diff --git a/drivers/media/media-devnode.c b/drivers/media/media-devnode.c |
703 | index af5263c..7b42ace 100644 |
704 | --- a/drivers/media/media-devnode.c |
705 | +++ b/drivers/media/media-devnode.c |
706 | @@ -213,14 +213,14 @@ int __must_check media_devnode_register(struct media_devnode *mdev) |
707 | |
708 | /* Part 1: Find a free minor number */ |
709 | mutex_lock(&media_devnode_lock); |
710 | - minor = find_next_zero_bit(media_devnode_nums, 0, MEDIA_NUM_DEVICES); |
711 | + minor = find_next_zero_bit(media_devnode_nums, MEDIA_NUM_DEVICES, 0); |
712 | if (minor == MEDIA_NUM_DEVICES) { |
713 | mutex_unlock(&media_devnode_lock); |
714 | printk(KERN_ERR "could not get a free minor\n"); |
715 | return -ENFILE; |
716 | } |
717 | |
718 | - set_bit(mdev->minor, media_devnode_nums); |
719 | + set_bit(minor, media_devnode_nums); |
720 | mutex_unlock(&media_devnode_lock); |
721 | |
722 | mdev->minor = minor; |
723 | diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c |
724 | index 0dfd1b9..0e3fccb 100644 |
725 | --- a/drivers/net/igb/igb_main.c |
726 | +++ b/drivers/net/igb/igb_main.c |
727 | @@ -2372,6 +2372,9 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) |
728 | } |
729 | #endif /* CONFIG_PCI_IOV */ |
730 | adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); |
731 | + /* i350 cannot do RSS and SR-IOV at the same time */ |
732 | + if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count) |
733 | + adapter->rss_queues = 1; |
734 | |
735 | /* |
736 | * if rss_queues > 4 or vfs are going to be allocated with rss_queues |
737 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c |
738 | index 1033ef6..f2b974d 100644 |
739 | --- a/drivers/net/usb/cdc_ncm.c |
740 | +++ b/drivers/net/usb/cdc_ncm.c |
741 | @@ -1254,6 +1254,7 @@ static struct usb_driver cdc_ncm_driver = { |
742 | .disconnect = cdc_ncm_disconnect, |
743 | .suspend = usbnet_suspend, |
744 | .resume = usbnet_resume, |
745 | + .reset_resume = usbnet_resume, |
746 | .supports_autosuspend = 1, |
747 | }; |
748 | |
749 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
750 | index 37af3f4..db4416c 100644 |
751 | --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
752 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
753 | @@ -4598,10 +4598,16 @@ static void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah, |
754 | case 1: |
755 | break; |
756 | case 2: |
757 | - scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; |
758 | + if (scaledPower > REDUCE_SCALED_POWER_BY_TWO_CHAIN) |
759 | + scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; |
760 | + else |
761 | + scaledPower = 0; |
762 | break; |
763 | case 3: |
764 | - scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; |
765 | + if (scaledPower > REDUCE_SCALED_POWER_BY_THREE_CHAIN) |
766 | + scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; |
767 | + else |
768 | + scaledPower = 0; |
769 | break; |
770 | } |
771 | |
772 | diff --git a/drivers/net/wireless/ath/ath9k/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c |
773 | index 8cd8333..945e448 100644 |
774 | --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c |
775 | +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c |
776 | @@ -522,10 +522,16 @@ static void ath9k_hw_set_ar9287_power_per_rate_table(struct ath_hw *ah, |
777 | case 1: |
778 | break; |
779 | case 2: |
780 | - scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; |
781 | + if (scaledPower > REDUCE_SCALED_POWER_BY_TWO_CHAIN) |
782 | + scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; |
783 | + else |
784 | + scaledPower = 0; |
785 | break; |
786 | case 3: |
787 | - scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; |
788 | + if (scaledPower > REDUCE_SCALED_POWER_BY_THREE_CHAIN) |
789 | + scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; |
790 | + else |
791 | + scaledPower = 0; |
792 | break; |
793 | } |
794 | scaledPower = max((u16)0, scaledPower); |
795 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c |
796 | index 1482fa6..846bb4f 100644 |
797 | --- a/drivers/net/wireless/ath/ath9k/main.c |
798 | +++ b/drivers/net/wireless/ath/ath9k/main.c |
799 | @@ -633,7 +633,8 @@ void ath9k_tasklet(unsigned long data) |
800 | u32 status = sc->intrstatus; |
801 | u32 rxmask; |
802 | |
803 | - if (status & ATH9K_INT_FATAL) { |
804 | + if ((status & ATH9K_INT_FATAL) || |
805 | + (status & ATH9K_INT_BB_WATCHDOG)) { |
806 | ath_reset(sc, true); |
807 | return; |
808 | } |
809 | @@ -699,6 +700,7 @@ irqreturn_t ath_isr(int irq, void *dev) |
810 | { |
811 | #define SCHED_INTR ( \ |
812 | ATH9K_INT_FATAL | \ |
813 | + ATH9K_INT_BB_WATCHDOG | \ |
814 | ATH9K_INT_RXORN | \ |
815 | ATH9K_INT_RXEOL | \ |
816 | ATH9K_INT_RX | \ |
817 | diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c |
818 | index 4c0d36a..a39dfc4 100644 |
819 | --- a/drivers/net/wireless/ath/ath9k/rc.c |
820 | +++ b/drivers/net/wireless/ath/ath9k/rc.c |
821 | @@ -689,7 +689,8 @@ static void ath_rc_rate_set_series(const struct ath_rate_table *rate_table, |
822 | |
823 | if (WLAN_RC_PHY_HT(rate_table->info[rix].phy)) { |
824 | rate->flags |= IEEE80211_TX_RC_MCS; |
825 | - if (WLAN_RC_PHY_40(rate_table->info[rix].phy)) |
826 | + if (WLAN_RC_PHY_40(rate_table->info[rix].phy) && |
827 | + conf_is_ht40(&txrc->hw->conf)) |
828 | rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; |
829 | if (WLAN_RC_PHY_SGI(rate_table->info[rix].phy)) |
830 | rate->flags |= IEEE80211_TX_RC_SHORT_GI; |
831 | diff --git a/drivers/net/wireless/iwlegacy/iwl-4965-lib.c b/drivers/net/wireless/iwlegacy/iwl-4965-lib.c |
832 | index 5a8a3cc..455f1f7 100644 |
833 | --- a/drivers/net/wireless/iwlegacy/iwl-4965-lib.c |
834 | +++ b/drivers/net/wireless/iwlegacy/iwl-4965-lib.c |
835 | @@ -628,11 +628,11 @@ void iwl4965_rx_reply_rx(struct iwl_priv *priv, |
836 | |
837 | /* rx_status carries information about the packet to mac80211 */ |
838 | rx_status.mactime = le64_to_cpu(phy_res->timestamp); |
839 | + rx_status.band = (phy_res->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? |
840 | + IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; |
841 | rx_status.freq = |
842 | ieee80211_channel_to_frequency(le16_to_cpu(phy_res->channel), |
843 | rx_status.band); |
844 | - rx_status.band = (phy_res->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? |
845 | - IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; |
846 | rx_status.rate_idx = |
847 | iwl4965_hwrate_to_mac80211_idx(rate_n_flags, rx_status.band); |
848 | rx_status.flag = 0; |
849 | diff --git a/drivers/net/wireless/iwlegacy/iwl-4965.c b/drivers/net/wireless/iwlegacy/iwl-4965.c |
850 | index f5433c7..facc94e 100644 |
851 | --- a/drivers/net/wireless/iwlegacy/iwl-4965.c |
852 | +++ b/drivers/net/wireless/iwlegacy/iwl-4965.c |
853 | @@ -1218,10 +1218,10 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c |
854 | * receive commit_rxon request |
855 | * abort any previous channel switch if still in process |
856 | */ |
857 | - if (priv->switch_rxon.switch_in_progress && |
858 | - (priv->switch_rxon.channel != ctx->staging.channel)) { |
859 | + if (test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status) && |
860 | + (priv->switch_channel != ctx->staging.channel)) { |
861 | IWL_DEBUG_11H(priv, "abort channel switch on %d\n", |
862 | - le16_to_cpu(priv->switch_rxon.channel)); |
863 | + le16_to_cpu(priv->switch_channel)); |
864 | iwl_legacy_chswitch_done(priv, false); |
865 | } |
866 | |
867 | @@ -1237,7 +1237,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c |
868 | |
869 | memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon)); |
870 | iwl_legacy_print_rx_config_cmd(priv, ctx); |
871 | - return 0; |
872 | + goto set_tx_power; |
873 | } |
874 | |
875 | /* If we are currently associated and the new config requires |
876 | @@ -1317,6 +1317,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c |
877 | |
878 | iwl4965_init_sensitivity(priv); |
879 | |
880 | +set_tx_power: |
881 | /* If we issue a new RXON command which required a tune then we must |
882 | * send a new TXPOWER command or we won't be able to Tx any frames */ |
883 | ret = iwl_legacy_set_tx_power(priv, priv->tx_power_next, true); |
884 | @@ -1403,9 +1404,6 @@ static int iwl4965_hw_channel_switch(struct iwl_priv *priv, |
885 | return rc; |
886 | } |
887 | |
888 | - priv->switch_rxon.channel = cmd.channel; |
889 | - priv->switch_rxon.switch_in_progress = true; |
890 | - |
891 | return iwl_legacy_send_cmd_pdu(priv, |
892 | REPLY_CHANNEL_SWITCH, sizeof(cmd), &cmd); |
893 | } |
894 | @@ -1543,7 +1541,7 @@ static void iwl4965_temperature_calib(struct iwl_priv *priv) |
895 | s32 temp; |
896 | |
897 | temp = iwl4965_hw_get_temperature(priv); |
898 | - if (temp < 0) |
899 | + if (IWL_TX_POWER_TEMPERATURE_OUT_OF_RANGE(temp)) |
900 | return; |
901 | |
902 | if (priv->temperature != temp) { |
903 | diff --git a/drivers/net/wireless/iwlegacy/iwl-core.c b/drivers/net/wireless/iwlegacy/iwl-core.c |
904 | index 42db0fc..8ad7922 100644 |
905 | --- a/drivers/net/wireless/iwlegacy/iwl-core.c |
906 | +++ b/drivers/net/wireless/iwlegacy/iwl-core.c |
907 | @@ -862,12 +862,8 @@ void iwl_legacy_chswitch_done(struct iwl_priv *priv, bool is_success) |
908 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
909 | return; |
910 | |
911 | - if (priv->switch_rxon.switch_in_progress) { |
912 | + if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
913 | ieee80211_chswitch_done(ctx->vif, is_success); |
914 | - mutex_lock(&priv->mutex); |
915 | - priv->switch_rxon.switch_in_progress = false; |
916 | - mutex_unlock(&priv->mutex); |
917 | - } |
918 | } |
919 | EXPORT_SYMBOL(iwl_legacy_chswitch_done); |
920 | |
921 | @@ -879,19 +875,19 @@ void iwl_legacy_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) |
922 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; |
923 | struct iwl_legacy_rxon_cmd *rxon = (void *)&ctx->active; |
924 | |
925 | - if (priv->switch_rxon.switch_in_progress) { |
926 | - if (!le32_to_cpu(csa->status) && |
927 | - (csa->channel == priv->switch_rxon.channel)) { |
928 | - rxon->channel = csa->channel; |
929 | - ctx->staging.channel = csa->channel; |
930 | - IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", |
931 | - le16_to_cpu(csa->channel)); |
932 | - iwl_legacy_chswitch_done(priv, true); |
933 | - } else { |
934 | - IWL_ERR(priv, "CSA notif (fail) : channel %d\n", |
935 | + if (!test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
936 | + return; |
937 | + |
938 | + if (!le32_to_cpu(csa->status) && csa->channel == priv->switch_channel) { |
939 | + rxon->channel = csa->channel; |
940 | + ctx->staging.channel = csa->channel; |
941 | + IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", |
942 | le16_to_cpu(csa->channel)); |
943 | - iwl_legacy_chswitch_done(priv, false); |
944 | - } |
945 | + iwl_legacy_chswitch_done(priv, true); |
946 | + } else { |
947 | + IWL_ERR(priv, "CSA notif (fail) : channel %d\n", |
948 | + le16_to_cpu(csa->channel)); |
949 | + iwl_legacy_chswitch_done(priv, false); |
950 | } |
951 | } |
952 | EXPORT_SYMBOL(iwl_legacy_rx_csa); |
953 | diff --git a/drivers/net/wireless/iwlegacy/iwl-core.h b/drivers/net/wireless/iwlegacy/iwl-core.h |
954 | index f03b463..e49176a 100644 |
955 | --- a/drivers/net/wireless/iwlegacy/iwl-core.h |
956 | +++ b/drivers/net/wireless/iwlegacy/iwl-core.h |
957 | @@ -561,7 +561,7 @@ void iwl_legacy_free_geos(struct iwl_priv *priv); |
958 | #define STATUS_SCAN_HW 15 |
959 | #define STATUS_POWER_PMI 16 |
960 | #define STATUS_FW_ERROR 17 |
961 | - |
962 | +#define STATUS_CHANNEL_SWITCH_PENDING 18 |
963 | |
964 | static inline int iwl_legacy_is_ready(struct iwl_priv *priv) |
965 | { |
966 | diff --git a/drivers/net/wireless/iwlegacy/iwl-dev.h b/drivers/net/wireless/iwlegacy/iwl-dev.h |
967 | index f43ac1e..54f89b4 100644 |
968 | --- a/drivers/net/wireless/iwlegacy/iwl-dev.h |
969 | +++ b/drivers/net/wireless/iwlegacy/iwl-dev.h |
970 | @@ -854,17 +854,6 @@ struct traffic_stats { |
971 | }; |
972 | |
973 | /* |
974 | - * iwl_switch_rxon: "channel switch" structure |
975 | - * |
976 | - * @ switch_in_progress: channel switch in progress |
977 | - * @ channel: new channel |
978 | - */ |
979 | -struct iwl_switch_rxon { |
980 | - bool switch_in_progress; |
981 | - __le16 channel; |
982 | -}; |
983 | - |
984 | -/* |
985 | * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds |
986 | * to perform continuous uCode event logging operation if enabled |
987 | */ |
988 | @@ -1115,7 +1104,7 @@ struct iwl_priv { |
989 | |
990 | struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; |
991 | |
992 | - struct iwl_switch_rxon switch_rxon; |
993 | + __le16 switch_channel; |
994 | |
995 | /* 1st responses from initialize and runtime uCode images. |
996 | * _4965's initialize alive response contains some calibration data. */ |
997 | diff --git a/drivers/net/wireless/iwlegacy/iwl4965-base.c b/drivers/net/wireless/iwlegacy/iwl4965-base.c |
998 | index a62fe24..d654876 100644 |
999 | --- a/drivers/net/wireless/iwlegacy/iwl4965-base.c |
1000 | +++ b/drivers/net/wireless/iwlegacy/iwl4965-base.c |
1001 | @@ -2851,16 +2851,13 @@ void iwl4965_mac_channel_switch(struct ieee80211_hw *hw, |
1002 | goto out_exit; |
1003 | |
1004 | if (test_bit(STATUS_EXIT_PENDING, &priv->status) || |
1005 | - test_bit(STATUS_SCANNING, &priv->status)) |
1006 | + test_bit(STATUS_SCANNING, &priv->status) || |
1007 | + test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
1008 | goto out_exit; |
1009 | |
1010 | if (!iwl_legacy_is_associated_ctx(ctx)) |
1011 | goto out_exit; |
1012 | |
1013 | - /* channel switch in progress */ |
1014 | - if (priv->switch_rxon.switch_in_progress == true) |
1015 | - goto out_exit; |
1016 | - |
1017 | mutex_lock(&priv->mutex); |
1018 | if (priv->cfg->ops->lib->set_channel_switch) { |
1019 | |
1020 | @@ -2910,16 +2907,20 @@ void iwl4965_mac_channel_switch(struct ieee80211_hw *hw, |
1021 | * at this point, staging_rxon has the |
1022 | * configuration for channel switch |
1023 | */ |
1024 | + set_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status); |
1025 | + priv->switch_channel = cpu_to_le16(ch); |
1026 | if (priv->cfg->ops->lib->set_channel_switch(priv, |
1027 | - ch_switch)) |
1028 | - priv->switch_rxon.switch_in_progress = false; |
1029 | + ch_switch)) { |
1030 | + clear_bit(STATUS_CHANNEL_SWITCH_PENDING, |
1031 | + &priv->status); |
1032 | + priv->switch_channel = 0; |
1033 | + ieee80211_chswitch_done(ctx->vif, false); |
1034 | + } |
1035 | } |
1036 | } |
1037 | out: |
1038 | mutex_unlock(&priv->mutex); |
1039 | out_exit: |
1040 | - if (!priv->switch_rxon.switch_in_progress) |
1041 | - ieee80211_chswitch_done(ctx->vif, false); |
1042 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
1043 | } |
1044 | |
1045 | diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c |
1046 | index d7b6126..d474cf3 100644 |
1047 | --- a/drivers/net/wireless/iwlwifi/iwl-2000.c |
1048 | +++ b/drivers/net/wireless/iwlwifi/iwl-2000.c |
1049 | @@ -181,79 +181,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv) |
1050 | return 0; |
1051 | } |
1052 | |
1053 | -static int iwl2030_hw_channel_switch(struct iwl_priv *priv, |
1054 | - struct ieee80211_channel_switch *ch_switch) |
1055 | -{ |
1056 | - /* |
1057 | - * MULTI-FIXME |
1058 | - * See iwl_mac_channel_switch. |
1059 | - */ |
1060 | - struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; |
1061 | - struct iwl6000_channel_switch_cmd cmd; |
1062 | - const struct iwl_channel_info *ch_info; |
1063 | - u32 switch_time_in_usec, ucode_switch_time; |
1064 | - u16 ch; |
1065 | - u32 tsf_low; |
1066 | - u8 switch_count; |
1067 | - u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); |
1068 | - struct ieee80211_vif *vif = ctx->vif; |
1069 | - struct iwl_host_cmd hcmd = { |
1070 | - .id = REPLY_CHANNEL_SWITCH, |
1071 | - .len = sizeof(cmd), |
1072 | - .flags = CMD_SYNC, |
1073 | - .data = &cmd, |
1074 | - }; |
1075 | - |
1076 | - cmd.band = priv->band == IEEE80211_BAND_2GHZ; |
1077 | - ch = ch_switch->channel->hw_value; |
1078 | - IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", |
1079 | - ctx->active.channel, ch); |
1080 | - cmd.channel = cpu_to_le16(ch); |
1081 | - cmd.rxon_flags = ctx->staging.flags; |
1082 | - cmd.rxon_filter_flags = ctx->staging.filter_flags; |
1083 | - switch_count = ch_switch->count; |
1084 | - tsf_low = ch_switch->timestamp & 0x0ffffffff; |
1085 | - /* |
1086 | - * calculate the ucode channel switch time |
1087 | - * adding TSF as one of the factor for when to switch |
1088 | - */ |
1089 | - if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { |
1090 | - if (switch_count > ((priv->ucode_beacon_time - tsf_low) / |
1091 | - beacon_interval)) { |
1092 | - switch_count -= (priv->ucode_beacon_time - |
1093 | - tsf_low) / beacon_interval; |
1094 | - } else |
1095 | - switch_count = 0; |
1096 | - } |
1097 | - if (switch_count <= 1) |
1098 | - cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); |
1099 | - else { |
1100 | - switch_time_in_usec = |
1101 | - vif->bss_conf.beacon_int * switch_count * TIME_UNIT; |
1102 | - ucode_switch_time = iwl_usecs_to_beacons(priv, |
1103 | - switch_time_in_usec, |
1104 | - beacon_interval); |
1105 | - cmd.switch_time = iwl_add_beacon_time(priv, |
1106 | - priv->ucode_beacon_time, |
1107 | - ucode_switch_time, |
1108 | - beacon_interval); |
1109 | - } |
1110 | - IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", |
1111 | - cmd.switch_time); |
1112 | - ch_info = iwl_get_channel_info(priv, priv->band, ch); |
1113 | - if (ch_info) |
1114 | - cmd.expect_beacon = is_channel_radar(ch_info); |
1115 | - else { |
1116 | - IWL_ERR(priv, "invalid channel switch from %u to %u\n", |
1117 | - ctx->active.channel, ch); |
1118 | - return -EFAULT; |
1119 | - } |
1120 | - priv->switch_rxon.channel = cmd.channel; |
1121 | - priv->switch_rxon.switch_in_progress = true; |
1122 | - |
1123 | - return iwl_send_cmd_sync(priv, &hcmd); |
1124 | -} |
1125 | - |
1126 | static struct iwl_lib_ops iwl2000_lib = { |
1127 | .set_hw_params = iwl2000_hw_set_hw_params, |
1128 | .txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl, |
1129 | @@ -277,7 +204,6 @@ static struct iwl_lib_ops iwl2000_lib = { |
1130 | .alive_notify = iwlagn_alive_notify, |
1131 | .send_tx_power = iwlagn_send_tx_power, |
1132 | .update_chain_flags = iwl_update_chain_flags, |
1133 | - .set_channel_switch = iwl2030_hw_channel_switch, |
1134 | .apm_ops = { |
1135 | .init = iwl_apm_init, |
1136 | .config = iwl2000_nic_config, |
1137 | diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c |
1138 | index 22e045b..dcf40e8 100644 |
1139 | --- a/drivers/net/wireless/iwlwifi/iwl-5000.c |
1140 | +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c |
1141 | @@ -337,8 +337,6 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv, |
1142 | ctx->active.channel, ch); |
1143 | return -EFAULT; |
1144 | } |
1145 | - priv->switch_rxon.channel = cmd.channel; |
1146 | - priv->switch_rxon.switch_in_progress = true; |
1147 | |
1148 | return iwl_send_cmd_sync(priv, &hcmd); |
1149 | } |
1150 | @@ -513,7 +511,6 @@ static struct iwl_base_params iwl5000_base_params = { |
1151 | }; |
1152 | static struct iwl_ht_params iwl5000_ht_params = { |
1153 | .ht_greenfield_support = true, |
1154 | - .use_rts_for_aggregation = true, /* use rts/cts protection */ |
1155 | }; |
1156 | |
1157 | #define IWL_DEVICE_5000 \ |
1158 | diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c |
1159 | index a745b01..9035255 100644 |
1160 | --- a/drivers/net/wireless/iwlwifi/iwl-6000.c |
1161 | +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c |
1162 | @@ -277,8 +277,6 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv, |
1163 | ctx->active.channel, ch); |
1164 | return -EFAULT; |
1165 | } |
1166 | - priv->switch_rxon.channel = cmd.channel; |
1167 | - priv->switch_rxon.switch_in_progress = true; |
1168 | |
1169 | return iwl_send_cmd_sync(priv, &hcmd); |
1170 | } |
1171 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c |
1172 | index 41543ad..129a551 100644 |
1173 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c |
1174 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c |
1175 | @@ -217,17 +217,9 @@ static void iwlagn_tx_cmd_protection(struct iwl_priv *priv, |
1176 | __le16 fc, __le32 *tx_flags) |
1177 | { |
1178 | if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS || |
1179 | - info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { |
1180 | + info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT || |
1181 | + info->flags & IEEE80211_TX_CTL_AMPDU) |
1182 | *tx_flags |= TX_CMD_FLG_PROT_REQUIRE_MSK; |
1183 | - return; |
1184 | - } |
1185 | - |
1186 | - if (priv->cfg->ht_params && |
1187 | - priv->cfg->ht_params->use_rts_for_aggregation && |
1188 | - info->flags & IEEE80211_TX_CTL_AMPDU) { |
1189 | - *tx_flags |= TX_CMD_FLG_PROT_REQUIRE_MSK; |
1190 | - return; |
1191 | - } |
1192 | } |
1193 | |
1194 | /* Calc max signal level (dBm) among 3 possible receivers */ |
1195 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c |
1196 | index fbbde07..7c0f80c 100644 |
1197 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c |
1198 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c |
1199 | @@ -173,6 +173,14 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
1200 | return 0; |
1201 | } |
1202 | |
1203 | + /* |
1204 | + * force CTS-to-self frames protection if RTS-CTS is not preferred |
1205 | + * one aggregation protection method |
1206 | + */ |
1207 | + if (!(priv->cfg->ht_params && |
1208 | + priv->cfg->ht_params->use_rts_for_aggregation)) |
1209 | + ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; |
1210 | + |
1211 | if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) || |
1212 | !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK)) |
1213 | ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; |
1214 | @@ -189,10 +197,10 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
1215 | * receive commit_rxon request |
1216 | * abort any previous channel switch if still in process |
1217 | */ |
1218 | - if (priv->switch_rxon.switch_in_progress && |
1219 | - (priv->switch_rxon.channel != ctx->staging.channel)) { |
1220 | + if (test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status) && |
1221 | + (priv->switch_channel != ctx->staging.channel)) { |
1222 | IWL_DEBUG_11H(priv, "abort channel switch on %d\n", |
1223 | - le16_to_cpu(priv->switch_rxon.channel)); |
1224 | + le16_to_cpu(priv->switch_channel)); |
1225 | iwl_chswitch_done(priv, false); |
1226 | } |
1227 | |
1228 | @@ -210,6 +218,11 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
1229 | |
1230 | memcpy(active, &ctx->staging, sizeof(*active)); |
1231 | iwl_print_rx_config_cmd(priv, ctx); |
1232 | + /* |
1233 | + * We do not commit tx power settings while channel changing, |
1234 | + * do it now if after settings changed. |
1235 | + */ |
1236 | + iwl_set_tx_power(priv, priv->tx_power_next, false); |
1237 | return 0; |
1238 | } |
1239 | |
1240 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c |
1241 | index 321b18b..5941e61 100644 |
1242 | --- a/drivers/net/wireless/iwlwifi/iwl-agn.c |
1243 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c |
1244 | @@ -3461,16 +3461,13 @@ void iwlagn_mac_channel_switch(struct ieee80211_hw *hw, |
1245 | goto out_exit; |
1246 | |
1247 | if (test_bit(STATUS_EXIT_PENDING, &priv->status) || |
1248 | - test_bit(STATUS_SCANNING, &priv->status)) |
1249 | + test_bit(STATUS_SCANNING, &priv->status) || |
1250 | + test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
1251 | goto out_exit; |
1252 | |
1253 | if (!iwl_is_associated_ctx(ctx)) |
1254 | goto out_exit; |
1255 | |
1256 | - /* channel switch in progress */ |
1257 | - if (priv->switch_rxon.switch_in_progress == true) |
1258 | - goto out_exit; |
1259 | - |
1260 | mutex_lock(&priv->mutex); |
1261 | if (priv->cfg->ops->lib->set_channel_switch) { |
1262 | |
1263 | @@ -3520,16 +3517,20 @@ void iwlagn_mac_channel_switch(struct ieee80211_hw *hw, |
1264 | * at this point, staging_rxon has the |
1265 | * configuration for channel switch |
1266 | */ |
1267 | + set_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status); |
1268 | + priv->switch_channel = cpu_to_le16(ch); |
1269 | if (priv->cfg->ops->lib->set_channel_switch(priv, |
1270 | - ch_switch)) |
1271 | - priv->switch_rxon.switch_in_progress = false; |
1272 | + ch_switch)) { |
1273 | + clear_bit(STATUS_CHANNEL_SWITCH_PENDING, |
1274 | + &priv->status); |
1275 | + priv->switch_channel = 0; |
1276 | + ieee80211_chswitch_done(ctx->vif, false); |
1277 | + } |
1278 | } |
1279 | } |
1280 | out: |
1281 | mutex_unlock(&priv->mutex); |
1282 | out_exit: |
1283 | - if (!priv->switch_rxon.switch_in_progress) |
1284 | - ieee80211_chswitch_done(ctx->vif, false); |
1285 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
1286 | } |
1287 | |
1288 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c |
1289 | index 1755729..7950bc4 100644 |
1290 | --- a/drivers/net/wireless/iwlwifi/iwl-core.c |
1291 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.c |
1292 | @@ -861,12 +861,8 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success) |
1293 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
1294 | return; |
1295 | |
1296 | - if (priv->switch_rxon.switch_in_progress) { |
1297 | + if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
1298 | ieee80211_chswitch_done(ctx->vif, is_success); |
1299 | - mutex_lock(&priv->mutex); |
1300 | - priv->switch_rxon.switch_in_progress = false; |
1301 | - mutex_unlock(&priv->mutex); |
1302 | - } |
1303 | } |
1304 | |
1305 | #ifdef CONFIG_IWLWIFI_DEBUG |
1306 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h |
1307 | index b316d83..92f65b6 100644 |
1308 | --- a/drivers/net/wireless/iwlwifi/iwl-core.h |
1309 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.h |
1310 | @@ -662,7 +662,7 @@ void iwlcore_free_geos(struct iwl_priv *priv); |
1311 | #define STATUS_SCAN_HW 15 |
1312 | #define STATUS_POWER_PMI 16 |
1313 | #define STATUS_FW_ERROR 17 |
1314 | - |
1315 | +#define STATUS_CHANNEL_SWITCH_PENDING 19 |
1316 | |
1317 | static inline int iwl_is_ready(struct iwl_priv *priv) |
1318 | { |
1319 | diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h |
1320 | index c0a4cfb..65a16ae 100644 |
1321 | --- a/drivers/net/wireless/iwlwifi/iwl-dev.h |
1322 | +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h |
1323 | @@ -1037,17 +1037,6 @@ struct traffic_stats { |
1324 | }; |
1325 | |
1326 | /* |
1327 | - * iwl_switch_rxon: "channel switch" structure |
1328 | - * |
1329 | - * @ switch_in_progress: channel switch in progress |
1330 | - * @ channel: new channel |
1331 | - */ |
1332 | -struct iwl_switch_rxon { |
1333 | - bool switch_in_progress; |
1334 | - __le16 channel; |
1335 | -}; |
1336 | - |
1337 | -/* |
1338 | * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds |
1339 | * to perform continuous uCode event logging operation if enabled |
1340 | */ |
1341 | @@ -1344,7 +1333,7 @@ struct iwl_priv { |
1342 | |
1343 | struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; |
1344 | |
1345 | - struct iwl_switch_rxon switch_rxon; |
1346 | + __le16 switch_channel; |
1347 | |
1348 | /* 1st responses from initialize and runtime uCode images. |
1349 | * _agn's initialize alive response contains some calibration data. */ |
1350 | diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c |
1351 | index 6f9a2fa..8055910 100644 |
1352 | --- a/drivers/net/wireless/iwlwifi/iwl-rx.c |
1353 | +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c |
1354 | @@ -299,19 +299,19 @@ static void iwl_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) |
1355 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; |
1356 | struct iwl_rxon_cmd *rxon = (void *)&ctx->active; |
1357 | |
1358 | - if (priv->switch_rxon.switch_in_progress) { |
1359 | - if (!le32_to_cpu(csa->status) && |
1360 | - (csa->channel == priv->switch_rxon.channel)) { |
1361 | - rxon->channel = csa->channel; |
1362 | - ctx->staging.channel = csa->channel; |
1363 | - IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", |
1364 | - le16_to_cpu(csa->channel)); |
1365 | - iwl_chswitch_done(priv, true); |
1366 | - } else { |
1367 | - IWL_ERR(priv, "CSA notif (fail) : channel %d\n", |
1368 | + if (!test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
1369 | + return; |
1370 | + |
1371 | + if (!le32_to_cpu(csa->status) && csa->channel == priv->switch_channel) { |
1372 | + rxon->channel = csa->channel; |
1373 | + ctx->staging.channel = csa->channel; |
1374 | + IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", |
1375 | le16_to_cpu(csa->channel)); |
1376 | - iwl_chswitch_done(priv, false); |
1377 | - } |
1378 | + iwl_chswitch_done(priv, true); |
1379 | + } else { |
1380 | + IWL_ERR(priv, "CSA notif (fail) : channel %d\n", |
1381 | + le16_to_cpu(csa->channel)); |
1382 | + iwl_chswitch_done(priv, false); |
1383 | } |
1384 | } |
1385 | |
1386 | diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c |
1387 | index ab607bb..13c0c77 100644 |
1388 | --- a/drivers/net/wireless/zd1211rw/zd_usb.c |
1389 | +++ b/drivers/net/wireless/zd1211rw/zd_usb.c |
1390 | @@ -1533,6 +1533,31 @@ static void __exit usb_exit(void) |
1391 | module_init(usb_init); |
1392 | module_exit(usb_exit); |
1393 | |
1394 | +static int zd_ep_regs_out_msg(struct usb_device *udev, void *data, int len, |
1395 | + int *actual_length, int timeout) |
1396 | +{ |
1397 | + /* In USB 2.0 mode EP_REGS_OUT endpoint is interrupt type. However in |
1398 | + * USB 1.1 mode endpoint is bulk. Select correct type URB by endpoint |
1399 | + * descriptor. |
1400 | + */ |
1401 | + struct usb_host_endpoint *ep; |
1402 | + unsigned int pipe; |
1403 | + |
1404 | + pipe = usb_sndintpipe(udev, EP_REGS_OUT); |
1405 | + ep = usb_pipe_endpoint(udev, pipe); |
1406 | + if (!ep) |
1407 | + return -EINVAL; |
1408 | + |
1409 | + if (usb_endpoint_xfer_int(&ep->desc)) { |
1410 | + return usb_interrupt_msg(udev, pipe, data, len, |
1411 | + actual_length, timeout); |
1412 | + } else { |
1413 | + pipe = usb_sndbulkpipe(udev, EP_REGS_OUT); |
1414 | + return usb_bulk_msg(udev, pipe, data, len, actual_length, |
1415 | + timeout); |
1416 | + } |
1417 | +} |
1418 | + |
1419 | static int usb_int_regs_length(unsigned int count) |
1420 | { |
1421 | return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data); |
1422 | @@ -1648,15 +1673,14 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, |
1423 | |
1424 | udev = zd_usb_to_usbdev(usb); |
1425 | prepare_read_regs_int(usb); |
1426 | - r = usb_interrupt_msg(udev, usb_sndintpipe(udev, EP_REGS_OUT), |
1427 | - req, req_len, &actual_req_len, 50 /* ms */); |
1428 | + r = zd_ep_regs_out_msg(udev, req, req_len, &actual_req_len, 50 /*ms*/); |
1429 | if (r) { |
1430 | dev_dbg_f(zd_usb_dev(usb), |
1431 | - "error in usb_interrupt_msg(). Error number %d\n", r); |
1432 | + "error in zd_ep_regs_out_msg(). Error number %d\n", r); |
1433 | goto error; |
1434 | } |
1435 | if (req_len != actual_req_len) { |
1436 | - dev_dbg_f(zd_usb_dev(usb), "error in usb_interrupt_msg()\n" |
1437 | + dev_dbg_f(zd_usb_dev(usb), "error in zd_ep_regs_out_msg()\n" |
1438 | " req_len %d != actual_req_len %d\n", |
1439 | req_len, actual_req_len); |
1440 | r = -EIO; |
1441 | @@ -1818,9 +1842,17 @@ int zd_usb_iowrite16v_async(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, |
1442 | rw->value = cpu_to_le16(ioreqs[i].value); |
1443 | } |
1444 | |
1445 | - usb_fill_int_urb(urb, udev, usb_sndintpipe(udev, EP_REGS_OUT), |
1446 | - req, req_len, iowrite16v_urb_complete, usb, |
1447 | - ep->desc.bInterval); |
1448 | + /* In USB 2.0 mode endpoint is interrupt type. However in USB 1.1 mode |
1449 | + * endpoint is bulk. Select correct type URB by endpoint descriptor. |
1450 | + */ |
1451 | + if (usb_endpoint_xfer_int(&ep->desc)) |
1452 | + usb_fill_int_urb(urb, udev, usb_sndintpipe(udev, EP_REGS_OUT), |
1453 | + req, req_len, iowrite16v_urb_complete, usb, |
1454 | + ep->desc.bInterval); |
1455 | + else |
1456 | + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_REGS_OUT), |
1457 | + req, req_len, iowrite16v_urb_complete, usb); |
1458 | + |
1459 | urb->transfer_flags |= URB_FREE_BUFFER; |
1460 | |
1461 | /* Submit previous URB */ |
1462 | @@ -1924,15 +1956,14 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) |
1463 | } |
1464 | |
1465 | udev = zd_usb_to_usbdev(usb); |
1466 | - r = usb_interrupt_msg(udev, usb_sndintpipe(udev, EP_REGS_OUT), |
1467 | - req, req_len, &actual_req_len, 50 /* ms */); |
1468 | + r = zd_ep_regs_out_msg(udev, req, req_len, &actual_req_len, 50 /*ms*/); |
1469 | if (r) { |
1470 | dev_dbg_f(zd_usb_dev(usb), |
1471 | - "error in usb_interrupt_msg(). Error number %d\n", r); |
1472 | + "error in zd_ep_regs_out_msg(). Error number %d\n", r); |
1473 | goto out; |
1474 | } |
1475 | if (req_len != actual_req_len) { |
1476 | - dev_dbg_f(zd_usb_dev(usb), "error in usb_interrupt_msg()" |
1477 | + dev_dbg_f(zd_usb_dev(usb), "error in zd_ep_regs_out_msg()" |
1478 | " req_len %d != actual_req_len %d\n", |
1479 | req_len, actual_req_len); |
1480 | r = -EIO; |
1481 | diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c |
1482 | index a3984f4..f34b5b2 100644 |
1483 | --- a/drivers/oprofile/buffer_sync.c |
1484 | +++ b/drivers/oprofile/buffer_sync.c |
1485 | @@ -141,6 +141,13 @@ static struct notifier_block module_load_nb = { |
1486 | .notifier_call = module_load_notify, |
1487 | }; |
1488 | |
1489 | +static void free_all_tasks(void) |
1490 | +{ |
1491 | + /* make sure we don't leak task structs */ |
1492 | + process_task_mortuary(); |
1493 | + process_task_mortuary(); |
1494 | +} |
1495 | + |
1496 | int sync_start(void) |
1497 | { |
1498 | int err; |
1499 | @@ -148,8 +155,6 @@ int sync_start(void) |
1500 | if (!zalloc_cpumask_var(&marked_cpus, GFP_KERNEL)) |
1501 | return -ENOMEM; |
1502 | |
1503 | - mutex_lock(&buffer_mutex); |
1504 | - |
1505 | err = task_handoff_register(&task_free_nb); |
1506 | if (err) |
1507 | goto out1; |
1508 | @@ -166,7 +171,6 @@ int sync_start(void) |
1509 | start_cpu_work(); |
1510 | |
1511 | out: |
1512 | - mutex_unlock(&buffer_mutex); |
1513 | return err; |
1514 | out4: |
1515 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); |
1516 | @@ -174,6 +178,7 @@ out3: |
1517 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); |
1518 | out2: |
1519 | task_handoff_unregister(&task_free_nb); |
1520 | + free_all_tasks(); |
1521 | out1: |
1522 | free_cpumask_var(marked_cpus); |
1523 | goto out; |
1524 | @@ -182,20 +187,16 @@ out1: |
1525 | |
1526 | void sync_stop(void) |
1527 | { |
1528 | - /* flush buffers */ |
1529 | - mutex_lock(&buffer_mutex); |
1530 | end_cpu_work(); |
1531 | unregister_module_notifier(&module_load_nb); |
1532 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); |
1533 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); |
1534 | task_handoff_unregister(&task_free_nb); |
1535 | - mutex_unlock(&buffer_mutex); |
1536 | - flush_cpu_work(); |
1537 | + barrier(); /* do all of the above first */ |
1538 | |
1539 | - /* make sure we don't leak task structs */ |
1540 | - process_task_mortuary(); |
1541 | - process_task_mortuary(); |
1542 | + flush_cpu_work(); |
1543 | |
1544 | + free_all_tasks(); |
1545 | free_cpumask_var(marked_cpus); |
1546 | } |
1547 | |
1548 | diff --git a/drivers/pci/hotplug/pcihp_slot.c b/drivers/pci/hotplug/pcihp_slot.c |
1549 | index 80b461c..749fdf0 100644 |
1550 | --- a/drivers/pci/hotplug/pcihp_slot.c |
1551 | +++ b/drivers/pci/hotplug/pcihp_slot.c |
1552 | @@ -158,6 +158,47 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) |
1553 | */ |
1554 | } |
1555 | |
1556 | +/* Program PCIE MaxPayload setting on device: ensure parent maxpayload <= device */ |
1557 | +static int pci_set_payload(struct pci_dev *dev) |
1558 | +{ |
1559 | + int pos, ppos; |
1560 | + u16 pctl, psz; |
1561 | + u16 dctl, dsz, dcap, dmax; |
1562 | + struct pci_dev *parent; |
1563 | + |
1564 | + parent = dev->bus->self; |
1565 | + pos = pci_find_capability(dev, PCI_CAP_ID_EXP); |
1566 | + if (!pos) |
1567 | + return 0; |
1568 | + |
1569 | + /* Read Device MaxPayload capability and setting */ |
1570 | + pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &dctl); |
1571 | + pci_read_config_word(dev, pos + PCI_EXP_DEVCAP, &dcap); |
1572 | + dsz = (dctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5; |
1573 | + dmax = (dcap & PCI_EXP_DEVCAP_PAYLOAD); |
1574 | + |
1575 | + /* Read Parent MaxPayload setting */ |
1576 | + ppos = pci_find_capability(parent, PCI_CAP_ID_EXP); |
1577 | + if (!ppos) |
1578 | + return 0; |
1579 | + pci_read_config_word(parent, ppos + PCI_EXP_DEVCTL, &pctl); |
1580 | + psz = (pctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5; |
1581 | + |
1582 | + /* If parent payload > device max payload -> error |
1583 | + * If parent payload > device payload -> set speed |
1584 | + * If parent payload <= device payload -> do nothing |
1585 | + */ |
1586 | + if (psz > dmax) |
1587 | + return -1; |
1588 | + else if (psz > dsz) { |
1589 | + dev_info(&dev->dev, "Setting MaxPayload to %d\n", 128 << psz); |
1590 | + pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, |
1591 | + (dctl & ~PCI_EXP_DEVCTL_PAYLOAD) + |
1592 | + (psz << 5)); |
1593 | + } |
1594 | + return 0; |
1595 | +} |
1596 | + |
1597 | void pci_configure_slot(struct pci_dev *dev) |
1598 | { |
1599 | struct pci_dev *cdev; |
1600 | @@ -169,6 +210,10 @@ void pci_configure_slot(struct pci_dev *dev) |
1601 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI))) |
1602 | return; |
1603 | |
1604 | + ret = pci_set_payload(dev); |
1605 | + if (ret) |
1606 | + dev_warn(&dev->dev, "could not set device max payload\n"); |
1607 | + |
1608 | memset(&hpp, 0, sizeof(hpp)); |
1609 | ret = pci_get_hp_params(dev, &hpp); |
1610 | if (ret) |
1611 | diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c |
1612 | index d552d2c..5db70c7 100644 |
1613 | --- a/drivers/pci/intel-iommu.c |
1614 | +++ b/drivers/pci/intel-iommu.c |
1615 | @@ -46,6 +46,8 @@ |
1616 | #define ROOT_SIZE VTD_PAGE_SIZE |
1617 | #define CONTEXT_SIZE VTD_PAGE_SIZE |
1618 | |
1619 | +#define IS_BRIDGE_HOST_DEVICE(pdev) \ |
1620 | + ((pdev->class >> 8) == PCI_CLASS_BRIDGE_HOST) |
1621 | #define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) |
1622 | #define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA) |
1623 | #define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e) |
1624 | @@ -1416,6 +1418,10 @@ static void domain_exit(struct dmar_domain *domain) |
1625 | if (!domain) |
1626 | return; |
1627 | |
1628 | + /* Flush any lazy unmaps that may reference this domain */ |
1629 | + if (!intel_iommu_strict) |
1630 | + flush_unmaps_timeout(0); |
1631 | + |
1632 | domain_remove_dev_info(domain); |
1633 | /* destroy iovas */ |
1634 | put_iova_domain(&domain->iovad); |
1635 | @@ -2105,10 +2111,10 @@ static int identity_mapping(struct pci_dev *pdev) |
1636 | if (likely(!iommu_identity_mapping)) |
1637 | return 0; |
1638 | |
1639 | + info = pdev->dev.archdata.iommu; |
1640 | + if (info && info != DUMMY_DEVICE_DOMAIN_INFO) |
1641 | + return (info->domain == si_domain); |
1642 | |
1643 | - list_for_each_entry(info, &si_domain->devices, link) |
1644 | - if (info->dev == pdev) |
1645 | - return 1; |
1646 | return 0; |
1647 | } |
1648 | |
1649 | @@ -2186,8 +2192,19 @@ static int iommu_should_identity_map(struct pci_dev *pdev, int startup) |
1650 | * Assume that they will -- if they turn out not to be, then we can |
1651 | * take them out of the 1:1 domain later. |
1652 | */ |
1653 | - if (!startup) |
1654 | - return pdev->dma_mask > DMA_BIT_MASK(32); |
1655 | + if (!startup) { |
1656 | + /* |
1657 | + * If the device's dma_mask is less than the system's memory |
1658 | + * size then this is not a candidate for identity mapping. |
1659 | + */ |
1660 | + u64 dma_mask = pdev->dma_mask; |
1661 | + |
1662 | + if (pdev->dev.coherent_dma_mask && |
1663 | + pdev->dev.coherent_dma_mask < dma_mask) |
1664 | + dma_mask = pdev->dev.coherent_dma_mask; |
1665 | + |
1666 | + return dma_mask >= dma_get_required_mask(&pdev->dev); |
1667 | + } |
1668 | |
1669 | return 1; |
1670 | } |
1671 | @@ -2202,6 +2219,9 @@ static int __init iommu_prepare_static_identity_mapping(int hw) |
1672 | return -EFAULT; |
1673 | |
1674 | for_each_pci_dev(pdev) { |
1675 | + /* Skip Host/PCI Bridge devices */ |
1676 | + if (IS_BRIDGE_HOST_DEVICE(pdev)) |
1677 | + continue; |
1678 | if (iommu_should_identity_map(pdev, 1)) { |
1679 | printk(KERN_INFO "IOMMU: %s identity mapping for device %s\n", |
1680 | hw ? "hardware" : "software", pci_name(pdev)); |
1681 | @@ -2591,8 +2611,7 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr, |
1682 | iommu = domain_get_iommu(domain); |
1683 | size = aligned_nrpages(paddr, size); |
1684 | |
1685 | - iova = intel_alloc_iova(hwdev, domain, dma_to_mm_pfn(size), |
1686 | - pdev->dma_mask); |
1687 | + iova = intel_alloc_iova(hwdev, domain, dma_to_mm_pfn(size), dma_mask); |
1688 | if (!iova) |
1689 | goto error; |
1690 | |
1691 | @@ -3379,8 +3398,8 @@ static void domain_remove_one_dev_info(struct dmar_domain *domain, |
1692 | spin_lock_irqsave(&device_domain_lock, flags); |
1693 | list_for_each_safe(entry, tmp, &domain->devices) { |
1694 | info = list_entry(entry, struct device_domain_info, link); |
1695 | - /* No need to compare PCI domain; it has to be the same */ |
1696 | - if (info->bus == pdev->bus->number && |
1697 | + if (info->segment == pci_domain_nr(pdev->bus) && |
1698 | + info->bus == pdev->bus->number && |
1699 | info->devfn == pdev->devfn) { |
1700 | list_del(&info->link); |
1701 | list_del(&info->global); |
1702 | @@ -3418,10 +3437,13 @@ static void domain_remove_one_dev_info(struct dmar_domain *domain, |
1703 | domain_update_iommu_cap(domain); |
1704 | spin_unlock_irqrestore(&domain->iommu_lock, tmp_flags); |
1705 | |
1706 | - spin_lock_irqsave(&iommu->lock, tmp_flags); |
1707 | - clear_bit(domain->id, iommu->domain_ids); |
1708 | - iommu->domains[domain->id] = NULL; |
1709 | - spin_unlock_irqrestore(&iommu->lock, tmp_flags); |
1710 | + if (!(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE) && |
1711 | + !(domain->flags & DOMAIN_FLAG_STATIC_IDENTITY)) { |
1712 | + spin_lock_irqsave(&iommu->lock, tmp_flags); |
1713 | + clear_bit(domain->id, iommu->domain_ids); |
1714 | + iommu->domains[domain->id] = NULL; |
1715 | + spin_unlock_irqrestore(&iommu->lock, tmp_flags); |
1716 | + } |
1717 | } |
1718 | |
1719 | spin_unlock_irqrestore(&device_domain_lock, flags); |
1720 | diff --git a/drivers/pci/iova.c b/drivers/pci/iova.c |
1721 | index 9606e59..c5c274a 100644 |
1722 | --- a/drivers/pci/iova.c |
1723 | +++ b/drivers/pci/iova.c |
1724 | @@ -63,8 +63,16 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free) |
1725 | curr = iovad->cached32_node; |
1726 | cached_iova = container_of(curr, struct iova, node); |
1727 | |
1728 | - if (free->pfn_lo >= cached_iova->pfn_lo) |
1729 | - iovad->cached32_node = rb_next(&free->node); |
1730 | + if (free->pfn_lo >= cached_iova->pfn_lo) { |
1731 | + struct rb_node *node = rb_next(&free->node); |
1732 | + struct iova *iova = container_of(node, struct iova, node); |
1733 | + |
1734 | + /* only cache if it's below 32bit pfn */ |
1735 | + if (node && iova->pfn_lo < iovad->dma_32bit_pfn) |
1736 | + iovad->cached32_node = node; |
1737 | + else |
1738 | + iovad->cached32_node = NULL; |
1739 | + } |
1740 | } |
1741 | |
1742 | /* Computes the padding size required, to make the |
1743 | diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c |
1744 | index 832a3fd7..c8c9842 100644 |
1745 | --- a/drivers/platform/x86/asus-wmi.c |
1746 | +++ b/drivers/platform/x86/asus-wmi.c |
1747 | @@ -1223,7 +1223,7 @@ static int asus_wmi_sysfs_init(struct platform_device *device) |
1748 | /* |
1749 | * Platform device |
1750 | */ |
1751 | -static int __init asus_wmi_platform_init(struct asus_wmi *asus) |
1752 | +static int asus_wmi_platform_init(struct asus_wmi *asus) |
1753 | { |
1754 | int rv; |
1755 | |
1756 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c |
1757 | index 58584dc..44e8ca3 100644 |
1758 | --- a/drivers/scsi/scsi_scan.c |
1759 | +++ b/drivers/scsi/scsi_scan.c |
1760 | @@ -297,7 +297,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, |
1761 | kfree(sdev); |
1762 | goto out; |
1763 | } |
1764 | - |
1765 | + blk_get_queue(sdev->request_queue); |
1766 | sdev->request_queue->queuedata = sdev; |
1767 | scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); |
1768 | |
1769 | diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c |
1770 | index e639125..e0bd3f7 100644 |
1771 | --- a/drivers/scsi/scsi_sysfs.c |
1772 | +++ b/drivers/scsi/scsi_sysfs.c |
1773 | @@ -322,6 +322,7 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) |
1774 | kfree(evt); |
1775 | } |
1776 | |
1777 | + blk_put_queue(sdev->request_queue); |
1778 | /* NULL queue means the device can't be used */ |
1779 | sdev->request_queue = NULL; |
1780 | |
1781 | diff --git a/drivers/staging/gma500/psb_fb.c b/drivers/staging/gma500/psb_fb.c |
1782 | index f67f53b..1b96199 100644 |
1783 | --- a/drivers/staging/gma500/psb_fb.c |
1784 | +++ b/drivers/staging/gma500/psb_fb.c |
1785 | @@ -489,6 +489,16 @@ static int psbfb_create(struct psb_fbdev *fbdev, |
1786 | info->screen_size = size; |
1787 | memset(info->screen_base, 0, size); |
1788 | |
1789 | + if (dev_priv->pg->stolen_size) { |
1790 | + info->apertures = alloc_apertures(1); |
1791 | + if (!info->apertures) { |
1792 | + ret = -ENOMEM; |
1793 | + goto out_err0; |
1794 | + } |
1795 | + info->apertures->ranges[0].base = dev->mode_config.fb_base; |
1796 | + info->apertures->ranges[0].size = dev_priv->pg->stolen_size; |
1797 | + } |
1798 | + |
1799 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); |
1800 | drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, |
1801 | sizes->fb_width, sizes->fb_height); |
1802 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c |
1803 | index 733fe8e..d4bee1b 100644 |
1804 | --- a/drivers/tty/serial/serial_core.c |
1805 | +++ b/drivers/tty/serial/serial_core.c |
1806 | @@ -172,12 +172,16 @@ static int uart_startup(struct tty_struct *tty, struct uart_state *state, int in |
1807 | |
1808 | retval = uport->ops->startup(uport); |
1809 | if (retval == 0) { |
1810 | - if (init_hw) { |
1811 | - /* |
1812 | - * Initialise the hardware port settings. |
1813 | - */ |
1814 | - uart_change_speed(tty, state, NULL); |
1815 | + if (uart_console(uport) && uport->cons->cflag) { |
1816 | + tty->termios->c_cflag = uport->cons->cflag; |
1817 | + uport->cons->cflag = 0; |
1818 | + } |
1819 | + /* |
1820 | + * Initialise the hardware port settings. |
1821 | + */ |
1822 | + uart_change_speed(tty, state, NULL); |
1823 | |
1824 | + if (init_hw) { |
1825 | /* |
1826 | * Setup the RTS and DTR signals once the |
1827 | * port is open and ready to respond. |
1828 | @@ -1466,45 +1470,6 @@ static void uart_hangup(struct tty_struct *tty) |
1829 | mutex_unlock(&port->mutex); |
1830 | } |
1831 | |
1832 | -/** |
1833 | - * uart_update_termios - update the terminal hw settings |
1834 | - * @tty: tty associated with UART |
1835 | - * @state: UART to update |
1836 | - * |
1837 | - * Copy across the serial console cflag setting into the termios settings |
1838 | - * for the initial open of the port. This allows continuity between the |
1839 | - * kernel settings, and the settings init adopts when it opens the port |
1840 | - * for the first time. |
1841 | - */ |
1842 | -static void uart_update_termios(struct tty_struct *tty, |
1843 | - struct uart_state *state) |
1844 | -{ |
1845 | - struct uart_port *port = state->uart_port; |
1846 | - |
1847 | - if (uart_console(port) && port->cons->cflag) { |
1848 | - tty->termios->c_cflag = port->cons->cflag; |
1849 | - port->cons->cflag = 0; |
1850 | - } |
1851 | - |
1852 | - /* |
1853 | - * If the device failed to grab its irq resources, |
1854 | - * or some other error occurred, don't try to talk |
1855 | - * to the port hardware. |
1856 | - */ |
1857 | - if (!(tty->flags & (1 << TTY_IO_ERROR))) { |
1858 | - /* |
1859 | - * Make termios settings take effect. |
1860 | - */ |
1861 | - uart_change_speed(tty, state, NULL); |
1862 | - |
1863 | - /* |
1864 | - * And finally enable the RTS and DTR signals. |
1865 | - */ |
1866 | - if (tty->termios->c_cflag & CBAUD) |
1867 | - uart_set_mctrl(port, TIOCM_DTR | TIOCM_RTS); |
1868 | - } |
1869 | -} |
1870 | - |
1871 | static int uart_carrier_raised(struct tty_port *port) |
1872 | { |
1873 | struct uart_state *state = container_of(port, struct uart_state, port); |
1874 | @@ -1524,16 +1489,8 @@ static void uart_dtr_rts(struct tty_port *port, int onoff) |
1875 | struct uart_state *state = container_of(port, struct uart_state, port); |
1876 | struct uart_port *uport = state->uart_port; |
1877 | |
1878 | - if (onoff) { |
1879 | + if (onoff) |
1880 | uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS); |
1881 | - |
1882 | - /* |
1883 | - * If this is the first open to succeed, |
1884 | - * adjust things to suit. |
1885 | - */ |
1886 | - if (!test_and_set_bit(ASYNCB_NORMAL_ACTIVE, &port->flags)) |
1887 | - uart_update_termios(port->tty, state); |
1888 | - } |
1889 | else |
1890 | uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); |
1891 | } |
1892 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
1893 | index caa2535..d0b84ff 100644 |
1894 | --- a/drivers/usb/class/cdc-acm.c |
1895 | +++ b/drivers/usb/class/cdc-acm.c |
1896 | @@ -1617,6 +1617,8 @@ static const struct usb_device_id acm_ids[] = { |
1897 | { NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */ |
1898 | { NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */ |
1899 | { NOKIA_PCSUITE_ACM_INFO(0x0302), }, /* Nokia N8 */ |
1900 | + { NOKIA_PCSUITE_ACM_INFO(0x0335), }, /* Nokia E7 */ |
1901 | + { NOKIA_PCSUITE_ACM_INFO(0x03cd), }, /* Nokia C7 */ |
1902 | { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */ |
1903 | |
1904 | /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */ |
1905 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1906 | index 93720bd..78e7f25 100644 |
1907 | --- a/drivers/usb/core/hub.c |
1908 | +++ b/drivers/usb/core/hub.c |
1909 | @@ -339,7 +339,8 @@ static int get_hub_status(struct usb_device *hdev, |
1910 | { |
1911 | int i, status = -ETIMEDOUT; |
1912 | |
1913 | - for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { |
1914 | + for (i = 0; i < USB_STS_RETRIES && |
1915 | + (status == -ETIMEDOUT || status == -EPIPE); i++) { |
1916 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
1917 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, |
1918 | data, sizeof(*data), USB_STS_TIMEOUT); |
1919 | @@ -355,7 +356,8 @@ static int get_port_status(struct usb_device *hdev, int port1, |
1920 | { |
1921 | int i, status = -ETIMEDOUT; |
1922 | |
1923 | - for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { |
1924 | + for (i = 0; i < USB_STS_RETRIES && |
1925 | + (status == -ETIMEDOUT || status == -EPIPE); i++) { |
1926 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
1927 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1, |
1928 | data, sizeof(*data), USB_STS_TIMEOUT); |
1929 | diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c |
1930 | index 0231814..ff00bd8 100644 |
1931 | --- a/drivers/usb/host/xhci-dbg.c |
1932 | +++ b/drivers/usb/host/xhci-dbg.c |
1933 | @@ -437,13 +437,13 @@ char *xhci_get_slot_state(struct xhci_hcd *xhci, |
1934 | struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); |
1935 | |
1936 | switch (GET_SLOT_STATE(slot_ctx->dev_state)) { |
1937 | - case 0: |
1938 | + case SLOT_STATE_ENABLED: |
1939 | return "enabled/disabled"; |
1940 | - case 1: |
1941 | + case SLOT_STATE_DEFAULT: |
1942 | return "default"; |
1943 | - case 2: |
1944 | + case SLOT_STATE_ADDRESSED: |
1945 | return "addressed"; |
1946 | - case 3: |
1947 | + case SLOT_STATE_CONFIGURED: |
1948 | return "configured"; |
1949 | default: |
1950 | return "reserved"; |
1951 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
1952 | index 783e5e0..976422a 100644 |
1953 | --- a/drivers/usb/host/xhci-mem.c |
1954 | +++ b/drivers/usb/host/xhci-mem.c |
1955 | @@ -986,9 +986,19 @@ static unsigned int xhci_parse_exponent_interval(struct usb_device *udev, |
1956 | interval = clamp_val(ep->desc.bInterval, 1, 16) - 1; |
1957 | if (interval != ep->desc.bInterval - 1) |
1958 | dev_warn(&udev->dev, |
1959 | - "ep %#x - rounding interval to %d microframes\n", |
1960 | + "ep %#x - rounding interval to %d %sframes\n", |
1961 | ep->desc.bEndpointAddress, |
1962 | - 1 << interval); |
1963 | + 1 << interval, |
1964 | + udev->speed == USB_SPEED_FULL ? "" : "micro"); |
1965 | + |
1966 | + if (udev->speed == USB_SPEED_FULL) { |
1967 | + /* |
1968 | + * Full speed isoc endpoints specify interval in frames, |
1969 | + * not microframes. We are using microframes everywhere, |
1970 | + * so adjust accordingly. |
1971 | + */ |
1972 | + interval += 3; /* 1 frame = 2^3 uframes */ |
1973 | + } |
1974 | |
1975 | return interval; |
1976 | } |
1977 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1978 | index a10494c..4940717 100644 |
1979 | --- a/drivers/usb/host/xhci-pci.c |
1980 | +++ b/drivers/usb/host/xhci-pci.c |
1981 | @@ -105,12 +105,22 @@ static int xhci_pci_setup(struct usb_hcd *hcd) |
1982 | |
1983 | /* Look for vendor-specific quirks */ |
1984 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && |
1985 | - pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && |
1986 | - pdev->revision == 0x0) { |
1987 | + pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) { |
1988 | + if (pdev->revision == 0x0) { |
1989 | xhci->quirks |= XHCI_RESET_EP_QUIRK; |
1990 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" |
1991 | " endpoint cmd after reset endpoint\n"); |
1992 | + } |
1993 | + /* Fresco Logic confirms: all revisions of this chip do not |
1994 | + * support MSI, even though some of them claim to in their PCI |
1995 | + * capabilities. |
1996 | + */ |
1997 | + xhci->quirks |= XHCI_BROKEN_MSI; |
1998 | + xhci_dbg(xhci, "QUIRK: Fresco Logic revision %u " |
1999 | + "has broken MSI implementation\n", |
2000 | + pdev->revision); |
2001 | } |
2002 | + |
2003 | if (pdev->vendor == PCI_VENDOR_ID_NEC) |
2004 | xhci->quirks |= XHCI_NEC_HOST; |
2005 | |
2006 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
2007 | index d2cd3ce..e5c4861 100644 |
2008 | --- a/drivers/usb/host/xhci.c |
2009 | +++ b/drivers/usb/host/xhci.c |
2010 | @@ -430,12 +430,19 @@ int xhci_run(struct usb_hcd *hcd) |
2011 | free_irq(hcd->irq, hcd); |
2012 | hcd->irq = -1; |
2013 | |
2014 | + /* Some Fresco Logic host controllers advertise MSI, but fail to |
2015 | + * generate interrupts. Don't even try to enable MSI. |
2016 | + */ |
2017 | + if (xhci->quirks & XHCI_BROKEN_MSI) |
2018 | + goto legacy_irq; |
2019 | + |
2020 | ret = xhci_setup_msix(xhci); |
2021 | if (ret) |
2022 | /* fall back to msi*/ |
2023 | ret = xhci_setup_msi(xhci); |
2024 | |
2025 | if (ret) { |
2026 | +legacy_irq: |
2027 | /* fall back to legacy interrupt*/ |
2028 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, |
2029 | hcd->irq_descr, hcd); |
2030 | @@ -2284,6 +2291,7 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) |
2031 | struct xhci_command *reset_device_cmd; |
2032 | int timeleft; |
2033 | int last_freed_endpoint; |
2034 | + struct xhci_slot_ctx *slot_ctx; |
2035 | |
2036 | ret = xhci_check_args(hcd, udev, NULL, 0, false, __func__); |
2037 | if (ret <= 0) |
2038 | @@ -2316,6 +2324,12 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) |
2039 | return -EINVAL; |
2040 | } |
2041 | |
2042 | + /* If device is not setup, there is no point in resetting it */ |
2043 | + slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); |
2044 | + if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) == |
2045 | + SLOT_STATE_DISABLED) |
2046 | + return 0; |
2047 | + |
2048 | xhci_dbg(xhci, "Resetting device with slot ID %u\n", slot_id); |
2049 | /* Allocate the command structure that holds the struct completion. |
2050 | * Assume we're in process context, since the normal device reset |
2051 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
2052 | index ba1be6b..fb85ce3 100644 |
2053 | --- a/drivers/usb/host/xhci.h |
2054 | +++ b/drivers/usb/host/xhci.h |
2055 | @@ -560,6 +560,11 @@ struct xhci_slot_ctx { |
2056 | #define SLOT_STATE (0x1f << 27) |
2057 | #define GET_SLOT_STATE(p) (((p) & (0x1f << 27)) >> 27) |
2058 | |
2059 | +#define SLOT_STATE_DISABLED 0 |
2060 | +#define SLOT_STATE_ENABLED SLOT_STATE_DISABLED |
2061 | +#define SLOT_STATE_DEFAULT 1 |
2062 | +#define SLOT_STATE_ADDRESSED 2 |
2063 | +#define SLOT_STATE_CONFIGURED 3 |
2064 | |
2065 | /** |
2066 | * struct xhci_ep_ctx |
2067 | @@ -1281,6 +1286,7 @@ struct xhci_hcd { |
2068 | #define XHCI_RESET_EP_QUIRK (1 << 1) |
2069 | #define XHCI_NEC_HOST (1 << 2) |
2070 | #define XHCI_AMD_PLL_FIX (1 << 3) |
2071 | +#define XHCI_BROKEN_MSI (1 << 6) |
2072 | /* There are two roothubs to keep track of bus suspend info for */ |
2073 | struct xhci_bus_state bus_state[2]; |
2074 | /* Is each xHCI roothub port a USB 3.0, USB 2.0, or USB 1.1 port? */ |
2075 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
2076 | index e8dbde5..1627289 100644 |
2077 | --- a/drivers/usb/serial/ftdi_sio.c |
2078 | +++ b/drivers/usb/serial/ftdi_sio.c |
2079 | @@ -647,6 +647,7 @@ static struct usb_device_id id_table_combined [] = { |
2080 | { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) }, |
2081 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, |
2082 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, |
2083 | + { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) }, |
2084 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, |
2085 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, |
2086 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, |
2087 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
2088 | index 1d946cd..ab1fcdf 100644 |
2089 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
2090 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
2091 | @@ -351,6 +351,7 @@ |
2092 | */ |
2093 | #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0 |
2094 | #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1 |
2095 | +#define FTDI_4N_GALAXY_DE_3_PID 0xF3C2 |
2096 | |
2097 | /* |
2098 | * Linx Technologies product ids |
2099 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
2100 | index 318dd00..60b25d8 100644 |
2101 | --- a/drivers/usb/serial/option.c |
2102 | +++ b/drivers/usb/serial/option.c |
2103 | @@ -311,10 +311,6 @@ static void option_instat_callback(struct urb *urb); |
2104 | #define ZTE_PRODUCT_AC2726 0xfff5 |
2105 | #define ZTE_PRODUCT_AC8710T 0xffff |
2106 | |
2107 | -/* ZTE PRODUCTS -- alternate vendor ID */ |
2108 | -#define ZTE_VENDOR_ID2 0x1d6b |
2109 | -#define ZTE_PRODUCT_MF_330 0x0002 |
2110 | - |
2111 | #define BENQ_VENDOR_ID 0x04a5 |
2112 | #define BENQ_PRODUCT_H10 0x4068 |
2113 | |
2114 | @@ -340,11 +336,12 @@ static void option_instat_callback(struct urb *urb); |
2115 | #define TOSHIBA_PRODUCT_G450 0x0d45 |
2116 | |
2117 | #define ALINK_VENDOR_ID 0x1e0e |
2118 | +#define ALINK_PRODUCT_PH300 0x9100 |
2119 | #define ALINK_PRODUCT_3GU 0x9200 |
2120 | |
2121 | /* ALCATEL PRODUCTS */ |
2122 | #define ALCATEL_VENDOR_ID 0x1bbb |
2123 | -#define ALCATEL_PRODUCT_X060S 0x0000 |
2124 | +#define ALCATEL_PRODUCT_X060S_X200 0x0000 |
2125 | |
2126 | #define PIRELLI_VENDOR_ID 0x1266 |
2127 | #define PIRELLI_PRODUCT_C100_1 0x1002 |
2128 | @@ -379,6 +376,9 @@ static void option_instat_callback(struct urb *urb); |
2129 | * It seems to contain a Qualcomm QSC6240/6290 chipset */ |
2130 | #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 |
2131 | |
2132 | +/* Zoom */ |
2133 | +#define ZOOM_PRODUCT_4597 0x9607 |
2134 | + |
2135 | /* Haier products */ |
2136 | #define HAIER_VENDOR_ID 0x201e |
2137 | #define HAIER_PRODUCT_CE100 0x2009 |
2138 | @@ -432,6 +432,20 @@ static const struct option_blacklist_info four_g_w14_blacklist = { |
2139 | .reason = OPTION_BLACKLIST_SENDSETUP |
2140 | }; |
2141 | |
2142 | +static const u8 alcatel_x200_no_sendsetup[] = { 0, 1 }; |
2143 | +static const struct option_blacklist_info alcatel_x200_blacklist = { |
2144 | + .infolen = ARRAY_SIZE(alcatel_x200_no_sendsetup), |
2145 | + .ifaceinfo = alcatel_x200_no_sendsetup, |
2146 | + .reason = OPTION_BLACKLIST_SENDSETUP |
2147 | +}; |
2148 | + |
2149 | +static const u8 zte_k3765_z_no_sendsetup[] = { 0, 1, 2 }; |
2150 | +static const struct option_blacklist_info zte_k3765_z_blacklist = { |
2151 | + .infolen = ARRAY_SIZE(zte_k3765_z_no_sendsetup), |
2152 | + .ifaceinfo = zte_k3765_z_no_sendsetup, |
2153 | + .reason = OPTION_BLACKLIST_SENDSETUP |
2154 | +}; |
2155 | + |
2156 | static const struct usb_device_id option_ids[] = { |
2157 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
2158 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
2159 | @@ -916,13 +930,13 @@ static const struct usb_device_id option_ids[] = { |
2160 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, |
2161 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, |
2162 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, |
2163 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, 0xff, 0xff) }, |
2164 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, |
2165 | + 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, |
2166 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, |
2167 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
2168 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, |
2169 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, |
2170 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, |
2171 | - { USB_DEVICE(ZTE_VENDOR_ID2, ZTE_PRODUCT_MF_330) }, |
2172 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
2173 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
2174 | { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ |
2175 | @@ -935,13 +949,17 @@ static const struct usb_device_id option_ids[] = { |
2176 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) }, |
2177 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ |
2178 | { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) }, |
2179 | + { USB_DEVICE(ALINK_VENDOR_ID, ALINK_PRODUCT_PH300) }, |
2180 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, |
2181 | - { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, |
2182 | + { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200), |
2183 | + .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist |
2184 | + }, |
2185 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
2186 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, |
2187 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), |
2188 | .driver_info = (kernel_ulong_t)&four_g_w14_blacklist |
2189 | }, |
2190 | + { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, |
2191 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, |
2192 | /* Pirelli */ |
2193 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1)}, |
2194 | diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c |
2195 | index 0041899..e8ae21b 100644 |
2196 | --- a/drivers/usb/storage/transport.c |
2197 | +++ b/drivers/usb/storage/transport.c |
2198 | @@ -819,6 +819,35 @@ Retry_Sense: |
2199 | } |
2200 | } |
2201 | |
2202 | + /* |
2203 | + * Some devices don't work or return incorrect data the first |
2204 | + * time they get a READ(10) command, or for the first READ(10) |
2205 | + * after a media change. If the INITIAL_READ10 flag is set, |
2206 | + * keep track of whether READ(10) commands succeed. If the |
2207 | + * previous one succeeded and this one failed, set the REDO_READ10 |
2208 | + * flag to force a retry. |
2209 | + */ |
2210 | + if (unlikely((us->fflags & US_FL_INITIAL_READ10) && |
2211 | + srb->cmnd[0] == READ_10)) { |
2212 | + if (srb->result == SAM_STAT_GOOD) { |
2213 | + set_bit(US_FLIDX_READ10_WORKED, &us->dflags); |
2214 | + } else if (test_bit(US_FLIDX_READ10_WORKED, &us->dflags)) { |
2215 | + clear_bit(US_FLIDX_READ10_WORKED, &us->dflags); |
2216 | + set_bit(US_FLIDX_REDO_READ10, &us->dflags); |
2217 | + } |
2218 | + |
2219 | + /* |
2220 | + * Next, if the REDO_READ10 flag is set, return a result |
2221 | + * code that will cause the SCSI core to retry the READ(10) |
2222 | + * command immediately. |
2223 | + */ |
2224 | + if (test_bit(US_FLIDX_REDO_READ10, &us->dflags)) { |
2225 | + clear_bit(US_FLIDX_REDO_READ10, &us->dflags); |
2226 | + srb->result = DID_IMM_RETRY << 16; |
2227 | + srb->sense_buffer[0] = 0; |
2228 | + } |
2229 | + } |
2230 | + |
2231 | /* Did we transfer less than the minimum amount required? */ |
2232 | if ((srb->result == SAM_STAT_GOOD || srb->sense_buffer[2] == 0) && |
2233 | scsi_bufflen(srb) - scsi_get_resid(srb) < srb->underflow) |
2234 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
2235 | index c1602b8..ccff348 100644 |
2236 | --- a/drivers/usb/storage/unusual_devs.h |
2237 | +++ b/drivers/usb/storage/unusual_devs.h |
2238 | @@ -1114,6 +1114,16 @@ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, |
2239 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2240 | US_FL_FIX_CAPACITY ), |
2241 | |
2242 | +/* Reported by Paul Hartman <paul.hartman+linux@gmail.com> |
2243 | + * This card reader returns "Illegal Request, Logical Block Address |
2244 | + * Out of Range" for the first READ(10) after a new card is inserted. |
2245 | + */ |
2246 | +UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100, |
2247 | + "Feiya", |
2248 | + "SD/SDHC Card Reader", |
2249 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2250 | + US_FL_INITIAL_READ10 ), |
2251 | + |
2252 | /* This Pentax still camera is not conformant |
2253 | * to the USB storage specification: - |
2254 | * - It does not like the INQUIRY command. So we must handle this command |
2255 | @@ -1888,6 +1898,15 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200, |
2256 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2257 | US_FL_NO_READ_DISC_INFO ), |
2258 | |
2259 | +/* Reported by Sven Geggus <sven-usbst@geggus.net> |
2260 | + * This encrypted pen drive returns bogus data for the initial READ(10). |
2261 | + */ |
2262 | +UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200, |
2263 | + "Corsair", |
2264 | + "Padlock v2", |
2265 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2266 | + US_FL_INITIAL_READ10 ), |
2267 | + |
2268 | /* Patch by Richard Schütz <r.schtz@t-online.de> |
2269 | * This external hard drive enclosure uses a JMicron chip which |
2270 | * needs the US_FL_IGNORE_RESIDUE flag to work properly. */ |
2271 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c |
2272 | index 4219c19..07d6d73 100644 |
2273 | --- a/drivers/usb/storage/usb.c |
2274 | +++ b/drivers/usb/storage/usb.c |
2275 | @@ -439,7 +439,8 @@ static void adjust_quirks(struct us_data *us) |
2276 | US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE | |
2277 | US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 | |
2278 | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | |
2279 | - US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT); |
2280 | + US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | |
2281 | + US_FL_INITIAL_READ10); |
2282 | |
2283 | p = quirks; |
2284 | while (*p) { |
2285 | @@ -483,6 +484,9 @@ static void adjust_quirks(struct us_data *us) |
2286 | case 'm': |
2287 | f |= US_FL_MAX_SECTORS_64; |
2288 | break; |
2289 | + case 'n': |
2290 | + f |= US_FL_INITIAL_READ10; |
2291 | + break; |
2292 | case 'o': |
2293 | f |= US_FL_CAPACITY_OK; |
2294 | break; |
2295 | @@ -946,6 +950,13 @@ int usb_stor_probe2(struct us_data *us) |
2296 | if (result) |
2297 | goto BadDevice; |
2298 | |
2299 | + /* |
2300 | + * If the device returns invalid data for the first READ(10) |
2301 | + * command, indicate the command should be retried. |
2302 | + */ |
2303 | + if (us->fflags & US_FL_INITIAL_READ10) |
2304 | + set_bit(US_FLIDX_REDO_READ10, &us->dflags); |
2305 | + |
2306 | /* Acquire all the other resources and add the host */ |
2307 | result = usb_stor_acquire_resources(us); |
2308 | if (result) |
2309 | diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h |
2310 | index 89d3bff..7b0f211 100644 |
2311 | --- a/drivers/usb/storage/usb.h |
2312 | +++ b/drivers/usb/storage/usb.h |
2313 | @@ -73,6 +73,8 @@ struct us_unusual_dev { |
2314 | #define US_FLIDX_RESETTING 4 /* device reset in progress */ |
2315 | #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ |
2316 | #define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */ |
2317 | +#define US_FLIDX_REDO_READ10 7 /* redo READ(10) command */ |
2318 | +#define US_FLIDX_READ10_WORKED 8 /* previous READ(10) succeeded */ |
2319 | |
2320 | #define USB_STOR_STRING_LEN 32 |
2321 | |
2322 | diff --git a/drivers/video/vga16fb.c b/drivers/video/vga16fb.c |
2323 | index 53b2c5a..305c975 100644 |
2324 | --- a/drivers/video/vga16fb.c |
2325 | +++ b/drivers/video/vga16fb.c |
2326 | @@ -1265,9 +1265,11 @@ static void vga16fb_imageblit(struct fb_info *info, const struct fb_image *image |
2327 | |
2328 | static void vga16fb_destroy(struct fb_info *info) |
2329 | { |
2330 | + struct platform_device *dev = container_of(info->device, struct platform_device, dev); |
2331 | iounmap(info->screen_base); |
2332 | fb_dealloc_cmap(&info->cmap); |
2333 | /* XXX unshare VGA regions */ |
2334 | + platform_set_drvdata(dev, NULL); |
2335 | framebuffer_release(info); |
2336 | } |
2337 | |
2338 | diff --git a/fs/block_dev.c b/fs/block_dev.c |
2339 | index 1f2b199..1a2421f 100644 |
2340 | --- a/fs/block_dev.c |
2341 | +++ b/fs/block_dev.c |
2342 | @@ -1272,8 +1272,8 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) |
2343 | * individual writeable reference is too fragile given the |
2344 | * way @mode is used in blkdev_get/put(). |
2345 | */ |
2346 | - if ((disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE) && |
2347 | - !res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) { |
2348 | + if (!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder && |
2349 | + (disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE)) { |
2350 | bdev->bd_write_holder = true; |
2351 | disk_block_events(disk); |
2352 | } |
2353 | diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c |
2354 | index d1a016b..ba3d95b 100644 |
2355 | --- a/fs/cifs/cifsencrypt.c |
2356 | +++ b/fs/cifs/cifsencrypt.c |
2357 | @@ -184,7 +184,7 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu, |
2358 | if (cifs_pdu == NULL || server == NULL) |
2359 | return -EINVAL; |
2360 | |
2361 | - if (cifs_pdu->Command == SMB_COM_NEGOTIATE) |
2362 | + if (!server->session_estab) |
2363 | return 0; |
2364 | |
2365 | if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) { |
2366 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
2367 | index 29fac128..5236582 100644 |
2368 | --- a/fs/cifs/connect.c |
2369 | +++ b/fs/cifs/connect.c |
2370 | @@ -199,7 +199,7 @@ cifs_reconnect(struct TCP_Server_Info *server) |
2371 | } |
2372 | spin_unlock(&GlobalMid_Lock); |
2373 | |
2374 | - while (server->tcpStatus == CifsNeedReconnect) { |
2375 | + do { |
2376 | try_to_freeze(); |
2377 | |
2378 | /* we should try only the port we connected to before */ |
2379 | @@ -214,7 +214,7 @@ cifs_reconnect(struct TCP_Server_Info *server) |
2380 | server->tcpStatus = CifsNeedNegotiate; |
2381 | spin_unlock(&GlobalMid_Lock); |
2382 | } |
2383 | - } |
2384 | + } while (server->tcpStatus == CifsNeedReconnect); |
2385 | |
2386 | return rc; |
2387 | } |
2388 | @@ -3208,7 +3208,7 @@ int cifs_negotiate_protocol(unsigned int xid, struct cifsSesInfo *ses) |
2389 | } |
2390 | if (rc == 0) { |
2391 | spin_lock(&GlobalMid_Lock); |
2392 | - if (server->tcpStatus != CifsExiting) |
2393 | + if (server->tcpStatus == CifsNeedNegotiate) |
2394 | server->tcpStatus = CifsGood; |
2395 | else |
2396 | rc = -EHOSTDOWN; |
2397 | diff --git a/fs/dcookies.c b/fs/dcookies.c |
2398 | index a21cabd..dda0dc7 100644 |
2399 | --- a/fs/dcookies.c |
2400 | +++ b/fs/dcookies.c |
2401 | @@ -178,6 +178,8 @@ SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len) |
2402 | /* FIXME: (deleted) ? */ |
2403 | path = d_path(&dcs->path, kbuf, PAGE_SIZE); |
2404 | |
2405 | + mutex_unlock(&dcookie_mutex); |
2406 | + |
2407 | if (IS_ERR(path)) { |
2408 | err = PTR_ERR(path); |
2409 | goto out_free; |
2410 | @@ -194,6 +196,7 @@ SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len) |
2411 | |
2412 | out_free: |
2413 | kfree(kbuf); |
2414 | + return err; |
2415 | out: |
2416 | mutex_unlock(&dcookie_mutex); |
2417 | return err; |
2418 | diff --git a/fs/exec.c b/fs/exec.c |
2419 | index 5e62d26..0c3682d 100644 |
2420 | --- a/fs/exec.c |
2421 | +++ b/fs/exec.c |
2422 | @@ -1046,6 +1046,7 @@ int flush_old_exec(struct linux_binprm * bprm) |
2423 | |
2424 | bprm->mm = NULL; /* We're using it now */ |
2425 | |
2426 | + set_fs(USER_DS); |
2427 | current->flags &= ~(PF_RANDOMIZE | PF_KTHREAD); |
2428 | flush_thread(); |
2429 | current->personality &= ~bprm->per_clear; |
2430 | @@ -1310,10 +1311,6 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) |
2431 | if (retval) |
2432 | return retval; |
2433 | |
2434 | - /* kernel module loader fixup */ |
2435 | - /* so we don't try to load run modprobe in kernel space. */ |
2436 | - set_fs(USER_DS); |
2437 | - |
2438 | retval = audit_bprm(bprm); |
2439 | if (retval) |
2440 | return retval; |
2441 | diff --git a/fs/fat/file.c b/fs/fat/file.c |
2442 | index 7257752..7018e1d 100644 |
2443 | --- a/fs/fat/file.c |
2444 | +++ b/fs/fat/file.c |
2445 | @@ -102,7 +102,7 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr) |
2446 | if (attr & ATTR_SYS) |
2447 | inode->i_flags |= S_IMMUTABLE; |
2448 | else |
2449 | - inode->i_flags &= S_IMMUTABLE; |
2450 | + inode->i_flags &= ~S_IMMUTABLE; |
2451 | } |
2452 | |
2453 | fat_save_attrs(inode, attr); |
2454 | diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c |
2455 | index aed25e8..e5cb2ce 100644 |
2456 | --- a/fs/ubifs/journal.c |
2457 | +++ b/fs/ubifs/journal.c |
2458 | @@ -666,6 +666,7 @@ out_free: |
2459 | |
2460 | out_release: |
2461 | release_head(c, BASEHD); |
2462 | + kfree(dent); |
2463 | out_ro: |
2464 | ubifs_ro_mode(c, err); |
2465 | if (last_reference) |
2466 | diff --git a/fs/ubifs/shrinker.c b/fs/ubifs/shrinker.c |
2467 | index 46961c0..d8f5d0f 100644 |
2468 | --- a/fs/ubifs/shrinker.c |
2469 | +++ b/fs/ubifs/shrinker.c |
2470 | @@ -283,7 +283,11 @@ int ubifs_shrinker(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
2471 | long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); |
2472 | |
2473 | if (nr == 0) |
2474 | - return clean_zn_cnt; |
2475 | + /* |
2476 | + * Due to the way UBIFS updates the clean znode counter it may |
2477 | + * temporarily be negative. |
2478 | + */ |
2479 | + return clean_zn_cnt >= 0 ? clean_zn_cnt : 1; |
2480 | |
2481 | if (!clean_zn_cnt) { |
2482 | /* |
2483 | diff --git a/include/linux/efi.h b/include/linux/efi.h |
2484 | index e376270..33fa120 100644 |
2485 | --- a/include/linux/efi.h |
2486 | +++ b/include/linux/efi.h |
2487 | @@ -299,7 +299,6 @@ extern void efi_initialize_iomem_resources(struct resource *code_resource, |
2488 | struct resource *data_resource, struct resource *bss_resource); |
2489 | extern unsigned long efi_get_time(void); |
2490 | extern int efi_set_rtc_mmss(unsigned long nowtime); |
2491 | -extern void efi_reserve_boot_services(void); |
2492 | extern struct efi_memory_map memmap; |
2493 | |
2494 | /** |
2495 | diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h |
2496 | index 71693d4..17df360 100644 |
2497 | --- a/include/linux/usb_usual.h |
2498 | +++ b/include/linux/usb_usual.h |
2499 | @@ -62,7 +62,9 @@ |
2500 | US_FLAG(NO_READ_DISC_INFO, 0x00040000) \ |
2501 | /* cannot handle READ_DISC_INFO */ \ |
2502 | US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ |
2503 | - /* cannot handle READ_CAPACITY_16 */ |
2504 | + /* cannot handle READ_CAPACITY_16 */ \ |
2505 | + US_FLAG(INITIAL_READ10, 0x00100000) \ |
2506 | + /* Initial READ(10) (and others) must be retried */ |
2507 | |
2508 | #define US_FLAG(name, value) US_FL_##name = value , |
2509 | enum { US_DO_ALL_FLAGS }; |
2510 | diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c |
2511 | index 2c039c9..51e4944 100644 |
2512 | --- a/kernel/irq/irqdesc.c |
2513 | +++ b/kernel/irq/irqdesc.c |
2514 | @@ -257,13 +257,11 @@ int __init early_irq_init(void) |
2515 | count = ARRAY_SIZE(irq_desc); |
2516 | |
2517 | for (i = 0; i < count; i++) { |
2518 | - desc[i].irq_data.irq = i; |
2519 | - desc[i].irq_data.chip = &no_irq_chip; |
2520 | desc[i].kstat_irqs = alloc_percpu(unsigned int); |
2521 | - irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS); |
2522 | - alloc_masks(desc + i, GFP_KERNEL, node); |
2523 | - desc_smp_init(desc + i, node); |
2524 | + alloc_masks(&desc[i], GFP_KERNEL, node); |
2525 | + raw_spin_lock_init(&desc[i].lock); |
2526 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); |
2527 | + desc_set_defaults(i, &desc[i], node); |
2528 | } |
2529 | return arch_early_irq_init(); |
2530 | } |
2531 | diff --git a/kernel/lockdep.c b/kernel/lockdep.c |
2532 | index 53a6895..49452a7 100644 |
2533 | --- a/kernel/lockdep.c |
2534 | +++ b/kernel/lockdep.c |
2535 | @@ -3242,7 +3242,7 @@ int lock_is_held(struct lockdep_map *lock) |
2536 | int ret = 0; |
2537 | |
2538 | if (unlikely(current->lockdep_recursion)) |
2539 | - return ret; |
2540 | + return 1; /* avoid false negative lockdep_assert_held() */ |
2541 | |
2542 | raw_local_irq_save(flags); |
2543 | check_flags(flags); |
2544 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
2545 | index 8ee3bd8..39f86fc 100644 |
2546 | --- a/mm/hugetlb.c |
2547 | +++ b/mm/hugetlb.c |
2548 | @@ -1033,10 +1033,10 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, |
2549 | */ |
2550 | chg = vma_needs_reservation(h, vma, addr); |
2551 | if (chg < 0) |
2552 | - return ERR_PTR(chg); |
2553 | + return ERR_PTR(-VM_FAULT_OOM); |
2554 | if (chg) |
2555 | if (hugetlb_get_quota(inode->i_mapping, chg)) |
2556 | - return ERR_PTR(-ENOSPC); |
2557 | + return ERR_PTR(-VM_FAULT_SIGBUS); |
2558 | |
2559 | spin_lock(&hugetlb_lock); |
2560 | page = dequeue_huge_page_vma(h, vma, addr, avoid_reserve); |
2561 | diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c |
2562 | index 3e81af1..821590d 100644 |
2563 | --- a/net/mac80211/ibss.c |
2564 | +++ b/net/mac80211/ibss.c |
2565 | @@ -967,6 +967,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) |
2566 | |
2567 | mutex_lock(&sdata->u.ibss.mtx); |
2568 | |
2569 | + sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH; |
2570 | + memset(sdata->u.ibss.bssid, 0, ETH_ALEN); |
2571 | + sdata->u.ibss.ssid_len = 0; |
2572 | + |
2573 | active_ibss = ieee80211_sta_active_ibss(sdata); |
2574 | |
2575 | if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { |
2576 | @@ -1000,8 +1004,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) |
2577 | kfree_skb(skb); |
2578 | |
2579 | skb_queue_purge(&sdata->skb_queue); |
2580 | - memset(sdata->u.ibss.bssid, 0, ETH_ALEN); |
2581 | - sdata->u.ibss.ssid_len = 0; |
2582 | |
2583 | del_timer_sync(&sdata->u.ibss.timer); |
2584 | |
2585 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
2586 | index 2c70a1e..29a1ce1 100644 |
2587 | --- a/net/wireless/nl80211.c |
2588 | +++ b/net/wireless/nl80211.c |
2589 | @@ -3239,12 +3239,12 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) |
2590 | i = 0; |
2591 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { |
2592 | nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { |
2593 | + request->ssids[i].ssid_len = nla_len(attr); |
2594 | if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) { |
2595 | err = -EINVAL; |
2596 | goto out_free; |
2597 | } |
2598 | memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); |
2599 | - request->ssids[i].ssid_len = nla_len(attr); |
2600 | i++; |
2601 | } |
2602 | } |
2603 | diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c |
2604 | index ec1bcec..3d2fd14 100644 |
2605 | --- a/security/apparmor/lsm.c |
2606 | +++ b/security/apparmor/lsm.c |
2607 | @@ -612,7 +612,7 @@ static int apparmor_setprocattr(struct task_struct *task, char *name, |
2608 | static int apparmor_task_setrlimit(struct task_struct *task, |
2609 | unsigned int resource, struct rlimit *new_rlim) |
2610 | { |
2611 | - struct aa_profile *profile = aa_current_profile(); |
2612 | + struct aa_profile *profile = __aa_current_profile(); |
2613 | int error = 0; |
2614 | |
2615 | if (!unconfined(profile)) |
2616 | diff --git a/security/tomoyo/mount.c b/security/tomoyo/mount.c |
2617 | index 82bf8c2..afa07cf 100644 |
2618 | --- a/security/tomoyo/mount.c |
2619 | +++ b/security/tomoyo/mount.c |
2620 | @@ -138,7 +138,7 @@ static int tomoyo_mount_acl(struct tomoyo_request_info *r, char *dev_name, |
2621 | } |
2622 | if (need_dev) { |
2623 | /* Get mount point or device file. */ |
2624 | - if (kern_path(dev_name, LOOKUP_FOLLOW, &path)) { |
2625 | + if (!dev_name || kern_path(dev_name, LOOKUP_FOLLOW, &path)) { |
2626 | error = -ENOENT; |
2627 | goto out; |
2628 | } |
2629 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2630 | index c82979a..2e95f01 100644 |
2631 | --- a/sound/pci/hda/patch_realtek.c |
2632 | +++ b/sound/pci/hda/patch_realtek.c |
2633 | @@ -13804,6 +13804,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { |
2634 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", |
2635 | ALC268_ACER_ASPIRE_ONE), |
2636 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), |
2637 | + SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron 910", ALC268_AUTO), |
2638 | SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0, |
2639 | "Dell Inspiron Mini9/Vostro A90", ALC268_DELL), |
2640 | /* almost compatible with toshiba but with optional digital outs; |
2641 | diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c |
2642 | index ab63d52..754c496 100644 |
2643 | --- a/sound/soc/codecs/ad1836.c |
2644 | +++ b/sound/soc/codecs/ad1836.c |
2645 | @@ -145,22 +145,22 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream, |
2646 | /* bit size */ |
2647 | switch (params_format(params)) { |
2648 | case SNDRV_PCM_FORMAT_S16_LE: |
2649 | - word_len = 3; |
2650 | + word_len = AD1836_WORD_LEN_16; |
2651 | break; |
2652 | case SNDRV_PCM_FORMAT_S20_3LE: |
2653 | - word_len = 1; |
2654 | + word_len = AD1836_WORD_LEN_20; |
2655 | break; |
2656 | case SNDRV_PCM_FORMAT_S24_LE: |
2657 | case SNDRV_PCM_FORMAT_S32_LE: |
2658 | - word_len = 0; |
2659 | + word_len = AD1836_WORD_LEN_24; |
2660 | break; |
2661 | } |
2662 | |
2663 | - snd_soc_update_bits(codec, AD1836_DAC_CTRL1, |
2664 | - AD1836_DAC_WORD_LEN_MASK, word_len); |
2665 | + snd_soc_update_bits(codec, AD1836_DAC_CTRL1, AD1836_DAC_WORD_LEN_MASK, |
2666 | + word_len << AD1836_DAC_WORD_LEN_OFFSET); |
2667 | |
2668 | - snd_soc_update_bits(codec, AD1836_ADC_CTRL2, |
2669 | - AD1836_ADC_WORD_LEN_MASK, word_len); |
2670 | + snd_soc_update_bits(codec, AD1836_ADC_CTRL2, AD1836_ADC_WORD_LEN_MASK, |
2671 | + word_len << AD1836_ADC_WORD_OFFSET); |
2672 | |
2673 | return 0; |
2674 | } |
2675 | diff --git a/sound/soc/codecs/ad1836.h b/sound/soc/codecs/ad1836.h |
2676 | index 8455967..9d6a3f8 100644 |
2677 | --- a/sound/soc/codecs/ad1836.h |
2678 | +++ b/sound/soc/codecs/ad1836.h |
2679 | @@ -25,6 +25,7 @@ |
2680 | #define AD1836_DAC_SERFMT_PCK256 (0x4 << 5) |
2681 | #define AD1836_DAC_SERFMT_PCK128 (0x5 << 5) |
2682 | #define AD1836_DAC_WORD_LEN_MASK 0x18 |
2683 | +#define AD1836_DAC_WORD_LEN_OFFSET 3 |
2684 | |
2685 | #define AD1836_DAC_CTRL2 1 |
2686 | #define AD1836_DACL1_MUTE 0 |
2687 | @@ -51,6 +52,7 @@ |
2688 | #define AD1836_ADCL2_MUTE 2 |
2689 | #define AD1836_ADCR2_MUTE 3 |
2690 | #define AD1836_ADC_WORD_LEN_MASK 0x30 |
2691 | +#define AD1836_ADC_WORD_OFFSET 5 |
2692 | #define AD1836_ADC_SERFMT_MASK (7 << 6) |
2693 | #define AD1836_ADC_SERFMT_PCK256 (0x4 << 6) |
2694 | #define AD1836_ADC_SERFMT_PCK128 (0x5 << 6) |
2695 | @@ -60,4 +62,8 @@ |
2696 | |
2697 | #define AD1836_NUM_REGS 16 |
2698 | |
2699 | +#define AD1836_WORD_LEN_24 0x0 |
2700 | +#define AD1836_WORD_LEN_20 0x1 |
2701 | +#define AD1836_WORD_LEN_16 0x2 |
2702 | + |
2703 | #endif |
2704 | diff --git a/sound/soc/codecs/wm8804.c b/sound/soc/codecs/wm8804.c |
2705 | index 6785688..9a5e67c 100644 |
2706 | --- a/sound/soc/codecs/wm8804.c |
2707 | +++ b/sound/soc/codecs/wm8804.c |
2708 | @@ -680,20 +680,25 @@ static struct snd_soc_dai_ops wm8804_dai_ops = { |
2709 | #define WM8804_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ |
2710 | SNDRV_PCM_FMTBIT_S24_LE) |
2711 | |
2712 | +#define WM8804_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ |
2713 | + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \ |
2714 | + SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \ |
2715 | + SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000) |
2716 | + |
2717 | static struct snd_soc_dai_driver wm8804_dai = { |
2718 | .name = "wm8804-spdif", |
2719 | .playback = { |
2720 | .stream_name = "Playback", |
2721 | .channels_min = 2, |
2722 | .channels_max = 2, |
2723 | - .rates = SNDRV_PCM_RATE_8000_192000, |
2724 | + .rates = WM8804_RATES, |
2725 | .formats = WM8804_FORMATS, |
2726 | }, |
2727 | .capture = { |
2728 | .stream_name = "Capture", |
2729 | .channels_min = 2, |
2730 | .channels_max = 2, |
2731 | - .rates = SNDRV_PCM_RATE_8000_192000, |
2732 | + .rates = WM8804_RATES, |
2733 | .formats = WM8804_FORMATS, |
2734 | }, |
2735 | .ops = &wm8804_dai_ops, |
2736 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c |
2737 | index 500011e..c22659e 100644 |
2738 | --- a/sound/soc/codecs/wm8962.c |
2739 | +++ b/sound/soc/codecs/wm8962.c |
2740 | @@ -1998,12 +1998,12 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, |
2741 | return 0; |
2742 | |
2743 | /* If the left PGA is enabled hit that VU bit... */ |
2744 | - if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTL_PGA_ENA) |
2745 | + if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA) |
2746 | return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, |
2747 | reg_cache[WM8962_HPOUTL_VOLUME]); |
2748 | |
2749 | /* ...otherwise the right. The VU is stereo. */ |
2750 | - if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTR_PGA_ENA) |
2751 | + if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA) |
2752 | return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, |
2753 | reg_cache[WM8962_HPOUTR_VOLUME]); |
2754 | |
2755 | diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c |
2756 | index ffa09b3..992a732 100644 |
2757 | --- a/sound/soc/samsung/i2s.c |
2758 | +++ b/sound/soc/samsung/i2s.c |
2759 | @@ -191,7 +191,7 @@ static inline bool tx_active(struct i2s_dai *i2s) |
2760 | if (!i2s) |
2761 | return false; |
2762 | |
2763 | - active = readl(i2s->addr + I2SMOD); |
2764 | + active = readl(i2s->addr + I2SCON); |
2765 | |
2766 | if (is_secondary(i2s)) |
2767 | active &= CON_TXSDMA_ACTIVE; |
2768 | @@ -223,7 +223,7 @@ static inline bool rx_active(struct i2s_dai *i2s) |
2769 | if (!i2s) |
2770 | return false; |
2771 | |
2772 | - active = readl(i2s->addr + I2SMOD) & CON_RXDMA_ACTIVE; |
2773 | + active = readl(i2s->addr + I2SCON) & CON_RXDMA_ACTIVE; |
2774 | |
2775 | return active ? true : false; |
2776 | } |
2777 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c |
2778 | index 81c4052..586d10b 100644 |
2779 | --- a/sound/soc/soc-dapm.c |
2780 | +++ b/sound/soc/soc-dapm.c |
2781 | @@ -362,9 +362,9 @@ static int dapm_update_bits(struct snd_soc_dapm_widget *widget) |
2782 | } |
2783 | |
2784 | /* create new dapm mixer control */ |
2785 | -static int dapm_new_mixer(struct snd_soc_dapm_context *dapm, |
2786 | - struct snd_soc_dapm_widget *w) |
2787 | +static int dapm_new_mixer(struct snd_soc_dapm_widget *w) |
2788 | { |
2789 | + struct snd_soc_dapm_context *dapm = w->dapm; |
2790 | int i, ret = 0; |
2791 | size_t name_len, prefix_len; |
2792 | struct snd_soc_dapm_path *path; |
2793 | @@ -443,9 +443,9 @@ static int dapm_new_mixer(struct snd_soc_dapm_context *dapm, |
2794 | } |
2795 | |
2796 | /* create new dapm mux control */ |
2797 | -static int dapm_new_mux(struct snd_soc_dapm_context *dapm, |
2798 | - struct snd_soc_dapm_widget *w) |
2799 | +static int dapm_new_mux(struct snd_soc_dapm_widget *w) |
2800 | { |
2801 | + struct snd_soc_dapm_context *dapm = w->dapm; |
2802 | struct snd_soc_dapm_path *path = NULL; |
2803 | struct snd_kcontrol *kcontrol; |
2804 | struct snd_card *card = dapm->card->snd_card; |
2805 | @@ -490,8 +490,7 @@ err: |
2806 | } |
2807 | |
2808 | /* create new dapm volume control */ |
2809 | -static int dapm_new_pga(struct snd_soc_dapm_context *dapm, |
2810 | - struct snd_soc_dapm_widget *w) |
2811 | +static int dapm_new_pga(struct snd_soc_dapm_widget *w) |
2812 | { |
2813 | if (w->num_kcontrols) |
2814 | dev_err(w->dapm->dev, |
2815 | @@ -1735,13 +1734,13 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) |
2816 | case snd_soc_dapm_mixer: |
2817 | case snd_soc_dapm_mixer_named_ctl: |
2818 | w->power_check = dapm_generic_check_power; |
2819 | - dapm_new_mixer(dapm, w); |
2820 | + dapm_new_mixer(w); |
2821 | break; |
2822 | case snd_soc_dapm_mux: |
2823 | case snd_soc_dapm_virt_mux: |
2824 | case snd_soc_dapm_value_mux: |
2825 | w->power_check = dapm_generic_check_power; |
2826 | - dapm_new_mux(dapm, w); |
2827 | + dapm_new_mux(w); |
2828 | break; |
2829 | case snd_soc_dapm_adc: |
2830 | case snd_soc_dapm_aif_out: |
2831 | @@ -1754,7 +1753,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) |
2832 | case snd_soc_dapm_pga: |
2833 | case snd_soc_dapm_out_drv: |
2834 | w->power_check = dapm_generic_check_power; |
2835 | - dapm_new_pga(dapm, w); |
2836 | + dapm_new_pga(w); |
2837 | break; |
2838 | case snd_soc_dapm_input: |
2839 | case snd_soc_dapm_output: |