Annotation of /trunk/kernel26-magellan/patches-2.6.39-r2/0101-2.6.39.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1424 -
(hide 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 | niro | 1424 | 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: |