Contents of /trunk/kernel-magellan/patches-3.8/0106-3.8.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2153 -
(show annotations)
(download)
Tue Apr 16 06:31:03 2013 UTC (11 years, 5 months ago) by niro
File size: 72843 byte(s)
Tue Apr 16 06:31:03 2013 UTC (11 years, 5 months ago) by niro
File size: 72843 byte(s)
-linux-3.8.7
1 | diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c |
2 | index 4d4c046..1383f86 100644 |
3 | --- a/arch/alpha/kernel/sys_nautilus.c |
4 | +++ b/arch/alpha/kernel/sys_nautilus.c |
5 | @@ -188,6 +188,10 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr) |
6 | extern void free_reserved_mem(void *, void *); |
7 | extern void pcibios_claim_one_bus(struct pci_bus *); |
8 | |
9 | +static struct resource irongate_io = { |
10 | + .name = "Irongate PCI IO", |
11 | + .flags = IORESOURCE_IO, |
12 | +}; |
13 | static struct resource irongate_mem = { |
14 | .name = "Irongate PCI MEM", |
15 | .flags = IORESOURCE_MEM, |
16 | @@ -209,6 +213,7 @@ nautilus_init_pci(void) |
17 | |
18 | irongate = pci_get_bus_and_slot(0, 0); |
19 | bus->self = irongate; |
20 | + bus->resource[0] = &irongate_io; |
21 | bus->resource[1] = &irongate_mem; |
22 | |
23 | pci_bus_size_bridges(bus); |
24 | diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c |
25 | index 1a89824..3b6de7a 100644 |
26 | --- a/arch/arm/mach-exynos/common.c |
27 | +++ b/arch/arm/mach-exynos/common.c |
28 | @@ -299,6 +299,7 @@ void exynos4_restart(char mode, const char *cmd) |
29 | |
30 | void exynos5_restart(char mode, const char *cmd) |
31 | { |
32 | + struct device_node *np; |
33 | u32 val; |
34 | void __iomem *addr; |
35 | |
36 | @@ -306,8 +307,9 @@ void exynos5_restart(char mode, const char *cmd) |
37 | val = 0x1; |
38 | addr = EXYNOS_SWRESET; |
39 | } else if (of_machine_is_compatible("samsung,exynos5440")) { |
40 | - val = (0x10 << 20) | (0x1 << 16); |
41 | - addr = EXYNOS5440_SWRESET; |
42 | + np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock"); |
43 | + addr = of_iomap(np, 0) + 0xcc; |
44 | + val = (0xfff << 20) | (0x1 << 16); |
45 | } else { |
46 | pr_err("%s: cannot support non-DT\n", __func__); |
47 | return; |
48 | diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S |
49 | index 1658676..33d0671 100644 |
50 | --- a/arch/mips/kernel/mcount.S |
51 | +++ b/arch/mips/kernel/mcount.S |
52 | @@ -46,10 +46,9 @@ |
53 | PTR_L a5, PT_R9(sp) |
54 | PTR_L a6, PT_R10(sp) |
55 | PTR_L a7, PT_R11(sp) |
56 | -#else |
57 | - PTR_ADDIU sp, PT_SIZE |
58 | #endif |
59 | -.endm |
60 | + PTR_ADDIU sp, PT_SIZE |
61 | + .endm |
62 | |
63 | .macro RETURN_BACK |
64 | jr ra |
65 | @@ -68,7 +67,11 @@ NESTED(ftrace_caller, PT_SIZE, ra) |
66 | .globl _mcount |
67 | _mcount: |
68 | b ftrace_stub |
69 | - addiu sp,sp,8 |
70 | +#ifdef CONFIG_32BIT |
71 | + addiu sp,sp,8 |
72 | +#else |
73 | + nop |
74 | +#endif |
75 | |
76 | /* When tracing is activated, it calls ftrace_caller+8 (aka here) */ |
77 | lw t1, function_trace_stop |
78 | diff --git a/arch/mips/lib/bitops.c b/arch/mips/lib/bitops.c |
79 | index 239a9c9..f3f7756 100644 |
80 | --- a/arch/mips/lib/bitops.c |
81 | +++ b/arch/mips/lib/bitops.c |
82 | @@ -90,12 +90,12 @@ int __mips_test_and_set_bit(unsigned long nr, |
83 | unsigned bit = nr & SZLONG_MASK; |
84 | unsigned long mask; |
85 | unsigned long flags; |
86 | - unsigned long res; |
87 | + int res; |
88 | |
89 | a += nr >> SZLONG_LOG; |
90 | mask = 1UL << bit; |
91 | raw_local_irq_save(flags); |
92 | - res = (mask & *a); |
93 | + res = (mask & *a) != 0; |
94 | *a |= mask; |
95 | raw_local_irq_restore(flags); |
96 | return res; |
97 | @@ -116,12 +116,12 @@ int __mips_test_and_set_bit_lock(unsigned long nr, |
98 | unsigned bit = nr & SZLONG_MASK; |
99 | unsigned long mask; |
100 | unsigned long flags; |
101 | - unsigned long res; |
102 | + int res; |
103 | |
104 | a += nr >> SZLONG_LOG; |
105 | mask = 1UL << bit; |
106 | raw_local_irq_save(flags); |
107 | - res = (mask & *a); |
108 | + res = (mask & *a) != 0; |
109 | *a |= mask; |
110 | raw_local_irq_restore(flags); |
111 | return res; |
112 | @@ -141,12 +141,12 @@ int __mips_test_and_clear_bit(unsigned long nr, volatile unsigned long *addr) |
113 | unsigned bit = nr & SZLONG_MASK; |
114 | unsigned long mask; |
115 | unsigned long flags; |
116 | - unsigned long res; |
117 | + int res; |
118 | |
119 | a += nr >> SZLONG_LOG; |
120 | mask = 1UL << bit; |
121 | raw_local_irq_save(flags); |
122 | - res = (mask & *a); |
123 | + res = (mask & *a) != 0; |
124 | *a &= ~mask; |
125 | raw_local_irq_restore(flags); |
126 | return res; |
127 | @@ -166,12 +166,12 @@ int __mips_test_and_change_bit(unsigned long nr, volatile unsigned long *addr) |
128 | unsigned bit = nr & SZLONG_MASK; |
129 | unsigned long mask; |
130 | unsigned long flags; |
131 | - unsigned long res; |
132 | + int res; |
133 | |
134 | a += nr >> SZLONG_LOG; |
135 | mask = 1UL << bit; |
136 | raw_local_irq_save(flags); |
137 | - res = (mask & *a); |
138 | + res = (mask & *a) != 0; |
139 | *a ^= mask; |
140 | raw_local_irq_restore(flags); |
141 | return res; |
142 | diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c |
143 | index 0da39fe..299731e 100644 |
144 | --- a/arch/powerpc/platforms/pseries/lpar.c |
145 | +++ b/arch/powerpc/platforms/pseries/lpar.c |
146 | @@ -186,7 +186,13 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group) |
147 | (0x1UL << 4), &dummy1, &dummy2); |
148 | if (lpar_rc == H_SUCCESS) |
149 | return i; |
150 | - BUG_ON(lpar_rc != H_NOT_FOUND); |
151 | + |
152 | + /* |
153 | + * The test for adjunct partition is performed before the |
154 | + * ANDCOND test. H_RESOURCE may be returned, so we need to |
155 | + * check for that as well. |
156 | + */ |
157 | + BUG_ON(lpar_rc != H_NOT_FOUND && lpar_rc != H_RESOURCE); |
158 | |
159 | slot_offset++; |
160 | slot_offset &= 0x7; |
161 | diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile |
162 | index 8a84501..5ef205c 100644 |
163 | --- a/arch/x86/boot/compressed/Makefile |
164 | +++ b/arch/x86/boot/compressed/Makefile |
165 | @@ -4,7 +4,7 @@ |
166 | # create a compressed vmlinux image from the original vmlinux |
167 | # |
168 | |
169 | -targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.xz vmlinux.bin.lzo head_$(BITS).o misc.o string.o cmdline.o early_serial_console.o piggy.o |
170 | +targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.xz vmlinux.bin.lzo |
171 | |
172 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 |
173 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC |
174 | @@ -29,7 +29,6 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ |
175 | $(obj)/piggy.o |
176 | |
177 | $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone |
178 | -$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone |
179 | |
180 | ifeq ($(CONFIG_EFI_STUB), y) |
181 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o |
182 | @@ -43,7 +42,7 @@ OBJCOPYFLAGS_vmlinux.bin := -R .comment -S |
183 | $(obj)/vmlinux.bin: vmlinux FORCE |
184 | $(call if_changed,objcopy) |
185 | |
186 | -targets += vmlinux.bin.all vmlinux.relocs |
187 | +targets += $(patsubst $(obj)/%,%,$(VMLINUX_OBJS)) vmlinux.bin.all vmlinux.relocs |
188 | |
189 | CMD_RELOCS = arch/x86/tools/relocs |
190 | quiet_cmd_relocs = RELOCS $@ |
191 | diff --git a/arch/x86/include/asm/syscall.h b/arch/x86/include/asm/syscall.h |
192 | index 1ace47b..2e188d6 100644 |
193 | --- a/arch/x86/include/asm/syscall.h |
194 | +++ b/arch/x86/include/asm/syscall.h |
195 | @@ -29,13 +29,13 @@ extern const unsigned long sys_call_table[]; |
196 | */ |
197 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) |
198 | { |
199 | - return regs->orig_ax & __SYSCALL_MASK; |
200 | + return regs->orig_ax; |
201 | } |
202 | |
203 | static inline void syscall_rollback(struct task_struct *task, |
204 | struct pt_regs *regs) |
205 | { |
206 | - regs->ax = regs->orig_ax & __SYSCALL_MASK; |
207 | + regs->ax = regs->orig_ax; |
208 | } |
209 | |
210 | static inline long syscall_get_error(struct task_struct *task, |
211 | diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c |
212 | index 7881477..6d2f7c0 100644 |
213 | --- a/block/blk-sysfs.c |
214 | +++ b/block/blk-sysfs.c |
215 | @@ -229,6 +229,8 @@ queue_store_##name(struct request_queue *q, const char *page, size_t count) \ |
216 | unsigned long val; \ |
217 | ssize_t ret; \ |
218 | ret = queue_var_store(&val, page, count); \ |
219 | + if (ret < 0) \ |
220 | + return ret; \ |
221 | if (neg) \ |
222 | val = !val; \ |
223 | \ |
224 | diff --git a/crypto/gcm.c b/crypto/gcm.c |
225 | index 1a25263..b97b186 100644 |
226 | --- a/crypto/gcm.c |
227 | +++ b/crypto/gcm.c |
228 | @@ -44,6 +44,7 @@ struct crypto_rfc4543_ctx { |
229 | |
230 | struct crypto_rfc4543_req_ctx { |
231 | u8 auth_tag[16]; |
232 | + u8 assocbuf[32]; |
233 | struct scatterlist cipher[1]; |
234 | struct scatterlist payload[2]; |
235 | struct scatterlist assoc[2]; |
236 | @@ -1142,9 +1143,19 @@ static struct aead_request *crypto_rfc4543_crypt(struct aead_request *req, |
237 | scatterwalk_crypto_chain(payload, dst, vdst == req->iv + 8, 2); |
238 | assoclen += 8 + req->cryptlen - (enc ? 0 : authsize); |
239 | |
240 | - sg_init_table(assoc, 2); |
241 | - sg_set_page(assoc, sg_page(req->assoc), req->assoc->length, |
242 | - req->assoc->offset); |
243 | + if (req->assoc->length == req->assoclen) { |
244 | + sg_init_table(assoc, 2); |
245 | + sg_set_page(assoc, sg_page(req->assoc), req->assoc->length, |
246 | + req->assoc->offset); |
247 | + } else { |
248 | + BUG_ON(req->assoclen > sizeof(rctx->assocbuf)); |
249 | + |
250 | + scatterwalk_map_and_copy(rctx->assocbuf, req->assoc, 0, |
251 | + req->assoclen, 0); |
252 | + |
253 | + sg_init_table(assoc, 2); |
254 | + sg_set_buf(assoc, rctx->assocbuf, req->assoclen); |
255 | + } |
256 | scatterwalk_crypto_chain(assoc, payload, 0, 2); |
257 | |
258 | aead_request_set_tfm(subreq, ctx->child); |
259 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c |
260 | index 7928d4d..eb73798 100644 |
261 | --- a/drivers/acpi/pci_root.c |
262 | +++ b/drivers/acpi/pci_root.c |
263 | @@ -454,7 +454,6 @@ static int acpi_pci_root_add(struct acpi_device *device) |
264 | acpi_handle handle; |
265 | struct acpi_device *child; |
266 | u32 flags, base_flags; |
267 | - bool is_osc_granted = false; |
268 | |
269 | root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); |
270 | if (!root) |
271 | @@ -525,60 +524,6 @@ static int acpi_pci_root_add(struct acpi_device *device) |
272 | flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT; |
273 | acpi_pci_osc_support(root, flags); |
274 | |
275 | - /* Indicate support for various _OSC capabilities. */ |
276 | - if (pci_ext_cfg_avail()) |
277 | - flags |= OSC_EXT_PCI_CONFIG_SUPPORT; |
278 | - if (pcie_aspm_support_enabled()) { |
279 | - flags |= OSC_ACTIVE_STATE_PWR_SUPPORT | |
280 | - OSC_CLOCK_PWR_CAPABILITY_SUPPORT; |
281 | - } |
282 | - if (pci_msi_enabled()) |
283 | - flags |= OSC_MSI_SUPPORT; |
284 | - if (flags != base_flags) { |
285 | - status = acpi_pci_osc_support(root, flags); |
286 | - if (ACPI_FAILURE(status)) { |
287 | - dev_info(&device->dev, "ACPI _OSC support " |
288 | - "notification failed, disabling PCIe ASPM\n"); |
289 | - pcie_no_aspm(); |
290 | - flags = base_flags; |
291 | - } |
292 | - } |
293 | - if (!pcie_ports_disabled |
294 | - && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) { |
295 | - flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL |
296 | - | OSC_PCI_EXPRESS_NATIVE_HP_CONTROL |
297 | - | OSC_PCI_EXPRESS_PME_CONTROL; |
298 | - |
299 | - if (pci_aer_available()) { |
300 | - if (aer_acpi_firmware_first()) |
301 | - dev_dbg(&device->dev, |
302 | - "PCIe errors handled by BIOS.\n"); |
303 | - else |
304 | - flags |= OSC_PCI_EXPRESS_AER_CONTROL; |
305 | - } |
306 | - |
307 | - dev_info(&device->dev, |
308 | - "Requesting ACPI _OSC control (0x%02x)\n", flags); |
309 | - |
310 | - status = acpi_pci_osc_control_set(device->handle, &flags, |
311 | - OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL); |
312 | - if (ACPI_SUCCESS(status)) { |
313 | - is_osc_granted = true; |
314 | - dev_info(&device->dev, |
315 | - "ACPI _OSC control (0x%02x) granted\n", flags); |
316 | - } else { |
317 | - is_osc_granted = false; |
318 | - dev_info(&device->dev, |
319 | - "ACPI _OSC request failed (%s), " |
320 | - "returned control mask: 0x%02x\n", |
321 | - acpi_format_exception(status), flags); |
322 | - } |
323 | - } else { |
324 | - dev_info(&device->dev, |
325 | - "Unable to request _OSC control " |
326 | - "(_OSC support mask: 0x%02x)\n", flags); |
327 | - } |
328 | - |
329 | /* |
330 | * TBD: Need PCI interface for enumeration/configuration of roots. |
331 | */ |
332 | @@ -618,14 +563,66 @@ static int acpi_pci_root_add(struct acpi_device *device) |
333 | list_for_each_entry(child, &device->children, node) |
334 | acpi_pci_bridge_scan(child); |
335 | |
336 | - /* ASPM setting */ |
337 | - if (is_osc_granted) { |
338 | - if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) |
339 | - pcie_clear_aspm(root->bus); |
340 | + /* Indicate support for various _OSC capabilities. */ |
341 | + if (pci_ext_cfg_avail()) |
342 | + flags |= OSC_EXT_PCI_CONFIG_SUPPORT; |
343 | + if (pcie_aspm_support_enabled()) |
344 | + flags |= OSC_ACTIVE_STATE_PWR_SUPPORT | |
345 | + OSC_CLOCK_PWR_CAPABILITY_SUPPORT; |
346 | + if (pci_msi_enabled()) |
347 | + flags |= OSC_MSI_SUPPORT; |
348 | + if (flags != base_flags) { |
349 | + status = acpi_pci_osc_support(root, flags); |
350 | + if (ACPI_FAILURE(status)) { |
351 | + dev_info(root->bus->bridge, "ACPI _OSC support " |
352 | + "notification failed, disabling PCIe ASPM\n"); |
353 | + pcie_no_aspm(); |
354 | + flags = base_flags; |
355 | + } |
356 | + } |
357 | + |
358 | + if (!pcie_ports_disabled |
359 | + && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) { |
360 | + flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL |
361 | + | OSC_PCI_EXPRESS_NATIVE_HP_CONTROL |
362 | + | OSC_PCI_EXPRESS_PME_CONTROL; |
363 | + |
364 | + if (pci_aer_available()) { |
365 | + if (aer_acpi_firmware_first()) |
366 | + dev_dbg(root->bus->bridge, |
367 | + "PCIe errors handled by BIOS.\n"); |
368 | + else |
369 | + flags |= OSC_PCI_EXPRESS_AER_CONTROL; |
370 | + } |
371 | + |
372 | + dev_info(root->bus->bridge, |
373 | + "Requesting ACPI _OSC control (0x%02x)\n", flags); |
374 | + |
375 | + status = acpi_pci_osc_control_set(device->handle, &flags, |
376 | + OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL); |
377 | + if (ACPI_SUCCESS(status)) { |
378 | + dev_info(root->bus->bridge, |
379 | + "ACPI _OSC control (0x%02x) granted\n", flags); |
380 | + if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) { |
381 | + /* |
382 | + * We have ASPM control, but the FADT indicates |
383 | + * that it's unsupported. Clear it. |
384 | + */ |
385 | + pcie_clear_aspm(root->bus); |
386 | + } |
387 | + } else { |
388 | + dev_info(root->bus->bridge, |
389 | + "ACPI _OSC request failed (%s), " |
390 | + "returned control mask: 0x%02x\n", |
391 | + acpi_format_exception(status), flags); |
392 | + pr_info("ACPI _OSC control for PCIe not granted, " |
393 | + "disabling ASPM\n"); |
394 | + pcie_no_aspm(); |
395 | + } |
396 | } else { |
397 | - pr_info("ACPI _OSC control for PCIe not granted, " |
398 | - "disabling ASPM\n"); |
399 | - pcie_no_aspm(); |
400 | + dev_info(root->bus->bridge, |
401 | + "Unable to request _OSC control " |
402 | + "(_OSC support mask: 0x%02x)\n", flags); |
403 | } |
404 | |
405 | pci_acpi_add_bus_pm_notifier(device, root->bus); |
406 | diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c |
407 | index d2ba439..78283bb 100644 |
408 | --- a/drivers/ata/ata_piix.c |
409 | +++ b/drivers/ata/ata_piix.c |
410 | @@ -150,6 +150,7 @@ enum piix_controller_ids { |
411 | tolapai_sata, |
412 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ |
413 | ich8_sata_snb, |
414 | + ich8_2port_sata_snb, |
415 | }; |
416 | |
417 | struct piix_map_db { |
418 | @@ -304,7 +305,7 @@ static const struct pci_device_id piix_pci_tbl[] = { |
419 | /* SATA Controller IDE (Lynx Point) */ |
420 | { 0x8086, 0x8c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
421 | /* SATA Controller IDE (Lynx Point) */ |
422 | - { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
423 | + { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, |
424 | /* SATA Controller IDE (Lynx Point) */ |
425 | { 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
426 | /* SATA Controller IDE (Lynx Point-LP) */ |
427 | @@ -439,6 +440,7 @@ static const struct piix_map_db *piix_map_db_table[] = { |
428 | [ich8m_apple_sata] = &ich8m_apple_map_db, |
429 | [tolapai_sata] = &tolapai_map_db, |
430 | [ich8_sata_snb] = &ich8_map_db, |
431 | + [ich8_2port_sata_snb] = &ich8_2port_map_db, |
432 | }; |
433 | |
434 | static struct pci_bits piix_enable_bits[] = { |
435 | @@ -1242,6 +1244,16 @@ static struct ata_port_info piix_port_info[] = { |
436 | .udma_mask = ATA_UDMA6, |
437 | .port_ops = &piix_sata_ops, |
438 | }, |
439 | + |
440 | + [ich8_2port_sata_snb] = |
441 | + { |
442 | + .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR |
443 | + | PIIX_FLAG_PIO16, |
444 | + .pio_mask = ATA_PIO4, |
445 | + .mwdma_mask = ATA_MWDMA2, |
446 | + .udma_mask = ATA_UDMA6, |
447 | + .port_ops = &piix_sata_ops, |
448 | + }, |
449 | }; |
450 | |
451 | #define AHCI_PCI_BAR 5 |
452 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
453 | index 46cd3f4..501c209 100644 |
454 | --- a/drivers/ata/libata-core.c |
455 | +++ b/drivers/ata/libata-core.c |
456 | @@ -2329,7 +2329,7 @@ int ata_dev_configure(struct ata_device *dev) |
457 | * from SATA Settings page of Identify Device Data Log. |
458 | */ |
459 | if (ata_id_has_devslp(dev->id)) { |
460 | - u8 sata_setting[ATA_SECT_SIZE]; |
461 | + u8 *sata_setting = ap->sector_buf; |
462 | int i, j; |
463 | |
464 | dev->flags |= ATA_DFLAG_DEVSLP; |
465 | @@ -2437,6 +2437,9 @@ int ata_dev_configure(struct ata_device *dev) |
466 | dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128, |
467 | dev->max_sectors); |
468 | |
469 | + if (dev->horkage & ATA_HORKAGE_MAX_SEC_LBA48) |
470 | + dev->max_sectors = ATA_MAX_SECTORS_LBA48; |
471 | + |
472 | if (ap->ops->dev_config) |
473 | ap->ops->dev_config(dev); |
474 | |
475 | @@ -4098,6 +4101,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
476 | /* Weird ATAPI devices */ |
477 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, |
478 | { "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA }, |
479 | + { "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, |
480 | |
481 | /* Devices we expect to fail diagnostics */ |
482 | |
483 | diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c |
484 | index e6732cf..79f4fca 100644 |
485 | --- a/drivers/base/regmap/regcache-rbtree.c |
486 | +++ b/drivers/base/regmap/regcache-rbtree.c |
487 | @@ -398,7 +398,7 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min, |
488 | base = 0; |
489 | |
490 | if (max < rbnode->base_reg + rbnode->blklen) |
491 | - end = rbnode->base_reg + rbnode->blklen - max; |
492 | + end = max - rbnode->base_reg + 1; |
493 | else |
494 | end = rbnode->blklen; |
495 | |
496 | diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c |
497 | index f00b059..ab3a020 100644 |
498 | --- a/drivers/base/regmap/regmap.c |
499 | +++ b/drivers/base/regmap/regmap.c |
500 | @@ -662,12 +662,12 @@ struct regmap *regmap_init(struct device *dev, |
501 | } |
502 | } |
503 | |
504 | + regmap_debugfs_init(map, config->name); |
505 | + |
506 | ret = regcache_init(map, config); |
507 | if (ret != 0) |
508 | goto err_range; |
509 | |
510 | - regmap_debugfs_init(map, config->name); |
511 | - |
512 | /* Add a devres resource for dev_get_regmap() */ |
513 | m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL); |
514 | if (!m) { |
515 | diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c |
516 | index 7012ea8..41fc550 100644 |
517 | --- a/drivers/cpufreq/exynos-cpufreq.c |
518 | +++ b/drivers/cpufreq/exynos-cpufreq.c |
519 | @@ -222,8 +222,6 @@ static int exynos_cpufreq_cpu_init(struct cpufreq_policy *policy) |
520 | |
521 | cpufreq_frequency_table_get_attr(exynos_info->freq_table, policy->cpu); |
522 | |
523 | - locking_frequency = exynos_getspeed(0); |
524 | - |
525 | /* set the transition latency value */ |
526 | policy->cpuinfo.transition_latency = 100000; |
527 | |
528 | @@ -288,6 +286,8 @@ static int __init exynos_cpufreq_init(void) |
529 | goto err_vdd_arm; |
530 | } |
531 | |
532 | + locking_frequency = exynos_getspeed(0); |
533 | + |
534 | register_pm_notifier(&exynos_cpufreq_nb); |
535 | |
536 | if (cpufreq_register_driver(&exynos_driver)) { |
537 | diff --git a/drivers/crypto/ux500/cryp/cryp_core.c b/drivers/crypto/ux500/cryp/cryp_core.c |
538 | index 8bc5fef..22c9063 100644 |
539 | --- a/drivers/crypto/ux500/cryp/cryp_core.c |
540 | +++ b/drivers/crypto/ux500/cryp/cryp_core.c |
541 | @@ -1750,7 +1750,7 @@ static struct platform_driver cryp_driver = { |
542 | .shutdown = ux500_cryp_shutdown, |
543 | .driver = { |
544 | .owner = THIS_MODULE, |
545 | - .name = "cryp1" |
546 | + .name = "cryp1", |
547 | .pm = &ux500_cryp_pm, |
548 | } |
549 | }; |
550 | diff --git a/drivers/eisa/pci_eisa.c b/drivers/eisa/pci_eisa.c |
551 | index cdae207..6c3fca9 100644 |
552 | --- a/drivers/eisa/pci_eisa.c |
553 | +++ b/drivers/eisa/pci_eisa.c |
554 | @@ -19,10 +19,10 @@ |
555 | /* There is only *one* pci_eisa device per machine, right ? */ |
556 | static struct eisa_root_device pci_eisa_root; |
557 | |
558 | -static int __init pci_eisa_init(struct pci_dev *pdev, |
559 | - const struct pci_device_id *ent) |
560 | +static int __init pci_eisa_init(struct pci_dev *pdev) |
561 | { |
562 | - int rc; |
563 | + int rc, i; |
564 | + struct resource *res, *bus_res = NULL; |
565 | |
566 | if ((rc = pci_enable_device (pdev))) { |
567 | printk (KERN_ERR "pci_eisa : Could not enable device %s\n", |
568 | @@ -30,9 +30,30 @@ static int __init pci_eisa_init(struct pci_dev *pdev, |
569 | return rc; |
570 | } |
571 | |
572 | + /* |
573 | + * The Intel 82375 PCI-EISA bridge is a subtractive-decode PCI |
574 | + * device, so the resources available on EISA are the same as those |
575 | + * available on the 82375 bus. This works the same as a PCI-PCI |
576 | + * bridge in subtractive-decode mode (see pci_read_bridge_bases()). |
577 | + * We assume other PCI-EISA bridges are similar. |
578 | + * |
579 | + * eisa_root_register() can only deal with a single io port resource, |
580 | + * so we use the first valid io port resource. |
581 | + */ |
582 | + pci_bus_for_each_resource(pdev->bus, res, i) |
583 | + if (res && (res->flags & IORESOURCE_IO)) { |
584 | + bus_res = res; |
585 | + break; |
586 | + } |
587 | + |
588 | + if (!bus_res) { |
589 | + dev_err(&pdev->dev, "No resources available\n"); |
590 | + return -1; |
591 | + } |
592 | + |
593 | pci_eisa_root.dev = &pdev->dev; |
594 | - pci_eisa_root.res = pdev->bus->resource[0]; |
595 | - pci_eisa_root.bus_base_addr = pdev->bus->resource[0]->start; |
596 | + pci_eisa_root.res = bus_res; |
597 | + pci_eisa_root.bus_base_addr = bus_res->start; |
598 | pci_eisa_root.slots = EISA_MAX_SLOTS; |
599 | pci_eisa_root.dma_mask = pdev->dma_mask; |
600 | dev_set_drvdata(pci_eisa_root.dev, &pci_eisa_root); |
601 | @@ -45,22 +66,26 @@ static int __init pci_eisa_init(struct pci_dev *pdev, |
602 | return 0; |
603 | } |
604 | |
605 | -static struct pci_device_id pci_eisa_pci_tbl[] = { |
606 | - { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
607 | - PCI_CLASS_BRIDGE_EISA << 8, 0xffff00, 0 }, |
608 | - { 0, } |
609 | -}; |
610 | +/* |
611 | + * We have to call pci_eisa_init_early() before pnpacpi_init()/isapnp_init(). |
612 | + * Otherwise pnp resource will get enabled early and could prevent eisa |
613 | + * to be initialized. |
614 | + * Also need to make sure pci_eisa_init_early() is called after |
615 | + * x86/pci_subsys_init(). |
616 | + * So need to use subsys_initcall_sync with it. |
617 | + */ |
618 | +static int __init pci_eisa_init_early(void) |
619 | +{ |
620 | + struct pci_dev *dev = NULL; |
621 | + int ret; |
622 | |
623 | -static struct pci_driver __refdata pci_eisa_driver = { |
624 | - .name = "pci_eisa", |
625 | - .id_table = pci_eisa_pci_tbl, |
626 | - .probe = pci_eisa_init, |
627 | -}; |
628 | + for_each_pci_dev(dev) |
629 | + if ((dev->class >> 8) == PCI_CLASS_BRIDGE_EISA) { |
630 | + ret = pci_eisa_init(dev); |
631 | + if (ret) |
632 | + return ret; |
633 | + } |
634 | |
635 | -static int __init pci_eisa_init_module (void) |
636 | -{ |
637 | - return pci_register_driver (&pci_eisa_driver); |
638 | + return 0; |
639 | } |
640 | - |
641 | -device_initcall(pci_eisa_init_module); |
642 | -MODULE_DEVICE_TABLE(pci, pci_eisa_pci_tbl); |
643 | +subsys_initcall_sync(pci_eisa_init_early); |
644 | diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c |
645 | index 770476a..3ce5bc3 100644 |
646 | --- a/drivers/gpio/gpio-stmpe.c |
647 | +++ b/drivers/gpio/gpio-stmpe.c |
648 | @@ -307,11 +307,15 @@ static const struct irq_domain_ops stmpe_gpio_irq_simple_ops = { |
649 | .xlate = irq_domain_xlate_twocell, |
650 | }; |
651 | |
652 | -static int stmpe_gpio_irq_init(struct stmpe_gpio *stmpe_gpio) |
653 | +static int stmpe_gpio_irq_init(struct stmpe_gpio *stmpe_gpio, |
654 | + struct device_node *np) |
655 | { |
656 | - int base = stmpe_gpio->irq_base; |
657 | + int base = 0; |
658 | |
659 | - stmpe_gpio->domain = irq_domain_add_simple(NULL, |
660 | + if (!np) |
661 | + base = stmpe_gpio->irq_base; |
662 | + |
663 | + stmpe_gpio->domain = irq_domain_add_simple(np, |
664 | stmpe_gpio->chip.ngpio, base, |
665 | &stmpe_gpio_irq_simple_ops, stmpe_gpio); |
666 | if (!stmpe_gpio->domain) { |
667 | @@ -346,6 +350,9 @@ static int stmpe_gpio_probe(struct platform_device *pdev) |
668 | stmpe_gpio->chip = template_chip; |
669 | stmpe_gpio->chip.ngpio = stmpe->num_gpios; |
670 | stmpe_gpio->chip.dev = &pdev->dev; |
671 | +#ifdef CONFIG_OF |
672 | + stmpe_gpio->chip.of_node = np; |
673 | +#endif |
674 | stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1; |
675 | |
676 | if (pdata) |
677 | @@ -366,7 +373,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev) |
678 | goto out_free; |
679 | |
680 | if (irq >= 0) { |
681 | - ret = stmpe_gpio_irq_init(stmpe_gpio); |
682 | + ret = stmpe_gpio_irq_init(stmpe_gpio, np); |
683 | if (ret) |
684 | goto out_disable; |
685 | |
686 | diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c |
687 | index 133b413..32d7775 100644 |
688 | --- a/drivers/gpu/drm/drm_fops.c |
689 | +++ b/drivers/gpu/drm/drm_fops.c |
690 | @@ -123,6 +123,7 @@ int drm_open(struct inode *inode, struct file *filp) |
691 | int retcode = 0; |
692 | int need_setup = 0; |
693 | struct address_space *old_mapping; |
694 | + struct address_space *old_imapping; |
695 | |
696 | minor = idr_find(&drm_minors_idr, minor_id); |
697 | if (!minor) |
698 | @@ -137,6 +138,7 @@ int drm_open(struct inode *inode, struct file *filp) |
699 | if (!dev->open_count++) |
700 | need_setup = 1; |
701 | mutex_lock(&dev->struct_mutex); |
702 | + old_imapping = inode->i_mapping; |
703 | old_mapping = dev->dev_mapping; |
704 | if (old_mapping == NULL) |
705 | dev->dev_mapping = &inode->i_data; |
706 | @@ -159,8 +161,8 @@ int drm_open(struct inode *inode, struct file *filp) |
707 | |
708 | err_undo: |
709 | mutex_lock(&dev->struct_mutex); |
710 | - filp->f_mapping = old_mapping; |
711 | - inode->i_mapping = old_mapping; |
712 | + filp->f_mapping = old_imapping; |
713 | + inode->i_mapping = old_imapping; |
714 | iput(container_of(dev->dev_mapping, struct inode, i_data)); |
715 | dev->dev_mapping = old_mapping; |
716 | mutex_unlock(&dev->struct_mutex); |
717 | diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
718 | index 7adf5a7..ba8805a 100644 |
719 | --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
720 | +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
721 | @@ -43,7 +43,7 @@ eb_create(int size) |
722 | { |
723 | struct eb_objects *eb; |
724 | int count = PAGE_SIZE / sizeof(struct hlist_head) / 2; |
725 | - BUILD_BUG_ON(!is_power_of_2(PAGE_SIZE / sizeof(struct hlist_head))); |
726 | + BUILD_BUG_ON_NOT_POWER_OF_2(PAGE_SIZE / sizeof(struct hlist_head)); |
727 | while (count > size) |
728 | count >>= 1; |
729 | eb = kzalloc(count*sizeof(struct hlist_head) + |
730 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
731 | index b52ed09..625b091 100644 |
732 | --- a/drivers/gpu/drm/i915/intel_crt.c |
733 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
734 | @@ -45,6 +45,9 @@ |
735 | |
736 | struct intel_crt { |
737 | struct intel_encoder base; |
738 | + /* DPMS state is stored in the connector, which we need in the |
739 | + * encoder's enable/disable callbacks */ |
740 | + struct intel_connector *connector; |
741 | bool force_hotplug_required; |
742 | u32 adpa_reg; |
743 | }; |
744 | @@ -81,29 +84,6 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder, |
745 | return true; |
746 | } |
747 | |
748 | -static void intel_disable_crt(struct intel_encoder *encoder) |
749 | -{ |
750 | - struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
751 | - struct intel_crt *crt = intel_encoder_to_crt(encoder); |
752 | - u32 temp; |
753 | - |
754 | - temp = I915_READ(crt->adpa_reg); |
755 | - temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE; |
756 | - temp &= ~ADPA_DAC_ENABLE; |
757 | - I915_WRITE(crt->adpa_reg, temp); |
758 | -} |
759 | - |
760 | -static void intel_enable_crt(struct intel_encoder *encoder) |
761 | -{ |
762 | - struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
763 | - struct intel_crt *crt = intel_encoder_to_crt(encoder); |
764 | - u32 temp; |
765 | - |
766 | - temp = I915_READ(crt->adpa_reg); |
767 | - temp |= ADPA_DAC_ENABLE; |
768 | - I915_WRITE(crt->adpa_reg, temp); |
769 | -} |
770 | - |
771 | /* Note: The caller is required to filter out dpms modes not supported by the |
772 | * platform. */ |
773 | static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) |
774 | @@ -135,6 +115,19 @@ static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) |
775 | I915_WRITE(crt->adpa_reg, temp); |
776 | } |
777 | |
778 | +static void intel_disable_crt(struct intel_encoder *encoder) |
779 | +{ |
780 | + intel_crt_set_dpms(encoder, DRM_MODE_DPMS_OFF); |
781 | +} |
782 | + |
783 | +static void intel_enable_crt(struct intel_encoder *encoder) |
784 | +{ |
785 | + struct intel_crt *crt = intel_encoder_to_crt(encoder); |
786 | + |
787 | + intel_crt_set_dpms(encoder, crt->connector->base.dpms); |
788 | +} |
789 | + |
790 | + |
791 | static void intel_crt_dpms(struct drm_connector *connector, int mode) |
792 | { |
793 | struct drm_device *dev = connector->dev; |
794 | @@ -746,6 +739,7 @@ void intel_crt_init(struct drm_device *dev) |
795 | } |
796 | |
797 | connector = &intel_connector->base; |
798 | + crt->connector = intel_connector; |
799 | drm_connector_init(dev, &intel_connector->base, |
800 | &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA); |
801 | |
802 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
803 | index e6e4df7..d3f834a 100644 |
804 | --- a/drivers/gpu/drm/i915/intel_display.c |
805 | +++ b/drivers/gpu/drm/i915/intel_display.c |
806 | @@ -8901,6 +8901,15 @@ static struct intel_quirk intel_quirks[] = { |
807 | |
808 | /* Acer Aspire 4736Z */ |
809 | { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness }, |
810 | + |
811 | + /* Acer/eMachines G725 */ |
812 | + { 0x2a42, 0x1025, 0x0210, quirk_invert_brightness }, |
813 | + |
814 | + /* Acer/eMachines e725 */ |
815 | + { 0x2a42, 0x1025, 0x0212, quirk_invert_brightness }, |
816 | + |
817 | + /* Acer/Packard Bell NCL20 */ |
818 | + { 0x2a42, 0x1025, 0x034b, quirk_invert_brightness }, |
819 | }; |
820 | |
821 | static void intel_init_quirks(struct drm_device *dev) |
822 | diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c |
823 | index 4f50c40..2e7c949 100644 |
824 | --- a/drivers/gpu/drm/mgag200/mgag200_mode.c |
825 | +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c |
826 | @@ -751,8 +751,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, |
827 | int i; |
828 | unsigned char misc = 0; |
829 | unsigned char ext_vga[6]; |
830 | - unsigned char ext_vga_index24; |
831 | - unsigned char dac_index90 = 0; |
832 | u8 bppshift; |
833 | |
834 | static unsigned char dacvalue[] = { |
835 | @@ -803,7 +801,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, |
836 | option2 = 0x0000b000; |
837 | break; |
838 | case G200_ER: |
839 | - dac_index90 = 0; |
840 | break; |
841 | } |
842 | |
843 | @@ -852,10 +849,8 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, |
844 | WREG_DAC(i, dacvalue[i]); |
845 | } |
846 | |
847 | - if (mdev->type == G200_ER) { |
848 | - WREG_DAC(0x90, dac_index90); |
849 | - } |
850 | - |
851 | + if (mdev->type == G200_ER) |
852 | + WREG_DAC(0x90, 0); |
853 | |
854 | if (option) |
855 | pci_write_config_dword(dev->pdev, PCI_MGA_OPTION, option); |
856 | @@ -952,8 +947,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, |
857 | if (mdev->type == G200_WB) |
858 | ext_vga[1] |= 0x88; |
859 | |
860 | - ext_vga_index24 = 0x05; |
861 | - |
862 | /* Set pixel clocks */ |
863 | misc = 0x2d; |
864 | WREG8(MGA_MISC_OUT, misc); |
865 | @@ -965,7 +958,7 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, |
866 | } |
867 | |
868 | if (mdev->type == G200_ER) |
869 | - WREG_ECRT(24, ext_vga_index24); |
870 | + WREG_ECRT(0x24, 0x5); |
871 | |
872 | if (mdev->type == G200_EV) { |
873 | WREG_ECRT(6, 0); |
874 | diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c |
875 | index 4124192..b569fe8 100644 |
876 | --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c |
877 | +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c |
878 | @@ -386,7 +386,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS) |
879 | struct nouveau_drm *drm = nouveau_drm(dev); |
880 | struct nouveau_device *device = nv_device(drm->device); |
881 | struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); |
882 | - struct nouveau_abi16_chan *chan, *temp; |
883 | + struct nouveau_abi16_chan *chan = NULL, *temp; |
884 | struct nouveau_abi16_ntfy *ntfy; |
885 | struct nouveau_object *object; |
886 | struct nv_dma_class args = {}; |
887 | @@ -399,10 +399,11 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS) |
888 | if (unlikely(nv_device(abi16->device)->card_type >= NV_C0)) |
889 | return nouveau_abi16_put(abi16, -EINVAL); |
890 | |
891 | - list_for_each_entry_safe(chan, temp, &abi16->channels, head) { |
892 | - if (chan->chan->handle == (NVDRM_CHAN | info->channel)) |
893 | + list_for_each_entry(temp, &abi16->channels, head) { |
894 | + if (temp->chan->handle == (NVDRM_CHAN | info->channel)) { |
895 | + chan = temp; |
896 | break; |
897 | - chan = NULL; |
898 | + } |
899 | } |
900 | |
901 | if (!chan) |
902 | @@ -454,17 +455,18 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS) |
903 | { |
904 | struct drm_nouveau_gpuobj_free *fini = data; |
905 | struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); |
906 | - struct nouveau_abi16_chan *chan, *temp; |
907 | + struct nouveau_abi16_chan *chan = NULL, *temp; |
908 | struct nouveau_abi16_ntfy *ntfy; |
909 | int ret; |
910 | |
911 | if (unlikely(!abi16)) |
912 | return -ENOMEM; |
913 | |
914 | - list_for_each_entry_safe(chan, temp, &abi16->channels, head) { |
915 | - if (chan->chan->handle == (NVDRM_CHAN | fini->channel)) |
916 | + list_for_each_entry(temp, &abi16->channels, head) { |
917 | + if (temp->chan->handle == (NVDRM_CHAN | fini->channel)) { |
918 | + chan = temp; |
919 | break; |
920 | - chan = NULL; |
921 | + } |
922 | } |
923 | |
924 | if (!chan) |
925 | diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c |
926 | index 25ddf3e..811062c 100644 |
927 | --- a/drivers/hid/hid-magicmouse.c |
928 | +++ b/drivers/hid/hid-magicmouse.c |
929 | @@ -462,6 +462,21 @@ static int magicmouse_input_mapping(struct hid_device *hdev, |
930 | return 0; |
931 | } |
932 | |
933 | +static void magicmouse_input_configured(struct hid_device *hdev, |
934 | + struct hid_input *hi) |
935 | + |
936 | +{ |
937 | + struct magicmouse_sc *msc = hid_get_drvdata(hdev); |
938 | + |
939 | + int ret = magicmouse_setup_input(msc->input, hdev); |
940 | + if (ret) { |
941 | + hid_err(hdev, "magicmouse setup input failed (%d)\n", ret); |
942 | + /* clean msc->input to notify probe() of the failure */ |
943 | + msc->input = NULL; |
944 | + } |
945 | +} |
946 | + |
947 | + |
948 | static int magicmouse_probe(struct hid_device *hdev, |
949 | const struct hid_device_id *id) |
950 | { |
951 | @@ -493,15 +508,10 @@ static int magicmouse_probe(struct hid_device *hdev, |
952 | goto err_free; |
953 | } |
954 | |
955 | - /* We do this after hid-input is done parsing reports so that |
956 | - * hid-input uses the most natural button and axis IDs. |
957 | - */ |
958 | - if (msc->input) { |
959 | - ret = magicmouse_setup_input(msc->input, hdev); |
960 | - if (ret) { |
961 | - hid_err(hdev, "magicmouse setup input failed (%d)\n", ret); |
962 | - goto err_stop_hw; |
963 | - } |
964 | + if (!msc->input) { |
965 | + hid_err(hdev, "magicmouse input not registered\n"); |
966 | + ret = -ENOMEM; |
967 | + goto err_stop_hw; |
968 | } |
969 | |
970 | if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE) |
971 | @@ -568,6 +578,7 @@ static struct hid_driver magicmouse_driver = { |
972 | .remove = magicmouse_remove, |
973 | .raw_event = magicmouse_raw_event, |
974 | .input_mapping = magicmouse_input_mapping, |
975 | + .input_configured = magicmouse_input_configured, |
976 | }; |
977 | |
978 | static int __init magicmouse_init(void) |
979 | diff --git a/drivers/hwspinlock/hwspinlock_core.c b/drivers/hwspinlock/hwspinlock_core.c |
980 | index db713c0..461a0d7 100644 |
981 | --- a/drivers/hwspinlock/hwspinlock_core.c |
982 | +++ b/drivers/hwspinlock/hwspinlock_core.c |
983 | @@ -416,6 +416,8 @@ static int __hwspin_lock_request(struct hwspinlock *hwlock) |
984 | ret = pm_runtime_get_sync(dev); |
985 | if (ret < 0) { |
986 | dev_err(dev, "%s: can't power on device\n", __func__); |
987 | + pm_runtime_put_noidle(dev); |
988 | + module_put(dev->driver->owner); |
989 | return ret; |
990 | } |
991 | |
992 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
993 | index b3e3294..0d03d38 100644 |
994 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
995 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
996 | @@ -7858,12 +7858,19 @@ static int __init ixgbe_init_module(void) |
997 | ixgbe_dbg_init(); |
998 | #endif /* CONFIG_DEBUG_FS */ |
999 | |
1000 | + ret = pci_register_driver(&ixgbe_driver); |
1001 | + if (ret) { |
1002 | +#ifdef CONFIG_DEBUG_FS |
1003 | + ixgbe_dbg_exit(); |
1004 | +#endif /* CONFIG_DEBUG_FS */ |
1005 | + return ret; |
1006 | + } |
1007 | + |
1008 | #ifdef CONFIG_IXGBE_DCA |
1009 | dca_register_notify(&dca_notifier); |
1010 | #endif |
1011 | |
1012 | - ret = pci_register_driver(&ixgbe_driver); |
1013 | - return ret; |
1014 | + return 0; |
1015 | } |
1016 | |
1017 | module_init(ixgbe_init_module); |
1018 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c |
1019 | index 998974f..2d849da 100644 |
1020 | --- a/drivers/net/ethernet/realtek/r8169.c |
1021 | +++ b/drivers/net/ethernet/realtek/r8169.c |
1022 | @@ -3819,6 +3819,30 @@ static void rtl_init_mdio_ops(struct rtl8169_private *tp) |
1023 | } |
1024 | } |
1025 | |
1026 | +static void rtl_speed_down(struct rtl8169_private *tp) |
1027 | +{ |
1028 | + u32 adv; |
1029 | + int lpa; |
1030 | + |
1031 | + rtl_writephy(tp, 0x1f, 0x0000); |
1032 | + lpa = rtl_readphy(tp, MII_LPA); |
1033 | + |
1034 | + if (lpa & (LPA_10HALF | LPA_10FULL)) |
1035 | + adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full; |
1036 | + else if (lpa & (LPA_100HALF | LPA_100FULL)) |
1037 | + adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | |
1038 | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; |
1039 | + else |
1040 | + adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | |
1041 | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | |
1042 | + (tp->mii.supports_gmii ? |
1043 | + ADVERTISED_1000baseT_Half | |
1044 | + ADVERTISED_1000baseT_Full : 0); |
1045 | + |
1046 | + rtl8169_set_speed(tp->dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL, |
1047 | + adv); |
1048 | +} |
1049 | + |
1050 | static void rtl_wol_suspend_quirk(struct rtl8169_private *tp) |
1051 | { |
1052 | void __iomem *ioaddr = tp->mmio_addr; |
1053 | @@ -3849,9 +3873,7 @@ static bool rtl_wol_pll_power_down(struct rtl8169_private *tp) |
1054 | if (!(__rtl8169_get_wol(tp) & WAKE_ANY)) |
1055 | return false; |
1056 | |
1057 | - rtl_writephy(tp, 0x1f, 0x0000); |
1058 | - rtl_writephy(tp, MII_BMCR, 0x0000); |
1059 | - |
1060 | + rtl_speed_down(tp); |
1061 | rtl_wol_suspend_quirk(tp); |
1062 | |
1063 | return true; |
1064 | diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c |
1065 | index cdb11b3..3eca710 100644 |
1066 | --- a/drivers/net/wireless/mwifiex/cfg80211.c |
1067 | +++ b/drivers/net/wireless/mwifiex/cfg80211.c |
1068 | @@ -1846,7 +1846,8 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, |
1069 | } |
1070 | } |
1071 | |
1072 | - for (i = 0; i < request->n_channels; i++) { |
1073 | + for (i = 0; i < min_t(u32, request->n_channels, |
1074 | + MWIFIEX_USER_SCAN_CHAN_MAX); i++) { |
1075 | chan = request->channels[i]; |
1076 | priv->user_scan_cfg->chan_list[i].chan_number = chan->hw_value; |
1077 | priv->user_scan_cfg->chan_list[i].radio_type = chan->band; |
1078 | diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c |
1079 | index 8955a0e..771be26 100644 |
1080 | --- a/drivers/net/wireless/mwifiex/scan.c |
1081 | +++ b/drivers/net/wireless/mwifiex/scan.c |
1082 | @@ -1371,8 +1371,10 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, |
1083 | queue_work(adapter->workqueue, &adapter->main_work); |
1084 | |
1085 | /* Perform internal scan synchronously */ |
1086 | - if (!priv->scan_request) |
1087 | + if (!priv->scan_request) { |
1088 | + dev_dbg(adapter->dev, "wait internal scan\n"); |
1089 | mwifiex_wait_queue_complete(adapter, cmd_node); |
1090 | + } |
1091 | } else { |
1092 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, |
1093 | flags); |
1094 | @@ -1768,7 +1770,12 @@ check_next_scan: |
1095 | /* Need to indicate IOCTL complete */ |
1096 | if (adapter->curr_cmd->wait_q_enabled) { |
1097 | adapter->cmd_wait_q.status = 0; |
1098 | - mwifiex_complete_cmd(adapter, adapter->curr_cmd); |
1099 | + if (!priv->scan_request) { |
1100 | + dev_dbg(adapter->dev, |
1101 | + "complete internal scan\n"); |
1102 | + mwifiex_complete_cmd(adapter, |
1103 | + adapter->curr_cmd); |
1104 | + } |
1105 | } |
1106 | if (priv->report_scan_result) |
1107 | priv->report_scan_result = false; |
1108 | diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c |
1109 | index a0c8cae..b1c673e 100644 |
1110 | --- a/drivers/net/wireless/rt2x00/rt2x00pci.c |
1111 | +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c |
1112 | @@ -52,8 +52,8 @@ int rt2x00pci_regbusy_read(struct rt2x00_dev *rt2x00dev, |
1113 | udelay(REGISTER_BUSY_DELAY); |
1114 | } |
1115 | |
1116 | - ERROR(rt2x00dev, "Indirect register access failed: " |
1117 | - "offset=0x%.08x, value=0x%.08x\n", offset, *reg); |
1118 | + printk_once(KERN_ERR "%s() Indirect register access failed: " |
1119 | + "offset=0x%.08x, value=0x%.08x\n", __func__, offset, *reg); |
1120 | *reg = ~0; |
1121 | |
1122 | return 0; |
1123 | diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c |
1124 | index 1af4008..21354bf 100644 |
1125 | --- a/drivers/pci/pci-acpi.c |
1126 | +++ b/drivers/pci/pci-acpi.c |
1127 | @@ -53,14 +53,15 @@ static void pci_acpi_wake_dev(acpi_handle handle, u32 event, void *context) |
1128 | return; |
1129 | } |
1130 | |
1131 | - if (!pci_dev->pm_cap || !pci_dev->pme_support |
1132 | - || pci_check_pme_status(pci_dev)) { |
1133 | - if (pci_dev->pme_poll) |
1134 | - pci_dev->pme_poll = false; |
1135 | + /* Clear PME Status if set. */ |
1136 | + if (pci_dev->pme_support) |
1137 | + pci_check_pme_status(pci_dev); |
1138 | |
1139 | - pci_wakeup_event(pci_dev); |
1140 | - pm_runtime_resume(&pci_dev->dev); |
1141 | - } |
1142 | + if (pci_dev->pme_poll) |
1143 | + pci_dev->pme_poll = false; |
1144 | + |
1145 | + pci_wakeup_event(pci_dev); |
1146 | + pm_runtime_resume(&pci_dev->dev); |
1147 | |
1148 | if (pci_dev->subordinate) |
1149 | pci_pme_wakeup_bus(pci_dev->subordinate); |
1150 | diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c |
1151 | index 08c243a..ed4d094 100644 |
1152 | --- a/drivers/pci/pcie/portdrv_pci.c |
1153 | +++ b/drivers/pci/pcie/portdrv_pci.c |
1154 | @@ -185,14 +185,6 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = { |
1155 | #endif /* !PM */ |
1156 | |
1157 | /* |
1158 | - * PCIe port runtime suspend is broken for some chipsets, so use a |
1159 | - * black list to disable runtime PM for these chipsets. |
1160 | - */ |
1161 | -static const struct pci_device_id port_runtime_pm_black_list[] = { |
1162 | - { /* end: all zeroes */ } |
1163 | -}; |
1164 | - |
1165 | -/* |
1166 | * pcie_portdrv_probe - Probe PCI-Express port devices |
1167 | * @dev: PCI-Express port device being probed |
1168 | * |
1169 | @@ -225,16 +217,11 @@ static int pcie_portdrv_probe(struct pci_dev *dev, |
1170 | * it by default. |
1171 | */ |
1172 | dev->d3cold_allowed = false; |
1173 | - if (!pci_match_id(port_runtime_pm_black_list, dev)) |
1174 | - pm_runtime_put_noidle(&dev->dev); |
1175 | - |
1176 | return 0; |
1177 | } |
1178 | |
1179 | static void pcie_portdrv_remove(struct pci_dev *dev) |
1180 | { |
1181 | - if (!pci_match_id(port_runtime_pm_black_list, dev)) |
1182 | - pm_runtime_get_noresume(&dev->dev); |
1183 | pcie_port_device_remove(dev); |
1184 | pci_disable_device(dev); |
1185 | } |
1186 | diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c |
1187 | index 2264331..b96766b 100644 |
1188 | --- a/drivers/platform/x86/msi-wmi.c |
1189 | +++ b/drivers/platform/x86/msi-wmi.c |
1190 | @@ -176,7 +176,7 @@ static void msi_wmi_notify(u32 value, void *context) |
1191 | pr_debug("Suppressed key event 0x%X - " |
1192 | "Last press was %lld us ago\n", |
1193 | key->code, ktime_to_us(diff)); |
1194 | - return; |
1195 | + goto msi_wmi_notify_exit; |
1196 | } |
1197 | last_pressed[key->code - SCANCODE_BASE] = cur; |
1198 | |
1199 | @@ -195,6 +195,8 @@ static void msi_wmi_notify(u32 value, void *context) |
1200 | pr_info("Unknown key pressed - %x\n", eventcode); |
1201 | } else |
1202 | pr_info("Unknown event received\n"); |
1203 | + |
1204 | +msi_wmi_notify_exit: |
1205 | kfree(response.pointer); |
1206 | } |
1207 | |
1208 | diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig |
1209 | index 96ce101..a936efb 100644 |
1210 | --- a/drivers/remoteproc/Kconfig |
1211 | +++ b/drivers/remoteproc/Kconfig |
1212 | @@ -5,7 +5,7 @@ config REMOTEPROC |
1213 | tristate |
1214 | depends on EXPERIMENTAL |
1215 | depends on HAS_DMA |
1216 | - select FW_CONFIG |
1217 | + select FW_LOADER |
1218 | select VIRTIO |
1219 | |
1220 | config OMAP_REMOTEPROC |
1221 | diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c |
1222 | index dd3bfaf..752b507 100644 |
1223 | --- a/drivers/remoteproc/remoteproc_core.c |
1224 | +++ b/drivers/remoteproc/remoteproc_core.c |
1225 | @@ -370,10 +370,12 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc, |
1226 | /* it is now safe to add the virtio device */ |
1227 | ret = rproc_add_virtio_dev(rvdev, rsc->id); |
1228 | if (ret) |
1229 | - goto free_rvdev; |
1230 | + goto remove_rvdev; |
1231 | |
1232 | return 0; |
1233 | |
1234 | +remove_rvdev: |
1235 | + list_del(&rvdev->node); |
1236 | free_rvdev: |
1237 | kfree(rvdev); |
1238 | return ret; |
1239 | diff --git a/drivers/remoteproc/ste_modem_rproc.c b/drivers/remoteproc/ste_modem_rproc.c |
1240 | index a7743c0..fb95c42 100644 |
1241 | --- a/drivers/remoteproc/ste_modem_rproc.c |
1242 | +++ b/drivers/remoteproc/ste_modem_rproc.c |
1243 | @@ -240,6 +240,8 @@ static int sproc_drv_remove(struct platform_device *pdev) |
1244 | |
1245 | /* Unregister as remoteproc device */ |
1246 | rproc_del(sproc->rproc); |
1247 | + dma_free_coherent(sproc->rproc->dev.parent, SPROC_FW_SIZE, |
1248 | + sproc->fw_addr, sproc->fw_dma_addr); |
1249 | rproc_put(sproc->rproc); |
1250 | |
1251 | mdev->drv_data = NULL; |
1252 | @@ -297,10 +299,13 @@ static int sproc_probe(struct platform_device *pdev) |
1253 | /* Register as a remoteproc device */ |
1254 | err = rproc_add(rproc); |
1255 | if (err) |
1256 | - goto free_rproc; |
1257 | + goto free_mem; |
1258 | |
1259 | return 0; |
1260 | |
1261 | +free_mem: |
1262 | + dma_free_coherent(rproc->dev.parent, SPROC_FW_SIZE, |
1263 | + sproc->fw_addr, sproc->fw_dma_addr); |
1264 | free_rproc: |
1265 | /* Reset device data upon error */ |
1266 | mdev->drv_data = NULL; |
1267 | diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c |
1268 | index d38b267..b6469e2 100644 |
1269 | --- a/drivers/rtc/rtc-at91rm9200.c |
1270 | +++ b/drivers/rtc/rtc-at91rm9200.c |
1271 | @@ -44,7 +44,6 @@ static DECLARE_COMPLETION(at91_rtc_updated); |
1272 | static unsigned int at91_alarm_year = AT91_RTC_EPOCH; |
1273 | static void __iomem *at91_rtc_regs; |
1274 | static int irq; |
1275 | -static u32 at91_rtc_imr; |
1276 | |
1277 | /* |
1278 | * Decode time/date into rtc_time structure |
1279 | @@ -109,11 +108,9 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm) |
1280 | cr = at91_rtc_read(AT91_RTC_CR); |
1281 | at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM); |
1282 | |
1283 | - at91_rtc_imr |= AT91_RTC_ACKUPD; |
1284 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ACKUPD); |
1285 | wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */ |
1286 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD); |
1287 | - at91_rtc_imr &= ~AT91_RTC_ACKUPD; |
1288 | |
1289 | at91_rtc_write(AT91_RTC_TIMR, |
1290 | bin2bcd(tm->tm_sec) << 0 |
1291 | @@ -145,7 +142,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) |
1292 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); |
1293 | tm->tm_year = at91_alarm_year - 1900; |
1294 | |
1295 | - alrm->enabled = (at91_rtc_imr & AT91_RTC_ALARM) |
1296 | + alrm->enabled = (at91_rtc_read(AT91_RTC_IMR) & AT91_RTC_ALARM) |
1297 | ? 1 : 0; |
1298 | |
1299 | pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, |
1300 | @@ -171,7 +168,6 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) |
1301 | tm.tm_sec = alrm->time.tm_sec; |
1302 | |
1303 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); |
1304 | - at91_rtc_imr &= ~AT91_RTC_ALARM; |
1305 | at91_rtc_write(AT91_RTC_TIMALR, |
1306 | bin2bcd(tm.tm_sec) << 0 |
1307 | | bin2bcd(tm.tm_min) << 8 |
1308 | @@ -184,7 +180,6 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) |
1309 | |
1310 | if (alrm->enabled) { |
1311 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
1312 | - at91_rtc_imr |= AT91_RTC_ALARM; |
1313 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); |
1314 | } |
1315 | |
1316 | @@ -201,12 +196,9 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
1317 | |
1318 | if (enabled) { |
1319 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
1320 | - at91_rtc_imr |= AT91_RTC_ALARM; |
1321 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); |
1322 | - } else { |
1323 | + } else |
1324 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); |
1325 | - at91_rtc_imr &= ~AT91_RTC_ALARM; |
1326 | - } |
1327 | |
1328 | return 0; |
1329 | } |
1330 | @@ -215,10 +207,12 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
1331 | */ |
1332 | static int at91_rtc_proc(struct device *dev, struct seq_file *seq) |
1333 | { |
1334 | + unsigned long imr = at91_rtc_read(AT91_RTC_IMR); |
1335 | + |
1336 | seq_printf(seq, "update_IRQ\t: %s\n", |
1337 | - (at91_rtc_imr & AT91_RTC_ACKUPD) ? "yes" : "no"); |
1338 | + (imr & AT91_RTC_ACKUPD) ? "yes" : "no"); |
1339 | seq_printf(seq, "periodic_IRQ\t: %s\n", |
1340 | - (at91_rtc_imr & AT91_RTC_SECEV) ? "yes" : "no"); |
1341 | + (imr & AT91_RTC_SECEV) ? "yes" : "no"); |
1342 | |
1343 | return 0; |
1344 | } |
1345 | @@ -233,7 +227,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) |
1346 | unsigned int rtsr; |
1347 | unsigned long events = 0; |
1348 | |
1349 | - rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_imr; |
1350 | + rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read(AT91_RTC_IMR); |
1351 | if (rtsr) { /* this interrupt is shared! Is it ours? */ |
1352 | if (rtsr & AT91_RTC_ALARM) |
1353 | events |= (RTC_AF | RTC_IRQF); |
1354 | @@ -297,7 +291,6 @@ static int __init at91_rtc_probe(struct platform_device *pdev) |
1355 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
1356 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
1357 | AT91_RTC_CALEV); |
1358 | - at91_rtc_imr = 0; |
1359 | |
1360 | ret = request_irq(irq, at91_rtc_interrupt, |
1361 | IRQF_SHARED, |
1362 | @@ -337,7 +330,6 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) |
1363 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
1364 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
1365 | AT91_RTC_CALEV); |
1366 | - at91_rtc_imr = 0; |
1367 | free_irq(irq, pdev); |
1368 | |
1369 | rtc_device_unregister(rtc); |
1370 | @@ -350,35 +342,31 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) |
1371 | |
1372 | /* AT91RM9200 RTC Power management control */ |
1373 | |
1374 | -static u32 at91_rtc_bkpimr; |
1375 | - |
1376 | +static u32 at91_rtc_imr; |
1377 | |
1378 | static int at91_rtc_suspend(struct device *dev) |
1379 | { |
1380 | /* this IRQ is shared with DBGU and other hardware which isn't |
1381 | * necessarily doing PM like we are... |
1382 | */ |
1383 | - at91_rtc_bkpimr = at91_rtc_imr & (AT91_RTC_ALARM|AT91_RTC_SECEV); |
1384 | - if (at91_rtc_bkpimr) { |
1385 | - if (device_may_wakeup(dev)) { |
1386 | + at91_rtc_imr = at91_rtc_read(AT91_RTC_IMR) |
1387 | + & (AT91_RTC_ALARM|AT91_RTC_SECEV); |
1388 | + if (at91_rtc_imr) { |
1389 | + if (device_may_wakeup(dev)) |
1390 | enable_irq_wake(irq); |
1391 | - } else { |
1392 | - at91_rtc_write(AT91_RTC_IDR, at91_rtc_bkpimr); |
1393 | - at91_rtc_imr &= ~at91_rtc_bkpimr; |
1394 | - } |
1395 | -} |
1396 | + else |
1397 | + at91_rtc_write(AT91_RTC_IDR, at91_rtc_imr); |
1398 | + } |
1399 | return 0; |
1400 | } |
1401 | |
1402 | static int at91_rtc_resume(struct device *dev) |
1403 | { |
1404 | - if (at91_rtc_bkpimr) { |
1405 | - if (device_may_wakeup(dev)) { |
1406 | + if (at91_rtc_imr) { |
1407 | + if (device_may_wakeup(dev)) |
1408 | disable_irq_wake(irq); |
1409 | - } else { |
1410 | - at91_rtc_imr |= at91_rtc_bkpimr; |
1411 | - at91_rtc_write(AT91_RTC_IER, at91_rtc_bkpimr); |
1412 | - } |
1413 | + else |
1414 | + at91_rtc_write(AT91_RTC_IER, at91_rtc_imr); |
1415 | } |
1416 | return 0; |
1417 | } |
1418 | diff --git a/drivers/rtc/rtc-at91rm9200.h b/drivers/rtc/rtc-at91rm9200.h |
1419 | index 5f940b6..da1945e 100644 |
1420 | --- a/drivers/rtc/rtc-at91rm9200.h |
1421 | +++ b/drivers/rtc/rtc-at91rm9200.h |
1422 | @@ -64,6 +64,7 @@ |
1423 | #define AT91_RTC_SCCR 0x1c /* Status Clear Command Register */ |
1424 | #define AT91_RTC_IER 0x20 /* Interrupt Enable Register */ |
1425 | #define AT91_RTC_IDR 0x24 /* Interrupt Disable Register */ |
1426 | +#define AT91_RTC_IMR 0x28 /* Interrupt Mask Register */ |
1427 | |
1428 | #define AT91_RTC_VER 0x2c /* Valid Entry Register */ |
1429 | #define AT91_RTC_NVTIM (1 << 0) /* Non valid Time */ |
1430 | diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c |
1431 | index cb3a310..41e21bf 100644 |
1432 | --- a/drivers/spi/spi-mpc512x-psc.c |
1433 | +++ b/drivers/spi/spi-mpc512x-psc.c |
1434 | @@ -164,7 +164,7 @@ static int mpc512x_psc_spi_transfer_rxtx(struct spi_device *spi, |
1435 | |
1436 | for (i = count; i > 0; i--) { |
1437 | data = tx_buf ? *tx_buf++ : 0; |
1438 | - if (len == EOFBYTE) |
1439 | + if (len == EOFBYTE && t->cs_change) |
1440 | setbits32(&fifo->txcmd, MPC512x_PSC_FIFO_EOF); |
1441 | out_8(&fifo->txdata_8, data); |
1442 | len--; |
1443 | diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c |
1444 | index ad93231..6796a25 100644 |
1445 | --- a/drivers/spi/spi-s3c64xx.c |
1446 | +++ b/drivers/spi/spi-s3c64xx.c |
1447 | @@ -997,25 +997,30 @@ static irqreturn_t s3c64xx_spi_irq(int irq, void *data) |
1448 | { |
1449 | struct s3c64xx_spi_driver_data *sdd = data; |
1450 | struct spi_master *spi = sdd->master; |
1451 | - unsigned int val; |
1452 | + unsigned int val, clr = 0; |
1453 | |
1454 | - val = readl(sdd->regs + S3C64XX_SPI_PENDING_CLR); |
1455 | + val = readl(sdd->regs + S3C64XX_SPI_STATUS); |
1456 | |
1457 | - val &= S3C64XX_SPI_PND_RX_OVERRUN_CLR | |
1458 | - S3C64XX_SPI_PND_RX_UNDERRUN_CLR | |
1459 | - S3C64XX_SPI_PND_TX_OVERRUN_CLR | |
1460 | - S3C64XX_SPI_PND_TX_UNDERRUN_CLR; |
1461 | - |
1462 | - writel(val, sdd->regs + S3C64XX_SPI_PENDING_CLR); |
1463 | - |
1464 | - if (val & S3C64XX_SPI_PND_RX_OVERRUN_CLR) |
1465 | + if (val & S3C64XX_SPI_ST_RX_OVERRUN_ERR) { |
1466 | + clr = S3C64XX_SPI_PND_RX_OVERRUN_CLR; |
1467 | dev_err(&spi->dev, "RX overrun\n"); |
1468 | - if (val & S3C64XX_SPI_PND_RX_UNDERRUN_CLR) |
1469 | + } |
1470 | + if (val & S3C64XX_SPI_ST_RX_UNDERRUN_ERR) { |
1471 | + clr |= S3C64XX_SPI_PND_RX_UNDERRUN_CLR; |
1472 | dev_err(&spi->dev, "RX underrun\n"); |
1473 | - if (val & S3C64XX_SPI_PND_TX_OVERRUN_CLR) |
1474 | + } |
1475 | + if (val & S3C64XX_SPI_ST_TX_OVERRUN_ERR) { |
1476 | + clr |= S3C64XX_SPI_PND_TX_OVERRUN_CLR; |
1477 | dev_err(&spi->dev, "TX overrun\n"); |
1478 | - if (val & S3C64XX_SPI_PND_TX_UNDERRUN_CLR) |
1479 | + } |
1480 | + if (val & S3C64XX_SPI_ST_TX_UNDERRUN_ERR) { |
1481 | + clr |= S3C64XX_SPI_PND_TX_UNDERRUN_CLR; |
1482 | dev_err(&spi->dev, "TX underrun\n"); |
1483 | + } |
1484 | + |
1485 | + /* Clear the pending irq by setting and then clearing it */ |
1486 | + writel(clr, sdd->regs + S3C64XX_SPI_PENDING_CLR); |
1487 | + writel(0, sdd->regs + S3C64XX_SPI_PENDING_CLR); |
1488 | |
1489 | return IRQ_HANDLED; |
1490 | } |
1491 | @@ -1039,9 +1044,13 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel) |
1492 | writel(0, regs + S3C64XX_SPI_MODE_CFG); |
1493 | writel(0, regs + S3C64XX_SPI_PACKET_CNT); |
1494 | |
1495 | - /* Clear any irq pending bits */ |
1496 | - writel(readl(regs + S3C64XX_SPI_PENDING_CLR), |
1497 | - regs + S3C64XX_SPI_PENDING_CLR); |
1498 | + /* Clear any irq pending bits, should set and clear the bits */ |
1499 | + val = S3C64XX_SPI_PND_RX_OVERRUN_CLR | |
1500 | + S3C64XX_SPI_PND_RX_UNDERRUN_CLR | |
1501 | + S3C64XX_SPI_PND_TX_OVERRUN_CLR | |
1502 | + S3C64XX_SPI_PND_TX_UNDERRUN_CLR; |
1503 | + writel(val, regs + S3C64XX_SPI_PENDING_CLR); |
1504 | + writel(0, regs + S3C64XX_SPI_PENDING_CLR); |
1505 | |
1506 | writel(0, regs + S3C64XX_SPI_SWAP_CFG); |
1507 | |
1508 | diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c |
1509 | index 8c8ce80..bfbf9fb 100644 |
1510 | --- a/drivers/thermal/thermal_sys.c |
1511 | +++ b/drivers/thermal/thermal_sys.c |
1512 | @@ -1807,6 +1807,7 @@ static int __init thermal_init(void) |
1513 | idr_destroy(&thermal_cdev_idr); |
1514 | mutex_destroy(&thermal_idr_lock); |
1515 | mutex_destroy(&thermal_list_lock); |
1516 | + return result; |
1517 | } |
1518 | result = genetlink_init(); |
1519 | return result; |
1520 | diff --git a/drivers/tty/serial/8250/8250_pnp.c b/drivers/tty/serial/8250/8250_pnp.c |
1521 | index b3455a9..35d9ab9 100644 |
1522 | --- a/drivers/tty/serial/8250/8250_pnp.c |
1523 | +++ b/drivers/tty/serial/8250/8250_pnp.c |
1524 | @@ -429,7 +429,6 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) |
1525 | { |
1526 | struct uart_8250_port uart; |
1527 | int ret, line, flags = dev_id->driver_data; |
1528 | - struct resource *res = NULL; |
1529 | |
1530 | if (flags & UNKNOWN_DEV) { |
1531 | ret = serial_pnp_guess_board(dev); |
1532 | @@ -440,12 +439,11 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) |
1533 | memset(&uart, 0, sizeof(uart)); |
1534 | if (pnp_irq_valid(dev, 0)) |
1535 | uart.port.irq = pnp_irq(dev, 0); |
1536 | - if ((flags & CIR_PORT) && pnp_port_valid(dev, 2)) |
1537 | - res = pnp_get_resource(dev, IORESOURCE_IO, 2); |
1538 | - else if (pnp_port_valid(dev, 0)) |
1539 | - res = pnp_get_resource(dev, IORESOURCE_IO, 0); |
1540 | - if (pnp_resource_enabled(res)) { |
1541 | - uart.port.iobase = res->start; |
1542 | + if ((flags & CIR_PORT) && pnp_port_valid(dev, 2)) { |
1543 | + uart.port.iobase = pnp_port_start(dev, 2); |
1544 | + uart.port.iotype = UPIO_PORT; |
1545 | + } else if (pnp_port_valid(dev, 0)) { |
1546 | + uart.port.iobase = pnp_port_start(dev, 0); |
1547 | uart.port.iotype = UPIO_PORT; |
1548 | } else if (pnp_mem_valid(dev, 0)) { |
1549 | uart.port.mapbase = pnp_mem_start(dev, 0); |
1550 | diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c |
1551 | index b28e66c..4a62e12 100644 |
1552 | --- a/drivers/vfio/pci/vfio_pci.c |
1553 | +++ b/drivers/vfio/pci/vfio_pci.c |
1554 | @@ -331,6 +331,7 @@ static long vfio_pci_ioctl(void *device_data, |
1555 | |
1556 | if (!(hdr.flags & VFIO_IRQ_SET_DATA_NONE)) { |
1557 | size_t size; |
1558 | + int max = vfio_pci_get_irq_count(vdev, hdr.index); |
1559 | |
1560 | if (hdr.flags & VFIO_IRQ_SET_DATA_BOOL) |
1561 | size = sizeof(uint8_t); |
1562 | @@ -340,7 +341,7 @@ static long vfio_pci_ioctl(void *device_data, |
1563 | return -EINVAL; |
1564 | |
1565 | if (hdr.argsz - minsz < hdr.count * size || |
1566 | - hdr.count > vfio_pci_get_irq_count(vdev, hdr.index)) |
1567 | + hdr.start >= max || hdr.start + hdr.count > max) |
1568 | return -EINVAL; |
1569 | |
1570 | data = memdup_user((void __user *)(arg + minsz), |
1571 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c |
1572 | index 2e9779b..c53189d 100644 |
1573 | --- a/fs/nfs/nfs4client.c |
1574 | +++ b/fs/nfs/nfs4client.c |
1575 | @@ -300,7 +300,7 @@ int nfs40_walk_client_list(struct nfs_client *new, |
1576 | struct rpc_cred *cred) |
1577 | { |
1578 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); |
1579 | - struct nfs_client *pos, *n, *prev = NULL; |
1580 | + struct nfs_client *pos, *prev = NULL; |
1581 | struct nfs4_setclientid_res clid = { |
1582 | .clientid = new->cl_clientid, |
1583 | .confirm = new->cl_confirm, |
1584 | @@ -308,10 +308,23 @@ int nfs40_walk_client_list(struct nfs_client *new, |
1585 | int status = -NFS4ERR_STALE_CLIENTID; |
1586 | |
1587 | spin_lock(&nn->nfs_client_lock); |
1588 | - list_for_each_entry_safe(pos, n, &nn->nfs_client_list, cl_share_link) { |
1589 | + list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { |
1590 | /* If "pos" isn't marked ready, we can't trust the |
1591 | * remaining fields in "pos" */ |
1592 | - if (pos->cl_cons_state < NFS_CS_READY) |
1593 | + if (pos->cl_cons_state > NFS_CS_READY) { |
1594 | + atomic_inc(&pos->cl_count); |
1595 | + spin_unlock(&nn->nfs_client_lock); |
1596 | + |
1597 | + if (prev) |
1598 | + nfs_put_client(prev); |
1599 | + prev = pos; |
1600 | + |
1601 | + status = nfs_wait_client_init_complete(pos); |
1602 | + spin_lock(&nn->nfs_client_lock); |
1603 | + if (status < 0) |
1604 | + continue; |
1605 | + } |
1606 | + if (pos->cl_cons_state != NFS_CS_READY) |
1607 | continue; |
1608 | |
1609 | if (pos->rpc_ops != new->rpc_ops) |
1610 | @@ -423,16 +436,16 @@ int nfs41_walk_client_list(struct nfs_client *new, |
1611 | struct rpc_cred *cred) |
1612 | { |
1613 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); |
1614 | - struct nfs_client *pos, *n, *prev = NULL; |
1615 | + struct nfs_client *pos, *prev = NULL; |
1616 | int status = -NFS4ERR_STALE_CLIENTID; |
1617 | |
1618 | spin_lock(&nn->nfs_client_lock); |
1619 | - list_for_each_entry_safe(pos, n, &nn->nfs_client_list, cl_share_link) { |
1620 | + list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { |
1621 | /* If "pos" isn't marked ready, we can't trust the |
1622 | * remaining fields in "pos", especially the client |
1623 | * ID and serverowner fields. Wait for CREATE_SESSION |
1624 | * to finish. */ |
1625 | - if (pos->cl_cons_state < NFS_CS_READY) { |
1626 | + if (pos->cl_cons_state > NFS_CS_READY) { |
1627 | atomic_inc(&pos->cl_count); |
1628 | spin_unlock(&nn->nfs_client_lock); |
1629 | |
1630 | @@ -440,18 +453,17 @@ int nfs41_walk_client_list(struct nfs_client *new, |
1631 | nfs_put_client(prev); |
1632 | prev = pos; |
1633 | |
1634 | - nfs4_schedule_lease_recovery(pos); |
1635 | status = nfs_wait_client_init_complete(pos); |
1636 | - if (status < 0) { |
1637 | - nfs_put_client(pos); |
1638 | - spin_lock(&nn->nfs_client_lock); |
1639 | - continue; |
1640 | + if (status == 0) { |
1641 | + nfs4_schedule_lease_recovery(pos); |
1642 | + status = nfs4_wait_clnt_recover(pos); |
1643 | } |
1644 | - status = pos->cl_cons_state; |
1645 | spin_lock(&nn->nfs_client_lock); |
1646 | if (status < 0) |
1647 | continue; |
1648 | } |
1649 | + if (pos->cl_cons_state != NFS_CS_READY) |
1650 | + continue; |
1651 | |
1652 | if (pos->rpc_ops != new->rpc_ops) |
1653 | continue; |
1654 | @@ -469,17 +481,18 @@ int nfs41_walk_client_list(struct nfs_client *new, |
1655 | continue; |
1656 | |
1657 | atomic_inc(&pos->cl_count); |
1658 | - spin_unlock(&nn->nfs_client_lock); |
1659 | + *result = pos; |
1660 | + status = 0; |
1661 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", |
1662 | __func__, pos, atomic_read(&pos->cl_count)); |
1663 | - |
1664 | - *result = pos; |
1665 | - return 0; |
1666 | + break; |
1667 | } |
1668 | |
1669 | /* No matching nfs_client found. */ |
1670 | spin_unlock(&nn->nfs_client_lock); |
1671 | dprintk("NFS: <-- %s status = %d\n", __func__, status); |
1672 | + if (prev) |
1673 | + nfs_put_client(prev); |
1674 | return status; |
1675 | } |
1676 | #endif /* CONFIG_NFS_V4_1 */ |
1677 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c |
1678 | index e61f68d..994fbe2 100644 |
1679 | --- a/fs/nfs/nfs4state.c |
1680 | +++ b/fs/nfs/nfs4state.c |
1681 | @@ -1877,7 +1877,13 @@ again: |
1682 | status = PTR_ERR(clnt); |
1683 | break; |
1684 | } |
1685 | - clp->cl_rpcclient = clnt; |
1686 | + /* Note: this is safe because we haven't yet marked the |
1687 | + * client as ready, so we are the only user of |
1688 | + * clp->cl_rpcclient |
1689 | + */ |
1690 | + clnt = xchg(&clp->cl_rpcclient, clnt); |
1691 | + rpc_shutdown_client(clnt); |
1692 | + clnt = clp->cl_rpcclient; |
1693 | goto again; |
1694 | |
1695 | case -NFS4ERR_MINOR_VERS_MISMATCH: |
1696 | diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c |
1697 | index c196369..4cce1d9 100644 |
1698 | --- a/fs/reiserfs/xattr.c |
1699 | +++ b/fs/reiserfs/xattr.c |
1700 | @@ -187,8 +187,8 @@ fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset, |
1701 | if (dbuf->count == ARRAY_SIZE(dbuf->dentries)) |
1702 | return -ENOSPC; |
1703 | |
1704 | - if (name[0] == '.' && (name[1] == '\0' || |
1705 | - (name[1] == '.' && name[2] == '\0'))) |
1706 | + if (name[0] == '.' && (namelen < 2 || |
1707 | + (namelen == 2 && name[1] == '.'))) |
1708 | return 0; |
1709 | |
1710 | dentry = lookup_one_len(name, dbuf->xadir, namelen); |
1711 | diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c |
1712 | index ddc0f6a..97f6875 100644 |
1713 | --- a/fs/ubifs/super.c |
1714 | +++ b/fs/ubifs/super.c |
1715 | @@ -1568,6 +1568,12 @@ static int ubifs_remount_rw(struct ubifs_info *c) |
1716 | c->remounting_rw = 1; |
1717 | c->ro_mount = 0; |
1718 | |
1719 | + if (c->space_fixup) { |
1720 | + err = ubifs_fixup_free_space(c); |
1721 | + if (err) |
1722 | + return err; |
1723 | + } |
1724 | + |
1725 | err = check_free_space(c); |
1726 | if (err) |
1727 | goto out; |
1728 | @@ -1684,12 +1690,6 @@ static int ubifs_remount_rw(struct ubifs_info *c) |
1729 | err = dbg_check_space_info(c); |
1730 | } |
1731 | |
1732 | - if (c->space_fixup) { |
1733 | - err = ubifs_fixup_free_space(c); |
1734 | - if (err) |
1735 | - goto out; |
1736 | - } |
1737 | - |
1738 | mutex_unlock(&c->umount_mutex); |
1739 | return err; |
1740 | |
1741 | diff --git a/include/linux/ata.h b/include/linux/ata.h |
1742 | index 8f7a3d6..ee0bd95 100644 |
1743 | --- a/include/linux/ata.h |
1744 | +++ b/include/linux/ata.h |
1745 | @@ -954,7 +954,7 @@ static inline int atapi_cdb_len(const u16 *dev_id) |
1746 | } |
1747 | } |
1748 | |
1749 | -static inline bool atapi_command_packet_set(const u16 *dev_id) |
1750 | +static inline int atapi_command_packet_set(const u16 *dev_id) |
1751 | { |
1752 | return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f; |
1753 | } |
1754 | diff --git a/include/linux/libata.h b/include/linux/libata.h |
1755 | index 649e5f8..0621bca 100644 |
1756 | --- a/include/linux/libata.h |
1757 | +++ b/include/linux/libata.h |
1758 | @@ -398,6 +398,7 @@ enum { |
1759 | ATA_HORKAGE_NOSETXFER = (1 << 14), /* skip SETXFER, SATA only */ |
1760 | ATA_HORKAGE_BROKEN_FPDMA_AA = (1 << 15), /* skip AA */ |
1761 | ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */ |
1762 | + ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */ |
1763 | |
1764 | /* DMA mask for user DMA control: User visible values; DO NOT |
1765 | renumber */ |
1766 | diff --git a/include/linux/preempt.h b/include/linux/preempt.h |
1767 | index 5a710b9..87a03c7 100644 |
1768 | --- a/include/linux/preempt.h |
1769 | +++ b/include/linux/preempt.h |
1770 | @@ -93,14 +93,20 @@ do { \ |
1771 | |
1772 | #else /* !CONFIG_PREEMPT_COUNT */ |
1773 | |
1774 | -#define preempt_disable() do { } while (0) |
1775 | -#define sched_preempt_enable_no_resched() do { } while (0) |
1776 | -#define preempt_enable_no_resched() do { } while (0) |
1777 | -#define preempt_enable() do { } while (0) |
1778 | - |
1779 | -#define preempt_disable_notrace() do { } while (0) |
1780 | -#define preempt_enable_no_resched_notrace() do { } while (0) |
1781 | -#define preempt_enable_notrace() do { } while (0) |
1782 | +/* |
1783 | + * Even if we don't have any preemption, we need preempt disable/enable |
1784 | + * to be barriers, so that we don't have things like get_user/put_user |
1785 | + * that can cause faults and scheduling migrate into our preempt-protected |
1786 | + * region. |
1787 | + */ |
1788 | +#define preempt_disable() barrier() |
1789 | +#define sched_preempt_enable_no_resched() barrier() |
1790 | +#define preempt_enable_no_resched() barrier() |
1791 | +#define preempt_enable() barrier() |
1792 | + |
1793 | +#define preempt_disable_notrace() barrier() |
1794 | +#define preempt_enable_no_resched_notrace() barrier() |
1795 | +#define preempt_enable_notrace() barrier() |
1796 | |
1797 | #endif /* CONFIG_PREEMPT_COUNT */ |
1798 | |
1799 | diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h |
1800 | index a26e2fb..e2369c1 100644 |
1801 | --- a/include/linux/spinlock_up.h |
1802 | +++ b/include/linux/spinlock_up.h |
1803 | @@ -16,7 +16,10 @@ |
1804 | * In the debug case, 1 means unlocked, 0 means locked. (the values |
1805 | * are inverted, to catch initialization bugs) |
1806 | * |
1807 | - * No atomicity anywhere, we are on UP. |
1808 | + * No atomicity anywhere, we are on UP. However, we still need |
1809 | + * the compiler barriers, because we do not want the compiler to |
1810 | + * move potentially faulting instructions (notably user accesses) |
1811 | + * into the locked sequence, resulting in non-atomic execution. |
1812 | */ |
1813 | |
1814 | #ifdef CONFIG_DEBUG_SPINLOCK |
1815 | @@ -25,6 +28,7 @@ |
1816 | static inline void arch_spin_lock(arch_spinlock_t *lock) |
1817 | { |
1818 | lock->slock = 0; |
1819 | + barrier(); |
1820 | } |
1821 | |
1822 | static inline void |
1823 | @@ -32,6 +36,7 @@ arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags) |
1824 | { |
1825 | local_irq_save(flags); |
1826 | lock->slock = 0; |
1827 | + barrier(); |
1828 | } |
1829 | |
1830 | static inline int arch_spin_trylock(arch_spinlock_t *lock) |
1831 | @@ -39,32 +44,34 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock) |
1832 | char oldval = lock->slock; |
1833 | |
1834 | lock->slock = 0; |
1835 | + barrier(); |
1836 | |
1837 | return oldval > 0; |
1838 | } |
1839 | |
1840 | static inline void arch_spin_unlock(arch_spinlock_t *lock) |
1841 | { |
1842 | + barrier(); |
1843 | lock->slock = 1; |
1844 | } |
1845 | |
1846 | /* |
1847 | * Read-write spinlocks. No debug version. |
1848 | */ |
1849 | -#define arch_read_lock(lock) do { (void)(lock); } while (0) |
1850 | -#define arch_write_lock(lock) do { (void)(lock); } while (0) |
1851 | -#define arch_read_trylock(lock) ({ (void)(lock); 1; }) |
1852 | -#define arch_write_trylock(lock) ({ (void)(lock); 1; }) |
1853 | -#define arch_read_unlock(lock) do { (void)(lock); } while (0) |
1854 | -#define arch_write_unlock(lock) do { (void)(lock); } while (0) |
1855 | +#define arch_read_lock(lock) do { barrier(); (void)(lock); } while (0) |
1856 | +#define arch_write_lock(lock) do { barrier(); (void)(lock); } while (0) |
1857 | +#define arch_read_trylock(lock) ({ barrier(); (void)(lock); 1; }) |
1858 | +#define arch_write_trylock(lock) ({ barrier(); (void)(lock); 1; }) |
1859 | +#define arch_read_unlock(lock) do { barrier(); (void)(lock); } while (0) |
1860 | +#define arch_write_unlock(lock) do { barrier(); (void)(lock); } while (0) |
1861 | |
1862 | #else /* DEBUG_SPINLOCK */ |
1863 | #define arch_spin_is_locked(lock) ((void)(lock), 0) |
1864 | /* for sched.c and kernel_lock.c: */ |
1865 | -# define arch_spin_lock(lock) do { (void)(lock); } while (0) |
1866 | -# define arch_spin_lock_flags(lock, flags) do { (void)(lock); } while (0) |
1867 | -# define arch_spin_unlock(lock) do { (void)(lock); } while (0) |
1868 | -# define arch_spin_trylock(lock) ({ (void)(lock); 1; }) |
1869 | +# define arch_spin_lock(lock) do { barrier(); (void)(lock); } while (0) |
1870 | +# define arch_spin_lock_flags(lock, flags) do { barrier(); (void)(lock); } while (0) |
1871 | +# define arch_spin_unlock(lock) do { barrier(); (void)(lock); } while (0) |
1872 | +# define arch_spin_trylock(lock) ({ barrier(); (void)(lock); 1; }) |
1873 | #endif /* DEBUG_SPINLOCK */ |
1874 | |
1875 | #define arch_spin_is_contended(lock) (((void)(lock), 0)) |
1876 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
1877 | index b27052c..64bc5d8 100644 |
1878 | --- a/kernel/trace/ftrace.c |
1879 | +++ b/kernel/trace/ftrace.c |
1880 | @@ -4537,12 +4537,8 @@ ftrace_enable_sysctl(struct ctl_table *table, int write, |
1881 | ftrace_startup_sysctl(); |
1882 | |
1883 | /* we are starting ftrace again */ |
1884 | - if (ftrace_ops_list != &ftrace_list_end) { |
1885 | - if (ftrace_ops_list->next == &ftrace_list_end) |
1886 | - ftrace_trace_function = ftrace_ops_list->func; |
1887 | - else |
1888 | - ftrace_trace_function = ftrace_ops_list_func; |
1889 | - } |
1890 | + if (ftrace_ops_list != &ftrace_list_end) |
1891 | + update_ftrace_function(); |
1892 | |
1893 | } else { |
1894 | /* stopping ftrace calls (just send to ftrace_stub) */ |
1895 | diff --git a/mm/mmap.c b/mm/mmap.c |
1896 | index 8832b87..90db251 100644 |
1897 | --- a/mm/mmap.c |
1898 | +++ b/mm/mmap.c |
1899 | @@ -1922,7 +1922,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) |
1900 | |
1901 | /* Check the cache first. */ |
1902 | /* (Cache hit rate is typically around 35%.) */ |
1903 | - vma = mm->mmap_cache; |
1904 | + vma = ACCESS_ONCE(mm->mmap_cache); |
1905 | if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) { |
1906 | struct rb_node *rb_node; |
1907 | |
1908 | diff --git a/mm/nommu.c b/mm/nommu.c |
1909 | index 79c3cac..bbe1f3f 100644 |
1910 | --- a/mm/nommu.c |
1911 | +++ b/mm/nommu.c |
1912 | @@ -819,7 +819,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) |
1913 | struct vm_area_struct *vma; |
1914 | |
1915 | /* check the cache first */ |
1916 | - vma = mm->mmap_cache; |
1917 | + vma = ACCESS_ONCE(mm->mmap_cache); |
1918 | if (vma && vma->vm_start <= addr && vma->vm_end > addr) |
1919 | return vma; |
1920 | |
1921 | diff --git a/net/can/gw.c b/net/can/gw.c |
1922 | index 574dda78e..28e7bdc 100644 |
1923 | --- a/net/can/gw.c |
1924 | +++ b/net/can/gw.c |
1925 | @@ -436,7 +436,7 @@ static int cgw_notifier(struct notifier_block *nb, |
1926 | if (gwj->src.dev == dev || gwj->dst.dev == dev) { |
1927 | hlist_del(&gwj->list); |
1928 | cgw_unregister_filter(gwj); |
1929 | - kfree(gwj); |
1930 | + kmem_cache_free(cgw_cache, gwj); |
1931 | } |
1932 | } |
1933 | } |
1934 | @@ -829,7 +829,7 @@ static void cgw_remove_all_jobs(void) |
1935 | hlist_for_each_entry_safe(gwj, n, nx, &cgw_list, list) { |
1936 | hlist_del(&gwj->list); |
1937 | cgw_unregister_filter(gwj); |
1938 | - kfree(gwj); |
1939 | + kmem_cache_free(cgw_cache, gwj); |
1940 | } |
1941 | } |
1942 | |
1943 | @@ -885,7 +885,7 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) |
1944 | |
1945 | hlist_del(&gwj->list); |
1946 | cgw_unregister_filter(gwj); |
1947 | - kfree(gwj); |
1948 | + kmem_cache_free(cgw_cache, gwj); |
1949 | err = 0; |
1950 | break; |
1951 | } |
1952 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c |
1953 | index 0479c64..49c48c6 100644 |
1954 | --- a/net/mac80211/cfg.c |
1955 | +++ b/net/mac80211/cfg.c |
1956 | @@ -2499,7 +2499,7 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local, |
1957 | list_del(&dep->list); |
1958 | mutex_unlock(&local->mtx); |
1959 | |
1960 | - ieee80211_roc_notify_destroy(dep); |
1961 | + ieee80211_roc_notify_destroy(dep, true); |
1962 | return 0; |
1963 | } |
1964 | |
1965 | @@ -2539,7 +2539,7 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local, |
1966 | ieee80211_start_next_roc(local); |
1967 | mutex_unlock(&local->mtx); |
1968 | |
1969 | - ieee80211_roc_notify_destroy(found); |
1970 | + ieee80211_roc_notify_destroy(found, true); |
1971 | } else { |
1972 | /* work may be pending so use it all the time */ |
1973 | found->abort = true; |
1974 | @@ -2549,6 +2549,8 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local, |
1975 | |
1976 | /* work will clean up etc */ |
1977 | flush_delayed_work(&found->work); |
1978 | + WARN_ON(!found->to_be_freed); |
1979 | + kfree(found); |
1980 | } |
1981 | |
1982 | return 0; |
1983 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h |
1984 | index 2ed065c..55d8f89 100644 |
1985 | --- a/net/mac80211/ieee80211_i.h |
1986 | +++ b/net/mac80211/ieee80211_i.h |
1987 | @@ -346,6 +346,7 @@ struct ieee80211_roc_work { |
1988 | struct ieee80211_channel *chan; |
1989 | |
1990 | bool started, abort, hw_begun, notified; |
1991 | + bool to_be_freed; |
1992 | |
1993 | unsigned long hw_start_time; |
1994 | |
1995 | @@ -1363,7 +1364,7 @@ void ieee80211_offchannel_return(struct ieee80211_local *local); |
1996 | void ieee80211_roc_setup(struct ieee80211_local *local); |
1997 | void ieee80211_start_next_roc(struct ieee80211_local *local); |
1998 | void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata); |
1999 | -void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc); |
2000 | +void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc, bool free); |
2001 | void ieee80211_sw_roc_work(struct work_struct *work); |
2002 | void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc); |
2003 | |
2004 | diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c |
2005 | index a3ad4c3..7acbdaa 100644 |
2006 | --- a/net/mac80211/offchannel.c |
2007 | +++ b/net/mac80211/offchannel.c |
2008 | @@ -299,10 +299,13 @@ void ieee80211_start_next_roc(struct ieee80211_local *local) |
2009 | } |
2010 | } |
2011 | |
2012 | -void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc) |
2013 | +void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc, bool free) |
2014 | { |
2015 | struct ieee80211_roc_work *dep, *tmp; |
2016 | |
2017 | + if (WARN_ON(roc->to_be_freed)) |
2018 | + return; |
2019 | + |
2020 | /* was never transmitted */ |
2021 | if (roc->frame) { |
2022 | cfg80211_mgmt_tx_status(&roc->sdata->wdev, |
2023 | @@ -318,9 +321,12 @@ void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc) |
2024 | GFP_KERNEL); |
2025 | |
2026 | list_for_each_entry_safe(dep, tmp, &roc->dependents, list) |
2027 | - ieee80211_roc_notify_destroy(dep); |
2028 | + ieee80211_roc_notify_destroy(dep, true); |
2029 | |
2030 | - kfree(roc); |
2031 | + if (free) |
2032 | + kfree(roc); |
2033 | + else |
2034 | + roc->to_be_freed = true; |
2035 | } |
2036 | |
2037 | void ieee80211_sw_roc_work(struct work_struct *work) |
2038 | @@ -333,6 +339,9 @@ void ieee80211_sw_roc_work(struct work_struct *work) |
2039 | |
2040 | mutex_lock(&local->mtx); |
2041 | |
2042 | + if (roc->to_be_freed) |
2043 | + goto out_unlock; |
2044 | + |
2045 | if (roc->abort) |
2046 | goto finish; |
2047 | |
2048 | @@ -372,7 +381,7 @@ void ieee80211_sw_roc_work(struct work_struct *work) |
2049 | finish: |
2050 | list_del(&roc->list); |
2051 | started = roc->started; |
2052 | - ieee80211_roc_notify_destroy(roc); |
2053 | + ieee80211_roc_notify_destroy(roc, !roc->abort); |
2054 | |
2055 | if (started) { |
2056 | drv_flush(local, false); |
2057 | @@ -412,7 +421,7 @@ static void ieee80211_hw_roc_done(struct work_struct *work) |
2058 | |
2059 | list_del(&roc->list); |
2060 | |
2061 | - ieee80211_roc_notify_destroy(roc); |
2062 | + ieee80211_roc_notify_destroy(roc, true); |
2063 | |
2064 | /* if there's another roc, start it now */ |
2065 | ieee80211_start_next_roc(local); |
2066 | @@ -462,12 +471,14 @@ void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata) |
2067 | list_for_each_entry_safe(roc, tmp, &tmp_list, list) { |
2068 | if (local->ops->remain_on_channel) { |
2069 | list_del(&roc->list); |
2070 | - ieee80211_roc_notify_destroy(roc); |
2071 | + ieee80211_roc_notify_destroy(roc, true); |
2072 | } else { |
2073 | ieee80211_queue_delayed_work(&local->hw, &roc->work, 0); |
2074 | |
2075 | /* work will clean up etc */ |
2076 | flush_delayed_work(&roc->work); |
2077 | + WARN_ON(!roc->to_be_freed); |
2078 | + kfree(roc); |
2079 | } |
2080 | } |
2081 | |
2082 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
2083 | index 507b5e8..716aa41 100644 |
2084 | --- a/net/sunrpc/clnt.c |
2085 | +++ b/net/sunrpc/clnt.c |
2086 | @@ -511,7 +511,7 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args, |
2087 | new = rpc_new_client(args, xprt); |
2088 | if (IS_ERR(new)) { |
2089 | err = PTR_ERR(new); |
2090 | - goto out_put; |
2091 | + goto out_err; |
2092 | } |
2093 | |
2094 | atomic_inc(&clnt->cl_count); |
2095 | @@ -524,8 +524,6 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args, |
2096 | new->cl_chatty = clnt->cl_chatty; |
2097 | return new; |
2098 | |
2099 | -out_put: |
2100 | - xprt_put(xprt); |
2101 | out_err: |
2102 | dprintk("RPC: %s: returned error %d\n", __func__, err); |
2103 | return ERR_PTR(err); |
2104 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
2105 | index e46b6a3..622f726 100644 |
2106 | --- a/sound/pci/hda/hda_codec.c |
2107 | +++ b/sound/pci/hda/hda_codec.c |
2108 | @@ -173,7 +173,7 @@ const char *snd_hda_get_jack_type(u32 cfg) |
2109 | "Line Out", "Speaker", "HP Out", "CD", |
2110 | "SPDIF Out", "Digital Out", "Modem Line", "Modem Hand", |
2111 | "Line In", "Aux", "Mic", "Telephony", |
2112 | - "SPDIF In", "Digitial In", "Reserved", "Other" |
2113 | + "SPDIF In", "Digital In", "Reserved", "Other" |
2114 | }; |
2115 | |
2116 | return jack_types[(cfg & AC_DEFCFG_DEVICE) |
2117 | diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c |
2118 | index 4c054f4..86f6468 100644 |
2119 | --- a/sound/pci/hda/hda_eld.c |
2120 | +++ b/sound/pci/hda/hda_eld.c |
2121 | @@ -322,7 +322,7 @@ int snd_hdmi_get_eld(struct hdmi_eld *eld, |
2122 | struct hda_codec *codec, hda_nid_t nid) |
2123 | { |
2124 | int i; |
2125 | - int ret; |
2126 | + int ret = 0; |
2127 | int size; |
2128 | unsigned char *buf; |
2129 | |
2130 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2131 | index 47fb18d..ee975a2 100644 |
2132 | --- a/sound/pci/hda/patch_realtek.c |
2133 | +++ b/sound/pci/hda/patch_realtek.c |
2134 | @@ -6720,7 +6720,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec) |
2135 | const hda_nid_t *ssids; |
2136 | |
2137 | if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || |
2138 | - codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670) |
2139 | + codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670 || |
2140 | + codec->vendor_id == 0x10ec0671) |
2141 | ssids = alc663_ssids; |
2142 | else |
2143 | ssids = alc662_ssids; |
2144 | @@ -7173,6 +7174,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
2145 | { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, |
2146 | { .id = 0x10ec0668, .name = "ALC668", .patch = patch_alc662 }, |
2147 | { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, |
2148 | + { .id = 0x10ec0671, .name = "ALC671", .patch = patch_alc662 }, |
2149 | { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 }, |
2150 | { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, |
2151 | { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, |
2152 | diff --git a/sound/soc/fsl/imx-ssi.c b/sound/soc/fsl/imx-ssi.c |
2153 | index 3b48042..63e453f 100644 |
2154 | --- a/sound/soc/fsl/imx-ssi.c |
2155 | +++ b/sound/soc/fsl/imx-ssi.c |
2156 | @@ -496,6 +496,8 @@ static void imx_ssi_ac97_reset(struct snd_ac97 *ac97) |
2157 | |
2158 | if (imx_ssi->ac97_reset) |
2159 | imx_ssi->ac97_reset(ac97); |
2160 | + /* First read sometimes fails, do a dummy read */ |
2161 | + imx_ssi_ac97_read(ac97, 0); |
2162 | } |
2163 | |
2164 | static void imx_ssi_ac97_warm_reset(struct snd_ac97 *ac97) |
2165 | @@ -504,6 +506,9 @@ static void imx_ssi_ac97_warm_reset(struct snd_ac97 *ac97) |
2166 | |
2167 | if (imx_ssi->ac97_warm_reset) |
2168 | imx_ssi->ac97_warm_reset(ac97); |
2169 | + |
2170 | + /* First read sometimes fails, do a dummy read */ |
2171 | + imx_ssi_ac97_read(ac97, 0); |
2172 | } |
2173 | |
2174 | struct snd_ac97_bus_ops soc_ac97_ops = { |
2175 | diff --git a/sound/soc/sh/dma-sh7760.c b/sound/soc/sh/dma-sh7760.c |
2176 | index 19eff8f..1a8b03e 100644 |
2177 | --- a/sound/soc/sh/dma-sh7760.c |
2178 | +++ b/sound/soc/sh/dma-sh7760.c |
2179 | @@ -342,8 +342,8 @@ static int camelot_pcm_new(struct snd_soc_pcm_runtime *rtd) |
2180 | return 0; |
2181 | } |
2182 | |
2183 | -static struct snd_soc_platform sh7760_soc_platform = { |
2184 | - .pcm_ops = &camelot_pcm_ops, |
2185 | +static struct snd_soc_platform_driver sh7760_soc_platform = { |
2186 | + .ops = &camelot_pcm_ops, |
2187 | .pcm_new = camelot_pcm_new, |
2188 | .pcm_free = camelot_pcm_free, |
2189 | }; |
2190 | diff --git a/sound/soc/spear/spear_pcm.c b/sound/soc/spear/spear_pcm.c |
2191 | index 9b76cc5..5e7aebe 100644 |
2192 | --- a/sound/soc/spear/spear_pcm.c |
2193 | +++ b/sound/soc/spear/spear_pcm.c |
2194 | @@ -149,9 +149,9 @@ static void spear_pcm_free(struct snd_pcm *pcm) |
2195 | |
2196 | static u64 spear_pcm_dmamask = DMA_BIT_MASK(32); |
2197 | |
2198 | -static int spear_pcm_new(struct snd_card *card, |
2199 | - struct snd_soc_dai *dai, struct snd_pcm *pcm) |
2200 | +static int spear_pcm_new(struct snd_soc_pcm_runtime *rtd) |
2201 | { |
2202 | + struct snd_card *card = rtd->card->snd_card; |
2203 | int ret; |
2204 | |
2205 | if (!card->dev->dma_mask) |
2206 | @@ -159,16 +159,16 @@ static int spear_pcm_new(struct snd_card *card, |
2207 | if (!card->dev->coherent_dma_mask) |
2208 | card->dev->coherent_dma_mask = DMA_BIT_MASK(32); |
2209 | |
2210 | - if (dai->driver->playback.channels_min) { |
2211 | - ret = spear_pcm_preallocate_dma_buffer(pcm, |
2212 | + if (rtd->cpu_dai->driver->playback.channels_min) { |
2213 | + ret = spear_pcm_preallocate_dma_buffer(rtd->pcm, |
2214 | SNDRV_PCM_STREAM_PLAYBACK, |
2215 | spear_pcm_hardware.buffer_bytes_max); |
2216 | if (ret) |
2217 | return ret; |
2218 | } |
2219 | |
2220 | - if (dai->driver->capture.channels_min) { |
2221 | - ret = spear_pcm_preallocate_dma_buffer(pcm, |
2222 | + if (rtd->cpu_dai->driver->capture.channels_min) { |
2223 | + ret = spear_pcm_preallocate_dma_buffer(rtd->pcm, |
2224 | SNDRV_PCM_STREAM_CAPTURE, |
2225 | spear_pcm_hardware.buffer_bytes_max); |
2226 | if (ret) |