Magellan Linux

Annotation of /trunk/kernel-magellan/patches-3.9/0108-3.9.9-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2234 - (hide annotations) (download)
Thu Jul 11 17:29:27 2013 UTC (10 years, 10 months ago) by niro
File size: 35022 byte(s)
-linux-3.9.9
1 niro 2234 diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
2     index e1489c5..738fcba 100644
3     --- a/arch/arm/include/asm/cacheflush.h
4     +++ b/arch/arm/include/asm/cacheflush.h
5     @@ -320,9 +320,7 @@ static inline void flush_anon_page(struct vm_area_struct *vma,
6     }
7    
8     #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
9     -static inline void flush_kernel_dcache_page(struct page *page)
10     -{
11     -}
12     +extern void flush_kernel_dcache_page(struct page *);
13    
14     #define flush_dcache_mmap_lock(mapping) \
15     spin_lock_irq(&(mapping)->tree_lock)
16     diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
17     index 1c8f7f5..b5ae9fd 100644
18     --- a/arch/arm/mm/flush.c
19     +++ b/arch/arm/mm/flush.c
20     @@ -298,6 +298,39 @@ void flush_dcache_page(struct page *page)
21     EXPORT_SYMBOL(flush_dcache_page);
22    
23     /*
24     + * Ensure cache coherency for the kernel mapping of this page. We can
25     + * assume that the page is pinned via kmap.
26     + *
27     + * If the page only exists in the page cache and there are no user
28     + * space mappings, this is a no-op since the page was already marked
29     + * dirty at creation. Otherwise, we need to flush the dirty kernel
30     + * cache lines directly.
31     + */
32     +void flush_kernel_dcache_page(struct page *page)
33     +{
34     + if (cache_is_vivt() || cache_is_vipt_aliasing()) {
35     + struct address_space *mapping;
36     +
37     + mapping = page_mapping(page);
38     +
39     + if (!mapping || mapping_mapped(mapping)) {
40     + void *addr;
41     +
42     + addr = page_address(page);
43     + /*
44     + * kmap_atomic() doesn't set the page virtual
45     + * address for highmem pages, and
46     + * kunmap_atomic() takes care of cache
47     + * flushing already.
48     + */
49     + if (!IS_ENABLED(CONFIG_HIGHMEM) || addr)
50     + __cpuc_flush_dcache_area(addr, PAGE_SIZE);
51     + }
52     + }
53     +}
54     +EXPORT_SYMBOL(flush_kernel_dcache_page);
55     +
56     +/*
57     * Flush an anonymous page so that users of get_user_pages()
58     * can safely access the data. The expected sequence is:
59     *
60     diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c
61     index d51225f..eb5293a 100644
62     --- a/arch/arm/mm/nommu.c
63     +++ b/arch/arm/mm/nommu.c
64     @@ -57,6 +57,12 @@ void flush_dcache_page(struct page *page)
65     }
66     EXPORT_SYMBOL(flush_dcache_page);
67    
68     +void flush_kernel_dcache_page(struct page *page)
69     +{
70     + __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
71     +}
72     +EXPORT_SYMBOL(flush_kernel_dcache_page);
73     +
74     void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
75     unsigned long uaddr, void *dst, const void *src,
76     unsigned long len)
77     diff --git a/arch/powerpc/platforms/pseries/eeh_pe.c b/arch/powerpc/platforms/pseries/eeh_pe.c
78     index fe43d1a..9d4a9e8 100644
79     --- a/arch/powerpc/platforms/pseries/eeh_pe.c
80     +++ b/arch/powerpc/platforms/pseries/eeh_pe.c
81     @@ -639,7 +639,8 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
82    
83     if (pe->type & EEH_PE_PHB) {
84     bus = pe->phb->bus;
85     - } else if (pe->type & EEH_PE_BUS) {
86     + } else if (pe->type & EEH_PE_BUS ||
87     + pe->type & EEH_PE_DEVICE) {
88     edev = list_first_entry(&pe->edevs, struct eeh_dev, list);
89     pdev = eeh_dev_to_pci_dev(edev);
90     if (pdev)
91     diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
92     index d8a6a38..feb719d 100644
93     --- a/arch/s390/kernel/ipl.c
94     +++ b/arch/s390/kernel/ipl.c
95     @@ -754,9 +754,9 @@ static struct bin_attribute sys_reipl_fcp_scp_data_attr = {
96     .write = reipl_fcp_scpdata_write,
97     };
98    
99     -DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%016llx\n",
100     +DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%llx\n",
101     reipl_block_fcp->ipl_info.fcp.wwpn);
102     -DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%016llx\n",
103     +DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%llx\n",
104     reipl_block_fcp->ipl_info.fcp.lun);
105     DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n",
106     reipl_block_fcp->ipl_info.fcp.bootprog);
107     @@ -1323,9 +1323,9 @@ static struct shutdown_action __refdata reipl_action = {
108    
109     /* FCP dump device attributes */
110    
111     -DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%016llx\n",
112     +DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%llx\n",
113     dump_block_fcp->ipl_info.fcp.wwpn);
114     -DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%016llx\n",
115     +DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%llx\n",
116     dump_block_fcp->ipl_info.fcp.lun);
117     DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n",
118     dump_block_fcp->ipl_info.fcp.bootprog);
119     diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c
120     index 1630f43..1d95be9 100644
121     --- a/arch/s390/kernel/irq.c
122     +++ b/arch/s390/kernel/irq.c
123     @@ -313,3 +313,69 @@ void measurement_alert_subclass_unregister(void)
124     spin_unlock(&ma_subclass_lock);
125     }
126     EXPORT_SYMBOL(measurement_alert_subclass_unregister);
127     +
128     +#ifdef CONFIG_SMP
129     +void synchronize_irq(unsigned int irq)
130     +{
131     + /*
132     + * Not needed, the handler is protected by a lock and IRQs that occur
133     + * after the handler is deleted are just NOPs.
134     + */
135     +}
136     +EXPORT_SYMBOL_GPL(synchronize_irq);
137     +#endif
138     +
139     +#ifndef CONFIG_PCI
140     +
141     +/* Only PCI devices have dynamically-defined IRQ handlers */
142     +
143     +int request_irq(unsigned int irq, irq_handler_t handler,
144     + unsigned long irqflags, const char *devname, void *dev_id)
145     +{
146     + return -EINVAL;
147     +}
148     +EXPORT_SYMBOL_GPL(request_irq);
149     +
150     +void free_irq(unsigned int irq, void *dev_id)
151     +{
152     + WARN_ON(1);
153     +}
154     +EXPORT_SYMBOL_GPL(free_irq);
155     +
156     +void enable_irq(unsigned int irq)
157     +{
158     + WARN_ON(1);
159     +}
160     +EXPORT_SYMBOL_GPL(enable_irq);
161     +
162     +void disable_irq(unsigned int irq)
163     +{
164     + WARN_ON(1);
165     +}
166     +EXPORT_SYMBOL_GPL(disable_irq);
167     +
168     +#endif /* !CONFIG_PCI */
169     +
170     +void disable_irq_nosync(unsigned int irq)
171     +{
172     + disable_irq(irq);
173     +}
174     +EXPORT_SYMBOL_GPL(disable_irq_nosync);
175     +
176     +unsigned long probe_irq_on(void)
177     +{
178     + return 0;
179     +}
180     +EXPORT_SYMBOL_GPL(probe_irq_on);
181     +
182     +int probe_irq_off(unsigned long val)
183     +{
184     + return 0;
185     +}
186     +EXPORT_SYMBOL_GPL(probe_irq_off);
187     +
188     +unsigned int probe_irq_mask(unsigned long val)
189     +{
190     + return val;
191     +}
192     +EXPORT_SYMBOL_GPL(probe_irq_mask);
193     diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
194     index 27b4c17..4fd5b5a 100644
195     --- a/arch/s390/pci/pci.c
196     +++ b/arch/s390/pci/pci.c
197     @@ -306,15 +306,6 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
198     return rc;
199     }
200    
201     -void synchronize_irq(unsigned int irq)
202     -{
203     - /*
204     - * Not needed, the handler is protected by a lock and IRQs that occur
205     - * after the handler is deleted are just NOPs.
206     - */
207     -}
208     -EXPORT_SYMBOL_GPL(synchronize_irq);
209     -
210     void enable_irq(unsigned int irq)
211     {
212     struct msi_desc *msi = irq_get_msi_desc(irq);
213     @@ -331,30 +322,6 @@ void disable_irq(unsigned int irq)
214     }
215     EXPORT_SYMBOL_GPL(disable_irq);
216    
217     -void disable_irq_nosync(unsigned int irq)
218     -{
219     - disable_irq(irq);
220     -}
221     -EXPORT_SYMBOL_GPL(disable_irq_nosync);
222     -
223     -unsigned long probe_irq_on(void)
224     -{
225     - return 0;
226     -}
227     -EXPORT_SYMBOL_GPL(probe_irq_on);
228     -
229     -int probe_irq_off(unsigned long val)
230     -{
231     - return 0;
232     -}
233     -EXPORT_SYMBOL_GPL(probe_irq_off);
234     -
235     -unsigned int probe_irq_mask(unsigned long val)
236     -{
237     - return val;
238     -}
239     -EXPORT_SYMBOL_GPL(probe_irq_mask);
240     -
241     void pcibios_fixup_bus(struct pci_bus *bus)
242     {
243     }
244     diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
245     index 95fd352..b00bf09 100644
246     --- a/arch/x86/include/asm/irq_remapping.h
247     +++ b/arch/x86/include/asm/irq_remapping.h
248     @@ -23,11 +23,13 @@
249     #define __X86_IRQ_REMAPPING_H
250    
251     #include <asm/io_apic.h>
252     +#include <linux/irq.h>
253    
254     #ifdef CONFIG_IRQ_REMAP
255    
256     extern void setup_irq_remapping_ops(void);
257     extern int irq_remapping_supported(void);
258     +extern void set_irq_remapping_broken(void);
259     extern int irq_remapping_prepare(void);
260     extern int irq_remapping_enable(void);
261     extern void irq_remapping_disable(void);
262     @@ -54,6 +56,7 @@ void irq_remap_modify_chip_defaults(struct irq_chip *chip);
263    
264     static inline void setup_irq_remapping_ops(void) { }
265     static inline int irq_remapping_supported(void) { return 0; }
266     +static inline void set_irq_remapping_broken(void) { }
267     static inline int irq_remapping_prepare(void) { return -ENODEV; }
268     static inline int irq_remapping_enable(void) { return -ENODEV; }
269     static inline void irq_remapping_disable(void) { }
270     diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
271     index 3755ef4..94ab6b9 100644
272     --- a/arch/x86/kernel/early-quirks.c
273     +++ b/arch/x86/kernel/early-quirks.c
274     @@ -18,6 +18,7 @@
275     #include <asm/apic.h>
276     #include <asm/iommu.h>
277     #include <asm/gart.h>
278     +#include <asm/irq_remapping.h>
279    
280     static void __init fix_hypertransport_config(int num, int slot, int func)
281     {
282     @@ -192,6 +193,21 @@ static void __init ati_bugs_contd(int num, int slot, int func)
283     }
284     #endif
285    
286     +static void __init intel_remapping_check(int num, int slot, int func)
287     +{
288     + u8 revision;
289     +
290     + revision = read_pci_config_byte(num, slot, func, PCI_REVISION_ID);
291     +
292     + /*
293     + * Revision 0x13 of this chipset supports irq remapping
294     + * but has an erratum that breaks its behavior, flag it as such
295     + */
296     + if (revision == 0x13)
297     + set_irq_remapping_broken();
298     +
299     +}
300     +
301     #define QFLAG_APPLY_ONCE 0x1
302     #define QFLAG_APPLIED 0x2
303     #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
304     @@ -221,6 +237,10 @@ static struct chipset early_qrk[] __initdata = {
305     PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
306     { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
307     PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
308     + { PCI_VENDOR_ID_INTEL, 0x3403, PCI_CLASS_BRIDGE_HOST,
309     + PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
310     + { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST,
311     + PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
312     {}
313     };
314    
315     diff --git a/crypto/algboss.c b/crypto/algboss.c
316     index 769219b..76fc0b2 100644
317     --- a/crypto/algboss.c
318     +++ b/crypto/algboss.c
319     @@ -45,10 +45,9 @@ struct cryptomgr_param {
320     } nu32;
321     } attrs[CRYPTO_MAX_ATTRS];
322    
323     - char larval[CRYPTO_MAX_ALG_NAME];
324     char template[CRYPTO_MAX_ALG_NAME];
325    
326     - struct completion *completion;
327     + struct crypto_larval *larval;
328    
329     u32 otype;
330     u32 omask;
331     @@ -87,7 +86,8 @@ static int cryptomgr_probe(void *data)
332     crypto_tmpl_put(tmpl);
333    
334     out:
335     - complete_all(param->completion);
336     + complete_all(&param->larval->completion);
337     + crypto_alg_put(&param->larval->alg);
338     kfree(param);
339     module_put_and_exit(0);
340     }
341     @@ -187,18 +187,19 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
342     param->otype = larval->alg.cra_flags;
343     param->omask = larval->mask;
344    
345     - memcpy(param->larval, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME);
346     -
347     - param->completion = &larval->completion;
348     + crypto_alg_get(&larval->alg);
349     + param->larval = larval;
350    
351     thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");
352     if (IS_ERR(thread))
353     - goto err_free_param;
354     + goto err_put_larval;
355    
356     wait_for_completion_interruptible(&larval->completion);
357    
358     return NOTIFY_STOP;
359    
360     +err_put_larval:
361     + crypto_alg_put(&larval->alg);
362     err_free_param:
363     kfree(param);
364     err_put_module:
365     diff --git a/crypto/api.c b/crypto/api.c
366     index 033a714..3b61803 100644
367     --- a/crypto/api.c
368     +++ b/crypto/api.c
369     @@ -34,12 +34,6 @@ EXPORT_SYMBOL_GPL(crypto_alg_sem);
370     BLOCKING_NOTIFIER_HEAD(crypto_chain);
371     EXPORT_SYMBOL_GPL(crypto_chain);
372    
373     -static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
374     -{
375     - atomic_inc(&alg->cra_refcnt);
376     - return alg;
377     -}
378     -
379     struct crypto_alg *crypto_mod_get(struct crypto_alg *alg)
380     {
381     return try_module_get(alg->cra_module) ? crypto_alg_get(alg) : NULL;
382     diff --git a/crypto/internal.h b/crypto/internal.h
383     index 9ebedae..bd39bfc 100644
384     --- a/crypto/internal.h
385     +++ b/crypto/internal.h
386     @@ -103,6 +103,12 @@ int crypto_register_notifier(struct notifier_block *nb);
387     int crypto_unregister_notifier(struct notifier_block *nb);
388     int crypto_probing_notify(unsigned long val, void *v);
389    
390     +static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
391     +{
392     + atomic_inc(&alg->cra_refcnt);
393     + return alg;
394     +}
395     +
396     static inline void crypto_alg_put(struct crypto_alg *alg)
397     {
398     if (atomic_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)
399     diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
400     index 3badf18..3ce078c 100644
401     --- a/drivers/ata/libata-acpi.c
402     +++ b/drivers/ata/libata-acpi.c
403     @@ -157,8 +157,10 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
404    
405     spin_unlock_irqrestore(ap->lock, flags);
406    
407     - if (wait)
408     + if (wait) {
409     ata_port_wait_eh(ap);
410     + flush_work(&ap->hotplug_task.work);
411     + }
412     }
413    
414     static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data)
415     @@ -215,6 +217,38 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
416     .uevent = ata_acpi_ap_uevent,
417     };
418    
419     +void ata_acpi_hotplug_init(struct ata_host *host)
420     +{
421     + int i;
422     +
423     + for (i = 0; i < host->n_ports; i++) {
424     + struct ata_port *ap = host->ports[i];
425     + acpi_handle handle;
426     + struct ata_device *dev;
427     +
428     + if (!ap)
429     + continue;
430     +
431     + handle = ata_ap_acpi_handle(ap);
432     + if (handle) {
433     + /* we might be on a docking station */
434     + register_hotplug_dock_device(handle,
435     + &ata_acpi_ap_dock_ops, ap);
436     + }
437     +
438     + ata_for_each_dev(dev, &ap->link, ALL) {
439     + handle = ata_dev_acpi_handle(dev);
440     + if (!handle)
441     + continue;
442     +
443     + /* we might be on a docking station */
444     + register_hotplug_dock_device(handle,
445     + &ata_acpi_dev_dock_ops,
446     + dev);
447     + }
448     + }
449     +}
450     +
451     /**
452     * ata_acpi_dissociate - dissociate ATA host from ACPI objects
453     * @host: target ATA host
454     diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
455     index cf15aee..8038ee3 100644
456     --- a/drivers/ata/libata-core.c
457     +++ b/drivers/ata/libata-core.c
458     @@ -6148,6 +6148,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
459     if (rc)
460     goto err_tadd;
461    
462     + ata_acpi_hotplug_init(host);
463     +
464     /* set cable, sata_spd_limit and report */
465     for (i = 0; i < host->n_ports; i++) {
466     struct ata_port *ap = host->ports[i];
467     diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
468     index c949dd3..577d902b 100644
469     --- a/drivers/ata/libata.h
470     +++ b/drivers/ata/libata.h
471     @@ -122,6 +122,7 @@ extern int ata_acpi_register(void);
472     extern void ata_acpi_unregister(void);
473     extern void ata_acpi_bind(struct ata_device *dev);
474     extern void ata_acpi_unbind(struct ata_device *dev);
475     +extern void ata_acpi_hotplug_init(struct ata_host *host);
476     #else
477     static inline void ata_acpi_dissociate(struct ata_host *host) { }
478     static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
479     @@ -134,6 +135,7 @@ static inline int ata_acpi_register(void) { return 0; }
480     static inline void ata_acpi_unregister(void) { }
481     static inline void ata_acpi_bind(struct ata_device *dev) { }
482     static inline void ata_acpi_unbind(struct ata_device *dev) { }
483     +static inline void ata_acpi_hotplug_init(struct ata_host *host) {}
484     #endif
485    
486     /* libata-scsi.c */
487     diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
488     index f3b8f23..5b19b2d 100644
489     --- a/drivers/iommu/intel_irq_remapping.c
490     +++ b/drivers/iommu/intel_irq_remapping.c
491     @@ -524,6 +524,16 @@ static int __init intel_irq_remapping_supported(void)
492    
493     if (disable_irq_remap)
494     return 0;
495     + if (irq_remap_broken) {
496     + WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
497     + "This system BIOS has enabled interrupt remapping\n"
498     + "on a chipset that contains an erratum making that\n"
499     + "feature unstable. To maintain system stability\n"
500     + "interrupt remapping is being disabled. Please\n"
501     + "contact your BIOS vendor for an update\n");
502     + disable_irq_remap = 1;
503     + return 0;
504     + }
505    
506     if (!dmar_ir_support())
507     return 0;
508     diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
509     index 7c11ff3..dcfea4e 100644
510     --- a/drivers/iommu/irq_remapping.c
511     +++ b/drivers/iommu/irq_remapping.c
512     @@ -18,6 +18,7 @@
513     int irq_remapping_enabled;
514    
515     int disable_irq_remap;
516     +int irq_remap_broken;
517     int disable_sourceid_checking;
518     int no_x2apic_optout;
519    
520     @@ -210,6 +211,11 @@ void __init setup_irq_remapping_ops(void)
521     #endif
522     }
523    
524     +void set_irq_remapping_broken(void)
525     +{
526     + irq_remap_broken = 1;
527     +}
528     +
529     int irq_remapping_supported(void)
530     {
531     if (disable_irq_remap)
532     diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
533     index ecb6376..90c4dae 100644
534     --- a/drivers/iommu/irq_remapping.h
535     +++ b/drivers/iommu/irq_remapping.h
536     @@ -32,6 +32,7 @@ struct pci_dev;
537     struct msi_msg;
538    
539     extern int disable_irq_remap;
540     +extern int irq_remap_broken;
541     extern int disable_sourceid_checking;
542     extern int no_x2apic_optout;
543     extern int irq_remapping_enabled;
544     @@ -89,6 +90,7 @@ extern struct irq_remap_ops amd_iommu_irq_ops;
545    
546     #define irq_remapping_enabled 0
547     #define disable_irq_remap 1
548     +#define irq_remap_broken 0
549    
550     #endif /* CONFIG_IRQ_REMAP */
551    
552     diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c
553     index 6e15ef0..cbd388e 100644
554     --- a/drivers/net/can/usb/usb_8dev.c
555     +++ b/drivers/net/can/usb/usb_8dev.c
556     @@ -977,7 +977,7 @@ static int usb_8dev_probe(struct usb_interface *intf,
557     err = usb_8dev_cmd_version(priv, &version);
558     if (err) {
559     netdev_err(netdev, "can't get firmware version\n");
560     - goto cleanup_cmd_msg_buffer;
561     + goto cleanup_unregister_candev;
562     } else {
563     netdev_info(netdev,
564     "firmware: %d.%d, hardware: %d.%d\n",
565     @@ -989,6 +989,9 @@ static int usb_8dev_probe(struct usb_interface *intf,
566    
567     return 0;
568    
569     +cleanup_unregister_candev:
570     + unregister_netdev(priv->netdev);
571     +
572     cleanup_cmd_msg_buffer:
573     kfree(priv->cmd_msg_buffer);
574    
575     diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c
576     index 147614e..6a8a382 100644
577     --- a/drivers/net/wan/dlci.c
578     +++ b/drivers/net/wan/dlci.c
579     @@ -384,21 +384,37 @@ static int dlci_del(struct dlci_add *dlci)
580     struct frad_local *flp;
581     struct net_device *master, *slave;
582     int err;
583     + bool found = false;
584     +
585     + rtnl_lock();
586    
587     /* validate slave device */
588     master = __dev_get_by_name(&init_net, dlci->devname);
589     - if (!master)
590     - return -ENODEV;
591     + if (!master) {
592     + err = -ENODEV;
593     + goto out;
594     + }
595     +
596     + list_for_each_entry(dlp, &dlci_devs, list) {
597     + if (dlp->master == master) {
598     + found = true;
599     + break;
600     + }
601     + }
602     + if (!found) {
603     + err = -ENODEV;
604     + goto out;
605     + }
606    
607     if (netif_running(master)) {
608     - return -EBUSY;
609     + err = -EBUSY;
610     + goto out;
611     }
612    
613     dlp = netdev_priv(master);
614     slave = dlp->slave;
615     flp = netdev_priv(slave);
616    
617     - rtnl_lock();
618     err = (*flp->deassoc)(slave, master);
619     if (!err) {
620     list_del(&dlp->list);
621     @@ -407,8 +423,8 @@ static int dlci_del(struct dlci_add *dlci)
622    
623     dev_put(slave);
624     }
625     +out:
626     rtnl_unlock();
627     -
628     return err;
629     }
630    
631     diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
632     index a8016d7..305bed8 100644
633     --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
634     +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
635     @@ -1174,7 +1174,7 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
636     mutex_lock(&priv->htc_pm_lock);
637    
638     priv->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
639     - if (priv->ps_idle)
640     + if (!priv->ps_idle)
641     chip_reset = true;
642    
643     mutex_unlock(&priv->htc_pm_lock);
644     diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c
645     index a82b6b3..5c36c21 100644
646     --- a/drivers/net/wireless/iwlwifi/dvm/rxon.c
647     +++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c
648     @@ -1377,7 +1377,7 @@ static void iwlagn_chain_noise_reset(struct iwl_priv *priv)
649     struct iwl_chain_noise_data *data = &priv->chain_noise_data;
650     int ret;
651    
652     - if (!(priv->calib_disabled & IWL_CHAIN_NOISE_CALIB_DISABLED))
653     + if (priv->calib_disabled & IWL_CHAIN_NOISE_CALIB_DISABLED)
654     return;
655    
656     if ((data->state == IWL_CHAIN_NOISE_ALIVE) &&
657     diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
658     index 92849e5..d420c53 100644
659     --- a/drivers/net/wireless/rt2x00/rt2800lib.c
660     +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
661     @@ -2634,19 +2634,26 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
662     * TODO: we do not use +6 dBm option to do not increase power beyond
663     * regulatory limit, however this could be utilized for devices with
664     * CAPABILITY_POWER_LIMIT.
665     + *
666     + * TODO: add different temperature compensation code for RT3290 & RT5390
667     + * to allow to use BBP_R1 for those chips.
668     */
669     - rt2800_bbp_read(rt2x00dev, 1, &r1);
670     - if (delta <= -12) {
671     - power_ctrl = 2;
672     - delta += 12;
673     - } else if (delta <= -6) {
674     - power_ctrl = 1;
675     - delta += 6;
676     - } else {
677     - power_ctrl = 0;
678     + if (!rt2x00_rt(rt2x00dev, RT3290) &&
679     + !rt2x00_rt(rt2x00dev, RT5390)) {
680     + rt2800_bbp_read(rt2x00dev, 1, &r1);
681     + if (delta <= -12) {
682     + power_ctrl = 2;
683     + delta += 12;
684     + } else if (delta <= -6) {
685     + power_ctrl = 1;
686     + delta += 6;
687     + } else {
688     + power_ctrl = 0;
689     + }
690     + rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl);
691     + rt2800_bbp_write(rt2x00dev, 1, r1);
692     }
693     - rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl);
694     - rt2800_bbp_write(rt2x00dev, 1, r1);
695     +
696     offset = TX_PWR_CFG_0;
697    
698     for (i = 0; i < EEPROM_TXPOWER_BYRATE_SIZE; i += 2) {
699     diff --git a/drivers/of/base.c b/drivers/of/base.c
700     index 321d3ef..e77e719 100644
701     --- a/drivers/of/base.c
702     +++ b/drivers/of/base.c
703     @@ -1166,11 +1166,11 @@ static int __of_parse_phandle_with_args(const struct device_node *np,
704     out_args->args_count = count;
705     for (i = 0; i < count; i++)
706     out_args->args[i] = be32_to_cpup(list++);
707     + } else {
708     + of_node_put(node);
709     }
710    
711     /* Found it! return success */
712     - if (node)
713     - of_node_put(node);
714     return 0;
715     }
716    
717     diff --git a/fs/exec.c b/fs/exec.c
718     index 6d56ff2..0d5c76f 100644
719     --- a/fs/exec.c
720     +++ b/fs/exec.c
721     @@ -1136,13 +1136,6 @@ void setup_new_exec(struct linux_binprm * bprm)
722     set_dumpable(current->mm, suid_dumpable);
723     }
724    
725     - /*
726     - * Flush performance counters when crossing a
727     - * security domain:
728     - */
729     - if (!get_dumpable(current->mm))
730     - perf_event_exit_task(current);
731     -
732     /* An exec changes our domain. We are no longer part of the thread
733     group */
734    
735     @@ -1206,6 +1199,15 @@ void install_exec_creds(struct linux_binprm *bprm)
736    
737     commit_creds(bprm->cred);
738     bprm->cred = NULL;
739     +
740     + /*
741     + * Disable monitoring for regular users
742     + * when executing setuid binaries. Must
743     + * wait until new credentials are committed
744     + * by commit_creds() above
745     + */
746     + if (get_dumpable(current->mm) != SUID_DUMP_USER)
747     + perf_event_exit_task(current);
748     /*
749     * cred_guard_mutex must be held at least to this point to prevent
750     * ptrace_attach() from altering our determination of the task's
751     diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
752     index de08c92f..605af51 100644
753     --- a/fs/ubifs/dir.c
754     +++ b/fs/ubifs/dir.c
755     @@ -349,31 +349,50 @@ static unsigned int vfs_dent_type(uint8_t type)
756     static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
757     {
758     int err, over = 0;
759     + loff_t pos = file->f_pos;
760     struct qstr nm;
761     union ubifs_key key;
762     struct ubifs_dent_node *dent;
763     struct inode *dir = file_inode(file);
764     struct ubifs_info *c = dir->i_sb->s_fs_info;
765    
766     - dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, file->f_pos);
767     + dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, pos);
768    
769     - if (file->f_pos > UBIFS_S_KEY_HASH_MASK || file->f_pos == 2)
770     + if (pos > UBIFS_S_KEY_HASH_MASK || pos == 2)
771     /*
772     * The directory was seek'ed to a senseless position or there
773     * are no more entries.
774     */
775     return 0;
776    
777     + if (file->f_version == 0) {
778     + /*
779     + * The file was seek'ed, which means that @file->private_data
780     + * is now invalid. This may also be just the first
781     + * 'ubifs_readdir()' invocation, in which case
782     + * @file->private_data is NULL, and the below code is
783     + * basically a no-op.
784     + */
785     + kfree(file->private_data);
786     + file->private_data = NULL;
787     + }
788     +
789     + /*
790     + * 'generic_file_llseek()' unconditionally sets @file->f_version to
791     + * zero, and we use this for detecting whether the file was seek'ed.
792     + */
793     + file->f_version = 1;
794     +
795     /* File positions 0 and 1 correspond to "." and ".." */
796     - if (file->f_pos == 0) {
797     + if (pos == 0) {
798     ubifs_assert(!file->private_data);
799     over = filldir(dirent, ".", 1, 0, dir->i_ino, DT_DIR);
800     if (over)
801     return 0;
802     - file->f_pos = 1;
803     + file->f_pos = pos = 1;
804     }
805    
806     - if (file->f_pos == 1) {
807     + if (pos == 1) {
808     ubifs_assert(!file->private_data);
809     over = filldir(dirent, "..", 2, 1,
810     parent_ino(file->f_path.dentry), DT_DIR);
811     @@ -389,7 +408,7 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
812     goto out;
813     }
814    
815     - file->f_pos = key_hash_flash(c, &dent->key);
816     + file->f_pos = pos = key_hash_flash(c, &dent->key);
817     file->private_data = dent;
818     }
819    
820     @@ -397,17 +416,16 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
821     if (!dent) {
822     /*
823     * The directory was seek'ed to and is now readdir'ed.
824     - * Find the entry corresponding to @file->f_pos or the
825     - * closest one.
826     + * Find the entry corresponding to @pos or the closest one.
827     */
828     - dent_key_init_hash(c, &key, dir->i_ino, file->f_pos);
829     + dent_key_init_hash(c, &key, dir->i_ino, pos);
830     nm.name = NULL;
831     dent = ubifs_tnc_next_ent(c, &key, &nm);
832     if (IS_ERR(dent)) {
833     err = PTR_ERR(dent);
834     goto out;
835     }
836     - file->f_pos = key_hash_flash(c, &dent->key);
837     + file->f_pos = pos = key_hash_flash(c, &dent->key);
838     file->private_data = dent;
839     }
840    
841     @@ -419,7 +437,7 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
842     ubifs_inode(dir)->creat_sqnum);
843    
844     nm.len = le16_to_cpu(dent->nlen);
845     - over = filldir(dirent, dent->name, nm.len, file->f_pos,
846     + over = filldir(dirent, dent->name, nm.len, pos,
847     le64_to_cpu(dent->inum),
848     vfs_dent_type(dent->type));
849     if (over)
850     @@ -435,9 +453,17 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)
851     }
852    
853     kfree(file->private_data);
854     - file->f_pos = key_hash_flash(c, &dent->key);
855     + file->f_pos = pos = key_hash_flash(c, &dent->key);
856     file->private_data = dent;
857     cond_resched();
858     +
859     + if (file->f_version == 0)
860     + /*
861     + * The file was seek'ed meanwhile, lets return and start
862     + * reading direntries from the new position on the next
863     + * invocation.
864     + */
865     + return 0;
866     }
867    
868     out:
869     @@ -448,15 +474,13 @@ out:
870    
871     kfree(file->private_data);
872     file->private_data = NULL;
873     + /* 2 is a special value indicating that there are no more direntries */
874     file->f_pos = 2;
875     return 0;
876     }
877    
878     -/* If a directory is seeked, we have to free saved readdir() state */
879     static loff_t ubifs_dir_llseek(struct file *file, loff_t offset, int whence)
880     {
881     - kfree(file->private_data);
882     - file->private_data = NULL;
883     return generic_file_llseek(file, offset, whence);
884     }
885    
886     diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
887     index a64f8ae..20185ea 100644
888     --- a/kernel/events/hw_breakpoint.c
889     +++ b/kernel/events/hw_breakpoint.c
890     @@ -120,7 +120,7 @@ static int task_bp_pinned(int cpu, struct perf_event *bp, enum bp_type_idx type)
891     list_for_each_entry(iter, &bp_task_head, hw.bp_list) {
892     if (iter->hw.bp_target == tsk &&
893     find_slot_idx(iter) == type &&
894     - cpu == iter->cpu)
895     + (iter->cpu < 0 || cpu == iter->cpu))
896     count += hw_breakpoint_weight(iter);
897     }
898    
899     @@ -149,7 +149,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp,
900     return;
901     }
902    
903     - for_each_online_cpu(cpu) {
904     + for_each_possible_cpu(cpu) {
905     unsigned int nr;
906    
907     nr = per_cpu(nr_cpu_bp_pinned[type], cpu);
908     @@ -235,7 +235,7 @@ toggle_bp_slot(struct perf_event *bp, bool enable, enum bp_type_idx type,
909     if (cpu >= 0) {
910     toggle_bp_task_slot(bp, cpu, enable, type, weight);
911     } else {
912     - for_each_online_cpu(cpu)
913     + for_each_possible_cpu(cpu)
914     toggle_bp_task_slot(bp, cpu, enable, type, weight);
915     }
916    
917     diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
918     index c5f9cd6..04b32e1 100644
919     --- a/net/bluetooth/l2cap_core.c
920     +++ b/net/bluetooth/l2cap_core.c
921     @@ -2743,6 +2743,9 @@ static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
922     BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
923     conn, code, ident, dlen);
924    
925     + if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
926     + return NULL;
927     +
928     len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
929     count = min_t(unsigned int, conn->mtu, len);
930    
931     @@ -4221,7 +4224,7 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn,
932     struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
933     u16 type, result;
934    
935     - if (cmd_len != sizeof(*rsp))
936     + if (cmd_len < sizeof(*rsp))
937     return -EPROTO;
938    
939     type = __le16_to_cpu(rsp->type);
940     diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
941     index 2b6c226..a560ae0 100644
942     --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
943     +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
944     @@ -204,7 +204,7 @@ static unsigned int __ipv6_conntrack_in(struct net *net,
945     if (ct != NULL && !nf_ct_is_untracked(ct)) {
946     help = nfct_help(ct);
947     if ((help && help->helper) || !nf_ct_is_confirmed(ct)) {
948     - nf_conntrack_get_reasm(skb);
949     + nf_conntrack_get_reasm(reasm);
950     NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, reasm,
951     (struct net_device *)in,
952     (struct net_device *)out,
953     diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
954     index 5672533..4e74cd6 100644
955     --- a/net/mac80211/ieee80211_i.h
956     +++ b/net/mac80211/ieee80211_i.h
957     @@ -1520,9 +1520,9 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
958     ieee80211_tx_skb_tid(sdata, skb, 7);
959     }
960    
961     -void ieee802_11_parse_elems(u8 *start, size_t len,
962     +void ieee802_11_parse_elems(const u8 *start, size_t len,
963     struct ieee802_11_elems *elems);
964     -u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
965     +u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len,
966     struct ieee802_11_elems *elems,
967     u64 filter, u32 crc);
968     u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
969     diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
970     index 0a60f40..9726603 100644
971     --- a/net/mac80211/mlme.c
972     +++ b/net/mac80211/mlme.c
973     @@ -2422,8 +2422,11 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
974     u16 capab_info, aid;
975     struct ieee802_11_elems elems;
976     struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
977     + const struct cfg80211_bss_ies *bss_ies = NULL;
978     + struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
979     u32 changed = 0;
980     int err;
981     + bool ret;
982    
983     /* AssocResp and ReassocResp have identical structure */
984    
985     @@ -2455,21 +2458,86 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
986     ifmgd->aid = aid;
987    
988     /*
989     + * Some APs are erroneously not including some information in their
990     + * (re)association response frames. Try to recover by using the data
991     + * from the beacon or probe response. This seems to afflict mobile
992     + * 2G/3G/4G wifi routers, reported models include the "Onda PN51T",
993     + * "Vodafone PocketWiFi 2", "ZTE MF60" and a similar T-Mobile device.
994     + */
995     + if ((assoc_data->wmm && !elems.wmm_param) ||
996     + (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
997     + (!elems.ht_cap_elem || !elems.ht_operation)) ||
998     + (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
999     + (!elems.vht_cap_elem || !elems.vht_operation))) {
1000     + const struct cfg80211_bss_ies *ies;
1001     + struct ieee802_11_elems bss_elems;
1002     +
1003     + rcu_read_lock();
1004     + ies = rcu_dereference(cbss->ies);
1005     + if (ies)
1006     + bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
1007     + GFP_ATOMIC);
1008     + rcu_read_unlock();
1009     + if (!bss_ies)
1010     + return false;
1011     +
1012     + ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
1013     + &bss_elems);
1014     + if (assoc_data->wmm &&
1015     + !elems.wmm_param && bss_elems.wmm_param) {
1016     + elems.wmm_param = bss_elems.wmm_param;
1017     + sdata_info(sdata,
1018     + "AP bug: WMM param missing from AssocResp\n");
1019     + }
1020     +
1021     + /*
1022     + * Also check if we requested HT/VHT, otherwise the AP doesn't
1023     + * have to include the IEs in the (re)association response.
1024     + */
1025     + if (!elems.ht_cap_elem && bss_elems.ht_cap_elem &&
1026     + !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
1027     + elems.ht_cap_elem = bss_elems.ht_cap_elem;
1028     + sdata_info(sdata,
1029     + "AP bug: HT capability missing from AssocResp\n");
1030     + }
1031     + if (!elems.ht_operation && bss_elems.ht_operation &&
1032     + !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
1033     + elems.ht_operation = bss_elems.ht_operation;
1034     + sdata_info(sdata,
1035     + "AP bug: HT operation missing from AssocResp\n");
1036     + }
1037     + if (!elems.vht_cap_elem && bss_elems.vht_cap_elem &&
1038     + !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
1039     + elems.vht_cap_elem = bss_elems.vht_cap_elem;
1040     + sdata_info(sdata,
1041     + "AP bug: VHT capa missing from AssocResp\n");
1042     + }
1043     + if (!elems.vht_operation && bss_elems.vht_operation &&
1044     + !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
1045     + elems.vht_operation = bss_elems.vht_operation;
1046     + sdata_info(sdata,
1047     + "AP bug: VHT operation missing from AssocResp\n");
1048     + }
1049     + }
1050     +
1051     + /*
1052     * We previously checked these in the beacon/probe response, so
1053     * they should be present here. This is just a safety net.
1054     */
1055     if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
1056     (!elems.wmm_param || !elems.ht_cap_elem || !elems.ht_operation)) {
1057     sdata_info(sdata,
1058     - "HT AP is missing WMM params or HT capability/operation in AssocResp\n");
1059     - return false;
1060     + "HT AP is missing WMM params or HT capability/operation\n");
1061     + ret = false;
1062     + goto out;
1063     }
1064    
1065     if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
1066     (!elems.vht_cap_elem || !elems.vht_operation)) {
1067     sdata_info(sdata,
1068     - "VHT AP is missing VHT capability/operation in AssocResp\n");
1069     - return false;
1070     + "VHT AP is missing VHT capability/operation\n");
1071     + ret = false;
1072     + goto out;
1073     }
1074    
1075     mutex_lock(&sdata->local->sta_mtx);
1076     @@ -2480,7 +2548,8 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
1077     sta = sta_info_get(sdata, cbss->bssid);
1078     if (WARN_ON(!sta)) {
1079     mutex_unlock(&sdata->local->sta_mtx);
1080     - return false;
1081     + ret = false;
1082     + goto out;
1083     }
1084    
1085     sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)];
1086     @@ -2533,7 +2602,8 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
1087     sta->sta.addr);
1088     WARN_ON(__sta_info_destroy(sta));
1089     mutex_unlock(&sdata->local->sta_mtx);
1090     - return false;
1091     + ret = false;
1092     + goto out;
1093     }
1094    
1095     mutex_unlock(&sdata->local->sta_mtx);
1096     @@ -2573,7 +2643,10 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
1097     ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt);
1098     ieee80211_sta_reset_beacon_monitor(sdata);
1099    
1100     - return true;
1101     + ret = true;
1102     + out:
1103     + kfree(bss_ies);
1104     + return ret;
1105     }
1106    
1107     static enum rx_mgmt_action __must_check
1108     diff --git a/net/mac80211/util.c b/net/mac80211/util.c
1109     index 0f38f43..1f4b908 100644
1110     --- a/net/mac80211/util.c
1111     +++ b/net/mac80211/util.c
1112     @@ -626,12 +626,12 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
1113     }
1114     EXPORT_SYMBOL(ieee80211_queue_delayed_work);
1115    
1116     -u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
1117     +u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len,
1118     struct ieee802_11_elems *elems,
1119     u64 filter, u32 crc)
1120     {
1121     size_t left = len;
1122     - u8 *pos = start;
1123     + const u8 *pos = start;
1124     bool calc_crc = filter != 0;
1125     DECLARE_BITMAP(seen_elems, 256);
1126    
1127     @@ -877,7 +877,7 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,
1128     return crc;
1129     }
1130    
1131     -void ieee802_11_parse_elems(u8 *start, size_t len,
1132     +void ieee802_11_parse_elems(const u8 *start, size_t len,
1133     struct ieee802_11_elems *elems)
1134     {
1135     ieee802_11_parse_elems_crc(start, len, elems, 0, 0);