Annotation of /trunk/kernel-lts/patches-3.4/0128-3.4.29-all-fixes.patch
Parent Directory | Revision Log
Revision 2065 -
(hide annotations)
(download)
Wed Feb 6 10:50:19 2013 UTC (11 years, 7 months ago) by niro
File size: 32240 byte(s)
Wed Feb 6 10:50:19 2013 UTC (11 years, 7 months ago) by niro
File size: 32240 byte(s)
-linux-3.4.29
1 | niro | 2065 | diff --git a/Makefile b/Makefile |
2 | index 8ccebba..23bcb1a 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 4 | ||
8 | -SUBLEVEL = 28 | ||
9 | +SUBLEVEL = 29 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Saber-toothed Squirrel | ||
12 | |||
13 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c | ||
14 | index 582142e..55293a7 100644 | ||
15 | --- a/arch/arm/mach-at91/setup.c | ||
16 | +++ b/arch/arm/mach-at91/setup.c | ||
17 | @@ -104,6 +104,8 @@ static void __init soc_detect(u32 dbgu_base) | ||
18 | switch (socid) { | ||
19 | case ARCH_ID_AT91RM9200: | ||
20 | at91_soc_initdata.type = AT91_SOC_RM9200; | ||
21 | + if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_NONE) | ||
22 | + at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; | ||
23 | at91_boot_soc = at91rm9200_soc; | ||
24 | break; | ||
25 | |||
26 | diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c | ||
27 | index db23ae4..a3e4adf 100644 | ||
28 | --- a/arch/arm/mm/dma-mapping.c | ||
29 | +++ b/arch/arm/mm/dma-mapping.c | ||
30 | @@ -503,25 +503,27 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | ||
31 | size_t size, enum dma_data_direction dir, | ||
32 | void (*op)(const void *, size_t, int)) | ||
33 | { | ||
34 | + unsigned long pfn; | ||
35 | + size_t left = size; | ||
36 | + | ||
37 | + pfn = page_to_pfn(page) + offset / PAGE_SIZE; | ||
38 | + offset %= PAGE_SIZE; | ||
39 | + | ||
40 | /* | ||
41 | * A single sg entry may refer to multiple physically contiguous | ||
42 | * pages. But we still need to process highmem pages individually. | ||
43 | * If highmem is not configured then the bulk of this loop gets | ||
44 | * optimized out. | ||
45 | */ | ||
46 | - size_t left = size; | ||
47 | do { | ||
48 | size_t len = left; | ||
49 | void *vaddr; | ||
50 | |||
51 | + page = pfn_to_page(pfn); | ||
52 | + | ||
53 | if (PageHighMem(page)) { | ||
54 | - if (len + offset > PAGE_SIZE) { | ||
55 | - if (offset >= PAGE_SIZE) { | ||
56 | - page += offset / PAGE_SIZE; | ||
57 | - offset %= PAGE_SIZE; | ||
58 | - } | ||
59 | + if (len + offset > PAGE_SIZE) | ||
60 | len = PAGE_SIZE - offset; | ||
61 | - } | ||
62 | vaddr = kmap_high_get(page); | ||
63 | if (vaddr) { | ||
64 | vaddr += offset; | ||
65 | @@ -538,7 +540,7 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | ||
66 | op(vaddr, len, dir); | ||
67 | } | ||
68 | offset = 0; | ||
69 | - page++; | ||
70 | + pfn++; | ||
71 | left -= len; | ||
72 | } while (left); | ||
73 | } | ||
74 | diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S | ||
75 | index cc926c9..323ce1a 100644 | ||
76 | --- a/arch/arm/vfp/entry.S | ||
77 | +++ b/arch/arm/vfp/entry.S | ||
78 | @@ -22,7 +22,7 @@ | ||
79 | @ IRQs disabled. | ||
80 | @ | ||
81 | ENTRY(do_vfp) | ||
82 | -#ifdef CONFIG_PREEMPT | ||
83 | +#ifdef CONFIG_PREEMPT_COUNT | ||
84 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
85 | add r11, r4, #1 @ increment it | ||
86 | str r11, [r10, #TI_PREEMPT] | ||
87 | @@ -35,7 +35,7 @@ ENTRY(do_vfp) | ||
88 | ENDPROC(do_vfp) | ||
89 | |||
90 | ENTRY(vfp_null_entry) | ||
91 | -#ifdef CONFIG_PREEMPT | ||
92 | +#ifdef CONFIG_PREEMPT_COUNT | ||
93 | get_thread_info r10 | ||
94 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
95 | sub r11, r4, #1 @ decrement it | ||
96 | @@ -53,7 +53,7 @@ ENDPROC(vfp_null_entry) | ||
97 | |||
98 | __INIT | ||
99 | ENTRY(vfp_testing_entry) | ||
100 | -#ifdef CONFIG_PREEMPT | ||
101 | +#ifdef CONFIG_PREEMPT_COUNT | ||
102 | get_thread_info r10 | ||
103 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
104 | sub r11, r4, #1 @ decrement it | ||
105 | diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S | ||
106 | index 3a0efaa..6ff903e 100644 | ||
107 | --- a/arch/arm/vfp/vfphw.S | ||
108 | +++ b/arch/arm/vfp/vfphw.S | ||
109 | @@ -167,7 +167,7 @@ vfp_hw_state_valid: | ||
110 | @ else it's one 32-bit instruction, so | ||
111 | @ always subtract 4 from the following | ||
112 | @ instruction address. | ||
113 | -#ifdef CONFIG_PREEMPT | ||
114 | +#ifdef CONFIG_PREEMPT_COUNT | ||
115 | get_thread_info r10 | ||
116 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
117 | sub r11, r4, #1 @ decrement it | ||
118 | @@ -191,7 +191,7 @@ look_for_VFP_exceptions: | ||
119 | @ not recognised by VFP | ||
120 | |||
121 | DBGSTR "not VFP" | ||
122 | -#ifdef CONFIG_PREEMPT | ||
123 | +#ifdef CONFIG_PREEMPT_COUNT | ||
124 | get_thread_info r10 | ||
125 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
126 | sub r11, r4, #1 @ decrement it | ||
127 | diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c | ||
128 | index eb11369..8563b64 100644 | ||
129 | --- a/arch/x86/kernel/msr.c | ||
130 | +++ b/arch/x86/kernel/msr.c | ||
131 | @@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file) | ||
132 | unsigned int cpu; | ||
133 | struct cpuinfo_x86 *c; | ||
134 | |||
135 | + if (!capable(CAP_SYS_RAWIO)) | ||
136 | + return -EPERM; | ||
137 | + | ||
138 | cpu = iminor(file->f_path.dentry->d_inode); | ||
139 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) | ||
140 | return -ENXIO; /* No such CPU */ | ||
141 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c | ||
142 | index d289ee7..b71e4a5 100644 | ||
143 | --- a/arch/x86/kernel/setup.c | ||
144 | +++ b/arch/x86/kernel/setup.c | ||
145 | @@ -622,6 +622,7 @@ static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10; | ||
146 | |||
147 | static bool __init snb_gfx_workaround_needed(void) | ||
148 | { | ||
149 | +#ifdef CONFIG_PCI | ||
150 | int i; | ||
151 | u16 vendor, devid; | ||
152 | static const u16 snb_ids[] = { | ||
153 | @@ -646,6 +647,7 @@ static bool __init snb_gfx_workaround_needed(void) | ||
154 | for (i = 0; i < ARRAY_SIZE(snb_ids); i++) | ||
155 | if (devid == snb_ids[i]) | ||
156 | return true; | ||
157 | +#endif | ||
158 | |||
159 | return false; | ||
160 | } | ||
161 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c | ||
162 | index 72d8899..6825327 100644 | ||
163 | --- a/arch/x86/platform/efi/efi.c | ||
164 | +++ b/arch/x86/platform/efi/efi.c | ||
165 | @@ -900,7 +900,7 @@ void __init efi_enter_virtual_mode(void) | ||
166 | * | ||
167 | * Call EFI services through wrapper functions. | ||
168 | */ | ||
169 | - efi.runtime_version = efi_systab.fw_revision; | ||
170 | + efi.runtime_version = efi_systab.hdr.revision; | ||
171 | efi.get_time = virt_efi_get_time; | ||
172 | efi.set_time = virt_efi_set_time; | ||
173 | efi.get_wakeup_time = virt_efi_get_wakeup_time; | ||
174 | diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c | ||
175 | index ac3aa54..0fba86d 100644 | ||
176 | --- a/arch/x86/platform/efi/efi_64.c | ||
177 | +++ b/arch/x86/platform/efi/efi_64.c | ||
178 | @@ -38,7 +38,7 @@ | ||
179 | #include <asm/cacheflush.h> | ||
180 | #include <asm/fixmap.h> | ||
181 | |||
182 | -static pgd_t save_pgd __initdata; | ||
183 | +static pgd_t *save_pgd __initdata; | ||
184 | static unsigned long efi_flags __initdata; | ||
185 | |||
186 | static void __init early_code_mapping_set_exec(int executable) | ||
187 | @@ -61,12 +61,20 @@ static void __init early_code_mapping_set_exec(int executable) | ||
188 | void __init efi_call_phys_prelog(void) | ||
189 | { | ||
190 | unsigned long vaddress; | ||
191 | + int pgd; | ||
192 | + int n_pgds; | ||
193 | |||
194 | early_code_mapping_set_exec(1); | ||
195 | local_irq_save(efi_flags); | ||
196 | - vaddress = (unsigned long)__va(0x0UL); | ||
197 | - save_pgd = *pgd_offset_k(0x0UL); | ||
198 | - set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress)); | ||
199 | + | ||
200 | + n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE); | ||
201 | + save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL); | ||
202 | + | ||
203 | + for (pgd = 0; pgd < n_pgds; pgd++) { | ||
204 | + save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE); | ||
205 | + vaddress = (unsigned long)__va(pgd * PGDIR_SIZE); | ||
206 | + set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress)); | ||
207 | + } | ||
208 | __flush_tlb_all(); | ||
209 | } | ||
210 | |||
211 | @@ -75,7 +83,11 @@ void __init efi_call_phys_epilog(void) | ||
212 | /* | ||
213 | * After the lock is released, the original page table is restored. | ||
214 | */ | ||
215 | - set_pgd(pgd_offset_k(0x0UL), save_pgd); | ||
216 | + int pgd; | ||
217 | + int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); | ||
218 | + for (pgd = 0; pgd < n_pgds; pgd++) | ||
219 | + set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); | ||
220 | + kfree(save_pgd); | ||
221 | __flush_tlb_all(); | ||
222 | local_irq_restore(efi_flags); | ||
223 | early_code_mapping_set_exec(0); | ||
224 | diff --git a/drivers/edac/edac_pci_sysfs.c b/drivers/edac/edac_pci_sysfs.c | ||
225 | index 97f5064..686ac03 100644 | ||
226 | --- a/drivers/edac/edac_pci_sysfs.c | ||
227 | +++ b/drivers/edac/edac_pci_sysfs.c | ||
228 | @@ -257,7 +257,7 @@ static ssize_t edac_pci_dev_store(struct kobject *kobj, | ||
229 | struct edac_pci_dev_attribute *edac_pci_dev; | ||
230 | edac_pci_dev = (struct edac_pci_dev_attribute *)attr; | ||
231 | |||
232 | - if (edac_pci_dev->show) | ||
233 | + if (edac_pci_dev->store) | ||
234 | return edac_pci_dev->store(edac_pci_dev->value, buffer, count); | ||
235 | return -EIO; | ||
236 | } | ||
237 | diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
238 | index 711e95a..8fb6f41 100644 | ||
239 | --- a/drivers/gpu/drm/radeon/radeon_cursor.c | ||
240 | +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
241 | @@ -238,7 +238,8 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | ||
242 | y = 0; | ||
243 | } | ||
244 | |||
245 | - if (ASIC_IS_AVIVO(rdev)) { | ||
246 | + /* fixed on DCE6 and newer */ | ||
247 | + if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE6(rdev)) { | ||
248 | int i = 0; | ||
249 | struct drm_crtc *crtc_p; | ||
250 | |||
251 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c | ||
252 | index 173b97b..1f50727 100644 | ||
253 | --- a/drivers/gpu/drm/radeon/radeon_display.c | ||
254 | +++ b/drivers/gpu/drm/radeon/radeon_display.c | ||
255 | @@ -1136,7 +1136,7 @@ radeon_user_framebuffer_create(struct drm_device *dev, | ||
256 | if (ret) { | ||
257 | kfree(radeon_fb); | ||
258 | drm_gem_object_unreference_unlocked(obj); | ||
259 | - return NULL; | ||
260 | + return ERR_PTR(ret); | ||
261 | } | ||
262 | |||
263 | return &radeon_fb->base; | ||
264 | diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c | ||
265 | index c04ddca..ef0ae93 100644 | ||
266 | --- a/drivers/iommu/amd_iommu_init.c | ||
267 | +++ b/drivers/iommu/amd_iommu_init.c | ||
268 | @@ -1002,6 +1002,38 @@ static void __init free_iommu_all(void) | ||
269 | } | ||
270 | |||
271 | /* | ||
272 | + * Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall Translations) | ||
273 | + * Workaround: | ||
274 | + * BIOS should disable L2B micellaneous clock gating by setting | ||
275 | + * L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b | ||
276 | + */ | ||
277 | +static void __init amd_iommu_erratum_746_workaround(struct amd_iommu *iommu) | ||
278 | +{ | ||
279 | + u32 value; | ||
280 | + | ||
281 | + if ((boot_cpu_data.x86 != 0x15) || | ||
282 | + (boot_cpu_data.x86_model < 0x10) || | ||
283 | + (boot_cpu_data.x86_model > 0x1f)) | ||
284 | + return; | ||
285 | + | ||
286 | + pci_write_config_dword(iommu->dev, 0xf0, 0x90); | ||
287 | + pci_read_config_dword(iommu->dev, 0xf4, &value); | ||
288 | + | ||
289 | + if (value & BIT(2)) | ||
290 | + return; | ||
291 | + | ||
292 | + /* Select NB indirect register 0x90 and enable writing */ | ||
293 | + pci_write_config_dword(iommu->dev, 0xf0, 0x90 | (1 << 8)); | ||
294 | + | ||
295 | + pci_write_config_dword(iommu->dev, 0xf4, value | 0x4); | ||
296 | + pr_info("AMD-Vi: Applying erratum 746 workaround for IOMMU at %s\n", | ||
297 | + dev_name(&iommu->dev->dev)); | ||
298 | + | ||
299 | + /* Clear the enable writing bit */ | ||
300 | + pci_write_config_dword(iommu->dev, 0xf0, 0x90); | ||
301 | +} | ||
302 | + | ||
303 | +/* | ||
304 | * This function clues the initialization function for one IOMMU | ||
305 | * together and also allocates the command buffer and programs the | ||
306 | * hardware. It does NOT enable the IOMMU. This is done afterwards. | ||
307 | @@ -1062,6 +1094,8 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h) | ||
308 | if (iommu->cap & (1UL << IOMMU_CAP_NPCACHE)) | ||
309 | amd_iommu_np_cache = true; | ||
310 | |||
311 | + amd_iommu_erratum_746_workaround(iommu); | ||
312 | + | ||
313 | return pci_enable_device(iommu->dev); | ||
314 | } | ||
315 | |||
316 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
317 | index be66606..5d71873 100644 | ||
318 | --- a/drivers/iommu/intel-iommu.c | ||
319 | +++ b/drivers/iommu/intel-iommu.c | ||
320 | @@ -4193,6 +4193,21 @@ static struct iommu_ops intel_iommu_ops = { | ||
321 | .pgsize_bitmap = INTEL_IOMMU_PGSIZES, | ||
322 | }; | ||
323 | |||
324 | +static void __devinit quirk_iommu_g4x_gfx(struct pci_dev *dev) | ||
325 | +{ | ||
326 | + /* G4x/GM45 integrated gfx dmar support is totally busted. */ | ||
327 | + printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n"); | ||
328 | + dmar_map_gfx = 0; | ||
329 | +} | ||
330 | + | ||
331 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_g4x_gfx); | ||
332 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e00, quirk_iommu_g4x_gfx); | ||
333 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e10, quirk_iommu_g4x_gfx); | ||
334 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e20, quirk_iommu_g4x_gfx); | ||
335 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e30, quirk_iommu_g4x_gfx); | ||
336 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e40, quirk_iommu_g4x_gfx); | ||
337 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e90, quirk_iommu_g4x_gfx); | ||
338 | + | ||
339 | static void __devinit quirk_iommu_rwbf(struct pci_dev *dev) | ||
340 | { | ||
341 | /* | ||
342 | @@ -4201,12 +4216,6 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev) | ||
343 | */ | ||
344 | printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n"); | ||
345 | rwbf_quirk = 1; | ||
346 | - | ||
347 | - /* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */ | ||
348 | - if (dev->revision == 0x07) { | ||
349 | - printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n"); | ||
350 | - dmar_map_gfx = 0; | ||
351 | - } | ||
352 | } | ||
353 | |||
354 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf); | ||
355 | diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c | ||
356 | index 86cd532..21a3d77 100644 | ||
357 | --- a/drivers/net/can/c_can/c_can.c | ||
358 | +++ b/drivers/net/can/c_can/c_can.c | ||
359 | @@ -914,7 +914,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | ||
360 | break; | ||
361 | case LEC_ACK_ERROR: | ||
362 | netdev_dbg(dev, "ack error\n"); | ||
363 | - cf->data[2] |= (CAN_ERR_PROT_LOC_ACK | | ||
364 | + cf->data[3] |= (CAN_ERR_PROT_LOC_ACK | | ||
365 | CAN_ERR_PROT_LOC_ACK_DEL); | ||
366 | break; | ||
367 | case LEC_BIT1_ERROR: | ||
368 | @@ -927,7 +927,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | ||
369 | break; | ||
370 | case LEC_CRC_ERROR: | ||
371 | netdev_dbg(dev, "CRC error\n"); | ||
372 | - cf->data[2] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | ||
373 | + cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | ||
374 | CAN_ERR_PROT_LOC_CRC_DEL); | ||
375 | break; | ||
376 | default: | ||
377 | diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c | ||
378 | index 2bb215e..ab13a57 100644 | ||
379 | --- a/drivers/net/can/pch_can.c | ||
380 | +++ b/drivers/net/can/pch_can.c | ||
381 | @@ -560,7 +560,7 @@ static void pch_can_error(struct net_device *ndev, u32 status) | ||
382 | stats->rx_errors++; | ||
383 | break; | ||
384 | case PCH_CRC_ERR: | ||
385 | - cf->data[2] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
386 | + cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
387 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
388 | priv->can.can_stats.bus_error++; | ||
389 | stats->rx_errors++; | ||
390 | diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c | ||
391 | index 5ec2700..19000aa 100644 | ||
392 | --- a/drivers/net/can/ti_hecc.c | ||
393 | +++ b/drivers/net/can/ti_hecc.c | ||
394 | @@ -746,12 +746,12 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | ||
395 | } | ||
396 | if (err_status & HECC_CANES_CRCE) { | ||
397 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_CRCE); | ||
398 | - cf->data[2] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
399 | + cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
400 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
401 | } | ||
402 | if (err_status & HECC_CANES_ACKE) { | ||
403 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_ACKE); | ||
404 | - cf->data[2] |= CAN_ERR_PROT_LOC_ACK | | ||
405 | + cf->data[3] |= CAN_ERR_PROT_LOC_ACK | | ||
406 | CAN_ERR_PROT_LOC_ACK_DEL; | ||
407 | } | ||
408 | } | ||
409 | diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c | ||
410 | index 5eb53c9..2e4243f 100644 | ||
411 | --- a/drivers/net/wireless/ath/ath9k/beacon.c | ||
412 | +++ b/drivers/net/wireless/ath/ath9k/beacon.c | ||
413 | @@ -154,6 +154,7 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, | ||
414 | skb->len, DMA_TO_DEVICE); | ||
415 | dev_kfree_skb_any(skb); | ||
416 | bf->bf_buf_addr = 0; | ||
417 | + bf->bf_mpdu = NULL; | ||
418 | } | ||
419 | |||
420 | /* Get a new beacon from mac80211 */ | ||
421 | diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
422 | index c25226a..ec86d98 100644 | ||
423 | --- a/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
424 | +++ b/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
425 | @@ -342,6 +342,8 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle, | ||
426 | endpoint->ep_callbacks.tx(endpoint->ep_callbacks.priv, | ||
427 | skb, htc_hdr->endpoint_id, | ||
428 | txok); | ||
429 | + } else { | ||
430 | + kfree_skb(skb); | ||
431 | } | ||
432 | } | ||
433 | |||
434 | diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c | ||
435 | index 90b8527..039bac7 100644 | ||
436 | --- a/drivers/net/wireless/ath/ath9k/recv.c | ||
437 | +++ b/drivers/net/wireless/ath/ath9k/recv.c | ||
438 | @@ -778,6 +778,7 @@ static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc, | ||
439 | return NULL; | ||
440 | } | ||
441 | |||
442 | + list_del(&bf->list); | ||
443 | if (!bf->bf_mpdu) | ||
444 | return bf; | ||
445 | |||
446 | @@ -1966,14 +1967,15 @@ requeue_drop_frag: | ||
447 | sc->rx.frag = NULL; | ||
448 | } | ||
449 | requeue: | ||
450 | + list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
451 | + if (flush) | ||
452 | + continue; | ||
453 | + | ||
454 | if (edma) { | ||
455 | - list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
456 | ath_rx_edma_buf_link(sc, qtype); | ||
457 | } else { | ||
458 | - list_move_tail(&bf->list, &sc->rx.rxbuf); | ||
459 | ath_rx_buf_link(sc, bf); | ||
460 | - if (!flush) | ||
461 | - ath9k_hw_rxena(ah); | ||
462 | + ath9k_hw_rxena(ah); | ||
463 | } | ||
464 | } while (1); | ||
465 | |||
466 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | ||
467 | index 569ab8a..27f37c7 100644 | ||
468 | --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | ||
469 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | ||
470 | @@ -1400,9 +1400,10 @@ void brcms_add_timer(struct brcms_timer *t, uint ms, int periodic) | ||
471 | #endif | ||
472 | t->ms = ms; | ||
473 | t->periodic = (bool) periodic; | ||
474 | - t->set = true; | ||
475 | - | ||
476 | - atomic_inc(&t->wl->callbacks); | ||
477 | + if (!t->set) { | ||
478 | + t->set = true; | ||
479 | + atomic_inc(&t->wl->callbacks); | ||
480 | + } | ||
481 | |||
482 | ieee80211_queue_delayed_work(hw, &t->dly_wrk, msecs_to_jiffies(ms)); | ||
483 | } | ||
484 | diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c | ||
485 | index 4bc2711..2ab6b96 100644 | ||
486 | --- a/drivers/net/wireless/iwlegacy/common.c | ||
487 | +++ b/drivers/net/wireless/iwlegacy/common.c | ||
488 | @@ -3957,17 +3957,21 @@ il_connection_init_rx_config(struct il_priv *il) | ||
489 | |||
490 | memset(&il->staging, 0, sizeof(il->staging)); | ||
491 | |||
492 | - if (!il->vif) { | ||
493 | + switch (il->iw_mode) { | ||
494 | + case NL80211_IFTYPE_UNSPECIFIED: | ||
495 | il->staging.dev_type = RXON_DEV_TYPE_ESS; | ||
496 | - } else if (il->vif->type == NL80211_IFTYPE_STATION) { | ||
497 | + break; | ||
498 | + case NL80211_IFTYPE_STATION: | ||
499 | il->staging.dev_type = RXON_DEV_TYPE_ESS; | ||
500 | il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; | ||
501 | - } else if (il->vif->type == NL80211_IFTYPE_ADHOC) { | ||
502 | + break; | ||
503 | + case NL80211_IFTYPE_ADHOC: | ||
504 | il->staging.dev_type = RXON_DEV_TYPE_IBSS; | ||
505 | il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK; | ||
506 | il->staging.filter_flags = | ||
507 | RXON_FILTER_BCON_AWARE_MSK | RXON_FILTER_ACCEPT_GRP_MSK; | ||
508 | - } else { | ||
509 | + break; | ||
510 | + default: | ||
511 | IL_ERR("Unsupported interface type %d\n", il->vif->type); | ||
512 | return; | ||
513 | } | ||
514 | @@ -4550,8 +4554,7 @@ out: | ||
515 | EXPORT_SYMBOL(il_mac_add_interface); | ||
516 | |||
517 | static void | ||
518 | -il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif, | ||
519 | - bool mode_change) | ||
520 | +il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif) | ||
521 | { | ||
522 | lockdep_assert_held(&il->mutex); | ||
523 | |||
524 | @@ -4560,9 +4563,7 @@ il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif, | ||
525 | il_force_scan_end(il); | ||
526 | } | ||
527 | |||
528 | - if (!mode_change) | ||
529 | - il_set_mode(il); | ||
530 | - | ||
531 | + il_set_mode(il); | ||
532 | } | ||
533 | |||
534 | void | ||
535 | @@ -4575,8 +4576,8 @@ il_mac_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | ||
536 | |||
537 | WARN_ON(il->vif != vif); | ||
538 | il->vif = NULL; | ||
539 | - | ||
540 | - il_teardown_interface(il, vif, false); | ||
541 | + il->iw_mode = NL80211_IFTYPE_UNSPECIFIED; | ||
542 | + il_teardown_interface(il, vif); | ||
543 | memset(il->bssid, 0, ETH_ALEN); | ||
544 | |||
545 | D_MAC80211("leave\n"); | ||
546 | @@ -4685,18 +4686,10 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | ||
547 | } | ||
548 | |||
549 | /* success */ | ||
550 | - il_teardown_interface(il, vif, true); | ||
551 | vif->type = newtype; | ||
552 | vif->p2p = false; | ||
553 | - err = il_set_mode(il); | ||
554 | - WARN_ON(err); | ||
555 | - /* | ||
556 | - * We've switched internally, but submitting to the | ||
557 | - * device may have failed for some reason. Mask this | ||
558 | - * error, because otherwise mac80211 will not switch | ||
559 | - * (and set the interface type back) and we'll be | ||
560 | - * out of sync with it. | ||
561 | - */ | ||
562 | + il->iw_mode = newtype; | ||
563 | + il_teardown_interface(il, vif); | ||
564 | err = 0; | ||
565 | |||
566 | out: | ||
567 | diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c | ||
568 | index 5867fac..6ca3d8a 100644 | ||
569 | --- a/drivers/net/wireless/mwifiex/pcie.c | ||
570 | +++ b/drivers/net/wireless/mwifiex/pcie.c | ||
571 | @@ -158,7 +158,7 @@ static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state) | ||
572 | |||
573 | if (pdev) { | ||
574 | card = (struct pcie_service_card *) pci_get_drvdata(pdev); | ||
575 | - if (!card || card->adapter) { | ||
576 | + if (!card || !card->adapter) { | ||
577 | pr_err("Card or adapter structure is not valid\n"); | ||
578 | return 0; | ||
579 | } | ||
580 | diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c | ||
581 | index b009b89..817ba7c 100644 | ||
582 | --- a/drivers/target/target_core_fabric_configfs.c | ||
583 | +++ b/drivers/target/target_core_fabric_configfs.c | ||
584 | @@ -752,12 +752,6 @@ static int target_fabric_port_link( | ||
585 | struct target_fabric_configfs *tf; | ||
586 | int ret; | ||
587 | |||
588 | - if (dev->dev_link_magic != SE_DEV_LINK_MAGIC) { | ||
589 | - pr_err("Bad dev->dev_link_magic, not a valid se_dev_ci pointer:" | ||
590 | - " %p to struct se_device: %p\n", se_dev_ci, dev); | ||
591 | - return -EFAULT; | ||
592 | - } | ||
593 | - | ||
594 | tpg_ci = &lun_ci->ci_parent->ci_group->cg_item; | ||
595 | se_tpg = container_of(to_config_group(tpg_ci), | ||
596 | struct se_portal_group, tpg_group); | ||
597 | @@ -775,6 +769,11 @@ static int target_fabric_port_link( | ||
598 | ret = -ENODEV; | ||
599 | goto out; | ||
600 | } | ||
601 | + if (dev->dev_link_magic != SE_DEV_LINK_MAGIC) { | ||
602 | + pr_err("Bad dev->dev_link_magic, not a valid se_dev_ci pointer:" | ||
603 | + " %p to struct se_device: %p\n", se_dev_ci, dev); | ||
604 | + return -EFAULT; | ||
605 | + } | ||
606 | |||
607 | lun_p = core_dev_add_lun(se_tpg, dev->se_hba, dev, | ||
608 | lun->unpacked_lun); | ||
609 | diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c | ||
610 | index 6873bb6..2263144 100644 | ||
611 | --- a/fs/cifs/cifs_dfs_ref.c | ||
612 | +++ b/fs/cifs/cifs_dfs_ref.c | ||
613 | @@ -226,6 +226,8 @@ compose_mount_options_out: | ||
614 | compose_mount_options_err: | ||
615 | kfree(mountdata); | ||
616 | mountdata = ERR_PTR(rc); | ||
617 | + kfree(*devname); | ||
618 | + *devname = NULL; | ||
619 | goto compose_mount_options_out; | ||
620 | } | ||
621 | |||
622 | diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c | ||
623 | index 2257d1f..4327516 100644 | ||
624 | --- a/fs/nfs/namespace.c | ||
625 | +++ b/fs/nfs/namespace.c | ||
626 | @@ -253,11 +253,31 @@ out_nofree: | ||
627 | return mnt; | ||
628 | } | ||
629 | |||
630 | +static int | ||
631 | +nfs_namespace_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | ||
632 | +{ | ||
633 | + if (NFS_FH(dentry->d_inode)->size != 0) | ||
634 | + return nfs_getattr(mnt, dentry, stat); | ||
635 | + generic_fillattr(dentry->d_inode, stat); | ||
636 | + return 0; | ||
637 | +} | ||
638 | + | ||
639 | +static int | ||
640 | +nfs_namespace_setattr(struct dentry *dentry, struct iattr *attr) | ||
641 | +{ | ||
642 | + if (NFS_FH(dentry->d_inode)->size != 0) | ||
643 | + return nfs_setattr(dentry, attr); | ||
644 | + return -EACCES; | ||
645 | +} | ||
646 | + | ||
647 | const struct inode_operations nfs_mountpoint_inode_operations = { | ||
648 | .getattr = nfs_getattr, | ||
649 | + .setattr = nfs_setattr, | ||
650 | }; | ||
651 | |||
652 | const struct inode_operations nfs_referral_inode_operations = { | ||
653 | + .getattr = nfs_namespace_getattr, | ||
654 | + .setattr = nfs_namespace_setattr, | ||
655 | }; | ||
656 | |||
657 | static void nfs_expire_automounts(struct work_struct *work) | ||
658 | diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c | ||
659 | index 0dbb9e7..7a978c7 100644 | ||
660 | --- a/fs/xfs/xfs_aops.c | ||
661 | +++ b/fs/xfs/xfs_aops.c | ||
662 | @@ -89,11 +89,11 @@ xfs_destroy_ioend( | ||
663 | } | ||
664 | |||
665 | if (ioend->io_iocb) { | ||
666 | + inode_dio_done(ioend->io_inode); | ||
667 | if (ioend->io_isasync) { | ||
668 | aio_complete(ioend->io_iocb, ioend->io_error ? | ||
669 | ioend->io_error : ioend->io_result, 0); | ||
670 | } | ||
671 | - inode_dio_done(ioend->io_inode); | ||
672 | } | ||
673 | |||
674 | mempool_free(ioend, xfs_ioend_pool); | ||
675 | diff --git a/kernel/smp.c b/kernel/smp.c | ||
676 | index 2f8b10e..d5f3238 100644 | ||
677 | --- a/kernel/smp.c | ||
678 | +++ b/kernel/smp.c | ||
679 | @@ -31,6 +31,7 @@ struct call_function_data { | ||
680 | struct call_single_data csd; | ||
681 | atomic_t refs; | ||
682 | cpumask_var_t cpumask; | ||
683 | + cpumask_var_t cpumask_ipi; | ||
684 | }; | ||
685 | |||
686 | static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data); | ||
687 | @@ -54,6 +55,9 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||
688 | if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL, | ||
689 | cpu_to_node(cpu))) | ||
690 | return notifier_from_errno(-ENOMEM); | ||
691 | + if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL, | ||
692 | + cpu_to_node(cpu))) | ||
693 | + return notifier_from_errno(-ENOMEM); | ||
694 | break; | ||
695 | |||
696 | #ifdef CONFIG_HOTPLUG_CPU | ||
697 | @@ -63,6 +67,7 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||
698 | case CPU_DEAD: | ||
699 | case CPU_DEAD_FROZEN: | ||
700 | free_cpumask_var(cfd->cpumask); | ||
701 | + free_cpumask_var(cfd->cpumask_ipi); | ||
702 | break; | ||
703 | #endif | ||
704 | }; | ||
705 | @@ -524,6 +529,12 @@ void smp_call_function_many(const struct cpumask *mask, | ||
706 | return; | ||
707 | } | ||
708 | |||
709 | + /* | ||
710 | + * After we put an entry into the list, data->cpumask | ||
711 | + * may be cleared again when another CPU sends another IPI for | ||
712 | + * a SMP function call, so data->cpumask will be zero. | ||
713 | + */ | ||
714 | + cpumask_copy(data->cpumask_ipi, data->cpumask); | ||
715 | raw_spin_lock_irqsave(&call_function.lock, flags); | ||
716 | /* | ||
717 | * Place entry at the _HEAD_ of the list, so that any cpu still | ||
718 | @@ -547,7 +558,7 @@ void smp_call_function_many(const struct cpumask *mask, | ||
719 | smp_mb(); | ||
720 | |||
721 | /* Send a message to all CPUs in the map */ | ||
722 | - arch_send_call_function_ipi_mask(data->cpumask); | ||
723 | + arch_send_call_function_ipi_mask(data->cpumask_ipi); | ||
724 | |||
725 | /* Optionally wait for the CPUs to complete */ | ||
726 | if (wait) | ||
727 | diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c | ||
728 | index 25edda0..ef45e10 100644 | ||
729 | --- a/net/bluetooth/hci_event.c | ||
730 | +++ b/net/bluetooth/hci_event.c | ||
731 | @@ -2366,7 +2366,7 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk | ||
732 | if (ev->opcode != HCI_OP_NOP) | ||
733 | del_timer(&hdev->cmd_timer); | ||
734 | |||
735 | - if (ev->ncmd) { | ||
736 | + if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) { | ||
737 | atomic_set(&hdev->cmd_cnt, 1); | ||
738 | if (!skb_queue_empty(&hdev->cmd_q)) | ||
739 | queue_work(hdev->workqueue, &hdev->cmd_work); | ||
740 | diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c | ||
741 | index d478be1..7a0d984 100644 | ||
742 | --- a/net/bluetooth/hidp/core.c | ||
743 | +++ b/net/bluetooth/hidp/core.c | ||
744 | @@ -949,7 +949,7 @@ static int hidp_setup_hid(struct hidp_session *session, | ||
745 | hid->version = req->version; | ||
746 | hid->country = req->country; | ||
747 | |||
748 | - strncpy(hid->name, req->name, 128); | ||
749 | + strncpy(hid->name, req->name, sizeof(req->name) - 1); | ||
750 | strncpy(hid->phys, batostr(&bt_sk(session->ctrl_sock->sk)->src), 64); | ||
751 | strncpy(hid->uniq, batostr(&bt_sk(session->ctrl_sock->sk)->dst), 64); | ||
752 | |||
753 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c | ||
754 | index 677d659..9443348 100644 | ||
755 | --- a/net/mac80211/cfg.c | ||
756 | +++ b/net/mac80211/cfg.c | ||
757 | @@ -151,7 +151,17 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev, | ||
758 | sta = sta_info_get(sdata, mac_addr); | ||
759 | else | ||
760 | sta = sta_info_get_bss(sdata, mac_addr); | ||
761 | - if (!sta) { | ||
762 | + /* | ||
763 | + * The ASSOC test makes sure the driver is ready to | ||
764 | + * receive the key. When wpa_supplicant has roamed | ||
765 | + * using FT, it attempts to set the key before | ||
766 | + * association has completed, this rejects that attempt | ||
767 | + * so it will set the key again after assocation. | ||
768 | + * | ||
769 | + * TODO: accept the key if we have a station entry and | ||
770 | + * add it to the device after the station. | ||
771 | + */ | ||
772 | + if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) { | ||
773 | ieee80211_key_free(sdata->local, key); | ||
774 | err = -ENOENT; | ||
775 | goto out_unlock; | ||
776 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
777 | index f8b5e75..05160db 100644 | ||
778 | --- a/net/mac80211/ieee80211_i.h | ||
779 | +++ b/net/mac80211/ieee80211_i.h | ||
780 | @@ -1264,10 +1264,8 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata); | ||
781 | void ieee80211_sched_scan_stopped_work(struct work_struct *work); | ||
782 | |||
783 | /* off-channel helpers */ | ||
784 | -void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
785 | - bool offchannel_ps_enable); | ||
786 | -void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
787 | - bool offchannel_ps_disable); | ||
788 | +void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local); | ||
789 | +void ieee80211_offchannel_return(struct ieee80211_local *local); | ||
790 | void ieee80211_hw_roc_setup(struct ieee80211_local *local); | ||
791 | |||
792 | /* interface handling */ | ||
793 | diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c | ||
794 | index 935aa4b..c22f074 100644 | ||
795 | --- a/net/mac80211/offchannel.c | ||
796 | +++ b/net/mac80211/offchannel.c | ||
797 | @@ -103,8 +103,7 @@ static void ieee80211_offchannel_ps_disable(struct ieee80211_sub_if_data *sdata) | ||
798 | ieee80211_sta_reset_conn_monitor(sdata); | ||
799 | } | ||
800 | |||
801 | -void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
802 | - bool offchannel_ps_enable) | ||
803 | +void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local) | ||
804 | { | ||
805 | struct ieee80211_sub_if_data *sdata; | ||
806 | |||
807 | @@ -129,8 +128,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
808 | |||
809 | if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { | ||
810 | netif_tx_stop_all_queues(sdata->dev); | ||
811 | - if (offchannel_ps_enable && | ||
812 | - (sdata->vif.type == NL80211_IFTYPE_STATION) && | ||
813 | + if (sdata->vif.type == NL80211_IFTYPE_STATION && | ||
814 | sdata->u.mgd.associated) | ||
815 | ieee80211_offchannel_ps_enable(sdata, true); | ||
816 | } | ||
817 | @@ -138,8 +136,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
818 | mutex_unlock(&local->iflist_mtx); | ||
819 | } | ||
820 | |||
821 | -void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
822 | - bool offchannel_ps_disable) | ||
823 | +void ieee80211_offchannel_return(struct ieee80211_local *local) | ||
824 | { | ||
825 | struct ieee80211_sub_if_data *sdata; | ||
826 | |||
827 | @@ -152,11 +149,9 @@ void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
828 | continue; | ||
829 | |||
830 | /* Tell AP we're back */ | ||
831 | - if (offchannel_ps_disable && | ||
832 | - sdata->vif.type == NL80211_IFTYPE_STATION) { | ||
833 | - if (sdata->u.mgd.associated) | ||
834 | - ieee80211_offchannel_ps_disable(sdata); | ||
835 | - } | ||
836 | + if (sdata->vif.type == NL80211_IFTYPE_STATION && | ||
837 | + sdata->u.mgd.associated) | ||
838 | + ieee80211_offchannel_ps_disable(sdata); | ||
839 | |||
840 | if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { | ||
841 | /* | ||
842 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c | ||
843 | index e95d494..bcc57f9 100644 | ||
844 | --- a/net/mac80211/scan.c | ||
845 | +++ b/net/mac80211/scan.c | ||
846 | @@ -329,7 +329,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted, | ||
847 | if (!was_hw_scan) { | ||
848 | ieee80211_configure_filter(local); | ||
849 | drv_sw_scan_complete(local); | ||
850 | - ieee80211_offchannel_return(local, true); | ||
851 | + ieee80211_offchannel_return(local); | ||
852 | } | ||
853 | |||
854 | ieee80211_recalc_idle(local); | ||
855 | @@ -374,7 +374,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local) | ||
856 | local->next_scan_state = SCAN_DECISION; | ||
857 | local->scan_channel_idx = 0; | ||
858 | |||
859 | - ieee80211_offchannel_stop_vifs(local, true); | ||
860 | + ieee80211_offchannel_stop_vifs(local); | ||
861 | |||
862 | ieee80211_configure_filter(local); | ||
863 | |||
864 | @@ -629,12 +629,8 @@ static void ieee80211_scan_state_suspend(struct ieee80211_local *local, | ||
865 | local->scan_channel = NULL; | ||
866 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); | ||
867 | |||
868 | - /* | ||
869 | - * Re-enable vifs and beaconing. Leave PS | ||
870 | - * in off-channel state..will put that back | ||
871 | - * on-channel at the end of scanning. | ||
872 | - */ | ||
873 | - ieee80211_offchannel_return(local, false); | ||
874 | + /* disable PS */ | ||
875 | + ieee80211_offchannel_return(local); | ||
876 | |||
877 | *next_delay = HZ / 5; | ||
878 | /* afterwards, resume scan & go to next channel */ | ||
879 | @@ -644,8 +640,7 @@ static void ieee80211_scan_state_suspend(struct ieee80211_local *local, | ||
880 | static void ieee80211_scan_state_resume(struct ieee80211_local *local, | ||
881 | unsigned long *next_delay) | ||
882 | { | ||
883 | - /* PS already is in off-channel mode */ | ||
884 | - ieee80211_offchannel_stop_vifs(local, false); | ||
885 | + ieee80211_offchannel_stop_vifs(local); | ||
886 | |||
887 | if (local->ops->flush) { | ||
888 | drv_flush(local, false); | ||
889 | diff --git a/net/mac80211/work.c b/net/mac80211/work.c | ||
890 | index c6e230e..a74f538 100644 | ||
891 | --- a/net/mac80211/work.c | ||
892 | +++ b/net/mac80211/work.c | ||
893 | @@ -148,7 +148,7 @@ static void ieee80211_work_work(struct work_struct *work) | ||
894 | } | ||
895 | |||
896 | if (!started && !local->tmp_channel) { | ||
897 | - ieee80211_offchannel_stop_vifs(local, true); | ||
898 | + ieee80211_offchannel_stop_vifs(local); | ||
899 | |||
900 | local->tmp_channel = wk->chan; | ||
901 | local->tmp_channel_type = wk->chan_type; | ||
902 | @@ -220,7 +220,7 @@ static void ieee80211_work_work(struct work_struct *work) | ||
903 | local->tmp_channel = NULL; | ||
904 | ieee80211_hw_config(local, 0); | ||
905 | |||
906 | - ieee80211_offchannel_return(local, true); | ||
907 | + ieee80211_offchannel_return(local); | ||
908 | |||
909 | /* give connection some time to breathe */ | ||
910 | run_again(local, jiffies + HZ/2); | ||
911 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
912 | index 7f2a109..f7f8776 100644 | ||
913 | --- a/sound/pci/hda/patch_realtek.c | ||
914 | +++ b/sound/pci/hda/patch_realtek.c | ||
915 | @@ -4741,6 +4741,7 @@ static const struct snd_pci_quirk alc880_fixup_tbl[] = { | ||
916 | SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB), | ||
917 | SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810), | ||
918 | SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM), | ||
919 | + SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST), | ||
920 | SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_FIXUP_F1734), | ||
921 | SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU), | ||
922 | SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734), | ||
923 | diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c | ||
924 | index 86b84a1..8e0cf14 100644 | ||
925 | --- a/sound/soc/codecs/wm2200.c | ||
926 | +++ b/sound/soc/codecs/wm2200.c | ||
927 | @@ -897,8 +897,6 @@ static const char *wm2200_mixer_texts[] = { | ||
928 | "EQR", | ||
929 | "LHPF1", | ||
930 | "LHPF2", | ||
931 | - "LHPF3", | ||
932 | - "LHPF4", | ||
933 | "DSP1.1", | ||
934 | "DSP1.2", | ||
935 | "DSP1.3", | ||
936 | @@ -931,7 +929,6 @@ static int wm2200_mixer_values[] = { | ||
937 | 0x25, | ||
938 | 0x50, /* EQ */ | ||
939 | 0x51, | ||
940 | - 0x52, | ||
941 | 0x60, /* LHPF1 */ | ||
942 | 0x61, /* LHPF2 */ | ||
943 | 0x68, /* DSP1 */ | ||
944 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
945 | index 29ae209..15b0712 100644 | ||
946 | --- a/sound/usb/mixer.c | ||
947 | +++ b/sound/usb/mixer.c | ||
948 | @@ -1239,16 +1239,23 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | ||
949 | } | ||
950 | channels = (hdr->bLength - 7) / csize - 1; | ||
951 | bmaControls = hdr->bmaControls; | ||
952 | + if (hdr->bLength < 7 + csize) { | ||
953 | + snd_printk(KERN_ERR "usbaudio: unit %u: " | ||
954 | + "invalid UAC_FEATURE_UNIT descriptor\n", | ||
955 | + unitid); | ||
956 | + return -EINVAL; | ||
957 | + } | ||
958 | } else { | ||
959 | struct uac2_feature_unit_descriptor *ftr = _ftr; | ||
960 | csize = 4; | ||
961 | channels = (hdr->bLength - 6) / 4 - 1; | ||
962 | bmaControls = ftr->bmaControls; | ||
963 | - } | ||
964 | - | ||
965 | - if (hdr->bLength < 7 || !csize || hdr->bLength < 7 + csize) { | ||
966 | - snd_printk(KERN_ERR "usbaudio: unit %u: invalid UAC_FEATURE_UNIT descriptor\n", unitid); | ||
967 | - return -EINVAL; | ||
968 | + if (hdr->bLength < 6 + csize) { | ||
969 | + snd_printk(KERN_ERR "usbaudio: unit %u: " | ||
970 | + "invalid UAC_FEATURE_UNIT descriptor\n", | ||
971 | + unitid); | ||
972 | + return -EINVAL; | ||
973 | + } | ||
974 | } | ||
975 | |||
976 | /* parse the source unit */ |