Contents of /trunk/kernel-alx/patches-3.10/0104-3.10.5-all-fixes.patch
Parent Directory | Revision Log
Revision 2288 -
(show annotations)
(download)
Wed Sep 25 06:47:47 2013 UTC (11 years ago) by niro
File size: 164202 byte(s)
Wed Sep 25 06:47:47 2013 UTC (11 years ago) by niro
File size: 164202 byte(s)
-linux-3.10 patches
1 | diff --git a/Makefile b/Makefile |
2 | index b4df9b2..f8349d0 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 4 |
9 | +SUBLEVEL = 5 |
10 | EXTRAVERSION = |
11 | NAME = Unicycling Gorilla |
12 | |
13 | diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c |
14 | index aabc02a..d1153c8 100644 |
15 | --- a/arch/arm/boot/compressed/atags_to_fdt.c |
16 | +++ b/arch/arm/boot/compressed/atags_to_fdt.c |
17 | @@ -53,6 +53,17 @@ static const void *getprop(const void *fdt, const char *node_path, |
18 | return fdt_getprop(fdt, offset, property, len); |
19 | } |
20 | |
21 | +static uint32_t get_cell_size(const void *fdt) |
22 | +{ |
23 | + int len; |
24 | + uint32_t cell_size = 1; |
25 | + const uint32_t *size_len = getprop(fdt, "/", "#size-cells", &len); |
26 | + |
27 | + if (size_len) |
28 | + cell_size = fdt32_to_cpu(*size_len); |
29 | + return cell_size; |
30 | +} |
31 | + |
32 | static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) |
33 | { |
34 | char cmdline[COMMAND_LINE_SIZE]; |
35 | @@ -95,9 +106,11 @@ static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) |
36 | int atags_to_fdt(void *atag_list, void *fdt, int total_space) |
37 | { |
38 | struct tag *atag = atag_list; |
39 | - uint32_t mem_reg_property[2 * NR_BANKS]; |
40 | + /* In the case of 64 bits memory size, need to reserve 2 cells for |
41 | + * address and size for each bank */ |
42 | + uint32_t mem_reg_property[2 * 2 * NR_BANKS]; |
43 | int memcount = 0; |
44 | - int ret; |
45 | + int ret, memsize; |
46 | |
47 | /* make sure we've got an aligned pointer */ |
48 | if ((u32)atag_list & 0x3) |
49 | @@ -137,8 +150,25 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) |
50 | continue; |
51 | if (!atag->u.mem.size) |
52 | continue; |
53 | - mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.start); |
54 | - mem_reg_property[memcount++] = cpu_to_fdt32(atag->u.mem.size); |
55 | + memsize = get_cell_size(fdt); |
56 | + |
57 | + if (memsize == 2) { |
58 | + /* if memsize is 2, that means that |
59 | + * each data needs 2 cells of 32 bits, |
60 | + * so the data are 64 bits */ |
61 | + uint64_t *mem_reg_prop64 = |
62 | + (uint64_t *)mem_reg_property; |
63 | + mem_reg_prop64[memcount++] = |
64 | + cpu_to_fdt64(atag->u.mem.start); |
65 | + mem_reg_prop64[memcount++] = |
66 | + cpu_to_fdt64(atag->u.mem.size); |
67 | + } else { |
68 | + mem_reg_property[memcount++] = |
69 | + cpu_to_fdt32(atag->u.mem.start); |
70 | + mem_reg_property[memcount++] = |
71 | + cpu_to_fdt32(atag->u.mem.size); |
72 | + } |
73 | + |
74 | } else if (atag->hdr.tag == ATAG_INITRD2) { |
75 | uint32_t initrd_start, initrd_size; |
76 | initrd_start = atag->u.initrd.start; |
77 | @@ -150,8 +180,10 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) |
78 | } |
79 | } |
80 | |
81 | - if (memcount) |
82 | - setprop(fdt, "/memory", "reg", mem_reg_property, 4*memcount); |
83 | + if (memcount) { |
84 | + setprop(fdt, "/memory", "reg", mem_reg_property, |
85 | + 4 * memcount * memsize); |
86 | + } |
87 | |
88 | return fdt_pack(fdt); |
89 | } |
90 | diff --git a/arch/powerpc/include/asm/module.h b/arch/powerpc/include/asm/module.h |
91 | index c1df590..49fa55b 100644 |
92 | --- a/arch/powerpc/include/asm/module.h |
93 | +++ b/arch/powerpc/include/asm/module.h |
94 | @@ -82,10 +82,9 @@ struct exception_table_entry; |
95 | void sort_ex_table(struct exception_table_entry *start, |
96 | struct exception_table_entry *finish); |
97 | |
98 | -#ifdef CONFIG_MODVERSIONS |
99 | +#if defined(CONFIG_MODVERSIONS) && defined(CONFIG_PPC64) |
100 | #define ARCH_RELOCATES_KCRCTAB |
101 | - |
102 | -extern const unsigned long reloc_start[]; |
103 | +#define reloc_start PHYSICAL_START |
104 | #endif |
105 | #endif /* __KERNEL__ */ |
106 | #endif /* _ASM_POWERPC_MODULE_H */ |
107 | diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S |
108 | index 654e479..f096e72 100644 |
109 | --- a/arch/powerpc/kernel/vmlinux.lds.S |
110 | +++ b/arch/powerpc/kernel/vmlinux.lds.S |
111 | @@ -38,9 +38,6 @@ jiffies = jiffies_64 + 4; |
112 | #endif |
113 | SECTIONS |
114 | { |
115 | - . = 0; |
116 | - reloc_start = .; |
117 | - |
118 | . = KERNELBASE; |
119 | |
120 | /* |
121 | diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c |
122 | index b44577b..ec94e11 100644 |
123 | --- a/arch/x86/kernel/acpi/sleep.c |
124 | +++ b/arch/x86/kernel/acpi/sleep.c |
125 | @@ -48,9 +48,20 @@ int acpi_suspend_lowlevel(void) |
126 | #ifndef CONFIG_64BIT |
127 | native_store_gdt((struct desc_ptr *)&header->pmode_gdt); |
128 | |
129 | + /* |
130 | + * We have to check that we can write back the value, and not |
131 | + * just read it. At least on 90 nm Pentium M (Family 6, Model |
132 | + * 13), reading an invalid MSR is not guaranteed to trap, see |
133 | + * Erratum X4 in "Intel Pentium M Processor on 90 nm Process |
134 | + * with 2-MB L2 Cache and IntelĀ® Processor A100 and A110 on 90 |
135 | + * nm process with 512-KB L2 Cache Specification Update". |
136 | + */ |
137 | if (!rdmsr_safe(MSR_EFER, |
138 | &header->pmode_efer_low, |
139 | - &header->pmode_efer_high)) |
140 | + &header->pmode_efer_high) && |
141 | + !wrmsr_safe(MSR_EFER, |
142 | + header->pmode_efer_low, |
143 | + header->pmode_efer_high)) |
144 | header->pmode_behavior |= (1 << WAKEUP_BEHAVIOR_RESTORE_EFER); |
145 | #endif /* !CONFIG_64BIT */ |
146 | |
147 | @@ -61,7 +72,10 @@ int acpi_suspend_lowlevel(void) |
148 | } |
149 | if (!rdmsr_safe(MSR_IA32_MISC_ENABLE, |
150 | &header->pmode_misc_en_low, |
151 | - &header->pmode_misc_en_high)) |
152 | + &header->pmode_misc_en_high) && |
153 | + !wrmsr_safe(MSR_IA32_MISC_ENABLE, |
154 | + header->pmode_misc_en_low, |
155 | + header->pmode_misc_en_high)) |
156 | header->pmode_behavior |= |
157 | (1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE); |
158 | header->realmode_flags = acpi_realmode_flags; |
159 | diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c |
160 | index fa72a39..3982357 100644 |
161 | --- a/arch/x86/kernel/cpu/mtrr/generic.c |
162 | +++ b/arch/x86/kernel/cpu/mtrr/generic.c |
163 | @@ -510,8 +510,9 @@ generic_get_free_region(unsigned long base, unsigned long size, int replace_reg) |
164 | static void generic_get_mtrr(unsigned int reg, unsigned long *base, |
165 | unsigned long *size, mtrr_type *type) |
166 | { |
167 | - unsigned int mask_lo, mask_hi, base_lo, base_hi; |
168 | - unsigned int tmp, hi; |
169 | + u32 mask_lo, mask_hi, base_lo, base_hi; |
170 | + unsigned int hi; |
171 | + u64 tmp, mask; |
172 | |
173 | /* |
174 | * get_mtrr doesn't need to update mtrr_state, also it could be called |
175 | @@ -532,18 +533,18 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, |
176 | rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi); |
177 | |
178 | /* Work out the shifted address mask: */ |
179 | - tmp = mask_hi << (32 - PAGE_SHIFT) | mask_lo >> PAGE_SHIFT; |
180 | - mask_lo = size_or_mask | tmp; |
181 | + tmp = (u64)mask_hi << (32 - PAGE_SHIFT) | mask_lo >> PAGE_SHIFT; |
182 | + mask = size_or_mask | tmp; |
183 | |
184 | /* Expand tmp with high bits to all 1s: */ |
185 | - hi = fls(tmp); |
186 | + hi = fls64(tmp); |
187 | if (hi > 0) { |
188 | - tmp |= ~((1<<(hi - 1)) - 1); |
189 | + tmp |= ~((1ULL<<(hi - 1)) - 1); |
190 | |
191 | - if (tmp != mask_lo) { |
192 | + if (tmp != mask) { |
193 | printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n"); |
194 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); |
195 | - mask_lo = tmp; |
196 | + mask = tmp; |
197 | } |
198 | } |
199 | |
200 | @@ -551,8 +552,8 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, |
201 | * This works correctly if size is a power of two, i.e. a |
202 | * contiguous range: |
203 | */ |
204 | - *size = -mask_lo; |
205 | - *base = base_hi << (32 - PAGE_SHIFT) | base_lo >> PAGE_SHIFT; |
206 | + *size = -mask; |
207 | + *base = (u64)base_hi << (32 - PAGE_SHIFT) | base_lo >> PAGE_SHIFT; |
208 | *type = base_lo & 0xff; |
209 | |
210 | out_put_cpu: |
211 | diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c |
212 | index 726bf96..ca22b73 100644 |
213 | --- a/arch/x86/kernel/cpu/mtrr/main.c |
214 | +++ b/arch/x86/kernel/cpu/mtrr/main.c |
215 | @@ -305,7 +305,8 @@ int mtrr_add_page(unsigned long base, unsigned long size, |
216 | return -EINVAL; |
217 | } |
218 | |
219 | - if (base & size_or_mask || size & size_or_mask) { |
220 | + if ((base | (base + size - 1)) >> |
221 | + (boot_cpu_data.x86_phys_bits - PAGE_SHIFT)) { |
222 | pr_warning("mtrr: base or size exceeds the MTRR width\n"); |
223 | return -EINVAL; |
224 | } |
225 | @@ -583,6 +584,7 @@ static struct syscore_ops mtrr_syscore_ops = { |
226 | |
227 | int __initdata changed_by_mtrr_cleanup; |
228 | |
229 | +#define SIZE_OR_MASK_BITS(n) (~((1ULL << ((n) - PAGE_SHIFT)) - 1)) |
230 | /** |
231 | * mtrr_bp_init - initialize mtrrs on the boot CPU |
232 | * |
233 | @@ -600,7 +602,7 @@ void __init mtrr_bp_init(void) |
234 | |
235 | if (cpu_has_mtrr) { |
236 | mtrr_if = &generic_mtrr_ops; |
237 | - size_or_mask = 0xff000000; /* 36 bits */ |
238 | + size_or_mask = SIZE_OR_MASK_BITS(36); |
239 | size_and_mask = 0x00f00000; |
240 | phys_addr = 36; |
241 | |
242 | @@ -619,7 +621,7 @@ void __init mtrr_bp_init(void) |
243 | boot_cpu_data.x86_mask == 0x4)) |
244 | phys_addr = 36; |
245 | |
246 | - size_or_mask = ~((1ULL << (phys_addr - PAGE_SHIFT)) - 1); |
247 | + size_or_mask = SIZE_OR_MASK_BITS(phys_addr); |
248 | size_and_mask = ~size_or_mask & 0xfffff00000ULL; |
249 | } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR && |
250 | boot_cpu_data.x86 == 6) { |
251 | @@ -627,7 +629,7 @@ void __init mtrr_bp_init(void) |
252 | * VIA C* family have Intel style MTRRs, |
253 | * but don't support PAE |
254 | */ |
255 | - size_or_mask = 0xfff00000; /* 32 bits */ |
256 | + size_or_mask = SIZE_OR_MASK_BITS(32); |
257 | size_and_mask = 0; |
258 | phys_addr = 32; |
259 | } |
260 | @@ -637,21 +639,21 @@ void __init mtrr_bp_init(void) |
261 | if (cpu_has_k6_mtrr) { |
262 | /* Pre-Athlon (K6) AMD CPU MTRRs */ |
263 | mtrr_if = mtrr_ops[X86_VENDOR_AMD]; |
264 | - size_or_mask = 0xfff00000; /* 32 bits */ |
265 | + size_or_mask = SIZE_OR_MASK_BITS(32); |
266 | size_and_mask = 0; |
267 | } |
268 | break; |
269 | case X86_VENDOR_CENTAUR: |
270 | if (cpu_has_centaur_mcr) { |
271 | mtrr_if = mtrr_ops[X86_VENDOR_CENTAUR]; |
272 | - size_or_mask = 0xfff00000; /* 32 bits */ |
273 | + size_or_mask = SIZE_OR_MASK_BITS(32); |
274 | size_and_mask = 0; |
275 | } |
276 | break; |
277 | case X86_VENDOR_CYRIX: |
278 | if (cpu_has_cyrix_arr) { |
279 | mtrr_if = mtrr_ops[X86_VENDOR_CYRIX]; |
280 | - size_or_mask = 0xfff00000; /* 32 bits */ |
281 | + size_or_mask = SIZE_OR_MASK_BITS(32); |
282 | size_and_mask = 0; |
283 | } |
284 | break; |
285 | diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S |
286 | index 321d65e..a836860 100644 |
287 | --- a/arch/x86/kernel/head_64.S |
288 | +++ b/arch/x86/kernel/head_64.S |
289 | @@ -513,7 +513,7 @@ ENTRY(phys_base) |
290 | #include "../../x86/xen/xen-head.S" |
291 | |
292 | .section .bss, "aw", @nobits |
293 | - .align L1_CACHE_BYTES |
294 | + .align PAGE_SIZE |
295 | ENTRY(idt_table) |
296 | .skip IDT_ENTRIES * 16 |
297 | |
298 | diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c |
299 | index 5e6301e..2cf0244 100644 |
300 | --- a/drivers/acpi/acpi_memhotplug.c |
301 | +++ b/drivers/acpi/acpi_memhotplug.c |
302 | @@ -283,6 +283,7 @@ static int acpi_memory_device_add(struct acpi_device *device, |
303 | /* Get the range from the _CRS */ |
304 | result = acpi_memory_get_device_resources(mem_device); |
305 | if (result) { |
306 | + device->driver_data = NULL; |
307 | kfree(mem_device); |
308 | return result; |
309 | } |
310 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
311 | index 14807e5..af658b2 100644 |
312 | --- a/drivers/acpi/scan.c |
313 | +++ b/drivers/acpi/scan.c |
314 | @@ -237,10 +237,12 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) |
315 | |
316 | mutex_lock(&acpi_scan_lock); |
317 | |
318 | - acpi_bus_get_device(handle, &device); |
319 | - if (device) { |
320 | - dev_warn(&device->dev, "Attempt to re-insert\n"); |
321 | - goto out; |
322 | + if (ost_source != ACPI_NOTIFY_BUS_CHECK) { |
323 | + acpi_bus_get_device(handle, &device); |
324 | + if (device) { |
325 | + dev_warn(&device->dev, "Attempt to re-insert\n"); |
326 | + goto out; |
327 | + } |
328 | } |
329 | acpi_evaluate_hotplug_ost(handle, ost_source, |
330 | ACPI_OST_SC_INSERT_IN_PROGRESS, NULL); |
331 | @@ -1890,6 +1892,9 @@ static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used, |
332 | if (acpi_bus_get_device(handle, &device)) |
333 | return AE_CTRL_DEPTH; |
334 | |
335 | + if (device->handler) |
336 | + return AE_OK; |
337 | + |
338 | ret = acpi_scan_attach_handler(device); |
339 | if (ret) |
340 | return ret > 0 ? AE_OK : AE_CTRL_DEPTH; |
341 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
342 | index 440eadf..0e4b96b 100644 |
343 | --- a/drivers/acpi/video.c |
344 | +++ b/drivers/acpi/video.c |
345 | @@ -450,6 +450,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
346 | }, |
347 | { |
348 | .callback = video_ignore_initial_backlight, |
349 | + .ident = "Fujitsu E753", |
350 | + .matches = { |
351 | + DMI_MATCH(DMI_BOARD_VENDOR, "FUJITSU"), |
352 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E753"), |
353 | + }, |
354 | + }, |
355 | + { |
356 | + .callback = video_ignore_initial_backlight, |
357 | .ident = "HP Pavilion dm4", |
358 | .matches = { |
359 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
360 | diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig |
361 | index a5a3ebc..78eabff 100644 |
362 | --- a/drivers/ata/Kconfig |
363 | +++ b/drivers/ata/Kconfig |
364 | @@ -107,7 +107,7 @@ config SATA_FSL |
365 | If unsure, say N. |
366 | |
367 | config SATA_INIC162X |
368 | - tristate "Initio 162x SATA support" |
369 | + tristate "Initio 162x SATA support (Very Experimental)" |
370 | depends on PCI |
371 | help |
372 | This option enables support for Initio 162x Serial ATA. |
373 | diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c |
374 | index 8eae659..b92913a 100644 |
375 | --- a/drivers/ata/ata_piix.c |
376 | +++ b/drivers/ata/ata_piix.c |
377 | @@ -330,7 +330,7 @@ static const struct pci_device_id piix_pci_tbl[] = { |
378 | /* SATA Controller IDE (Wellsburg) */ |
379 | { 0x8086, 0x8d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
380 | /* SATA Controller IDE (Wellsburg) */ |
381 | - { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
382 | + { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, |
383 | /* SATA Controller IDE (Wellsburg) */ |
384 | { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
385 | /* SATA Controller IDE (Wellsburg) */ |
386 | diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c |
387 | index 1e6827c..74456fa 100644 |
388 | --- a/drivers/ata/sata_inic162x.c |
389 | +++ b/drivers/ata/sata_inic162x.c |
390 | @@ -6,6 +6,18 @@ |
391 | * |
392 | * This file is released under GPL v2. |
393 | * |
394 | + * **** WARNING **** |
395 | + * |
396 | + * This driver never worked properly and unfortunately data corruption is |
397 | + * relatively common. There isn't anyone working on the driver and there's |
398 | + * no support from the vendor. Do not use this driver in any production |
399 | + * environment. |
400 | + * |
401 | + * http://thread.gmane.org/gmane.linux.debian.devel.bugs.rc/378525/focus=54491 |
402 | + * https://bugzilla.kernel.org/show_bug.cgi?id=60565 |
403 | + * |
404 | + * ***************** |
405 | + * |
406 | * This controller is eccentric and easily locks up if something isn't |
407 | * right. Documentation is available at initio's website but it only |
408 | * documents registers (not programming model). |
409 | @@ -807,6 +819,8 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
410 | |
411 | ata_print_version_once(&pdev->dev, DRV_VERSION); |
412 | |
413 | + dev_alert(&pdev->dev, "inic162x support is broken with common data corruption issues and will be disabled by default, contact linux-ide@vger.kernel.org if in production use\n"); |
414 | + |
415 | /* alloc host */ |
416 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, NR_PORTS); |
417 | hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); |
418 | diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c |
419 | index a941dcf..d0c81d1 100644 |
420 | --- a/drivers/base/regmap/regmap.c |
421 | +++ b/drivers/base/regmap/regmap.c |
422 | @@ -1717,7 +1717,7 @@ int regmap_async_complete(struct regmap *map) |
423 | int ret; |
424 | |
425 | /* Nothing to do with no async support */ |
426 | - if (!map->bus->async_write) |
427 | + if (!map->bus || !map->bus->async_write) |
428 | return 0; |
429 | |
430 | trace_regmap_async_complete_start(map->dev); |
431 | diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c |
432 | index dd5b2fe..d81dfca 100644 |
433 | --- a/drivers/block/xen-blkback/blkback.c |
434 | +++ b/drivers/block/xen-blkback/blkback.c |
435 | @@ -647,7 +647,18 @@ static int dispatch_discard_io(struct xen_blkif *blkif, |
436 | int status = BLKIF_RSP_OKAY; |
437 | struct block_device *bdev = blkif->vbd.bdev; |
438 | unsigned long secure; |
439 | + struct phys_req preq; |
440 | + |
441 | + preq.sector_number = req->u.discard.sector_number; |
442 | + preq.nr_sects = req->u.discard.nr_sectors; |
443 | |
444 | + err = xen_vbd_translate(&preq, blkif, WRITE); |
445 | + if (err) { |
446 | + pr_warn(DRV_PFX "access denied: DISCARD [%llu->%llu] on dev=%04x\n", |
447 | + preq.sector_number, |
448 | + preq.sector_number + preq.nr_sects, blkif->vbd.pdevice); |
449 | + goto fail_response; |
450 | + } |
451 | blkif->st_ds_req++; |
452 | |
453 | xen_blkif_get(blkif); |
454 | @@ -658,7 +669,7 @@ static int dispatch_discard_io(struct xen_blkif *blkif, |
455 | err = blkdev_issue_discard(bdev, req->u.discard.sector_number, |
456 | req->u.discard.nr_sectors, |
457 | GFP_KERNEL, secure); |
458 | - |
459 | +fail_response: |
460 | if (err == -EOPNOTSUPP) { |
461 | pr_debug(DRV_PFX "discard op failed, not supported\n"); |
462 | status = BLKIF_RSP_EOPNOTSUPP; |
463 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
464 | index 07f2840..6d6a0b4 100644 |
465 | --- a/drivers/cpufreq/intel_pstate.c |
466 | +++ b/drivers/cpufreq/intel_pstate.c |
467 | @@ -103,10 +103,10 @@ struct pstate_adjust_policy { |
468 | static struct pstate_adjust_policy default_policy = { |
469 | .sample_rate_ms = 10, |
470 | .deadband = 0, |
471 | - .setpoint = 109, |
472 | - .p_gain_pct = 17, |
473 | + .setpoint = 97, |
474 | + .p_gain_pct = 20, |
475 | .d_gain_pct = 0, |
476 | - .i_gain_pct = 4, |
477 | + .i_gain_pct = 0, |
478 | }; |
479 | |
480 | struct perf_limits { |
481 | @@ -468,12 +468,12 @@ static inline void intel_pstate_set_sample_time(struct cpudata *cpu) |
482 | static inline int intel_pstate_get_scaled_busy(struct cpudata *cpu) |
483 | { |
484 | int32_t busy_scaled; |
485 | - int32_t core_busy, turbo_pstate, current_pstate; |
486 | + int32_t core_busy, max_pstate, current_pstate; |
487 | |
488 | core_busy = int_tofp(cpu->samples[cpu->sample_ptr].core_pct_busy); |
489 | - turbo_pstate = int_tofp(cpu->pstate.turbo_pstate); |
490 | + max_pstate = int_tofp(cpu->pstate.max_pstate); |
491 | current_pstate = int_tofp(cpu->pstate.current_pstate); |
492 | - busy_scaled = mul_fp(core_busy, div_fp(turbo_pstate, current_pstate)); |
493 | + busy_scaled = mul_fp(core_busy, div_fp(max_pstate, current_pstate)); |
494 | |
495 | return fp_toint(busy_scaled); |
496 | } |
497 | diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c |
498 | index 5996521..84573b4 100644 |
499 | --- a/drivers/crypto/caam/caamhash.c |
500 | +++ b/drivers/crypto/caam/caamhash.c |
501 | @@ -429,7 +429,7 @@ static int hash_digest_key(struct caam_hash_ctx *ctx, const u8 *key_in, |
502 | dma_addr_t src_dma, dst_dma; |
503 | int ret = 0; |
504 | |
505 | - desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA); |
506 | + desc = kmalloc(CAAM_CMD_SZ * 8 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA); |
507 | if (!desc) { |
508 | dev_err(jrdev, "unable to allocate key input memory\n"); |
509 | return -ENOMEM; |
510 | diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c |
511 | index 7ef316f..ac1b43a 100644 |
512 | --- a/drivers/firewire/core-cdev.c |
513 | +++ b/drivers/firewire/core-cdev.c |
514 | @@ -54,6 +54,7 @@ |
515 | #define FW_CDEV_KERNEL_VERSION 5 |
516 | #define FW_CDEV_VERSION_EVENT_REQUEST2 4 |
517 | #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4 |
518 | +#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5 |
519 | |
520 | struct client { |
521 | u32 version; |
522 | @@ -1005,6 +1006,8 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) |
523 | a->channel, a->speed, a->header_size, cb, client); |
524 | if (IS_ERR(context)) |
525 | return PTR_ERR(context); |
526 | + if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW) |
527 | + context->drop_overflow_headers = true; |
528 | |
529 | /* We only support one context at this time. */ |
530 | spin_lock_irq(&client->lock); |
531 | diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c |
532 | index 9e1db64..afb701e 100644 |
533 | --- a/drivers/firewire/ohci.c |
534 | +++ b/drivers/firewire/ohci.c |
535 | @@ -2749,8 +2749,11 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr) |
536 | { |
537 | u32 *ctx_hdr; |
538 | |
539 | - if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) |
540 | + if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) { |
541 | + if (ctx->base.drop_overflow_headers) |
542 | + return; |
543 | flush_iso_completions(ctx); |
544 | + } |
545 | |
546 | ctx_hdr = ctx->header + ctx->header_length; |
547 | ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]); |
548 | @@ -2910,8 +2913,11 @@ static int handle_it_packet(struct context *context, |
549 | |
550 | sync_it_packet_for_cpu(context, d); |
551 | |
552 | - if (ctx->header_length + 4 > PAGE_SIZE) |
553 | + if (ctx->header_length + 4 > PAGE_SIZE) { |
554 | + if (ctx->base.drop_overflow_headers) |
555 | + return 1; |
556 | flush_iso_completions(ctx); |
557 | + } |
558 | |
559 | ctx_hdr = ctx->header + ctx->header_length; |
560 | ctx->last_timestamp = le16_to_cpu(last->res_count); |
561 | diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c |
562 | index 3b315ba..f968590 100644 |
563 | --- a/drivers/gpu/drm/i915/i915_dma.c |
564 | +++ b/drivers/gpu/drm/i915/i915_dma.c |
565 | @@ -1511,6 +1511,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
566 | dev_priv->dev = dev; |
567 | dev_priv->info = info; |
568 | |
569 | + spin_lock_init(&dev_priv->irq_lock); |
570 | + spin_lock_init(&dev_priv->gpu_error.lock); |
571 | + spin_lock_init(&dev_priv->rps.lock); |
572 | + mutex_init(&dev_priv->dpio_lock); |
573 | + mutex_init(&dev_priv->rps.hw_lock); |
574 | + mutex_init(&dev_priv->modeset_restore_lock); |
575 | + |
576 | i915_dump_device_info(dev_priv); |
577 | |
578 | if (i915_get_bridge_dev(dev)) { |
579 | @@ -1601,6 +1608,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
580 | intel_detect_pch(dev); |
581 | |
582 | intel_irq_init(dev); |
583 | + intel_pm_init(dev); |
584 | + intel_gt_sanitize(dev); |
585 | intel_gt_init(dev); |
586 | |
587 | /* Try to make sure MCHBAR is enabled before poking at it */ |
588 | @@ -1626,14 +1635,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
589 | if (!IS_I945G(dev) && !IS_I945GM(dev)) |
590 | pci_enable_msi(dev->pdev); |
591 | |
592 | - spin_lock_init(&dev_priv->irq_lock); |
593 | - spin_lock_init(&dev_priv->gpu_error.lock); |
594 | - spin_lock_init(&dev_priv->rps.lock); |
595 | - mutex_init(&dev_priv->dpio_lock); |
596 | - |
597 | - mutex_init(&dev_priv->rps.hw_lock); |
598 | - mutex_init(&dev_priv->modeset_restore_lock); |
599 | - |
600 | dev_priv->num_plane = 1; |
601 | if (IS_VALLEYVIEW(dev)) |
602 | dev_priv->num_plane = 2; |
603 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
604 | index a2e4953..bc6cd31 100644 |
605 | --- a/drivers/gpu/drm/i915/i915_drv.c |
606 | +++ b/drivers/gpu/drm/i915/i915_drv.c |
607 | @@ -685,7 +685,7 @@ static int i915_drm_thaw(struct drm_device *dev) |
608 | { |
609 | int error = 0; |
610 | |
611 | - intel_gt_reset(dev); |
612 | + intel_gt_sanitize(dev); |
613 | |
614 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
615 | mutex_lock(&dev->struct_mutex); |
616 | @@ -711,7 +711,7 @@ int i915_resume(struct drm_device *dev) |
617 | |
618 | pci_set_master(dev->pdev); |
619 | |
620 | - intel_gt_reset(dev); |
621 | + intel_gt_sanitize(dev); |
622 | |
623 | /* |
624 | * Platforms with opregion should have sane BIOS, older ones (gen3 and |
625 | @@ -1247,21 +1247,21 @@ hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg) |
626 | |
627 | #define __i915_read(x, y) \ |
628 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ |
629 | + unsigned long irqflags; \ |
630 | u##x val = 0; \ |
631 | + spin_lock_irqsave(&dev_priv->gt_lock, irqflags); \ |
632 | if (IS_GEN5(dev_priv->dev)) \ |
633 | ilk_dummy_write(dev_priv); \ |
634 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
635 | - unsigned long irqflags; \ |
636 | - spin_lock_irqsave(&dev_priv->gt_lock, irqflags); \ |
637 | if (dev_priv->forcewake_count == 0) \ |
638 | dev_priv->gt.force_wake_get(dev_priv); \ |
639 | val = read##y(dev_priv->regs + reg); \ |
640 | if (dev_priv->forcewake_count == 0) \ |
641 | dev_priv->gt.force_wake_put(dev_priv); \ |
642 | - spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); \ |
643 | } else { \ |
644 | val = read##y(dev_priv->regs + reg); \ |
645 | } \ |
646 | + spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); \ |
647 | trace_i915_reg_rw(false, reg, val, sizeof(val)); \ |
648 | return val; \ |
649 | } |
650 | @@ -1274,8 +1274,10 @@ __i915_read(64, q) |
651 | |
652 | #define __i915_write(x, y) \ |
653 | void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ |
654 | + unsigned long irqflags; \ |
655 | u32 __fifo_ret = 0; \ |
656 | trace_i915_reg_rw(true, reg, val, sizeof(val)); \ |
657 | + spin_lock_irqsave(&dev_priv->gt_lock, irqflags); \ |
658 | if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ |
659 | __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ |
660 | } \ |
661 | @@ -1287,6 +1289,7 @@ void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ |
662 | gen6_gt_check_fifodbg(dev_priv); \ |
663 | } \ |
664 | hsw_unclaimed_reg_check(dev_priv, reg); \ |
665 | + spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); \ |
666 | } |
667 | __i915_write(8, b) |
668 | __i915_write(16, w) |
669 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
670 | index 9669a0b..47d8b68 100644 |
671 | --- a/drivers/gpu/drm/i915/i915_drv.h |
672 | +++ b/drivers/gpu/drm/i915/i915_drv.h |
673 | @@ -491,6 +491,7 @@ enum intel_sbi_destination { |
674 | #define QUIRK_PIPEA_FORCE (1<<0) |
675 | #define QUIRK_LVDS_SSC_DISABLE (1<<1) |
676 | #define QUIRK_INVERT_BRIGHTNESS (1<<2) |
677 | +#define QUIRK_NO_PCH_PWM_ENABLE (1<<3) |
678 | |
679 | struct intel_fbdev; |
680 | struct intel_fbc_work; |
681 | @@ -1474,9 +1475,10 @@ void i915_hangcheck_elapsed(unsigned long data); |
682 | void i915_handle_error(struct drm_device *dev, bool wedged); |
683 | |
684 | extern void intel_irq_init(struct drm_device *dev); |
685 | +extern void intel_pm_init(struct drm_device *dev); |
686 | extern void intel_hpd_init(struct drm_device *dev); |
687 | extern void intel_gt_init(struct drm_device *dev); |
688 | -extern void intel_gt_reset(struct drm_device *dev); |
689 | +extern void intel_gt_sanitize(struct drm_device *dev); |
690 | |
691 | void i915_error_state_free(struct kref *error_ref); |
692 | |
693 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
694 | index 34118b0..0a30088 100644 |
695 | --- a/drivers/gpu/drm/i915/i915_gem.c |
696 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
697 | @@ -1881,6 +1881,10 @@ i915_gem_object_move_to_active(struct drm_i915_gem_object *obj, |
698 | u32 seqno = intel_ring_get_seqno(ring); |
699 | |
700 | BUG_ON(ring == NULL); |
701 | + if (obj->ring != ring && obj->last_write_seqno) { |
702 | + /* Keep the seqno relative to the current ring */ |
703 | + obj->last_write_seqno = seqno; |
704 | + } |
705 | obj->ring = ring; |
706 | |
707 | /* Add a reference if we're newly entering the active list. */ |
708 | @@ -2134,7 +2138,17 @@ void i915_gem_restore_fences(struct drm_device *dev) |
709 | |
710 | for (i = 0; i < dev_priv->num_fence_regs; i++) { |
711 | struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i]; |
712 | - i915_gem_write_fence(dev, i, reg->obj); |
713 | + |
714 | + /* |
715 | + * Commit delayed tiling changes if we have an object still |
716 | + * attached to the fence, otherwise just clear the fence. |
717 | + */ |
718 | + if (reg->obj) { |
719 | + i915_gem_object_update_fence(reg->obj, reg, |
720 | + reg->obj->tiling_mode); |
721 | + } else { |
722 | + i915_gem_write_fence(dev, i, NULL); |
723 | + } |
724 | } |
725 | } |
726 | |
727 | @@ -2534,7 +2548,6 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg, |
728 | drm_i915_private_t *dev_priv = dev->dev_private; |
729 | int fence_reg; |
730 | int fence_pitch_shift; |
731 | - uint64_t val; |
732 | |
733 | if (INTEL_INFO(dev)->gen >= 6) { |
734 | fence_reg = FENCE_REG_SANDYBRIDGE_0; |
735 | @@ -2544,8 +2557,23 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg, |
736 | fence_pitch_shift = I965_FENCE_PITCH_SHIFT; |
737 | } |
738 | |
739 | + fence_reg += reg * 8; |
740 | + |
741 | + /* To w/a incoherency with non-atomic 64-bit register updates, |
742 | + * we split the 64-bit update into two 32-bit writes. In order |
743 | + * for a partial fence not to be evaluated between writes, we |
744 | + * precede the update with write to turn off the fence register, |
745 | + * and only enable the fence as the last step. |
746 | + * |
747 | + * For extra levels of paranoia, we make sure each step lands |
748 | + * before applying the next step. |
749 | + */ |
750 | + I915_WRITE(fence_reg, 0); |
751 | + POSTING_READ(fence_reg); |
752 | + |
753 | if (obj) { |
754 | u32 size = obj->gtt_space->size; |
755 | + uint64_t val; |
756 | |
757 | val = (uint64_t)((obj->gtt_offset + size - 4096) & |
758 | 0xfffff000) << 32; |
759 | @@ -2554,12 +2582,16 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg, |
760 | if (obj->tiling_mode == I915_TILING_Y) |
761 | val |= 1 << I965_FENCE_TILING_Y_SHIFT; |
762 | val |= I965_FENCE_REG_VALID; |
763 | - } else |
764 | - val = 0; |
765 | |
766 | - fence_reg += reg * 8; |
767 | - I915_WRITE64(fence_reg, val); |
768 | - POSTING_READ(fence_reg); |
769 | + I915_WRITE(fence_reg + 4, val >> 32); |
770 | + POSTING_READ(fence_reg + 4); |
771 | + |
772 | + I915_WRITE(fence_reg + 0, val); |
773 | + POSTING_READ(fence_reg); |
774 | + } else { |
775 | + I915_WRITE(fence_reg + 4, 0); |
776 | + POSTING_READ(fence_reg + 4); |
777 | + } |
778 | } |
779 | |
780 | static void i915_write_fence_reg(struct drm_device *dev, int reg, |
781 | @@ -2654,6 +2686,10 @@ static void i915_gem_write_fence(struct drm_device *dev, int reg, |
782 | if (i915_gem_object_needs_mb(dev_priv->fence_regs[reg].obj)) |
783 | mb(); |
784 | |
785 | + WARN(obj && (!obj->stride || !obj->tiling_mode), |
786 | + "bogus fence setup with stride: 0x%x, tiling mode: %i\n", |
787 | + obj->stride, obj->tiling_mode); |
788 | + |
789 | switch (INTEL_INFO(dev)->gen) { |
790 | case 7: |
791 | case 6: |
792 | @@ -2713,6 +2749,7 @@ static void i915_gem_object_update_fence(struct drm_i915_gem_object *obj, |
793 | fence->obj = NULL; |
794 | list_del_init(&fence->lru_list); |
795 | } |
796 | + obj->fence_dirty = false; |
797 | } |
798 | |
799 | static int |
800 | @@ -2842,7 +2879,6 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj) |
801 | return 0; |
802 | |
803 | i915_gem_object_update_fence(obj, reg, enable); |
804 | - obj->fence_dirty = false; |
805 | |
806 | return 0; |
807 | } |
808 | @@ -4457,7 +4493,7 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc) |
809 | list_for_each_entry(obj, &dev_priv->mm.unbound_list, gtt_list) |
810 | if (obj->pages_pin_count == 0) |
811 | cnt += obj->base.size >> PAGE_SHIFT; |
812 | - list_for_each_entry(obj, &dev_priv->mm.inactive_list, gtt_list) |
813 | + list_for_each_entry(obj, &dev_priv->mm.inactive_list, mm_list) |
814 | if (obj->pin_count == 0 && obj->pages_pin_count == 0) |
815 | cnt += obj->base.size >> PAGE_SHIFT; |
816 | |
817 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
818 | index 56746dc..e1f4e6e 100644 |
819 | --- a/drivers/gpu/drm/i915/intel_display.c |
820 | +++ b/drivers/gpu/drm/i915/intel_display.c |
821 | @@ -8146,15 +8146,20 @@ static void intel_set_config_restore_state(struct drm_device *dev, |
822 | } |
823 | |
824 | static bool |
825 | -is_crtc_connector_off(struct drm_crtc *crtc, struct drm_connector *connectors, |
826 | - int num_connectors) |
827 | +is_crtc_connector_off(struct drm_mode_set *set) |
828 | { |
829 | int i; |
830 | |
831 | - for (i = 0; i < num_connectors; i++) |
832 | - if (connectors[i].encoder && |
833 | - connectors[i].encoder->crtc == crtc && |
834 | - connectors[i].dpms != DRM_MODE_DPMS_ON) |
835 | + if (set->num_connectors == 0) |
836 | + return false; |
837 | + |
838 | + if (WARN_ON(set->connectors == NULL)) |
839 | + return false; |
840 | + |
841 | + for (i = 0; i < set->num_connectors; i++) |
842 | + if (set->connectors[i]->encoder && |
843 | + set->connectors[i]->encoder->crtc == set->crtc && |
844 | + set->connectors[i]->dpms != DRM_MODE_DPMS_ON) |
845 | return true; |
846 | |
847 | return false; |
848 | @@ -8167,10 +8172,8 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set, |
849 | |
850 | /* We should be able to check here if the fb has the same properties |
851 | * and then just flip_or_move it */ |
852 | - if (set->connectors != NULL && |
853 | - is_crtc_connector_off(set->crtc, *set->connectors, |
854 | - set->num_connectors)) { |
855 | - config->mode_changed = true; |
856 | + if (is_crtc_connector_off(set)) { |
857 | + config->mode_changed = true; |
858 | } else if (set->crtc->fb != set->fb) { |
859 | /* If we have no fb then treat it as a full mode set */ |
860 | if (set->crtc->fb == NULL) { |
861 | @@ -8914,6 +8917,17 @@ static void quirk_invert_brightness(struct drm_device *dev) |
862 | DRM_INFO("applying inverted panel brightness quirk\n"); |
863 | } |
864 | |
865 | +/* |
866 | + * Some machines (Dell XPS13) suffer broken backlight controls if |
867 | + * BLM_PCH_PWM_ENABLE is set. |
868 | + */ |
869 | +static void quirk_no_pcm_pwm_enable(struct drm_device *dev) |
870 | +{ |
871 | + struct drm_i915_private *dev_priv = dev->dev_private; |
872 | + dev_priv->quirks |= QUIRK_NO_PCH_PWM_ENABLE; |
873 | + DRM_INFO("applying no-PCH_PWM_ENABLE quirk\n"); |
874 | +} |
875 | + |
876 | struct intel_quirk { |
877 | int device; |
878 | int subsystem_vendor; |
879 | @@ -8983,6 +8997,11 @@ static struct intel_quirk intel_quirks[] = { |
880 | |
881 | /* Acer Aspire 4736Z */ |
882 | { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness }, |
883 | + |
884 | + /* Dell XPS13 HD Sandy Bridge */ |
885 | + { 0x0116, 0x1028, 0x052e, quirk_no_pcm_pwm_enable }, |
886 | + /* Dell XPS13 HD and XPS13 FHD Ivy Bridge */ |
887 | + { 0x0166, 0x1028, 0x058b, quirk_no_pcm_pwm_enable }, |
888 | }; |
889 | |
890 | static void intel_init_quirks(struct drm_device *dev) |
891 | diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c |
892 | index eb5e6e9..33cb87f 100644 |
893 | --- a/drivers/gpu/drm/i915/intel_panel.c |
894 | +++ b/drivers/gpu/drm/i915/intel_panel.c |
895 | @@ -354,7 +354,8 @@ void intel_panel_enable_backlight(struct drm_device *dev, |
896 | POSTING_READ(reg); |
897 | I915_WRITE(reg, tmp | BLM_PWM_ENABLE); |
898 | |
899 | - if (HAS_PCH_SPLIT(dev)) { |
900 | + if (HAS_PCH_SPLIT(dev) && |
901 | + !(dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE)) { |
902 | tmp = I915_READ(BLC_PWM_PCH_CTL1); |
903 | tmp |= BLM_PCH_PWM_ENABLE; |
904 | tmp &= ~BLM_PCH_OVERRIDE_ENABLE; |
905 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
906 | index aa01128..2cfe9f6 100644 |
907 | --- a/drivers/gpu/drm/i915/intel_pm.c |
908 | +++ b/drivers/gpu/drm/i915/intel_pm.c |
909 | @@ -4486,7 +4486,7 @@ static void vlv_force_wake_put(struct drm_i915_private *dev_priv) |
910 | gen6_gt_check_fifodbg(dev_priv); |
911 | } |
912 | |
913 | -void intel_gt_reset(struct drm_device *dev) |
914 | +void intel_gt_sanitize(struct drm_device *dev) |
915 | { |
916 | struct drm_i915_private *dev_priv = dev->dev_private; |
917 | |
918 | @@ -4497,6 +4497,10 @@ void intel_gt_reset(struct drm_device *dev) |
919 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
920 | __gen6_gt_force_wake_mt_reset(dev_priv); |
921 | } |
922 | + |
923 | + /* BIOS often leaves RC6 enabled, but disable it for hw init */ |
924 | + if (INTEL_INFO(dev)->gen >= 6) |
925 | + intel_disable_gt_powersave(dev); |
926 | } |
927 | |
928 | void intel_gt_init(struct drm_device *dev) |
929 | @@ -4505,18 +4509,51 @@ void intel_gt_init(struct drm_device *dev) |
930 | |
931 | spin_lock_init(&dev_priv->gt_lock); |
932 | |
933 | - intel_gt_reset(dev); |
934 | - |
935 | if (IS_VALLEYVIEW(dev)) { |
936 | dev_priv->gt.force_wake_get = vlv_force_wake_get; |
937 | dev_priv->gt.force_wake_put = vlv_force_wake_put; |
938 | - } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { |
939 | + } else if (IS_HASWELL(dev)) { |
940 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_mt_get; |
941 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_mt_put; |
942 | + } else if (IS_IVYBRIDGE(dev)) { |
943 | + u32 ecobus; |
944 | + |
945 | + /* IVB configs may use multi-threaded forcewake */ |
946 | + |
947 | + /* A small trick here - if the bios hasn't configured |
948 | + * MT forcewake, and if the device is in RC6, then |
949 | + * force_wake_mt_get will not wake the device and the |
950 | + * ECOBUS read will return zero. Which will be |
951 | + * (correctly) interpreted by the test below as MT |
952 | + * forcewake being disabled. |
953 | + */ |
954 | + mutex_lock(&dev->struct_mutex); |
955 | + __gen6_gt_force_wake_mt_get(dev_priv); |
956 | + ecobus = I915_READ_NOTRACE(ECOBUS); |
957 | + __gen6_gt_force_wake_mt_put(dev_priv); |
958 | + mutex_unlock(&dev->struct_mutex); |
959 | + |
960 | + if (ecobus & FORCEWAKE_MT_ENABLE) { |
961 | + dev_priv->gt.force_wake_get = |
962 | + __gen6_gt_force_wake_mt_get; |
963 | + dev_priv->gt.force_wake_put = |
964 | + __gen6_gt_force_wake_mt_put; |
965 | + } else { |
966 | + DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n"); |
967 | + DRM_INFO("when using vblank-synced partial screen updates.\n"); |
968 | + dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; |
969 | + dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; |
970 | + } |
971 | } else if (IS_GEN6(dev)) { |
972 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; |
973 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; |
974 | } |
975 | +} |
976 | + |
977 | +void intel_pm_init(struct drm_device *dev) |
978 | +{ |
979 | + struct drm_i915_private *dev_priv = dev->dev_private; |
980 | + |
981 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, |
982 | intel_gen6_powersave_work); |
983 | } |
984 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c |
985 | index 1d5d613..1424f20 100644 |
986 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
987 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
988 | @@ -490,9 +490,6 @@ cleanup_pipe_control(struct intel_ring_buffer *ring) |
989 | struct pipe_control *pc = ring->private; |
990 | struct drm_i915_gem_object *obj; |
991 | |
992 | - if (!ring->private) |
993 | - return; |
994 | - |
995 | obj = pc->obj; |
996 | |
997 | kunmap(sg_page(obj->pages->sgl)); |
998 | @@ -500,7 +497,6 @@ cleanup_pipe_control(struct intel_ring_buffer *ring) |
999 | drm_gem_object_unreference(&obj->base); |
1000 | |
1001 | kfree(pc); |
1002 | - ring->private = NULL; |
1003 | } |
1004 | |
1005 | static int init_render_ring(struct intel_ring_buffer *ring) |
1006 | @@ -571,7 +567,10 @@ static void render_ring_cleanup(struct intel_ring_buffer *ring) |
1007 | if (HAS_BROKEN_CS_TLB(dev)) |
1008 | drm_gem_object_unreference(to_gem_object(ring->private)); |
1009 | |
1010 | - cleanup_pipe_control(ring); |
1011 | + if (INTEL_INFO(dev)->gen >= 5) |
1012 | + cleanup_pipe_control(ring); |
1013 | + |
1014 | + ring->private = NULL; |
1015 | } |
1016 | |
1017 | static void |
1018 | diff --git a/drivers/gpu/drm/nouveau/nv17_fence.c b/drivers/gpu/drm/nouveau/nv17_fence.c |
1019 | index 8e47a9b..22aa996 100644 |
1020 | --- a/drivers/gpu/drm/nouveau/nv17_fence.c |
1021 | +++ b/drivers/gpu/drm/nouveau/nv17_fence.c |
1022 | @@ -76,7 +76,7 @@ nv17_fence_context_new(struct nouveau_channel *chan) |
1023 | struct ttm_mem_reg *mem = &priv->bo->bo.mem; |
1024 | struct nouveau_object *object; |
1025 | u32 start = mem->start * PAGE_SIZE; |
1026 | - u32 limit = mem->start + mem->size - 1; |
1027 | + u32 limit = start + mem->size - 1; |
1028 | int ret = 0; |
1029 | |
1030 | fctx = chan->fence = kzalloc(sizeof(*fctx), GFP_KERNEL); |
1031 | diff --git a/drivers/gpu/drm/nouveau/nv50_fence.c b/drivers/gpu/drm/nouveau/nv50_fence.c |
1032 | index f9701e5..0ee3638 100644 |
1033 | --- a/drivers/gpu/drm/nouveau/nv50_fence.c |
1034 | +++ b/drivers/gpu/drm/nouveau/nv50_fence.c |
1035 | @@ -39,6 +39,8 @@ nv50_fence_context_new(struct nouveau_channel *chan) |
1036 | struct nv10_fence_chan *fctx; |
1037 | struct ttm_mem_reg *mem = &priv->bo->bo.mem; |
1038 | struct nouveau_object *object; |
1039 | + u32 start = mem->start * PAGE_SIZE; |
1040 | + u32 limit = start + mem->size - 1; |
1041 | int ret, i; |
1042 | |
1043 | fctx = chan->fence = kzalloc(sizeof(*fctx), GFP_KERNEL); |
1044 | @@ -51,26 +53,28 @@ nv50_fence_context_new(struct nouveau_channel *chan) |
1045 | fctx->base.sync = nv17_fence_sync; |
1046 | |
1047 | ret = nouveau_object_new(nv_object(chan->cli), chan->handle, |
1048 | - NvSema, 0x0002, |
1049 | + NvSema, 0x003d, |
1050 | &(struct nv_dma_class) { |
1051 | .flags = NV_DMA_TARGET_VRAM | |
1052 | NV_DMA_ACCESS_RDWR, |
1053 | - .start = mem->start * PAGE_SIZE, |
1054 | - .limit = mem->size - 1, |
1055 | + .start = start, |
1056 | + .limit = limit, |
1057 | }, sizeof(struct nv_dma_class), |
1058 | &object); |
1059 | |
1060 | /* dma objects for display sync channel semaphore blocks */ |
1061 | for (i = 0; !ret && i < dev->mode_config.num_crtc; i++) { |
1062 | struct nouveau_bo *bo = nv50_display_crtc_sema(dev, i); |
1063 | + u32 start = bo->bo.mem.start * PAGE_SIZE; |
1064 | + u32 limit = start + bo->bo.mem.size - 1; |
1065 | |
1066 | ret = nouveau_object_new(nv_object(chan->cli), chan->handle, |
1067 | NvEvoSema0 + i, 0x003d, |
1068 | &(struct nv_dma_class) { |
1069 | .flags = NV_DMA_TARGET_VRAM | |
1070 | NV_DMA_ACCESS_RDWR, |
1071 | - .start = bo->bo.offset, |
1072 | - .limit = bo->bo.offset + 0xfff, |
1073 | + .start = start, |
1074 | + .limit = limit, |
1075 | }, sizeof(struct nv_dma_class), |
1076 | &object); |
1077 | } |
1078 | diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c |
1079 | index fb441a7..15da7ef 100644 |
1080 | --- a/drivers/gpu/drm/radeon/atom.c |
1081 | +++ b/drivers/gpu/drm/radeon/atom.c |
1082 | @@ -1222,12 +1222,17 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) |
1083 | int r; |
1084 | |
1085 | mutex_lock(&ctx->mutex); |
1086 | + /* reset data block */ |
1087 | + ctx->data_block = 0; |
1088 | /* reset reg block */ |
1089 | ctx->reg_block = 0; |
1090 | /* reset fb window */ |
1091 | ctx->fb_base = 0; |
1092 | /* reset io mode */ |
1093 | ctx->io_mode = ATOM_IO_MM; |
1094 | + /* reset divmul */ |
1095 | + ctx->divmul[0] = 0; |
1096 | + ctx->divmul[1] = 0; |
1097 | r = atom_execute_table_locked(ctx, index, params); |
1098 | mutex_unlock(&ctx->mutex); |
1099 | return r; |
1100 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c |
1101 | index 064023b..32501f6 100644 |
1102 | --- a/drivers/gpu/drm/radeon/atombios_dp.c |
1103 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c |
1104 | @@ -44,6 +44,41 @@ static char *pre_emph_names[] = { |
1105 | }; |
1106 | |
1107 | /***** radeon AUX functions *****/ |
1108 | + |
1109 | +/* Atom needs data in little endian format |
1110 | + * so swap as appropriate when copying data to |
1111 | + * or from atom. Note that atom operates on |
1112 | + * dw units. |
1113 | + */ |
1114 | +static void radeon_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le) |
1115 | +{ |
1116 | +#ifdef __BIG_ENDIAN |
1117 | + u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */ |
1118 | + u32 *dst32, *src32; |
1119 | + int i; |
1120 | + |
1121 | + memcpy(src_tmp, src, num_bytes); |
1122 | + src32 = (u32 *)src_tmp; |
1123 | + dst32 = (u32 *)dst_tmp; |
1124 | + if (to_le) { |
1125 | + for (i = 0; i < ((num_bytes + 3) / 4); i++) |
1126 | + dst32[i] = cpu_to_le32(src32[i]); |
1127 | + memcpy(dst, dst_tmp, num_bytes); |
1128 | + } else { |
1129 | + u8 dws = num_bytes & ~3; |
1130 | + for (i = 0; i < ((num_bytes + 3) / 4); i++) |
1131 | + dst32[i] = le32_to_cpu(src32[i]); |
1132 | + memcpy(dst, dst_tmp, dws); |
1133 | + if (num_bytes % 4) { |
1134 | + for (i = 0; i < (num_bytes % 4); i++) |
1135 | + dst[dws+i] = dst_tmp[dws+i]; |
1136 | + } |
1137 | + } |
1138 | +#else |
1139 | + memcpy(dst, src, num_bytes); |
1140 | +#endif |
1141 | +} |
1142 | + |
1143 | union aux_channel_transaction { |
1144 | PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1; |
1145 | PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2; |
1146 | @@ -65,10 +100,10 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, |
1147 | |
1148 | base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); |
1149 | |
1150 | - memcpy(base, send, send_bytes); |
1151 | + radeon_copy_swap(base, send, send_bytes, true); |
1152 | |
1153 | - args.v1.lpAuxRequest = 0 + 4; |
1154 | - args.v1.lpDataOut = 16 + 4; |
1155 | + args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4)); |
1156 | + args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4)); |
1157 | args.v1.ucDataOutLen = 0; |
1158 | args.v1.ucChannelID = chan->rec.i2c_id; |
1159 | args.v1.ucDelay = delay / 10; |
1160 | @@ -102,7 +137,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, |
1161 | recv_bytes = recv_size; |
1162 | |
1163 | if (recv && recv_size) |
1164 | - memcpy(recv, base + 16, recv_bytes); |
1165 | + radeon_copy_swap(recv, base + 16, recv_bytes, false); |
1166 | |
1167 | return recv_bytes; |
1168 | } |
1169 | diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c |
1170 | index b9c6f76..bb9ea36 100644 |
1171 | --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c |
1172 | +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c |
1173 | @@ -157,9 +157,9 @@ static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
1174 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
1175 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
1176 | */ |
1177 | + WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id)); |
1178 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); |
1179 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); |
1180 | - WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id)); |
1181 | } |
1182 | |
1183 | |
1184 | @@ -177,6 +177,9 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode |
1185 | uint32_t offset; |
1186 | ssize_t err; |
1187 | |
1188 | + if (!dig || !dig->afmt) |
1189 | + return; |
1190 | + |
1191 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
1192 | if (!dig->afmt->enabled) |
1193 | return; |
1194 | @@ -280,6 +283,9 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) |
1195 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1196 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
1197 | |
1198 | + if (!dig || !dig->afmt) |
1199 | + return; |
1200 | + |
1201 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
1202 | if (enable && dig->afmt->enabled) |
1203 | return; |
1204 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
1205 | index 6948eb8..b60004e 100644 |
1206 | --- a/drivers/gpu/drm/radeon/r600.c |
1207 | +++ b/drivers/gpu/drm/radeon/r600.c |
1208 | @@ -2986,7 +2986,7 @@ void r600_uvd_fence_emit(struct radeon_device *rdev, |
1209 | struct radeon_fence *fence) |
1210 | { |
1211 | struct radeon_ring *ring = &rdev->ring[fence->ring]; |
1212 | - uint32_t addr = rdev->fence_drv[fence->ring].gpu_addr; |
1213 | + uint64_t addr = rdev->fence_drv[fence->ring].gpu_addr; |
1214 | |
1215 | radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0)); |
1216 | radeon_ring_write(ring, fence->seq); |
1217 | diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c |
1218 | index e73b2a7..f48240b 100644 |
1219 | --- a/drivers/gpu/drm/radeon/r600_hdmi.c |
1220 | +++ b/drivers/gpu/drm/radeon/r600_hdmi.c |
1221 | @@ -266,6 +266,9 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod |
1222 | uint32_t offset; |
1223 | ssize_t err; |
1224 | |
1225 | + if (!dig || !dig->afmt) |
1226 | + return; |
1227 | + |
1228 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
1229 | if (!dig->afmt->enabled) |
1230 | return; |
1231 | @@ -448,6 +451,9 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable) |
1232 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
1233 | u32 hdmi = HDMI0_ERROR_ACK; |
1234 | |
1235 | + if (!dig || !dig->afmt) |
1236 | + return; |
1237 | + |
1238 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
1239 | if (enable && dig->afmt->enabled) |
1240 | return; |
1241 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h |
1242 | index 142ce6c..f4dcfdd 100644 |
1243 | --- a/drivers/gpu/drm/radeon/radeon.h |
1244 | +++ b/drivers/gpu/drm/radeon/radeon.h |
1245 | @@ -408,6 +408,7 @@ struct radeon_sa_manager { |
1246 | uint64_t gpu_addr; |
1247 | void *cpu_ptr; |
1248 | uint32_t domain; |
1249 | + uint32_t align; |
1250 | }; |
1251 | |
1252 | struct radeon_sa_bo; |
1253 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c |
1254 | index 78edadc..68ce360 100644 |
1255 | --- a/drivers/gpu/drm/radeon/radeon_combios.c |
1256 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c |
1257 | @@ -147,7 +147,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, |
1258 | enum radeon_combios_table_offset table) |
1259 | { |
1260 | struct radeon_device *rdev = dev->dev_private; |
1261 | - int rev; |
1262 | + int rev, size; |
1263 | uint16_t offset = 0, check_offset; |
1264 | |
1265 | if (!rdev->bios) |
1266 | @@ -156,174 +156,106 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, |
1267 | switch (table) { |
1268 | /* absolute offset tables */ |
1269 | case COMBIOS_ASIC_INIT_1_TABLE: |
1270 | - check_offset = RBIOS16(rdev->bios_header_start + 0xc); |
1271 | - if (check_offset) |
1272 | - offset = check_offset; |
1273 | + check_offset = 0xc; |
1274 | break; |
1275 | case COMBIOS_BIOS_SUPPORT_TABLE: |
1276 | - check_offset = RBIOS16(rdev->bios_header_start + 0x14); |
1277 | - if (check_offset) |
1278 | - offset = check_offset; |
1279 | + check_offset = 0x14; |
1280 | break; |
1281 | case COMBIOS_DAC_PROGRAMMING_TABLE: |
1282 | - check_offset = RBIOS16(rdev->bios_header_start + 0x2a); |
1283 | - if (check_offset) |
1284 | - offset = check_offset; |
1285 | + check_offset = 0x2a; |
1286 | break; |
1287 | case COMBIOS_MAX_COLOR_DEPTH_TABLE: |
1288 | - check_offset = RBIOS16(rdev->bios_header_start + 0x2c); |
1289 | - if (check_offset) |
1290 | - offset = check_offset; |
1291 | + check_offset = 0x2c; |
1292 | break; |
1293 | case COMBIOS_CRTC_INFO_TABLE: |
1294 | - check_offset = RBIOS16(rdev->bios_header_start + 0x2e); |
1295 | - if (check_offset) |
1296 | - offset = check_offset; |
1297 | + check_offset = 0x2e; |
1298 | break; |
1299 | case COMBIOS_PLL_INFO_TABLE: |
1300 | - check_offset = RBIOS16(rdev->bios_header_start + 0x30); |
1301 | - if (check_offset) |
1302 | - offset = check_offset; |
1303 | + check_offset = 0x30; |
1304 | break; |
1305 | case COMBIOS_TV_INFO_TABLE: |
1306 | - check_offset = RBIOS16(rdev->bios_header_start + 0x32); |
1307 | - if (check_offset) |
1308 | - offset = check_offset; |
1309 | + check_offset = 0x32; |
1310 | break; |
1311 | case COMBIOS_DFP_INFO_TABLE: |
1312 | - check_offset = RBIOS16(rdev->bios_header_start + 0x34); |
1313 | - if (check_offset) |
1314 | - offset = check_offset; |
1315 | + check_offset = 0x34; |
1316 | break; |
1317 | case COMBIOS_HW_CONFIG_INFO_TABLE: |
1318 | - check_offset = RBIOS16(rdev->bios_header_start + 0x36); |
1319 | - if (check_offset) |
1320 | - offset = check_offset; |
1321 | + check_offset = 0x36; |
1322 | break; |
1323 | case COMBIOS_MULTIMEDIA_INFO_TABLE: |
1324 | - check_offset = RBIOS16(rdev->bios_header_start + 0x38); |
1325 | - if (check_offset) |
1326 | - offset = check_offset; |
1327 | + check_offset = 0x38; |
1328 | break; |
1329 | case COMBIOS_TV_STD_PATCH_TABLE: |
1330 | - check_offset = RBIOS16(rdev->bios_header_start + 0x3e); |
1331 | - if (check_offset) |
1332 | - offset = check_offset; |
1333 | + check_offset = 0x3e; |
1334 | break; |
1335 | case COMBIOS_LCD_INFO_TABLE: |
1336 | - check_offset = RBIOS16(rdev->bios_header_start + 0x40); |
1337 | - if (check_offset) |
1338 | - offset = check_offset; |
1339 | + check_offset = 0x40; |
1340 | break; |
1341 | case COMBIOS_MOBILE_INFO_TABLE: |
1342 | - check_offset = RBIOS16(rdev->bios_header_start + 0x42); |
1343 | - if (check_offset) |
1344 | - offset = check_offset; |
1345 | + check_offset = 0x42; |
1346 | break; |
1347 | case COMBIOS_PLL_INIT_TABLE: |
1348 | - check_offset = RBIOS16(rdev->bios_header_start + 0x46); |
1349 | - if (check_offset) |
1350 | - offset = check_offset; |
1351 | + check_offset = 0x46; |
1352 | break; |
1353 | case COMBIOS_MEM_CONFIG_TABLE: |
1354 | - check_offset = RBIOS16(rdev->bios_header_start + 0x48); |
1355 | - if (check_offset) |
1356 | - offset = check_offset; |
1357 | + check_offset = 0x48; |
1358 | break; |
1359 | case COMBIOS_SAVE_MASK_TABLE: |
1360 | - check_offset = RBIOS16(rdev->bios_header_start + 0x4a); |
1361 | - if (check_offset) |
1362 | - offset = check_offset; |
1363 | + check_offset = 0x4a; |
1364 | break; |
1365 | case COMBIOS_HARDCODED_EDID_TABLE: |
1366 | - check_offset = RBIOS16(rdev->bios_header_start + 0x4c); |
1367 | - if (check_offset) |
1368 | - offset = check_offset; |
1369 | + check_offset = 0x4c; |
1370 | break; |
1371 | case COMBIOS_ASIC_INIT_2_TABLE: |
1372 | - check_offset = RBIOS16(rdev->bios_header_start + 0x4e); |
1373 | - if (check_offset) |
1374 | - offset = check_offset; |
1375 | + check_offset = 0x4e; |
1376 | break; |
1377 | case COMBIOS_CONNECTOR_INFO_TABLE: |
1378 | - check_offset = RBIOS16(rdev->bios_header_start + 0x50); |
1379 | - if (check_offset) |
1380 | - offset = check_offset; |
1381 | + check_offset = 0x50; |
1382 | break; |
1383 | case COMBIOS_DYN_CLK_1_TABLE: |
1384 | - check_offset = RBIOS16(rdev->bios_header_start + 0x52); |
1385 | - if (check_offset) |
1386 | - offset = check_offset; |
1387 | + check_offset = 0x52; |
1388 | break; |
1389 | case COMBIOS_RESERVED_MEM_TABLE: |
1390 | - check_offset = RBIOS16(rdev->bios_header_start + 0x54); |
1391 | - if (check_offset) |
1392 | - offset = check_offset; |
1393 | + check_offset = 0x54; |
1394 | break; |
1395 | case COMBIOS_EXT_TMDS_INFO_TABLE: |
1396 | - check_offset = RBIOS16(rdev->bios_header_start + 0x58); |
1397 | - if (check_offset) |
1398 | - offset = check_offset; |
1399 | + check_offset = 0x58; |
1400 | break; |
1401 | case COMBIOS_MEM_CLK_INFO_TABLE: |
1402 | - check_offset = RBIOS16(rdev->bios_header_start + 0x5a); |
1403 | - if (check_offset) |
1404 | - offset = check_offset; |
1405 | + check_offset = 0x5a; |
1406 | break; |
1407 | case COMBIOS_EXT_DAC_INFO_TABLE: |
1408 | - check_offset = RBIOS16(rdev->bios_header_start + 0x5c); |
1409 | - if (check_offset) |
1410 | - offset = check_offset; |
1411 | + check_offset = 0x5c; |
1412 | break; |
1413 | case COMBIOS_MISC_INFO_TABLE: |
1414 | - check_offset = RBIOS16(rdev->bios_header_start + 0x5e); |
1415 | - if (check_offset) |
1416 | - offset = check_offset; |
1417 | + check_offset = 0x5e; |
1418 | break; |
1419 | case COMBIOS_CRT_INFO_TABLE: |
1420 | - check_offset = RBIOS16(rdev->bios_header_start + 0x60); |
1421 | - if (check_offset) |
1422 | - offset = check_offset; |
1423 | + check_offset = 0x60; |
1424 | break; |
1425 | case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE: |
1426 | - check_offset = RBIOS16(rdev->bios_header_start + 0x62); |
1427 | - if (check_offset) |
1428 | - offset = check_offset; |
1429 | + check_offset = 0x62; |
1430 | break; |
1431 | case COMBIOS_COMPONENT_VIDEO_INFO_TABLE: |
1432 | - check_offset = RBIOS16(rdev->bios_header_start + 0x64); |
1433 | - if (check_offset) |
1434 | - offset = check_offset; |
1435 | + check_offset = 0x64; |
1436 | break; |
1437 | case COMBIOS_FAN_SPEED_INFO_TABLE: |
1438 | - check_offset = RBIOS16(rdev->bios_header_start + 0x66); |
1439 | - if (check_offset) |
1440 | - offset = check_offset; |
1441 | + check_offset = 0x66; |
1442 | break; |
1443 | case COMBIOS_OVERDRIVE_INFO_TABLE: |
1444 | - check_offset = RBIOS16(rdev->bios_header_start + 0x68); |
1445 | - if (check_offset) |
1446 | - offset = check_offset; |
1447 | + check_offset = 0x68; |
1448 | break; |
1449 | case COMBIOS_OEM_INFO_TABLE: |
1450 | - check_offset = RBIOS16(rdev->bios_header_start + 0x6a); |
1451 | - if (check_offset) |
1452 | - offset = check_offset; |
1453 | + check_offset = 0x6a; |
1454 | break; |
1455 | case COMBIOS_DYN_CLK_2_TABLE: |
1456 | - check_offset = RBIOS16(rdev->bios_header_start + 0x6c); |
1457 | - if (check_offset) |
1458 | - offset = check_offset; |
1459 | + check_offset = 0x6c; |
1460 | break; |
1461 | case COMBIOS_POWER_CONNECTOR_INFO_TABLE: |
1462 | - check_offset = RBIOS16(rdev->bios_header_start + 0x6e); |
1463 | - if (check_offset) |
1464 | - offset = check_offset; |
1465 | + check_offset = 0x6e; |
1466 | break; |
1467 | case COMBIOS_I2C_INFO_TABLE: |
1468 | - check_offset = RBIOS16(rdev->bios_header_start + 0x70); |
1469 | - if (check_offset) |
1470 | - offset = check_offset; |
1471 | + check_offset = 0x70; |
1472 | break; |
1473 | /* relative offset tables */ |
1474 | case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */ |
1475 | @@ -439,11 +371,16 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, |
1476 | } |
1477 | break; |
1478 | default: |
1479 | + check_offset = 0; |
1480 | break; |
1481 | } |
1482 | |
1483 | - return offset; |
1484 | + size = RBIOS8(rdev->bios_header_start + 0x6); |
1485 | + /* check absolute offset tables */ |
1486 | + if (table < COMBIOS_ASIC_INIT_3_TABLE && check_offset && check_offset < size) |
1487 | + offset = RBIOS16(rdev->bios_header_start + check_offset); |
1488 | |
1489 | + return offset; |
1490 | } |
1491 | |
1492 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) |
1493 | @@ -965,16 +902,22 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct |
1494 | dac = RBIOS8(dac_info + 0x3) & 0xf; |
1495 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); |
1496 | } |
1497 | - /* if the values are all zeros, use the table */ |
1498 | - if (p_dac->ps2_pdac_adj) |
1499 | + /* if the values are zeros, use the table */ |
1500 | + if ((dac == 0) || (bg == 0)) |
1501 | + found = 0; |
1502 | + else |
1503 | found = 1; |
1504 | } |
1505 | |
1506 | /* quirks */ |
1507 | + /* Radeon 7000 (RV100) */ |
1508 | + if (((dev->pdev->device == 0x5159) && |
1509 | + (dev->pdev->subsystem_vendor == 0x174B) && |
1510 | + (dev->pdev->subsystem_device == 0x7c28)) || |
1511 | /* Radeon 9100 (R200) */ |
1512 | - if ((dev->pdev->device == 0x514D) && |
1513 | + ((dev->pdev->device == 0x514D) && |
1514 | (dev->pdev->subsystem_vendor == 0x174B) && |
1515 | - (dev->pdev->subsystem_device == 0x7149)) { |
1516 | + (dev->pdev->subsystem_device == 0x7149))) { |
1517 | /* vbios value is bad, use the default */ |
1518 | found = 0; |
1519 | } |
1520 | diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c |
1521 | index 43ec4a4..5ce190b 100644 |
1522 | --- a/drivers/gpu/drm/radeon/radeon_gart.c |
1523 | +++ b/drivers/gpu/drm/radeon/radeon_gart.c |
1524 | @@ -467,6 +467,7 @@ int radeon_vm_manager_init(struct radeon_device *rdev) |
1525 | size *= 2; |
1526 | r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager, |
1527 | RADEON_GPU_PAGE_ALIGN(size), |
1528 | + RADEON_GPU_PAGE_SIZE, |
1529 | RADEON_GEM_DOMAIN_VRAM); |
1530 | if (r) { |
1531 | dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n", |
1532 | diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c |
1533 | index 5a99d43..1fe12ab 100644 |
1534 | --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c |
1535 | +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c |
1536 | @@ -241,9 +241,6 @@ int radeon_irq_kms_init(struct radeon_device *rdev) |
1537 | { |
1538 | int r = 0; |
1539 | |
1540 | - INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); |
1541 | - INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi); |
1542 | - |
1543 | spin_lock_init(&rdev->irq.lock); |
1544 | r = drm_vblank_init(rdev->ddev, rdev->num_crtc); |
1545 | if (r) { |
1546 | @@ -265,6 +262,10 @@ int radeon_irq_kms_init(struct radeon_device *rdev) |
1547 | rdev->irq.installed = false; |
1548 | return r; |
1549 | } |
1550 | + |
1551 | + INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); |
1552 | + INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi); |
1553 | + |
1554 | DRM_INFO("radeon: irq initialized.\n"); |
1555 | return 0; |
1556 | } |
1557 | @@ -284,8 +285,8 @@ void radeon_irq_kms_fini(struct radeon_device *rdev) |
1558 | rdev->irq.installed = false; |
1559 | if (rdev->msi_enabled) |
1560 | pci_disable_msi(rdev->pdev); |
1561 | + flush_work(&rdev->hotplug_work); |
1562 | } |
1563 | - flush_work(&rdev->hotplug_work); |
1564 | } |
1565 | |
1566 | /** |
1567 | diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h |
1568 | index e2cb80a..2943823 100644 |
1569 | --- a/drivers/gpu/drm/radeon/radeon_object.h |
1570 | +++ b/drivers/gpu/drm/radeon/radeon_object.h |
1571 | @@ -158,7 +158,7 @@ static inline void * radeon_sa_bo_cpu_addr(struct radeon_sa_bo *sa_bo) |
1572 | |
1573 | extern int radeon_sa_bo_manager_init(struct radeon_device *rdev, |
1574 | struct radeon_sa_manager *sa_manager, |
1575 | - unsigned size, u32 domain); |
1576 | + unsigned size, u32 align, u32 domain); |
1577 | extern void radeon_sa_bo_manager_fini(struct radeon_device *rdev, |
1578 | struct radeon_sa_manager *sa_manager); |
1579 | extern int radeon_sa_bo_manager_start(struct radeon_device *rdev, |
1580 | diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c |
1581 | index 82434018..83f6295 100644 |
1582 | --- a/drivers/gpu/drm/radeon/radeon_ring.c |
1583 | +++ b/drivers/gpu/drm/radeon/radeon_ring.c |
1584 | @@ -224,6 +224,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev) |
1585 | } |
1586 | r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo, |
1587 | RADEON_IB_POOL_SIZE*64*1024, |
1588 | + RADEON_GPU_PAGE_SIZE, |
1589 | RADEON_GEM_DOMAIN_GTT); |
1590 | if (r) { |
1591 | return r; |
1592 | diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c |
1593 | index 0abe5a9..f0bac68 100644 |
1594 | --- a/drivers/gpu/drm/radeon/radeon_sa.c |
1595 | +++ b/drivers/gpu/drm/radeon/radeon_sa.c |
1596 | @@ -49,7 +49,7 @@ static void radeon_sa_bo_try_free(struct radeon_sa_manager *sa_manager); |
1597 | |
1598 | int radeon_sa_bo_manager_init(struct radeon_device *rdev, |
1599 | struct radeon_sa_manager *sa_manager, |
1600 | - unsigned size, u32 domain) |
1601 | + unsigned size, u32 align, u32 domain) |
1602 | { |
1603 | int i, r; |
1604 | |
1605 | @@ -57,13 +57,14 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev, |
1606 | sa_manager->bo = NULL; |
1607 | sa_manager->size = size; |
1608 | sa_manager->domain = domain; |
1609 | + sa_manager->align = align; |
1610 | sa_manager->hole = &sa_manager->olist; |
1611 | INIT_LIST_HEAD(&sa_manager->olist); |
1612 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { |
1613 | INIT_LIST_HEAD(&sa_manager->flist[i]); |
1614 | } |
1615 | |
1616 | - r = radeon_bo_create(rdev, size, RADEON_GPU_PAGE_SIZE, true, |
1617 | + r = radeon_bo_create(rdev, size, align, true, |
1618 | domain, NULL, &sa_manager->bo); |
1619 | if (r) { |
1620 | dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r); |
1621 | @@ -317,7 +318,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev, |
1622 | unsigned tries[RADEON_NUM_RINGS]; |
1623 | int i, r; |
1624 | |
1625 | - BUG_ON(align > RADEON_GPU_PAGE_SIZE); |
1626 | + BUG_ON(align > sa_manager->align); |
1627 | BUG_ON(size > sa_manager->size); |
1628 | |
1629 | *sa_bo = kmalloc(sizeof(struct radeon_sa_bo), GFP_KERNEL); |
1630 | diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c |
1631 | index 4c605c7..deb5c25 100644 |
1632 | --- a/drivers/hv/hv_balloon.c |
1633 | +++ b/drivers/hv/hv_balloon.c |
1634 | @@ -562,7 +562,7 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size, |
1635 | struct hv_hotadd_state *has) |
1636 | { |
1637 | int ret = 0; |
1638 | - int i, nid, t; |
1639 | + int i, nid; |
1640 | unsigned long start_pfn; |
1641 | unsigned long processed_pfn; |
1642 | unsigned long total_pfn = pfn_count; |
1643 | @@ -607,14 +607,11 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size, |
1644 | |
1645 | /* |
1646 | * Wait for the memory block to be onlined. |
1647 | + * Since the hot add has succeeded, it is ok to |
1648 | + * proceed even if the pages in the hot added region |
1649 | + * have not been "onlined" within the allowed time. |
1650 | */ |
1651 | - t = wait_for_completion_timeout(&dm_device.ol_waitevent, 5*HZ); |
1652 | - if (t == 0) { |
1653 | - pr_info("hot_add memory timedout\n"); |
1654 | - has->ha_end_pfn -= HA_CHUNK; |
1655 | - has->covered_end_pfn -= processed_pfn; |
1656 | - break; |
1657 | - } |
1658 | + wait_for_completion_timeout(&dm_device.ol_waitevent, 5*HZ); |
1659 | |
1660 | } |
1661 | |
1662 | @@ -978,6 +975,14 @@ static void post_status(struct hv_dynmem_device *dm) |
1663 | dm->num_pages_ballooned + |
1664 | compute_balloon_floor(); |
1665 | |
1666 | + /* |
1667 | + * If our transaction ID is no longer current, just don't |
1668 | + * send the status. This can happen if we were interrupted |
1669 | + * after we picked our transaction ID. |
1670 | + */ |
1671 | + if (status.hdr.trans_id != atomic_read(&trans_id)) |
1672 | + return; |
1673 | + |
1674 | vmbus_sendpacket(dm->dev->channel, &status, |
1675 | sizeof(struct dm_status), |
1676 | (unsigned long)NULL, |
1677 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
1678 | index 41712f0..5849dc0 100644 |
1679 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
1680 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
1681 | @@ -388,6 +388,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
1682 | init_waitqueue_head(&isert_conn->conn_wait_comp_err); |
1683 | kref_init(&isert_conn->conn_kref); |
1684 | kref_get(&isert_conn->conn_kref); |
1685 | + mutex_init(&isert_conn->conn_mutex); |
1686 | |
1687 | cma_id->context = isert_conn; |
1688 | isert_conn->conn_cm_id = cma_id; |
1689 | @@ -540,15 +541,32 @@ isert_disconnect_work(struct work_struct *work) |
1690 | struct isert_conn, conn_logout_work); |
1691 | |
1692 | pr_debug("isert_disconnect_work(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); |
1693 | - |
1694 | + mutex_lock(&isert_conn->conn_mutex); |
1695 | isert_conn->state = ISER_CONN_DOWN; |
1696 | |
1697 | if (isert_conn->post_recv_buf_count == 0 && |
1698 | atomic_read(&isert_conn->post_send_buf_count) == 0) { |
1699 | pr_debug("Calling wake_up(&isert_conn->conn_wait);\n"); |
1700 | - wake_up(&isert_conn->conn_wait); |
1701 | + mutex_unlock(&isert_conn->conn_mutex); |
1702 | + goto wake_up; |
1703 | + } |
1704 | + if (!isert_conn->conn_cm_id) { |
1705 | + mutex_unlock(&isert_conn->conn_mutex); |
1706 | + isert_put_conn(isert_conn); |
1707 | + return; |
1708 | + } |
1709 | + if (!isert_conn->logout_posted) { |
1710 | + pr_debug("Calling rdma_disconnect for !logout_posted from" |
1711 | + " isert_disconnect_work\n"); |
1712 | + rdma_disconnect(isert_conn->conn_cm_id); |
1713 | + mutex_unlock(&isert_conn->conn_mutex); |
1714 | + iscsit_cause_connection_reinstatement(isert_conn->conn, 0); |
1715 | + goto wake_up; |
1716 | } |
1717 | + mutex_unlock(&isert_conn->conn_mutex); |
1718 | |
1719 | +wake_up: |
1720 | + wake_up(&isert_conn->conn_wait); |
1721 | isert_put_conn(isert_conn); |
1722 | } |
1723 | |
1724 | @@ -934,16 +952,11 @@ isert_handle_scsi_cmd(struct isert_conn *isert_conn, |
1725 | } |
1726 | |
1727 | sequence_cmd: |
1728 | - rc = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); |
1729 | + rc = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); |
1730 | |
1731 | if (!rc && dump_payload == false && unsol_data) |
1732 | iscsit_set_unsoliticed_dataout(cmd); |
1733 | |
1734 | - if (rc == CMDSN_ERROR_CANNOT_RECOVER) |
1735 | - return iscsit_add_reject_from_cmd( |
1736 | - ISCSI_REASON_PROTOCOL_ERROR, |
1737 | - 1, 0, (unsigned char *)hdr, cmd); |
1738 | - |
1739 | return 0; |
1740 | } |
1741 | |
1742 | @@ -1184,14 +1197,12 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
1743 | { |
1744 | struct iscsi_cmd *cmd = &isert_cmd->iscsi_cmd; |
1745 | struct isert_conn *isert_conn = isert_cmd->conn; |
1746 | - struct iscsi_conn *conn; |
1747 | + struct iscsi_conn *conn = isert_conn->conn; |
1748 | |
1749 | pr_debug("Entering isert_put_cmd: %p\n", isert_cmd); |
1750 | |
1751 | switch (cmd->iscsi_opcode) { |
1752 | case ISCSI_OP_SCSI_CMD: |
1753 | - conn = isert_conn->conn; |
1754 | - |
1755 | spin_lock_bh(&conn->cmd_lock); |
1756 | if (!list_empty(&cmd->i_conn_node)) |
1757 | list_del(&cmd->i_conn_node); |
1758 | @@ -1201,16 +1212,18 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
1759 | iscsit_stop_dataout_timer(cmd); |
1760 | |
1761 | isert_unmap_cmd(isert_cmd, isert_conn); |
1762 | - /* |
1763 | - * Fall-through |
1764 | - */ |
1765 | + transport_generic_free_cmd(&cmd->se_cmd, 0); |
1766 | + break; |
1767 | case ISCSI_OP_SCSI_TMFUNC: |
1768 | + spin_lock_bh(&conn->cmd_lock); |
1769 | + if (!list_empty(&cmd->i_conn_node)) |
1770 | + list_del(&cmd->i_conn_node); |
1771 | + spin_unlock_bh(&conn->cmd_lock); |
1772 | + |
1773 | transport_generic_free_cmd(&cmd->se_cmd, 0); |
1774 | break; |
1775 | case ISCSI_OP_REJECT: |
1776 | case ISCSI_OP_NOOP_OUT: |
1777 | - conn = isert_conn->conn; |
1778 | - |
1779 | spin_lock_bh(&conn->cmd_lock); |
1780 | if (!list_empty(&cmd->i_conn_node)) |
1781 | list_del(&cmd->i_conn_node); |
1782 | @@ -1222,6 +1235,9 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
1783 | * associated cmd->se_cmd needs to be released. |
1784 | */ |
1785 | if (cmd->se_cmd.se_tfo != NULL) { |
1786 | + pr_debug("Calling transport_generic_free_cmd from" |
1787 | + " isert_put_cmd for 0x%02x\n", |
1788 | + cmd->iscsi_opcode); |
1789 | transport_generic_free_cmd(&cmd->se_cmd, 0); |
1790 | break; |
1791 | } |
1792 | @@ -1318,8 +1334,8 @@ isert_do_control_comp(struct work_struct *work) |
1793 | atomic_dec(&isert_conn->post_send_buf_count); |
1794 | |
1795 | cmd->i_state = ISTATE_SENT_STATUS; |
1796 | - complete(&cmd->reject_comp); |
1797 | isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); |
1798 | + break; |
1799 | case ISTATE_SEND_LOGOUTRSP: |
1800 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); |
1801 | /* |
1802 | @@ -1345,7 +1361,8 @@ isert_response_completion(struct iser_tx_desc *tx_desc, |
1803 | struct iscsi_cmd *cmd = &isert_cmd->iscsi_cmd; |
1804 | |
1805 | if (cmd->i_state == ISTATE_SEND_TASKMGTRSP || |
1806 | - cmd->i_state == ISTATE_SEND_LOGOUTRSP) { |
1807 | + cmd->i_state == ISTATE_SEND_LOGOUTRSP || |
1808 | + cmd->i_state == ISTATE_SEND_REJECT) { |
1809 | isert_unmap_tx_desc(tx_desc, ib_dev); |
1810 | |
1811 | INIT_WORK(&isert_cmd->comp_work, isert_do_control_comp); |
1812 | @@ -1419,7 +1436,11 @@ isert_cq_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn) |
1813 | pr_debug("isert_cq_comp_err >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); |
1814 | pr_debug("Calling wake_up from isert_cq_comp_err\n"); |
1815 | |
1816 | - isert_conn->state = ISER_CONN_TERMINATING; |
1817 | + mutex_lock(&isert_conn->conn_mutex); |
1818 | + if (isert_conn->state != ISER_CONN_DOWN) |
1819 | + isert_conn->state = ISER_CONN_TERMINATING; |
1820 | + mutex_unlock(&isert_conn->conn_mutex); |
1821 | + |
1822 | wake_up(&isert_conn->conn_wait_comp_err); |
1823 | } |
1824 | } |
1825 | @@ -1637,11 +1658,25 @@ isert_put_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn) |
1826 | struct isert_cmd, iscsi_cmd); |
1827 | struct isert_conn *isert_conn = (struct isert_conn *)conn->context; |
1828 | struct ib_send_wr *send_wr = &isert_cmd->tx_desc.send_wr; |
1829 | + struct ib_device *ib_dev = isert_conn->conn_cm_id->device; |
1830 | + struct ib_sge *tx_dsg = &isert_cmd->tx_desc.tx_sg[1]; |
1831 | + struct iscsi_reject *hdr = |
1832 | + (struct iscsi_reject *)&isert_cmd->tx_desc.iscsi_header; |
1833 | |
1834 | isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc); |
1835 | - iscsit_build_reject(cmd, conn, (struct iscsi_reject *) |
1836 | - &isert_cmd->tx_desc.iscsi_header); |
1837 | + iscsit_build_reject(cmd, conn, hdr); |
1838 | isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc); |
1839 | + |
1840 | + hton24(hdr->dlength, ISCSI_HDR_LEN); |
1841 | + isert_cmd->sense_buf_dma = ib_dma_map_single(ib_dev, |
1842 | + (void *)cmd->buf_ptr, ISCSI_HDR_LEN, |
1843 | + DMA_TO_DEVICE); |
1844 | + isert_cmd->sense_buf_len = ISCSI_HDR_LEN; |
1845 | + tx_dsg->addr = isert_cmd->sense_buf_dma; |
1846 | + tx_dsg->length = ISCSI_HDR_LEN; |
1847 | + tx_dsg->lkey = isert_conn->conn_mr->lkey; |
1848 | + isert_cmd->tx_desc.num_sge = 2; |
1849 | + |
1850 | isert_init_send_wr(isert_cmd, send_wr); |
1851 | |
1852 | pr_debug("Posting Reject IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n"); |
1853 | @@ -2175,6 +2210,17 @@ isert_free_np(struct iscsi_np *np) |
1854 | kfree(isert_np); |
1855 | } |
1856 | |
1857 | +static int isert_check_state(struct isert_conn *isert_conn, int state) |
1858 | +{ |
1859 | + int ret; |
1860 | + |
1861 | + mutex_lock(&isert_conn->conn_mutex); |
1862 | + ret = (isert_conn->state == state); |
1863 | + mutex_unlock(&isert_conn->conn_mutex); |
1864 | + |
1865 | + return ret; |
1866 | +} |
1867 | + |
1868 | static void isert_free_conn(struct iscsi_conn *conn) |
1869 | { |
1870 | struct isert_conn *isert_conn = conn->context; |
1871 | @@ -2184,26 +2230,43 @@ static void isert_free_conn(struct iscsi_conn *conn) |
1872 | * Decrement post_send_buf_count for special case when called |
1873 | * from isert_do_control_comp() -> iscsit_logout_post_handler() |
1874 | */ |
1875 | + mutex_lock(&isert_conn->conn_mutex); |
1876 | if (isert_conn->logout_posted) |
1877 | atomic_dec(&isert_conn->post_send_buf_count); |
1878 | |
1879 | - if (isert_conn->conn_cm_id) |
1880 | + if (isert_conn->conn_cm_id && isert_conn->state != ISER_CONN_DOWN) { |
1881 | + pr_debug("Calling rdma_disconnect from isert_free_conn\n"); |
1882 | rdma_disconnect(isert_conn->conn_cm_id); |
1883 | + } |
1884 | /* |
1885 | * Only wait for conn_wait_comp_err if the isert_conn made it |
1886 | * into full feature phase.. |
1887 | */ |
1888 | - if (isert_conn->state > ISER_CONN_INIT) { |
1889 | + if (isert_conn->state == ISER_CONN_UP) { |
1890 | pr_debug("isert_free_conn: Before wait_event comp_err %d\n", |
1891 | isert_conn->state); |
1892 | + mutex_unlock(&isert_conn->conn_mutex); |
1893 | + |
1894 | wait_event(isert_conn->conn_wait_comp_err, |
1895 | - isert_conn->state == ISER_CONN_TERMINATING); |
1896 | - pr_debug("isert_free_conn: After wait_event #1 >>>>>>>>>>>>\n"); |
1897 | + (isert_check_state(isert_conn, ISER_CONN_TERMINATING))); |
1898 | + |
1899 | + wait_event(isert_conn->conn_wait, |
1900 | + (isert_check_state(isert_conn, ISER_CONN_DOWN))); |
1901 | + |
1902 | + isert_put_conn(isert_conn); |
1903 | + return; |
1904 | + } |
1905 | + if (isert_conn->state == ISER_CONN_INIT) { |
1906 | + mutex_unlock(&isert_conn->conn_mutex); |
1907 | + isert_put_conn(isert_conn); |
1908 | + return; |
1909 | } |
1910 | + pr_debug("isert_free_conn: wait_event conn_wait %d\n", |
1911 | + isert_conn->state); |
1912 | + mutex_unlock(&isert_conn->conn_mutex); |
1913 | |
1914 | - pr_debug("isert_free_conn: wait_event conn_wait %d\n", isert_conn->state); |
1915 | - wait_event(isert_conn->conn_wait, isert_conn->state == ISER_CONN_DOWN); |
1916 | - pr_debug("isert_free_conn: After wait_event #2 >>>>>>>>>>>>>>>>>>>>\n"); |
1917 | + wait_event(isert_conn->conn_wait, |
1918 | + (isert_check_state(isert_conn, ISER_CONN_DOWN))); |
1919 | |
1920 | isert_put_conn(isert_conn); |
1921 | } |
1922 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h |
1923 | index b104f4c..5795c82 100644 |
1924 | --- a/drivers/infiniband/ulp/isert/ib_isert.h |
1925 | +++ b/drivers/infiniband/ulp/isert/ib_isert.h |
1926 | @@ -102,6 +102,7 @@ struct isert_conn { |
1927 | struct ib_qp *conn_qp; |
1928 | struct isert_device *conn_device; |
1929 | struct work_struct conn_logout_work; |
1930 | + struct mutex conn_mutex; |
1931 | wait_queue_head_t conn_wait; |
1932 | wait_queue_head_t conn_wait_comp_err; |
1933 | struct kref conn_kref; |
1934 | diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c |
1935 | index aa04f02..81a79b7 100644 |
1936 | --- a/drivers/md/dm-ioctl.c |
1937 | +++ b/drivers/md/dm-ioctl.c |
1938 | @@ -1644,7 +1644,10 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern |
1939 | } |
1940 | |
1941 | if (!dmi) { |
1942 | + unsigned noio_flag; |
1943 | + noio_flag = memalloc_noio_save(); |
1944 | dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_REPEAT | __GFP_HIGH, PAGE_KERNEL); |
1945 | + memalloc_noio_restore(noio_flag); |
1946 | if (dmi) |
1947 | *param_flags |= DM_PARAMS_VMALLOC; |
1948 | } |
1949 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
1950 | index bdf26f5..5adede1 100644 |
1951 | --- a/drivers/md/dm-mpath.c |
1952 | +++ b/drivers/md/dm-mpath.c |
1953 | @@ -1561,7 +1561,6 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd, |
1954 | unsigned long flags; |
1955 | int r; |
1956 | |
1957 | -again: |
1958 | bdev = NULL; |
1959 | mode = 0; |
1960 | r = 0; |
1961 | @@ -1579,7 +1578,7 @@ again: |
1962 | } |
1963 | |
1964 | if ((pgpath && m->queue_io) || (!pgpath && m->queue_if_no_path)) |
1965 | - r = -EAGAIN; |
1966 | + r = -ENOTCONN; |
1967 | else if (!bdev) |
1968 | r = -EIO; |
1969 | |
1970 | @@ -1591,11 +1590,8 @@ again: |
1971 | if (!r && ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) |
1972 | r = scsi_verify_blk_ioctl(NULL, cmd); |
1973 | |
1974 | - if (r == -EAGAIN && !fatal_signal_pending(current)) { |
1975 | + if (r == -ENOTCONN && !fatal_signal_pending(current)) |
1976 | queue_work(kmultipathd, &m->process_queued_ios); |
1977 | - msleep(10); |
1978 | - goto again; |
1979 | - } |
1980 | |
1981 | return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
1982 | } |
1983 | diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c |
1984 | index b948fd8..0d2e812 100644 |
1985 | --- a/drivers/md/dm-verity.c |
1986 | +++ b/drivers/md/dm-verity.c |
1987 | @@ -831,9 +831,8 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) |
1988 | for (i = v->levels - 1; i >= 0; i--) { |
1989 | sector_t s; |
1990 | v->hash_level_block[i] = hash_position; |
1991 | - s = verity_position_at_level(v, v->data_blocks, i); |
1992 | - s = (s >> v->hash_per_block_bits) + |
1993 | - !!(s & ((1 << v->hash_per_block_bits) - 1)); |
1994 | + s = (v->data_blocks + ((sector_t)1 << ((i + 1) * v->hash_per_block_bits)) - 1) |
1995 | + >> ((i + 1) * v->hash_per_block_bits); |
1996 | if (hash_position + s < hash_position) { |
1997 | ti->error = "Hash device offset overflow"; |
1998 | r = -E2BIG; |
1999 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
2000 | index d5370a9..33f2010 100644 |
2001 | --- a/drivers/md/dm.c |
2002 | +++ b/drivers/md/dm.c |
2003 | @@ -386,10 +386,12 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode, |
2004 | unsigned int cmd, unsigned long arg) |
2005 | { |
2006 | struct mapped_device *md = bdev->bd_disk->private_data; |
2007 | - struct dm_table *map = dm_get_live_table(md); |
2008 | + struct dm_table *map; |
2009 | struct dm_target *tgt; |
2010 | int r = -ENOTTY; |
2011 | |
2012 | +retry: |
2013 | + map = dm_get_live_table(md); |
2014 | if (!map || !dm_table_get_size(map)) |
2015 | goto out; |
2016 | |
2017 | @@ -410,6 +412,11 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode, |
2018 | out: |
2019 | dm_table_put(map); |
2020 | |
2021 | + if (r == -ENOTCONN) { |
2022 | + msleep(10); |
2023 | + goto retry; |
2024 | + } |
2025 | + |
2026 | return r; |
2027 | } |
2028 | |
2029 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
2030 | index 9b82377..51f0345 100644 |
2031 | --- a/drivers/md/md.c |
2032 | +++ b/drivers/md/md.c |
2033 | @@ -7697,20 +7697,6 @@ static int remove_and_add_spares(struct mddev *mddev, |
2034 | continue; |
2035 | |
2036 | rdev->recovery_offset = 0; |
2037 | - if (rdev->saved_raid_disk >= 0 && mddev->in_sync) { |
2038 | - spin_lock_irq(&mddev->write_lock); |
2039 | - if (mddev->in_sync) |
2040 | - /* OK, this device, which is in_sync, |
2041 | - * will definitely be noticed before |
2042 | - * the next write, so recovery isn't |
2043 | - * needed. |
2044 | - */ |
2045 | - rdev->recovery_offset = mddev->recovery_cp; |
2046 | - spin_unlock_irq(&mddev->write_lock); |
2047 | - } |
2048 | - if (mddev->ro && rdev->recovery_offset != MaxSector) |
2049 | - /* not safe to add this disk now */ |
2050 | - continue; |
2051 | if (mddev->pers-> |
2052 | hot_add_disk(mddev, rdev) == 0) { |
2053 | if (sysfs_link_rdev(mddev, rdev)) |
2054 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
2055 | index 6e17f81..6f48244 100644 |
2056 | --- a/drivers/md/raid1.c |
2057 | +++ b/drivers/md/raid1.c |
2058 | @@ -1848,6 +1848,36 @@ static int process_checks(struct r1bio *r1_bio) |
2059 | int i; |
2060 | int vcnt; |
2061 | |
2062 | + /* Fix variable parts of all bios */ |
2063 | + vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9); |
2064 | + for (i = 0; i < conf->raid_disks * 2; i++) { |
2065 | + int j; |
2066 | + int size; |
2067 | + struct bio *b = r1_bio->bios[i]; |
2068 | + if (b->bi_end_io != end_sync_read) |
2069 | + continue; |
2070 | + /* fixup the bio for reuse */ |
2071 | + bio_reset(b); |
2072 | + b->bi_vcnt = vcnt; |
2073 | + b->bi_size = r1_bio->sectors << 9; |
2074 | + b->bi_sector = r1_bio->sector + |
2075 | + conf->mirrors[i].rdev->data_offset; |
2076 | + b->bi_bdev = conf->mirrors[i].rdev->bdev; |
2077 | + b->bi_end_io = end_sync_read; |
2078 | + b->bi_private = r1_bio; |
2079 | + |
2080 | + size = b->bi_size; |
2081 | + for (j = 0; j < vcnt ; j++) { |
2082 | + struct bio_vec *bi; |
2083 | + bi = &b->bi_io_vec[j]; |
2084 | + bi->bv_offset = 0; |
2085 | + if (size > PAGE_SIZE) |
2086 | + bi->bv_len = PAGE_SIZE; |
2087 | + else |
2088 | + bi->bv_len = size; |
2089 | + size -= PAGE_SIZE; |
2090 | + } |
2091 | + } |
2092 | for (primary = 0; primary < conf->raid_disks * 2; primary++) |
2093 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && |
2094 | test_bit(BIO_UPTODATE, &r1_bio->bios[primary]->bi_flags)) { |
2095 | @@ -1856,12 +1886,10 @@ static int process_checks(struct r1bio *r1_bio) |
2096 | break; |
2097 | } |
2098 | r1_bio->read_disk = primary; |
2099 | - vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9); |
2100 | for (i = 0; i < conf->raid_disks * 2; i++) { |
2101 | int j; |
2102 | struct bio *pbio = r1_bio->bios[primary]; |
2103 | struct bio *sbio = r1_bio->bios[i]; |
2104 | - int size; |
2105 | |
2106 | if (sbio->bi_end_io != end_sync_read) |
2107 | continue; |
2108 | @@ -1887,27 +1915,6 @@ static int process_checks(struct r1bio *r1_bio) |
2109 | rdev_dec_pending(conf->mirrors[i].rdev, mddev); |
2110 | continue; |
2111 | } |
2112 | - /* fixup the bio for reuse */ |
2113 | - bio_reset(sbio); |
2114 | - sbio->bi_vcnt = vcnt; |
2115 | - sbio->bi_size = r1_bio->sectors << 9; |
2116 | - sbio->bi_sector = r1_bio->sector + |
2117 | - conf->mirrors[i].rdev->data_offset; |
2118 | - sbio->bi_bdev = conf->mirrors[i].rdev->bdev; |
2119 | - sbio->bi_end_io = end_sync_read; |
2120 | - sbio->bi_private = r1_bio; |
2121 | - |
2122 | - size = sbio->bi_size; |
2123 | - for (j = 0; j < vcnt ; j++) { |
2124 | - struct bio_vec *bi; |
2125 | - bi = &sbio->bi_io_vec[j]; |
2126 | - bi->bv_offset = 0; |
2127 | - if (size > PAGE_SIZE) |
2128 | - bi->bv_len = PAGE_SIZE; |
2129 | - else |
2130 | - bi->bv_len = size; |
2131 | - size -= PAGE_SIZE; |
2132 | - } |
2133 | |
2134 | bio_copy_data(sbio, pbio); |
2135 | } |
2136 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
2137 | index d61eb7e..081bb33 100644 |
2138 | --- a/drivers/md/raid10.c |
2139 | +++ b/drivers/md/raid10.c |
2140 | @@ -2268,12 +2268,18 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) |
2141 | d = r10_bio->devs[1].devnum; |
2142 | wbio = r10_bio->devs[1].bio; |
2143 | wbio2 = r10_bio->devs[1].repl_bio; |
2144 | + /* Need to test wbio2->bi_end_io before we call |
2145 | + * generic_make_request as if the former is NULL, |
2146 | + * the latter is free to free wbio2. |
2147 | + */ |
2148 | + if (wbio2 && !wbio2->bi_end_io) |
2149 | + wbio2 = NULL; |
2150 | if (wbio->bi_end_io) { |
2151 | atomic_inc(&conf->mirrors[d].rdev->nr_pending); |
2152 | md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(wbio)); |
2153 | generic_make_request(wbio); |
2154 | } |
2155 | - if (wbio2 && wbio2->bi_end_io) { |
2156 | + if (wbio2) { |
2157 | atomic_inc(&conf->mirrors[d].replacement->nr_pending); |
2158 | md_sync_acct(conf->mirrors[d].replacement->bdev, |
2159 | bio_sectors(wbio2)); |
2160 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
2161 | index 05e4a10..a35b846 100644 |
2162 | --- a/drivers/md/raid5.c |
2163 | +++ b/drivers/md/raid5.c |
2164 | @@ -3462,6 +3462,7 @@ static void handle_stripe(struct stripe_head *sh) |
2165 | test_and_clear_bit(STRIPE_SYNC_REQUESTED, &sh->state)) { |
2166 | set_bit(STRIPE_SYNCING, &sh->state); |
2167 | clear_bit(STRIPE_INSYNC, &sh->state); |
2168 | + clear_bit(STRIPE_REPLACED, &sh->state); |
2169 | } |
2170 | spin_unlock(&sh->stripe_lock); |
2171 | } |
2172 | @@ -3607,19 +3608,23 @@ static void handle_stripe(struct stripe_head *sh) |
2173 | handle_parity_checks5(conf, sh, &s, disks); |
2174 | } |
2175 | |
2176 | - if (s.replacing && s.locked == 0 |
2177 | - && !test_bit(STRIPE_INSYNC, &sh->state)) { |
2178 | + if ((s.replacing || s.syncing) && s.locked == 0 |
2179 | + && !test_bit(STRIPE_COMPUTE_RUN, &sh->state) |
2180 | + && !test_bit(STRIPE_REPLACED, &sh->state)) { |
2181 | /* Write out to replacement devices where possible */ |
2182 | for (i = 0; i < conf->raid_disks; i++) |
2183 | - if (test_bit(R5_UPTODATE, &sh->dev[i].flags) && |
2184 | - test_bit(R5_NeedReplace, &sh->dev[i].flags)) { |
2185 | + if (test_bit(R5_NeedReplace, &sh->dev[i].flags)) { |
2186 | + WARN_ON(!test_bit(R5_UPTODATE, &sh->dev[i].flags)); |
2187 | set_bit(R5_WantReplace, &sh->dev[i].flags); |
2188 | set_bit(R5_LOCKED, &sh->dev[i].flags); |
2189 | s.locked++; |
2190 | } |
2191 | - set_bit(STRIPE_INSYNC, &sh->state); |
2192 | + if (s.replacing) |
2193 | + set_bit(STRIPE_INSYNC, &sh->state); |
2194 | + set_bit(STRIPE_REPLACED, &sh->state); |
2195 | } |
2196 | if ((s.syncing || s.replacing) && s.locked == 0 && |
2197 | + !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && |
2198 | test_bit(STRIPE_INSYNC, &sh->state)) { |
2199 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); |
2200 | clear_bit(STRIPE_SYNCING, &sh->state); |
2201 | diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h |
2202 | index b0b663b..70c4932 100644 |
2203 | --- a/drivers/md/raid5.h |
2204 | +++ b/drivers/md/raid5.h |
2205 | @@ -306,6 +306,7 @@ enum { |
2206 | STRIPE_SYNC_REQUESTED, |
2207 | STRIPE_SYNCING, |
2208 | STRIPE_INSYNC, |
2209 | + STRIPE_REPLACED, |
2210 | STRIPE_PREREAD_ACTIVE, |
2211 | STRIPE_DELAYED, |
2212 | STRIPE_DEGRADED, |
2213 | diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c |
2214 | index c97e9d3..e70b4ff 100644 |
2215 | --- a/drivers/net/wireless/rtlwifi/pci.c |
2216 | +++ b/drivers/net/wireless/rtlwifi/pci.c |
2217 | @@ -1008,19 +1008,6 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) |
2218 | return; |
2219 | } |
2220 | |
2221 | -static void rtl_lps_change_work_callback(struct work_struct *work) |
2222 | -{ |
2223 | - struct rtl_works *rtlworks = |
2224 | - container_of(work, struct rtl_works, lps_change_work); |
2225 | - struct ieee80211_hw *hw = rtlworks->hw; |
2226 | - struct rtl_priv *rtlpriv = rtl_priv(hw); |
2227 | - |
2228 | - if (rtlpriv->enter_ps) |
2229 | - rtl_lps_enter(hw); |
2230 | - else |
2231 | - rtl_lps_leave(hw); |
2232 | -} |
2233 | - |
2234 | static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) |
2235 | { |
2236 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
2237 | diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c |
2238 | index 884bcea..71e917d 100644 |
2239 | --- a/drivers/net/wireless/rtlwifi/ps.c |
2240 | +++ b/drivers/net/wireless/rtlwifi/ps.c |
2241 | @@ -611,6 +611,18 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw) |
2242 | MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40)); |
2243 | } |
2244 | |
2245 | +void rtl_lps_change_work_callback(struct work_struct *work) |
2246 | +{ |
2247 | + struct rtl_works *rtlworks = |
2248 | + container_of(work, struct rtl_works, lps_change_work); |
2249 | + struct ieee80211_hw *hw = rtlworks->hw; |
2250 | + struct rtl_priv *rtlpriv = rtl_priv(hw); |
2251 | + |
2252 | + if (rtlpriv->enter_ps) |
2253 | + rtl_lps_enter(hw); |
2254 | + else |
2255 | + rtl_lps_leave(hw); |
2256 | +} |
2257 | |
2258 | void rtl_swlps_wq_callback(void *data) |
2259 | { |
2260 | diff --git a/drivers/net/wireless/rtlwifi/ps.h b/drivers/net/wireless/rtlwifi/ps.h |
2261 | index 4d682b7..88bd76e 100644 |
2262 | --- a/drivers/net/wireless/rtlwifi/ps.h |
2263 | +++ b/drivers/net/wireless/rtlwifi/ps.h |
2264 | @@ -49,5 +49,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw); |
2265 | void rtl_swlps_rf_sleep(struct ieee80211_hw *hw); |
2266 | void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); |
2267 | void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len); |
2268 | +void rtl_lps_change_work_callback(struct work_struct *work); |
2269 | |
2270 | #endif |
2271 | diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c |
2272 | index a3532e0..1feebdc 100644 |
2273 | --- a/drivers/net/wireless/rtlwifi/usb.c |
2274 | +++ b/drivers/net/wireless/rtlwifi/usb.c |
2275 | @@ -1070,6 +1070,8 @@ int rtl_usb_probe(struct usb_interface *intf, |
2276 | spin_lock_init(&rtlpriv->locks.usb_lock); |
2277 | INIT_WORK(&rtlpriv->works.fill_h2c_cmd, |
2278 | rtl_fill_h2c_cmd_work_callback); |
2279 | + INIT_WORK(&rtlpriv->works.lps_change_work, |
2280 | + rtl_lps_change_work_callback); |
2281 | |
2282 | rtlpriv->usb_data_index = 0; |
2283 | init_completion(&rtlpriv->firmware_loading_complete); |
2284 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
2285 | index 1db10141..0c01b8e 100644 |
2286 | --- a/drivers/net/xen-netfront.c |
2287 | +++ b/drivers/net/xen-netfront.c |
2288 | @@ -276,8 +276,7 @@ no_skb: |
2289 | break; |
2290 | } |
2291 | |
2292 | - __skb_fill_page_desc(skb, 0, page, 0, 0); |
2293 | - skb_shinfo(skb)->nr_frags = 1; |
2294 | + skb_add_rx_frag(skb, 0, page, 0, 0, PAGE_SIZE); |
2295 | __skb_queue_tail(&np->rx_batch, skb); |
2296 | } |
2297 | |
2298 | @@ -822,7 +821,6 @@ static RING_IDX xennet_fill_frags(struct netfront_info *np, |
2299 | struct sk_buff_head *list) |
2300 | { |
2301 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
2302 | - int nr_frags = shinfo->nr_frags; |
2303 | RING_IDX cons = np->rx.rsp_cons; |
2304 | struct sk_buff *nskb; |
2305 | |
2306 | @@ -831,19 +829,21 @@ static RING_IDX xennet_fill_frags(struct netfront_info *np, |
2307 | RING_GET_RESPONSE(&np->rx, ++cons); |
2308 | skb_frag_t *nfrag = &skb_shinfo(nskb)->frags[0]; |
2309 | |
2310 | - __skb_fill_page_desc(skb, nr_frags, |
2311 | - skb_frag_page(nfrag), |
2312 | - rx->offset, rx->status); |
2313 | + if (shinfo->nr_frags == MAX_SKB_FRAGS) { |
2314 | + unsigned int pull_to = NETFRONT_SKB_CB(skb)->pull_to; |
2315 | |
2316 | - skb->data_len += rx->status; |
2317 | + BUG_ON(pull_to <= skb_headlen(skb)); |
2318 | + __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); |
2319 | + } |
2320 | + BUG_ON(shinfo->nr_frags >= MAX_SKB_FRAGS); |
2321 | + |
2322 | + skb_add_rx_frag(skb, shinfo->nr_frags, skb_frag_page(nfrag), |
2323 | + rx->offset, rx->status, PAGE_SIZE); |
2324 | |
2325 | skb_shinfo(nskb)->nr_frags = 0; |
2326 | kfree_skb(nskb); |
2327 | - |
2328 | - nr_frags++; |
2329 | } |
2330 | |
2331 | - shinfo->nr_frags = nr_frags; |
2332 | return cons; |
2333 | } |
2334 | |
2335 | @@ -929,7 +929,8 @@ static int handle_incoming_queue(struct net_device *dev, |
2336 | while ((skb = __skb_dequeue(rxq)) != NULL) { |
2337 | int pull_to = NETFRONT_SKB_CB(skb)->pull_to; |
2338 | |
2339 | - __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); |
2340 | + if (pull_to > skb_headlen(skb)) |
2341 | + __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); |
2342 | |
2343 | /* Ethernet work: Delayed to here as it peeks the header. */ |
2344 | skb->protocol = eth_type_trans(skb, dev); |
2345 | @@ -1015,16 +1016,10 @@ err: |
2346 | skb_shinfo(skb)->frags[0].page_offset = rx->offset; |
2347 | skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status); |
2348 | skb->data_len = rx->status; |
2349 | + skb->len += rx->status; |
2350 | |
2351 | i = xennet_fill_frags(np, skb, &tmpq); |
2352 | |
2353 | - /* |
2354 | - * Truesize is the actual allocation size, even if the |
2355 | - * allocation is only partially used. |
2356 | - */ |
2357 | - skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags; |
2358 | - skb->len += skb->data_len; |
2359 | - |
2360 | if (rx->flags & XEN_NETRXF_csum_blank) |
2361 | skb->ip_summed = CHECKSUM_PARTIAL; |
2362 | else if (rx->flags & XEN_NETRXF_data_validated) |
2363 | diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c |
2364 | index 9bb020a..0d30ca8 100644 |
2365 | --- a/drivers/scsi/isci/task.c |
2366 | +++ b/drivers/scsi/isci/task.c |
2367 | @@ -491,6 +491,7 @@ int isci_task_abort_task(struct sas_task *task) |
2368 | struct isci_tmf tmf; |
2369 | int ret = TMF_RESP_FUNC_FAILED; |
2370 | unsigned long flags; |
2371 | + int target_done_already = 0; |
2372 | |
2373 | /* Get the isci_request reference from the task. Note that |
2374 | * this check does not depend on the pending request list |
2375 | @@ -505,9 +506,11 @@ int isci_task_abort_task(struct sas_task *task) |
2376 | /* If task is already done, the request isn't valid */ |
2377 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE) && |
2378 | (task->task_state_flags & SAS_TASK_AT_INITIATOR) && |
2379 | - old_request) |
2380 | + old_request) { |
2381 | idev = isci_get_device(task->dev->lldd_dev); |
2382 | - |
2383 | + target_done_already = test_bit(IREQ_COMPLETE_IN_TARGET, |
2384 | + &old_request->flags); |
2385 | + } |
2386 | spin_unlock(&task->task_state_lock); |
2387 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
2388 | |
2389 | @@ -561,7 +564,7 @@ int isci_task_abort_task(struct sas_task *task) |
2390 | |
2391 | if (task->task_proto == SAS_PROTOCOL_SMP || |
2392 | sas_protocol_ata(task->task_proto) || |
2393 | - test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags) || |
2394 | + target_done_already || |
2395 | test_bit(IDEV_GONE, &idev->flags)) { |
2396 | |
2397 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
2398 | diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c |
2399 | index 15e4080..51cd27a 100644 |
2400 | --- a/drivers/scsi/qla2xxx/qla_iocb.c |
2401 | +++ b/drivers/scsi/qla2xxx/qla_iocb.c |
2402 | @@ -419,6 +419,8 @@ qla2x00_start_scsi(srb_t *sp) |
2403 | __constant_cpu_to_le16(CF_SIMPLE_TAG); |
2404 | break; |
2405 | } |
2406 | + } else { |
2407 | + cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG); |
2408 | } |
2409 | |
2410 | /* Load SCSI command packet. */ |
2411 | @@ -1308,11 +1310,11 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, |
2412 | fcp_cmnd->task_attribute = TSK_ORDERED; |
2413 | break; |
2414 | default: |
2415 | - fcp_cmnd->task_attribute = 0; |
2416 | + fcp_cmnd->task_attribute = TSK_SIMPLE; |
2417 | break; |
2418 | } |
2419 | } else { |
2420 | - fcp_cmnd->task_attribute = 0; |
2421 | + fcp_cmnd->task_attribute = TSK_SIMPLE; |
2422 | } |
2423 | |
2424 | cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */ |
2425 | @@ -1527,7 +1529,12 @@ qla24xx_start_scsi(srb_t *sp) |
2426 | case ORDERED_QUEUE_TAG: |
2427 | cmd_pkt->task = TSK_ORDERED; |
2428 | break; |
2429 | + default: |
2430 | + cmd_pkt->task = TSK_SIMPLE; |
2431 | + break; |
2432 | } |
2433 | + } else { |
2434 | + cmd_pkt->task = TSK_SIMPLE; |
2435 | } |
2436 | |
2437 | /* Load SCSI command packet. */ |
2438 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
2439 | index 1b1125e..610417e 100644 |
2440 | --- a/drivers/scsi/sd.c |
2441 | +++ b/drivers/scsi/sd.c |
2442 | @@ -828,10 +828,17 @@ static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) |
2443 | |
2444 | static void sd_unprep_fn(struct request_queue *q, struct request *rq) |
2445 | { |
2446 | + struct scsi_cmnd *SCpnt = rq->special; |
2447 | + |
2448 | if (rq->cmd_flags & REQ_DISCARD) { |
2449 | free_page((unsigned long)rq->buffer); |
2450 | rq->buffer = NULL; |
2451 | } |
2452 | + if (SCpnt->cmnd != rq->cmd) { |
2453 | + mempool_free(SCpnt->cmnd, sd_cdb_pool); |
2454 | + SCpnt->cmnd = NULL; |
2455 | + SCpnt->cmd_len = 0; |
2456 | + } |
2457 | } |
2458 | |
2459 | /** |
2460 | @@ -1710,21 +1717,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) |
2461 | if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt)) |
2462 | sd_dif_complete(SCpnt, good_bytes); |
2463 | |
2464 | - if (scsi_host_dif_capable(sdkp->device->host, sdkp->protection_type) |
2465 | - == SD_DIF_TYPE2_PROTECTION && SCpnt->cmnd != SCpnt->request->cmd) { |
2466 | - |
2467 | - /* We have to print a failed command here as the |
2468 | - * extended CDB gets freed before scsi_io_completion() |
2469 | - * is called. |
2470 | - */ |
2471 | - if (result) |
2472 | - scsi_print_command(SCpnt); |
2473 | - |
2474 | - mempool_free(SCpnt->cmnd, sd_cdb_pool); |
2475 | - SCpnt->cmnd = NULL; |
2476 | - SCpnt->cmd_len = 0; |
2477 | - } |
2478 | - |
2479 | return good_bytes; |
2480 | } |
2481 | |
2482 | diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c |
2483 | index 9bd8747..34519ea 100644 |
2484 | --- a/drivers/staging/android/logger.c |
2485 | +++ b/drivers/staging/android/logger.c |
2486 | @@ -469,7 +469,7 @@ static ssize_t logger_aio_write(struct kiocb *iocb, const struct iovec *iov, |
2487 | unsigned long nr_segs, loff_t ppos) |
2488 | { |
2489 | struct logger_log *log = file_get_log(iocb->ki_filp); |
2490 | - size_t orig = log->w_off; |
2491 | + size_t orig; |
2492 | struct logger_entry header; |
2493 | struct timespec now; |
2494 | ssize_t ret = 0; |
2495 | @@ -490,6 +490,8 @@ static ssize_t logger_aio_write(struct kiocb *iocb, const struct iovec *iov, |
2496 | |
2497 | mutex_lock(&log->mutex); |
2498 | |
2499 | + orig = log->w_off; |
2500 | + |
2501 | /* |
2502 | * Fix up any readers, pulling them forward to the first readable |
2503 | * entry after (what will be) the new write offset. We do this now |
2504 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c |
2505 | index 924c54c..0ae406a 100644 |
2506 | --- a/drivers/staging/comedi/comedi_fops.c |
2507 | +++ b/drivers/staging/comedi/comedi_fops.c |
2508 | @@ -1401,22 +1401,19 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
2509 | DPRINTK("subdevice busy\n"); |
2510 | return -EBUSY; |
2511 | } |
2512 | - s->busy = file; |
2513 | |
2514 | /* make sure channel/gain list isn't too long */ |
2515 | if (cmd.chanlist_len > s->len_chanlist) { |
2516 | DPRINTK("channel/gain list too long %u > %d\n", |
2517 | cmd.chanlist_len, s->len_chanlist); |
2518 | - ret = -EINVAL; |
2519 | - goto cleanup; |
2520 | + return -EINVAL; |
2521 | } |
2522 | |
2523 | /* make sure channel/gain list isn't too short */ |
2524 | if (cmd.chanlist_len < 1) { |
2525 | DPRINTK("channel/gain list too short %u < 1\n", |
2526 | cmd.chanlist_len); |
2527 | - ret = -EINVAL; |
2528 | - goto cleanup; |
2529 | + return -EINVAL; |
2530 | } |
2531 | |
2532 | async->cmd = cmd; |
2533 | @@ -1426,8 +1423,7 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
2534 | kmalloc(async->cmd.chanlist_len * sizeof(int), GFP_KERNEL); |
2535 | if (!async->cmd.chanlist) { |
2536 | DPRINTK("allocation failed\n"); |
2537 | - ret = -ENOMEM; |
2538 | - goto cleanup; |
2539 | + return -ENOMEM; |
2540 | } |
2541 | |
2542 | if (copy_from_user(async->cmd.chanlist, user_chanlist, |
2543 | @@ -1479,6 +1475,9 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
2544 | |
2545 | comedi_set_subdevice_runflags(s, ~0, SRF_USER | SRF_RUNNING); |
2546 | |
2547 | + /* set s->busy _after_ setting SRF_RUNNING flag to avoid race with |
2548 | + * comedi_read() or comedi_write() */ |
2549 | + s->busy = file; |
2550 | ret = s->do_cmd(dev, s); |
2551 | if (ret == 0) |
2552 | return 0; |
2553 | @@ -1693,6 +1692,7 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, |
2554 | void *file) |
2555 | { |
2556 | struct comedi_subdevice *s; |
2557 | + int ret; |
2558 | |
2559 | if (arg >= dev->n_subdevices) |
2560 | return -EINVAL; |
2561 | @@ -1709,7 +1709,11 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, |
2562 | if (s->busy != file) |
2563 | return -EBUSY; |
2564 | |
2565 | - return do_cancel(dev, s); |
2566 | + ret = do_cancel(dev, s); |
2567 | + if (comedi_get_subdevice_runflags(s) & SRF_USER) |
2568 | + wake_up_interruptible(&s->async->wait_head); |
2569 | + |
2570 | + return ret; |
2571 | } |
2572 | |
2573 | /* |
2574 | @@ -2041,11 +2045,13 @@ static ssize_t comedi_write(struct file *file, const char __user *buf, |
2575 | |
2576 | if (!comedi_is_subdevice_running(s)) { |
2577 | if (count == 0) { |
2578 | + mutex_lock(&dev->mutex); |
2579 | if (comedi_is_subdevice_in_error(s)) |
2580 | retval = -EPIPE; |
2581 | else |
2582 | retval = 0; |
2583 | do_become_nonbusy(dev, s); |
2584 | + mutex_unlock(&dev->mutex); |
2585 | } |
2586 | break; |
2587 | } |
2588 | @@ -2144,11 +2150,13 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, |
2589 | |
2590 | if (n == 0) { |
2591 | if (!comedi_is_subdevice_running(s)) { |
2592 | + mutex_lock(&dev->mutex); |
2593 | do_become_nonbusy(dev, s); |
2594 | if (comedi_is_subdevice_in_error(s)) |
2595 | retval = -EPIPE; |
2596 | else |
2597 | retval = 0; |
2598 | + mutex_unlock(&dev->mutex); |
2599 | break; |
2600 | } |
2601 | if (file->f_flags & O_NONBLOCK) { |
2602 | @@ -2186,9 +2194,11 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, |
2603 | buf += n; |
2604 | break; /* makes device work like a pipe */ |
2605 | } |
2606 | - if (comedi_is_subdevice_idle(s) && |
2607 | - async->buf_read_count - async->buf_write_count == 0) { |
2608 | - do_become_nonbusy(dev, s); |
2609 | + if (comedi_is_subdevice_idle(s)) { |
2610 | + mutex_lock(&dev->mutex); |
2611 | + if (async->buf_read_count - async->buf_write_count == 0) |
2612 | + do_become_nonbusy(dev, s); |
2613 | + mutex_unlock(&dev->mutex); |
2614 | } |
2615 | set_current_state(TASK_RUNNING); |
2616 | remove_wait_queue(&async->wait_head, &wait); |
2617 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
2618 | index d7705e5..012ff8b 100644 |
2619 | --- a/drivers/target/iscsi/iscsi_target.c |
2620 | +++ b/drivers/target/iscsi/iscsi_target.c |
2621 | @@ -628,25 +628,18 @@ static void __exit iscsi_target_cleanup_module(void) |
2622 | } |
2623 | |
2624 | static int iscsit_add_reject( |
2625 | + struct iscsi_conn *conn, |
2626 | u8 reason, |
2627 | - int fail_conn, |
2628 | - unsigned char *buf, |
2629 | - struct iscsi_conn *conn) |
2630 | + unsigned char *buf) |
2631 | { |
2632 | struct iscsi_cmd *cmd; |
2633 | - struct iscsi_reject *hdr; |
2634 | - int ret; |
2635 | |
2636 | cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); |
2637 | if (!cmd) |
2638 | return -1; |
2639 | |
2640 | cmd->iscsi_opcode = ISCSI_OP_REJECT; |
2641 | - if (fail_conn) |
2642 | - cmd->cmd_flags |= ICF_REJECT_FAIL_CONN; |
2643 | - |
2644 | - hdr = (struct iscsi_reject *) cmd->pdu; |
2645 | - hdr->reason = reason; |
2646 | + cmd->reject_reason = reason; |
2647 | |
2648 | cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); |
2649 | if (!cmd->buf_ptr) { |
2650 | @@ -662,23 +655,16 @@ static int iscsit_add_reject( |
2651 | cmd->i_state = ISTATE_SEND_REJECT; |
2652 | iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); |
2653 | |
2654 | - ret = wait_for_completion_interruptible(&cmd->reject_comp); |
2655 | - if (ret != 0) |
2656 | - return -1; |
2657 | - |
2658 | - return (!fail_conn) ? 0 : -1; |
2659 | + return -1; |
2660 | } |
2661 | |
2662 | -int iscsit_add_reject_from_cmd( |
2663 | +static int iscsit_add_reject_from_cmd( |
2664 | + struct iscsi_cmd *cmd, |
2665 | u8 reason, |
2666 | - int fail_conn, |
2667 | - int add_to_conn, |
2668 | - unsigned char *buf, |
2669 | - struct iscsi_cmd *cmd) |
2670 | + bool add_to_conn, |
2671 | + unsigned char *buf) |
2672 | { |
2673 | struct iscsi_conn *conn; |
2674 | - struct iscsi_reject *hdr; |
2675 | - int ret; |
2676 | |
2677 | if (!cmd->conn) { |
2678 | pr_err("cmd->conn is NULL for ITT: 0x%08x\n", |
2679 | @@ -688,11 +674,7 @@ int iscsit_add_reject_from_cmd( |
2680 | conn = cmd->conn; |
2681 | |
2682 | cmd->iscsi_opcode = ISCSI_OP_REJECT; |
2683 | - if (fail_conn) |
2684 | - cmd->cmd_flags |= ICF_REJECT_FAIL_CONN; |
2685 | - |
2686 | - hdr = (struct iscsi_reject *) cmd->pdu; |
2687 | - hdr->reason = reason; |
2688 | + cmd->reject_reason = reason; |
2689 | |
2690 | cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); |
2691 | if (!cmd->buf_ptr) { |
2692 | @@ -709,8 +691,6 @@ int iscsit_add_reject_from_cmd( |
2693 | |
2694 | cmd->i_state = ISTATE_SEND_REJECT; |
2695 | iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); |
2696 | - |
2697 | - ret = wait_for_completion_interruptible(&cmd->reject_comp); |
2698 | /* |
2699 | * Perform the kref_put now if se_cmd has already been setup by |
2700 | * scsit_setup_scsi_cmd() |
2701 | @@ -719,12 +699,19 @@ int iscsit_add_reject_from_cmd( |
2702 | pr_debug("iscsi reject: calling target_put_sess_cmd >>>>>>\n"); |
2703 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
2704 | } |
2705 | - if (ret != 0) |
2706 | - return -1; |
2707 | + return -1; |
2708 | +} |
2709 | |
2710 | - return (!fail_conn) ? 0 : -1; |
2711 | +static int iscsit_add_reject_cmd(struct iscsi_cmd *cmd, u8 reason, |
2712 | + unsigned char *buf) |
2713 | +{ |
2714 | + return iscsit_add_reject_from_cmd(cmd, reason, true, buf); |
2715 | +} |
2716 | + |
2717 | +int iscsit_reject_cmd(struct iscsi_cmd *cmd, u8 reason, unsigned char *buf) |
2718 | +{ |
2719 | + return iscsit_add_reject_from_cmd(cmd, reason, false, buf); |
2720 | } |
2721 | -EXPORT_SYMBOL(iscsit_add_reject_from_cmd); |
2722 | |
2723 | /* |
2724 | * Map some portion of the allocated scatterlist to an iovec, suitable for |
2725 | @@ -844,8 +831,8 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2726 | !(hdr->flags & ISCSI_FLAG_CMD_FINAL)) { |
2727 | pr_err("ISCSI_FLAG_CMD_WRITE & ISCSI_FLAG_CMD_FINAL" |
2728 | " not set. Bad iSCSI Initiator.\n"); |
2729 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
2730 | - 1, 1, buf, cmd); |
2731 | + return iscsit_add_reject_cmd(cmd, |
2732 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
2733 | } |
2734 | |
2735 | if (((hdr->flags & ISCSI_FLAG_CMD_READ) || |
2736 | @@ -865,8 +852,8 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2737 | pr_err("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE" |
2738 | " set when Expected Data Transfer Length is 0 for" |
2739 | " CDB: 0x%02x. Bad iSCSI Initiator.\n", hdr->cdb[0]); |
2740 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
2741 | - 1, 1, buf, cmd); |
2742 | + return iscsit_add_reject_cmd(cmd, |
2743 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
2744 | } |
2745 | done: |
2746 | |
2747 | @@ -875,62 +862,62 @@ done: |
2748 | pr_err("ISCSI_FLAG_CMD_READ and/or ISCSI_FLAG_CMD_WRITE" |
2749 | " MUST be set if Expected Data Transfer Length is not 0." |
2750 | " Bad iSCSI Initiator\n"); |
2751 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
2752 | - 1, 1, buf, cmd); |
2753 | + return iscsit_add_reject_cmd(cmd, |
2754 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
2755 | } |
2756 | |
2757 | if ((hdr->flags & ISCSI_FLAG_CMD_READ) && |
2758 | (hdr->flags & ISCSI_FLAG_CMD_WRITE)) { |
2759 | pr_err("Bidirectional operations not supported!\n"); |
2760 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
2761 | - 1, 1, buf, cmd); |
2762 | + return iscsit_add_reject_cmd(cmd, |
2763 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
2764 | } |
2765 | |
2766 | if (hdr->opcode & ISCSI_OP_IMMEDIATE) { |
2767 | pr_err("Illegally set Immediate Bit in iSCSI Initiator" |
2768 | " Scsi Command PDU.\n"); |
2769 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
2770 | - 1, 1, buf, cmd); |
2771 | + return iscsit_add_reject_cmd(cmd, |
2772 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
2773 | } |
2774 | |
2775 | if (payload_length && !conn->sess->sess_ops->ImmediateData) { |
2776 | pr_err("ImmediateData=No but DataSegmentLength=%u," |
2777 | " protocol error.\n", payload_length); |
2778 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
2779 | - 1, 1, buf, cmd); |
2780 | + return iscsit_add_reject_cmd(cmd, |
2781 | + ISCSI_REASON_PROTOCOL_ERROR, buf); |
2782 | } |
2783 | |
2784 | - if ((be32_to_cpu(hdr->data_length )== payload_length) && |
2785 | + if ((be32_to_cpu(hdr->data_length) == payload_length) && |
2786 | (!(hdr->flags & ISCSI_FLAG_CMD_FINAL))) { |
2787 | pr_err("Expected Data Transfer Length and Length of" |
2788 | " Immediate Data are the same, but ISCSI_FLAG_CMD_FINAL" |
2789 | " bit is not set protocol error\n"); |
2790 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
2791 | - 1, 1, buf, cmd); |
2792 | + return iscsit_add_reject_cmd(cmd, |
2793 | + ISCSI_REASON_PROTOCOL_ERROR, buf); |
2794 | } |
2795 | |
2796 | if (payload_length > be32_to_cpu(hdr->data_length)) { |
2797 | pr_err("DataSegmentLength: %u is greater than" |
2798 | " EDTL: %u, protocol error.\n", payload_length, |
2799 | hdr->data_length); |
2800 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
2801 | - 1, 1, buf, cmd); |
2802 | + return iscsit_add_reject_cmd(cmd, |
2803 | + ISCSI_REASON_PROTOCOL_ERROR, buf); |
2804 | } |
2805 | |
2806 | if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { |
2807 | pr_err("DataSegmentLength: %u is greater than" |
2808 | " MaxXmitDataSegmentLength: %u, protocol error.\n", |
2809 | payload_length, conn->conn_ops->MaxXmitDataSegmentLength); |
2810 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
2811 | - 1, 1, buf, cmd); |
2812 | + return iscsit_add_reject_cmd(cmd, |
2813 | + ISCSI_REASON_PROTOCOL_ERROR, buf); |
2814 | } |
2815 | |
2816 | if (payload_length > conn->sess->sess_ops->FirstBurstLength) { |
2817 | pr_err("DataSegmentLength: %u is greater than" |
2818 | " FirstBurstLength: %u, protocol error.\n", |
2819 | payload_length, conn->sess->sess_ops->FirstBurstLength); |
2820 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
2821 | - 1, 1, buf, cmd); |
2822 | + return iscsit_add_reject_cmd(cmd, |
2823 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
2824 | } |
2825 | |
2826 | data_direction = (hdr->flags & ISCSI_FLAG_CMD_WRITE) ? DMA_TO_DEVICE : |
2827 | @@ -985,9 +972,8 @@ done: |
2828 | |
2829 | dr = iscsit_allocate_datain_req(); |
2830 | if (!dr) |
2831 | - return iscsit_add_reject_from_cmd( |
2832 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
2833 | - 1, 1, buf, cmd); |
2834 | + return iscsit_add_reject_cmd(cmd, |
2835 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
2836 | |
2837 | iscsit_attach_datain_req(cmd, dr); |
2838 | } |
2839 | @@ -1015,18 +1001,16 @@ done: |
2840 | cmd->sense_reason = target_setup_cmd_from_cdb(&cmd->se_cmd, hdr->cdb); |
2841 | if (cmd->sense_reason) { |
2842 | if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) { |
2843 | - return iscsit_add_reject_from_cmd( |
2844 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
2845 | - 1, 1, buf, cmd); |
2846 | + return iscsit_add_reject_cmd(cmd, |
2847 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
2848 | } |
2849 | |
2850 | goto attach_cmd; |
2851 | } |
2852 | |
2853 | if (iscsit_build_pdu_and_seq_lists(cmd, payload_length) < 0) { |
2854 | - return iscsit_add_reject_from_cmd( |
2855 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
2856 | - 1, 1, buf, cmd); |
2857 | + return iscsit_add_reject_cmd(cmd, |
2858 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
2859 | } |
2860 | |
2861 | attach_cmd: |
2862 | @@ -1068,17 +1052,13 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2863 | * be acknowledged. (See below) |
2864 | */ |
2865 | if (!cmd->immediate_data) { |
2866 | - cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); |
2867 | - if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
2868 | - if (!cmd->sense_reason) |
2869 | - return 0; |
2870 | - |
2871 | + cmdsn_ret = iscsit_sequence_cmd(conn, cmd, |
2872 | + (unsigned char *)hdr, hdr->cmdsn); |
2873 | + if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
2874 | + return -1; |
2875 | + else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
2876 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
2877 | return 0; |
2878 | - } else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { |
2879 | - return iscsit_add_reject_from_cmd( |
2880 | - ISCSI_REASON_PROTOCOL_ERROR, |
2881 | - 1, 0, (unsigned char *)hdr, cmd); |
2882 | } |
2883 | } |
2884 | |
2885 | @@ -1103,6 +1083,9 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2886 | * iscsit_check_received_cmdsn() in iscsit_get_immediate_data() below. |
2887 | */ |
2888 | if (cmd->sense_reason) { |
2889 | + if (cmd->reject_reason) |
2890 | + return 0; |
2891 | + |
2892 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
2893 | return 1; |
2894 | } |
2895 | @@ -1111,10 +1094,8 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2896 | * the backend memory allocation. |
2897 | */ |
2898 | cmd->sense_reason = transport_generic_new_cmd(&cmd->se_cmd); |
2899 | - if (cmd->sense_reason) { |
2900 | - target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
2901 | + if (cmd->sense_reason) |
2902 | return 1; |
2903 | - } |
2904 | |
2905 | return 0; |
2906 | } |
2907 | @@ -1124,6 +1105,7 @@ static int |
2908 | iscsit_get_immediate_data(struct iscsi_cmd *cmd, struct iscsi_scsi_req *hdr, |
2909 | bool dump_payload) |
2910 | { |
2911 | + struct iscsi_conn *conn = cmd->conn; |
2912 | int cmdsn_ret = 0, immed_ret = IMMEDIATE_DATA_NORMAL_OPERATION; |
2913 | /* |
2914 | * Special case for Unsupported SAM WRITE Opcodes and ImmediateData=Yes. |
2915 | @@ -1140,20 +1122,25 @@ after_immediate_data: |
2916 | * DataCRC, check against ExpCmdSN/MaxCmdSN if |
2917 | * Immediate Bit is not set. |
2918 | */ |
2919 | - cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, hdr->cmdsn); |
2920 | + cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, |
2921 | + (unsigned char *)hdr, hdr->cmdsn); |
2922 | + if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { |
2923 | + return -1; |
2924 | + } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
2925 | + target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
2926 | + return 0; |
2927 | + } |
2928 | |
2929 | if (cmd->sense_reason) { |
2930 | - if (iscsit_dump_data_payload(cmd->conn, |
2931 | - cmd->first_burst_len, 1) < 0) |
2932 | - return -1; |
2933 | + int rc; |
2934 | + |
2935 | + rc = iscsit_dump_data_payload(cmd->conn, |
2936 | + cmd->first_burst_len, 1); |
2937 | + target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
2938 | + return rc; |
2939 | } else if (cmd->unsolicited_data) |
2940 | iscsit_set_unsoliticed_dataout(cmd); |
2941 | |
2942 | - if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
2943 | - return iscsit_add_reject_from_cmd( |
2944 | - ISCSI_REASON_PROTOCOL_ERROR, |
2945 | - 1, 0, (unsigned char *)hdr, cmd); |
2946 | - |
2947 | } else if (immed_ret == IMMEDIATE_DATA_ERL1_CRC_FAILURE) { |
2948 | /* |
2949 | * Immediate Data failed DataCRC and ERL>=1, |
2950 | @@ -1184,15 +1171,14 @@ iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
2951 | |
2952 | rc = iscsit_setup_scsi_cmd(conn, cmd, buf); |
2953 | if (rc < 0) |
2954 | - return rc; |
2955 | + return 0; |
2956 | /* |
2957 | * Allocation iovecs needed for struct socket operations for |
2958 | * traditional iSCSI block I/O. |
2959 | */ |
2960 | if (iscsit_allocate_iovecs(cmd) < 0) { |
2961 | - return iscsit_add_reject_from_cmd( |
2962 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
2963 | - 1, 0, buf, cmd); |
2964 | + return iscsit_add_reject_cmd(cmd, |
2965 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
2966 | } |
2967 | immed_data = cmd->immediate_data; |
2968 | |
2969 | @@ -1283,8 +1269,8 @@ iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf, |
2970 | |
2971 | if (!payload_length) { |
2972 | pr_err("DataOUT payload is ZERO, protocol error.\n"); |
2973 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
2974 | - buf, conn); |
2975 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
2976 | + buf); |
2977 | } |
2978 | |
2979 | /* iSCSI write */ |
2980 | @@ -1301,8 +1287,8 @@ iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf, |
2981 | pr_err("DataSegmentLength: %u is greater than" |
2982 | " MaxXmitDataSegmentLength: %u\n", payload_length, |
2983 | conn->conn_ops->MaxXmitDataSegmentLength); |
2984 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
2985 | - buf, conn); |
2986 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
2987 | + buf); |
2988 | } |
2989 | |
2990 | cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, |
2991 | @@ -1325,8 +1311,7 @@ iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf, |
2992 | if (cmd->data_direction != DMA_TO_DEVICE) { |
2993 | pr_err("Command ITT: 0x%08x received DataOUT for a" |
2994 | " NON-WRITE command.\n", cmd->init_task_tag); |
2995 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
2996 | - 1, 0, buf, cmd); |
2997 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, buf); |
2998 | } |
2999 | se_cmd = &cmd->se_cmd; |
3000 | iscsit_mod_dataout_timer(cmd); |
3001 | @@ -1335,8 +1320,7 @@ iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf, |
3002 | pr_err("DataOut Offset: %u, Length %u greater than" |
3003 | " iSCSI Command EDTL %u, protocol error.\n", |
3004 | hdr->offset, payload_length, cmd->se_cmd.data_length); |
3005 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
3006 | - 1, 0, buf, cmd); |
3007 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_BOOKMARK_INVALID, buf); |
3008 | } |
3009 | |
3010 | if (cmd->unsolicited_data) { |
3011 | @@ -1528,7 +1512,7 @@ static int iscsit_handle_data_out(struct iscsi_conn *conn, unsigned char *buf) |
3012 | |
3013 | rc = iscsit_check_dataout_hdr(conn, buf, &cmd); |
3014 | if (rc < 0) |
3015 | - return rc; |
3016 | + return 0; |
3017 | else if (!cmd) |
3018 | return 0; |
3019 | |
3020 | @@ -1557,8 +1541,8 @@ int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3021 | if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { |
3022 | pr_err("NOPOUT ITT is reserved, but Immediate Bit is" |
3023 | " not set, protocol error.\n"); |
3024 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3025 | - buf, conn); |
3026 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, |
3027 | + (unsigned char *)hdr); |
3028 | } |
3029 | |
3030 | if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { |
3031 | @@ -1566,8 +1550,8 @@ int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3032 | " greater than MaxXmitDataSegmentLength: %u, protocol" |
3033 | " error.\n", payload_length, |
3034 | conn->conn_ops->MaxXmitDataSegmentLength); |
3035 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3036 | - buf, conn); |
3037 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, |
3038 | + (unsigned char *)hdr); |
3039 | } |
3040 | |
3041 | pr_debug("Got NOPOUT Ping %s ITT: 0x%08x, TTT: 0x%08x," |
3042 | @@ -1584,9 +1568,9 @@ int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3043 | */ |
3044 | if (hdr->ttt == cpu_to_be32(0xFFFFFFFF)) { |
3045 | if (!cmd) |
3046 | - return iscsit_add_reject( |
3047 | + return iscsit_reject_cmd(cmd, |
3048 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3049 | - 1, buf, conn); |
3050 | + (unsigned char *)hdr); |
3051 | |
3052 | cmd->iscsi_opcode = ISCSI_OP_NOOP_OUT; |
3053 | cmd->i_state = ISTATE_SEND_NOPIN; |
3054 | @@ -1700,15 +1684,14 @@ int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3055 | return 0; |
3056 | } |
3057 | |
3058 | - cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); |
3059 | + cmdsn_ret = iscsit_sequence_cmd(conn, cmd, |
3060 | + (unsigned char *)hdr, hdr->cmdsn); |
3061 | if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
3062 | ret = 0; |
3063 | goto ping_out; |
3064 | } |
3065 | if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
3066 | - return iscsit_add_reject_from_cmd( |
3067 | - ISCSI_REASON_PROTOCOL_ERROR, |
3068 | - 1, 0, buf, cmd); |
3069 | + return -1; |
3070 | |
3071 | return 0; |
3072 | } |
3073 | @@ -1757,8 +1740,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3074 | struct se_tmr_req *se_tmr; |
3075 | struct iscsi_tmr_req *tmr_req; |
3076 | struct iscsi_tm *hdr; |
3077 | - int out_of_order_cmdsn = 0; |
3078 | - int ret; |
3079 | + int out_of_order_cmdsn = 0, ret; |
3080 | + bool sess_ref = false; |
3081 | u8 function; |
3082 | |
3083 | hdr = (struct iscsi_tm *) buf; |
3084 | @@ -1782,8 +1765,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3085 | pr_err("Task Management Request TASK_REASSIGN not" |
3086 | " issued as immediate command, bad iSCSI Initiator" |
3087 | "implementation\n"); |
3088 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
3089 | - 1, 1, buf, cmd); |
3090 | + return iscsit_add_reject_cmd(cmd, |
3091 | + ISCSI_REASON_PROTOCOL_ERROR, buf); |
3092 | } |
3093 | if ((function != ISCSI_TM_FUNC_ABORT_TASK) && |
3094 | be32_to_cpu(hdr->refcmdsn) != ISCSI_RESERVED_TAG) |
3095 | @@ -1795,9 +1778,9 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3096 | if (!cmd->tmr_req) { |
3097 | pr_err("Unable to allocate memory for" |
3098 | " Task Management command!\n"); |
3099 | - return iscsit_add_reject_from_cmd( |
3100 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3101 | - 1, 1, buf, cmd); |
3102 | + return iscsit_add_reject_cmd(cmd, |
3103 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3104 | + buf); |
3105 | } |
3106 | |
3107 | /* |
3108 | @@ -1814,6 +1797,9 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3109 | conn->sess->se_sess, 0, DMA_NONE, |
3110 | MSG_SIMPLE_TAG, cmd->sense_buffer + 2); |
3111 | |
3112 | + target_get_sess_cmd(conn->sess->se_sess, &cmd->se_cmd, true); |
3113 | + sess_ref = true; |
3114 | + |
3115 | switch (function) { |
3116 | case ISCSI_TM_FUNC_ABORT_TASK: |
3117 | tcm_function = TMR_ABORT_TASK; |
3118 | @@ -1839,17 +1825,15 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3119 | default: |
3120 | pr_err("Unknown iSCSI TMR Function:" |
3121 | " 0x%02x\n", function); |
3122 | - return iscsit_add_reject_from_cmd( |
3123 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3124 | - 1, 1, buf, cmd); |
3125 | + return iscsit_add_reject_cmd(cmd, |
3126 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
3127 | } |
3128 | |
3129 | ret = core_tmr_alloc_req(&cmd->se_cmd, cmd->tmr_req, |
3130 | tcm_function, GFP_KERNEL); |
3131 | if (ret < 0) |
3132 | - return iscsit_add_reject_from_cmd( |
3133 | - ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3134 | - 1, 1, buf, cmd); |
3135 | + return iscsit_add_reject_cmd(cmd, |
3136 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
3137 | |
3138 | cmd->tmr_req->se_tmr_req = cmd->se_cmd.se_tmr_req; |
3139 | } |
3140 | @@ -1908,9 +1892,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3141 | break; |
3142 | |
3143 | if (iscsit_check_task_reassign_expdatasn(tmr_req, conn) < 0) |
3144 | - return iscsit_add_reject_from_cmd( |
3145 | - ISCSI_REASON_BOOKMARK_INVALID, 1, 1, |
3146 | - buf, cmd); |
3147 | + return iscsit_add_reject_cmd(cmd, |
3148 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
3149 | break; |
3150 | default: |
3151 | pr_err("Unknown TMR function: 0x%02x, protocol" |
3152 | @@ -1928,15 +1911,13 @@ attach: |
3153 | spin_unlock_bh(&conn->cmd_lock); |
3154 | |
3155 | if (!(hdr->opcode & ISCSI_OP_IMMEDIATE)) { |
3156 | - int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); |
3157 | + int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); |
3158 | if (cmdsn_ret == CMDSN_HIGHER_THAN_EXP) |
3159 | out_of_order_cmdsn = 1; |
3160 | else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) |
3161 | return 0; |
3162 | else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
3163 | - return iscsit_add_reject_from_cmd( |
3164 | - ISCSI_REASON_PROTOCOL_ERROR, |
3165 | - 1, 0, buf, cmd); |
3166 | + return -1; |
3167 | } |
3168 | iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); |
3169 | |
3170 | @@ -1956,6 +1937,11 @@ attach: |
3171 | * For connection recovery, this is also the default action for |
3172 | * TMR TASK_REASSIGN. |
3173 | */ |
3174 | + if (sess_ref) { |
3175 | + pr_debug("Handle TMR, using sess_ref=true check\n"); |
3176 | + target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); |
3177 | + } |
3178 | + |
3179 | iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); |
3180 | return 0; |
3181 | } |
3182 | @@ -1981,8 +1967,7 @@ static int iscsit_handle_text_cmd( |
3183 | pr_err("Unable to accept text parameter length: %u" |
3184 | "greater than MaxXmitDataSegmentLength %u.\n", |
3185 | payload_length, conn->conn_ops->MaxXmitDataSegmentLength); |
3186 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3187 | - buf, conn); |
3188 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, buf); |
3189 | } |
3190 | |
3191 | pr_debug("Got Text Request: ITT: 0x%08x, CmdSN: 0x%08x," |
3192 | @@ -2084,8 +2069,8 @@ static int iscsit_handle_text_cmd( |
3193 | |
3194 | cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); |
3195 | if (!cmd) |
3196 | - return iscsit_add_reject(ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3197 | - 1, buf, conn); |
3198 | + return iscsit_add_reject(conn, |
3199 | + ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
3200 | |
3201 | cmd->iscsi_opcode = ISCSI_OP_TEXT; |
3202 | cmd->i_state = ISTATE_SEND_TEXTRSP; |
3203 | @@ -2103,11 +2088,10 @@ static int iscsit_handle_text_cmd( |
3204 | iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); |
3205 | |
3206 | if (!(hdr->opcode & ISCSI_OP_IMMEDIATE)) { |
3207 | - cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); |
3208 | + cmdsn_ret = iscsit_sequence_cmd(conn, cmd, |
3209 | + (unsigned char *)hdr, hdr->cmdsn); |
3210 | if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
3211 | - return iscsit_add_reject_from_cmd( |
3212 | - ISCSI_REASON_PROTOCOL_ERROR, |
3213 | - 1, 0, buf, cmd); |
3214 | + return -1; |
3215 | |
3216 | return 0; |
3217 | } |
3218 | @@ -2292,14 +2276,11 @@ iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3219 | if (ret < 0) |
3220 | return ret; |
3221 | } else { |
3222 | - cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); |
3223 | - if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
3224 | + cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); |
3225 | + if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) |
3226 | logout_remove = 0; |
3227 | - } else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { |
3228 | - return iscsit_add_reject_from_cmd( |
3229 | - ISCSI_REASON_PROTOCOL_ERROR, |
3230 | - 1, 0, buf, cmd); |
3231 | - } |
3232 | + else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
3233 | + return -1; |
3234 | } |
3235 | |
3236 | return logout_remove; |
3237 | @@ -2323,8 +2304,8 @@ static int iscsit_handle_snack( |
3238 | if (!conn->sess->sess_ops->ErrorRecoveryLevel) { |
3239 | pr_err("Initiator sent SNACK request while in" |
3240 | " ErrorRecoveryLevel=0.\n"); |
3241 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3242 | - buf, conn); |
3243 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
3244 | + buf); |
3245 | } |
3246 | /* |
3247 | * SNACK_DATA and SNACK_R2T are both 0, so check which function to |
3248 | @@ -2348,13 +2329,13 @@ static int iscsit_handle_snack( |
3249 | case ISCSI_FLAG_SNACK_TYPE_RDATA: |
3250 | /* FIXME: Support R-Data SNACK */ |
3251 | pr_err("R-Data SNACK Not Supported.\n"); |
3252 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3253 | - buf, conn); |
3254 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
3255 | + buf); |
3256 | default: |
3257 | pr_err("Unknown SNACK type 0x%02x, protocol" |
3258 | " error.\n", hdr->flags & 0x0f); |
3259 | - return iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3260 | - buf, conn); |
3261 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
3262 | + buf); |
3263 | } |
3264 | |
3265 | return 0; |
3266 | @@ -2426,14 +2407,14 @@ static int iscsit_handle_immediate_data( |
3267 | pr_err("Unable to recover from" |
3268 | " Immediate Data digest failure while" |
3269 | " in ERL=0.\n"); |
3270 | - iscsit_add_reject_from_cmd( |
3271 | + iscsit_reject_cmd(cmd, |
3272 | ISCSI_REASON_DATA_DIGEST_ERROR, |
3273 | - 1, 0, (unsigned char *)hdr, cmd); |
3274 | + (unsigned char *)hdr); |
3275 | return IMMEDIATE_DATA_CANNOT_RECOVER; |
3276 | } else { |
3277 | - iscsit_add_reject_from_cmd( |
3278 | + iscsit_reject_cmd(cmd, |
3279 | ISCSI_REASON_DATA_DIGEST_ERROR, |
3280 | - 0, 0, (unsigned char *)hdr, cmd); |
3281 | + (unsigned char *)hdr); |
3282 | return IMMEDIATE_DATA_ERL1_CRC_FAILURE; |
3283 | } |
3284 | } else { |
3285 | @@ -3533,6 +3514,7 @@ iscsit_build_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn, |
3286 | struct iscsi_reject *hdr) |
3287 | { |
3288 | hdr->opcode = ISCSI_OP_REJECT; |
3289 | + hdr->reason = cmd->reject_reason; |
3290 | hdr->flags |= ISCSI_FLAG_CMD_FINAL; |
3291 | hton24(hdr->dlength, ISCSI_HDR_LEN); |
3292 | hdr->ffffffff = cpu_to_be32(0xffffffff); |
3293 | @@ -3806,18 +3788,11 @@ check_rsp_state: |
3294 | case ISTATE_SEND_STATUS_RECOVERY: |
3295 | case ISTATE_SEND_TEXTRSP: |
3296 | case ISTATE_SEND_TASKMGTRSP: |
3297 | + case ISTATE_SEND_REJECT: |
3298 | spin_lock_bh(&cmd->istate_lock); |
3299 | cmd->i_state = ISTATE_SENT_STATUS; |
3300 | spin_unlock_bh(&cmd->istate_lock); |
3301 | break; |
3302 | - case ISTATE_SEND_REJECT: |
3303 | - if (cmd->cmd_flags & ICF_REJECT_FAIL_CONN) { |
3304 | - cmd->cmd_flags &= ~ICF_REJECT_FAIL_CONN; |
3305 | - complete(&cmd->reject_comp); |
3306 | - goto err; |
3307 | - } |
3308 | - complete(&cmd->reject_comp); |
3309 | - break; |
3310 | default: |
3311 | pr_err("Unknown Opcode: 0x%02x ITT:" |
3312 | " 0x%08x, i_state: %d on CID: %hu\n", |
3313 | @@ -3922,8 +3897,7 @@ static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) |
3314 | case ISCSI_OP_SCSI_CMD: |
3315 | cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); |
3316 | if (!cmd) |
3317 | - return iscsit_add_reject(ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3318 | - 1, buf, conn); |
3319 | + goto reject; |
3320 | |
3321 | ret = iscsit_handle_scsi_cmd(conn, cmd, buf); |
3322 | break; |
3323 | @@ -3935,16 +3909,14 @@ static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) |
3324 | if (hdr->ttt == cpu_to_be32(0xFFFFFFFF)) { |
3325 | cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); |
3326 | if (!cmd) |
3327 | - return iscsit_add_reject(ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3328 | - 1, buf, conn); |
3329 | + goto reject; |
3330 | } |
3331 | ret = iscsit_handle_nop_out(conn, cmd, buf); |
3332 | break; |
3333 | case ISCSI_OP_SCSI_TMFUNC: |
3334 | cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); |
3335 | if (!cmd) |
3336 | - return iscsit_add_reject(ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3337 | - 1, buf, conn); |
3338 | + goto reject; |
3339 | |
3340 | ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf); |
3341 | break; |
3342 | @@ -3954,8 +3926,7 @@ static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) |
3343 | case ISCSI_OP_LOGOUT: |
3344 | cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); |
3345 | if (!cmd) |
3346 | - return iscsit_add_reject(ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3347 | - 1, buf, conn); |
3348 | + goto reject; |
3349 | |
3350 | ret = iscsit_handle_logout_cmd(conn, cmd, buf); |
3351 | if (ret > 0) |
3352 | @@ -3987,6 +3958,8 @@ static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) |
3353 | } |
3354 | |
3355 | return ret; |
3356 | +reject: |
3357 | + return iscsit_add_reject(conn, ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); |
3358 | } |
3359 | |
3360 | int iscsi_target_rx_thread(void *arg) |
3361 | @@ -4086,8 +4059,8 @@ restart: |
3362 | (!(opcode & ISCSI_OP_LOGOUT)))) { |
3363 | pr_err("Received illegal iSCSI Opcode: 0x%02x" |
3364 | " while in Discovery Session, rejecting.\n", opcode); |
3365 | - iscsit_add_reject(ISCSI_REASON_PROTOCOL_ERROR, 1, |
3366 | - buffer, conn); |
3367 | + iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
3368 | + buffer); |
3369 | goto transport_err; |
3370 | } |
3371 | |
3372 | diff --git a/drivers/target/iscsi/iscsi_target.h b/drivers/target/iscsi/iscsi_target.h |
3373 | index a0050b2..2c437cb 100644 |
3374 | --- a/drivers/target/iscsi/iscsi_target.h |
3375 | +++ b/drivers/target/iscsi/iscsi_target.h |
3376 | @@ -15,7 +15,7 @@ extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, |
3377 | extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, |
3378 | struct iscsi_portal_group *); |
3379 | extern int iscsit_del_np(struct iscsi_np *); |
3380 | -extern int iscsit_add_reject_from_cmd(u8, int, int, unsigned char *, struct iscsi_cmd *); |
3381 | +extern int iscsit_reject_cmd(struct iscsi_cmd *cmd, u8, unsigned char *); |
3382 | extern void iscsit_set_unsoliticed_dataout(struct iscsi_cmd *); |
3383 | extern int iscsit_logout_closesession(struct iscsi_cmd *, struct iscsi_conn *); |
3384 | extern int iscsit_logout_closeconnection(struct iscsi_cmd *, struct iscsi_conn *); |
3385 | diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c |
3386 | index 8d8b3ff..421344d 100644 |
3387 | --- a/drivers/target/iscsi/iscsi_target_configfs.c |
3388 | +++ b/drivers/target/iscsi/iscsi_target_configfs.c |
3389 | @@ -474,7 +474,7 @@ static ssize_t __iscsi_##prefix##_store_##name( \ |
3390 | if (!capable(CAP_SYS_ADMIN)) \ |
3391 | return -EPERM; \ |
3392 | \ |
3393 | - snprintf(auth->name, PAGE_SIZE, "%s", page); \ |
3394 | + snprintf(auth->name, sizeof(auth->name), "%s", page); \ |
3395 | if (!strncmp("NULL", auth->name, 4)) \ |
3396 | auth->naf_flags &= ~flags; \ |
3397 | else \ |
3398 | diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h |
3399 | index 60ec4b9..8907dcd 100644 |
3400 | --- a/drivers/target/iscsi/iscsi_target_core.h |
3401 | +++ b/drivers/target/iscsi/iscsi_target_core.h |
3402 | @@ -132,7 +132,6 @@ enum cmd_flags_table { |
3403 | ICF_CONTIG_MEMORY = 0x00000020, |
3404 | ICF_ATTACHED_TO_RQUEUE = 0x00000040, |
3405 | ICF_OOO_CMDSN = 0x00000080, |
3406 | - ICF_REJECT_FAIL_CONN = 0x00000100, |
3407 | }; |
3408 | |
3409 | /* struct iscsi_cmd->i_state */ |
3410 | @@ -366,6 +365,8 @@ struct iscsi_cmd { |
3411 | u8 maxcmdsn_inc; |
3412 | /* Immediate Unsolicited Dataout */ |
3413 | u8 unsolicited_data; |
3414 | + /* Reject reason code */ |
3415 | + u8 reject_reason; |
3416 | /* CID contained in logout PDU when opcode == ISCSI_INIT_LOGOUT_CMND */ |
3417 | u16 logout_cid; |
3418 | /* Command flags */ |
3419 | @@ -446,7 +447,6 @@ struct iscsi_cmd { |
3420 | struct list_head datain_list; |
3421 | /* R2T List */ |
3422 | struct list_head cmd_r2t_list; |
3423 | - struct completion reject_comp; |
3424 | /* Timer for DataOUT */ |
3425 | struct timer_list dataout_timer; |
3426 | /* Iovecs for SCSI data payload RX/TX w/ kernel level sockets */ |
3427 | diff --git a/drivers/target/iscsi/iscsi_target_erl0.c b/drivers/target/iscsi/iscsi_target_erl0.c |
3428 | index dcb199d..08bd878 100644 |
3429 | --- a/drivers/target/iscsi/iscsi_target_erl0.c |
3430 | +++ b/drivers/target/iscsi/iscsi_target_erl0.c |
3431 | @@ -746,13 +746,12 @@ int iscsit_check_post_dataout( |
3432 | if (!conn->sess->sess_ops->ErrorRecoveryLevel) { |
3433 | pr_err("Unable to recover from DataOUT CRC" |
3434 | " failure while ERL=0, closing session.\n"); |
3435 | - iscsit_add_reject_from_cmd(ISCSI_REASON_DATA_DIGEST_ERROR, |
3436 | - 1, 0, buf, cmd); |
3437 | + iscsit_reject_cmd(cmd, ISCSI_REASON_DATA_DIGEST_ERROR, |
3438 | + buf); |
3439 | return DATAOUT_CANNOT_RECOVER; |
3440 | } |
3441 | |
3442 | - iscsit_add_reject_from_cmd(ISCSI_REASON_DATA_DIGEST_ERROR, |
3443 | - 0, 0, buf, cmd); |
3444 | + iscsit_reject_cmd(cmd, ISCSI_REASON_DATA_DIGEST_ERROR, buf); |
3445 | return iscsit_dataout_post_crc_failed(cmd, buf); |
3446 | } |
3447 | } |
3448 | @@ -909,6 +908,7 @@ void iscsit_cause_connection_reinstatement(struct iscsi_conn *conn, int sleep) |
3449 | wait_for_completion(&conn->conn_wait_comp); |
3450 | complete(&conn->conn_post_wait_comp); |
3451 | } |
3452 | +EXPORT_SYMBOL(iscsit_cause_connection_reinstatement); |
3453 | |
3454 | void iscsit_fall_back_to_erl0(struct iscsi_session *sess) |
3455 | { |
3456 | diff --git a/drivers/target/iscsi/iscsi_target_erl1.c b/drivers/target/iscsi/iscsi_target_erl1.c |
3457 | index 40d9dbc..586c268 100644 |
3458 | --- a/drivers/target/iscsi/iscsi_target_erl1.c |
3459 | +++ b/drivers/target/iscsi/iscsi_target_erl1.c |
3460 | @@ -162,9 +162,8 @@ static int iscsit_handle_r2t_snack( |
3461 | " protocol error.\n", cmd->init_task_tag, begrun, |
3462 | (begrun + runlength), cmd->acked_data_sn); |
3463 | |
3464 | - return iscsit_add_reject_from_cmd( |
3465 | - ISCSI_REASON_PROTOCOL_ERROR, |
3466 | - 1, 0, buf, cmd); |
3467 | + return iscsit_reject_cmd(cmd, |
3468 | + ISCSI_REASON_PROTOCOL_ERROR, buf); |
3469 | } |
3470 | |
3471 | if (runlength) { |
3472 | @@ -173,8 +172,8 @@ static int iscsit_handle_r2t_snack( |
3473 | " with BegRun: 0x%08x, RunLength: 0x%08x, exceeds" |
3474 | " current R2TSN: 0x%08x, protocol error.\n", |
3475 | cmd->init_task_tag, begrun, runlength, cmd->r2t_sn); |
3476 | - return iscsit_add_reject_from_cmd( |
3477 | - ISCSI_REASON_BOOKMARK_INVALID, 1, 0, buf, cmd); |
3478 | + return iscsit_reject_cmd(cmd, |
3479 | + ISCSI_REASON_BOOKMARK_INVALID, buf); |
3480 | } |
3481 | last_r2tsn = (begrun + runlength); |
3482 | } else |
3483 | @@ -433,8 +432,7 @@ static int iscsit_handle_recovery_datain( |
3484 | " protocol error.\n", cmd->init_task_tag, begrun, |
3485 | (begrun + runlength), cmd->acked_data_sn); |
3486 | |
3487 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR, |
3488 | - 1, 0, buf, cmd); |
3489 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, buf); |
3490 | } |
3491 | |
3492 | /* |
3493 | @@ -445,14 +443,14 @@ static int iscsit_handle_recovery_datain( |
3494 | pr_err("Initiator requesting BegRun: 0x%08x, RunLength" |
3495 | ": 0x%08x greater than maximum DataSN: 0x%08x.\n", |
3496 | begrun, runlength, (cmd->data_sn - 1)); |
3497 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_INVALID, |
3498 | - 1, 0, buf, cmd); |
3499 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_BOOKMARK_INVALID, |
3500 | + buf); |
3501 | } |
3502 | |
3503 | dr = iscsit_allocate_datain_req(); |
3504 | if (!dr) |
3505 | - return iscsit_add_reject_from_cmd(ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3506 | - 1, 0, buf, cmd); |
3507 | + return iscsit_reject_cmd(cmd, ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
3508 | + buf); |
3509 | |
3510 | dr->data_sn = dr->begrun = begrun; |
3511 | dr->runlength = runlength; |
3512 | @@ -1090,7 +1088,7 @@ int iscsit_handle_ooo_cmdsn( |
3513 | |
3514 | ooo_cmdsn = iscsit_allocate_ooo_cmdsn(); |
3515 | if (!ooo_cmdsn) |
3516 | - return CMDSN_ERROR_CANNOT_RECOVER; |
3517 | + return -ENOMEM; |
3518 | |
3519 | ooo_cmdsn->cmd = cmd; |
3520 | ooo_cmdsn->batch_count = (batch) ? |
3521 | @@ -1101,10 +1099,10 @@ int iscsit_handle_ooo_cmdsn( |
3522 | |
3523 | if (iscsit_attach_ooo_cmdsn(sess, ooo_cmdsn) < 0) { |
3524 | kmem_cache_free(lio_ooo_cache, ooo_cmdsn); |
3525 | - return CMDSN_ERROR_CANNOT_RECOVER; |
3526 | + return -ENOMEM; |
3527 | } |
3528 | |
3529 | - return CMDSN_HIGHER_THAN_EXP; |
3530 | + return 0; |
3531 | } |
3532 | |
3533 | static int iscsit_set_dataout_timeout_values( |
3534 | diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c |
3535 | index 08a3bac..96e7fdb 100644 |
3536 | --- a/drivers/target/iscsi/iscsi_target_util.c |
3537 | +++ b/drivers/target/iscsi/iscsi_target_util.c |
3538 | @@ -178,7 +178,6 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, gfp_t gfp_mask) |
3539 | INIT_LIST_HEAD(&cmd->i_conn_node); |
3540 | INIT_LIST_HEAD(&cmd->datain_list); |
3541 | INIT_LIST_HEAD(&cmd->cmd_r2t_list); |
3542 | - init_completion(&cmd->reject_comp); |
3543 | spin_lock_init(&cmd->datain_lock); |
3544 | spin_lock_init(&cmd->dataout_timeout_lock); |
3545 | spin_lock_init(&cmd->istate_lock); |
3546 | @@ -284,13 +283,12 @@ static inline int iscsit_check_received_cmdsn(struct iscsi_session *sess, u32 cm |
3547 | * Commands may be received out of order if MC/S is in use. |
3548 | * Ensure they are executed in CmdSN order. |
3549 | */ |
3550 | -int iscsit_sequence_cmd( |
3551 | - struct iscsi_conn *conn, |
3552 | - struct iscsi_cmd *cmd, |
3553 | - __be32 cmdsn) |
3554 | +int iscsit_sequence_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3555 | + unsigned char *buf, __be32 cmdsn) |
3556 | { |
3557 | - int ret; |
3558 | - int cmdsn_ret; |
3559 | + int ret, cmdsn_ret; |
3560 | + bool reject = false; |
3561 | + u8 reason = ISCSI_REASON_BOOKMARK_NO_RESOURCES; |
3562 | |
3563 | mutex_lock(&conn->sess->cmdsn_mutex); |
3564 | |
3565 | @@ -300,9 +298,19 @@ int iscsit_sequence_cmd( |
3566 | ret = iscsit_execute_cmd(cmd, 0); |
3567 | if ((ret >= 0) && !list_empty(&conn->sess->sess_ooo_cmdsn_list)) |
3568 | iscsit_execute_ooo_cmdsns(conn->sess); |
3569 | + else if (ret < 0) { |
3570 | + reject = true; |
3571 | + ret = CMDSN_ERROR_CANNOT_RECOVER; |
3572 | + } |
3573 | break; |
3574 | case CMDSN_HIGHER_THAN_EXP: |
3575 | ret = iscsit_handle_ooo_cmdsn(conn->sess, cmd, be32_to_cpu(cmdsn)); |
3576 | + if (ret < 0) { |
3577 | + reject = true; |
3578 | + ret = CMDSN_ERROR_CANNOT_RECOVER; |
3579 | + break; |
3580 | + } |
3581 | + ret = CMDSN_HIGHER_THAN_EXP; |
3582 | break; |
3583 | case CMDSN_LOWER_THAN_EXP: |
3584 | cmd->i_state = ISTATE_REMOVE; |
3585 | @@ -310,11 +318,16 @@ int iscsit_sequence_cmd( |
3586 | ret = cmdsn_ret; |
3587 | break; |
3588 | default: |
3589 | + reason = ISCSI_REASON_PROTOCOL_ERROR; |
3590 | + reject = true; |
3591 | ret = cmdsn_ret; |
3592 | break; |
3593 | } |
3594 | mutex_unlock(&conn->sess->cmdsn_mutex); |
3595 | |
3596 | + if (reject) |
3597 | + iscsit_reject_cmd(cmd, reason, buf); |
3598 | + |
3599 | return ret; |
3600 | } |
3601 | EXPORT_SYMBOL(iscsit_sequence_cmd); |
3602 | diff --git a/drivers/target/iscsi/iscsi_target_util.h b/drivers/target/iscsi/iscsi_target_util.h |
3603 | index a442265..e4fc34a 100644 |
3604 | --- a/drivers/target/iscsi/iscsi_target_util.h |
3605 | +++ b/drivers/target/iscsi/iscsi_target_util.h |
3606 | @@ -13,7 +13,8 @@ extern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, gfp_t); |
3607 | extern struct iscsi_seq *iscsit_get_seq_holder_for_datain(struct iscsi_cmd *, u32); |
3608 | extern struct iscsi_seq *iscsit_get_seq_holder_for_r2t(struct iscsi_cmd *); |
3609 | extern struct iscsi_r2t *iscsit_get_holder_for_r2tsn(struct iscsi_cmd *, u32); |
3610 | -int iscsit_sequence_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, __be32 cmdsn); |
3611 | +extern int iscsit_sequence_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
3612 | + unsigned char * ,__be32 cmdsn); |
3613 | extern int iscsit_check_unsolicited_dataout(struct iscsi_cmd *, unsigned char *); |
3614 | extern struct iscsi_cmd *iscsit_find_cmd_from_itt(struct iscsi_conn *, itt_t); |
3615 | extern struct iscsi_cmd *iscsit_find_cmd_from_itt_or_dump(struct iscsi_conn *, |
3616 | diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c |
3617 | index 121aeb9..f597e88 100644 |
3618 | --- a/drivers/tty/tty_port.c |
3619 | +++ b/drivers/tty/tty_port.c |
3620 | @@ -256,10 +256,9 @@ void tty_port_tty_hangup(struct tty_port *port, bool check_clocal) |
3621 | { |
3622 | struct tty_struct *tty = tty_port_tty_get(port); |
3623 | |
3624 | - if (tty && (!check_clocal || !C_CLOCAL(tty))) { |
3625 | + if (tty && (!check_clocal || !C_CLOCAL(tty))) |
3626 | tty_hangup(tty); |
3627 | - tty_kref_put(tty); |
3628 | - } |
3629 | + tty_kref_put(tty); |
3630 | } |
3631 | EXPORT_SYMBOL_GPL(tty_port_tty_hangup); |
3632 | |
3633 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
3634 | index feef935..b93fc88 100644 |
3635 | --- a/drivers/usb/core/hub.c |
3636 | +++ b/drivers/usb/core/hub.c |
3637 | @@ -668,6 +668,15 @@ resubmit: |
3638 | static inline int |
3639 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) |
3640 | { |
3641 | + /* Need to clear both directions for control ep */ |
3642 | + if (((devinfo >> 11) & USB_ENDPOINT_XFERTYPE_MASK) == |
3643 | + USB_ENDPOINT_XFER_CONTROL) { |
3644 | + int status = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), |
3645 | + HUB_CLEAR_TT_BUFFER, USB_RT_PORT, |
3646 | + devinfo ^ 0x8000, tt, NULL, 0, 1000); |
3647 | + if (status) |
3648 | + return status; |
3649 | + } |
3650 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), |
3651 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, |
3652 | tt, NULL, 0, 1000); |
3653 | @@ -2846,6 +2855,15 @@ static int usb_disable_function_remotewakeup(struct usb_device *udev) |
3654 | USB_CTRL_SET_TIMEOUT); |
3655 | } |
3656 | |
3657 | +/* Count of wakeup-enabled devices at or below udev */ |
3658 | +static unsigned wakeup_enabled_descendants(struct usb_device *udev) |
3659 | +{ |
3660 | + struct usb_hub *hub = usb_hub_to_struct_hub(udev); |
3661 | + |
3662 | + return udev->do_remote_wakeup + |
3663 | + (hub ? hub->wakeup_enabled_descendants : 0); |
3664 | +} |
3665 | + |
3666 | /* |
3667 | * usb_port_suspend - suspend a usb device's upstream port |
3668 | * @udev: device that's no longer in active use, not a root hub |
3669 | @@ -2886,8 +2904,8 @@ static int usb_disable_function_remotewakeup(struct usb_device *udev) |
3670 | * Linux (2.6) currently has NO mechanisms to initiate that: no khubd |
3671 | * timer, no SRP, no requests through sysfs. |
3672 | * |
3673 | - * If Runtime PM isn't enabled or used, non-SuperSpeed devices really get |
3674 | - * suspended only when their bus goes into global suspend (i.e., the root |
3675 | + * If Runtime PM isn't enabled or used, non-SuperSpeed devices may not get |
3676 | + * suspended until their bus goes into global suspend (i.e., the root |
3677 | * hub is suspended). Nevertheless, we change @udev->state to |
3678 | * USB_STATE_SUSPENDED as this is the device's "logical" state. The actual |
3679 | * upstream port setting is stored in @udev->port_is_suspended. |
3680 | @@ -2958,15 +2976,21 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
3681 | /* see 7.1.7.6 */ |
3682 | if (hub_is_superspeed(hub->hdev)) |
3683 | status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U3); |
3684 | - else if (PMSG_IS_AUTO(msg)) |
3685 | - status = set_port_feature(hub->hdev, port1, |
3686 | - USB_PORT_FEAT_SUSPEND); |
3687 | + |
3688 | /* |
3689 | * For system suspend, we do not need to enable the suspend feature |
3690 | * on individual USB-2 ports. The devices will automatically go |
3691 | * into suspend a few ms after the root hub stops sending packets. |
3692 | * The USB 2.0 spec calls this "global suspend". |
3693 | + * |
3694 | + * However, many USB hubs have a bug: They don't relay wakeup requests |
3695 | + * from a downstream port if the port's suspend feature isn't on. |
3696 | + * Therefore we will turn on the suspend feature if udev or any of its |
3697 | + * descendants is enabled for remote wakeup. |
3698 | */ |
3699 | + else if (PMSG_IS_AUTO(msg) || wakeup_enabled_descendants(udev) > 0) |
3700 | + status = set_port_feature(hub->hdev, port1, |
3701 | + USB_PORT_FEAT_SUSPEND); |
3702 | else { |
3703 | really_suspend = false; |
3704 | status = 0; |
3705 | @@ -3001,15 +3025,16 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
3706 | if (!PMSG_IS_AUTO(msg)) |
3707 | status = 0; |
3708 | } else { |
3709 | - /* device has up to 10 msec to fully suspend */ |
3710 | dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", |
3711 | (PMSG_IS_AUTO(msg) ? "auto-" : ""), |
3712 | udev->do_remote_wakeup); |
3713 | - usb_set_device_state(udev, USB_STATE_SUSPENDED); |
3714 | if (really_suspend) { |
3715 | udev->port_is_suspended = 1; |
3716 | + |
3717 | + /* device has up to 10 msec to fully suspend */ |
3718 | msleep(10); |
3719 | } |
3720 | + usb_set_device_state(udev, USB_STATE_SUSPENDED); |
3721 | } |
3722 | |
3723 | /* |
3724 | @@ -3291,7 +3316,11 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) |
3725 | unsigned port1; |
3726 | int status; |
3727 | |
3728 | - /* Warn if children aren't already suspended */ |
3729 | + /* |
3730 | + * Warn if children aren't already suspended. |
3731 | + * Also, add up the number of wakeup-enabled descendants. |
3732 | + */ |
3733 | + hub->wakeup_enabled_descendants = 0; |
3734 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
3735 | struct usb_device *udev; |
3736 | |
3737 | @@ -3301,6 +3330,9 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) |
3738 | if (PMSG_IS_AUTO(msg)) |
3739 | return -EBUSY; |
3740 | } |
3741 | + if (udev) |
3742 | + hub->wakeup_enabled_descendants += |
3743 | + wakeup_enabled_descendants(udev); |
3744 | } |
3745 | |
3746 | if (hdev->do_remote_wakeup && hub->quirk_check_port_auto_suspend) { |
3747 | diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h |
3748 | index 80ab9ee..f608b39 100644 |
3749 | --- a/drivers/usb/core/hub.h |
3750 | +++ b/drivers/usb/core/hub.h |
3751 | @@ -59,6 +59,9 @@ struct usb_hub { |
3752 | struct usb_tt tt; /* Transaction Translator */ |
3753 | |
3754 | unsigned mA_per_port; /* current for each child */ |
3755 | +#ifdef CONFIG_PM |
3756 | + unsigned wakeup_enabled_descendants; |
3757 | +#endif |
3758 | |
3759 | unsigned limited_power:1; |
3760 | unsigned quiescing:1; |
3761 | diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c |
3762 | index c35d49d..358375e 100644 |
3763 | --- a/drivers/usb/dwc3/core.c |
3764 | +++ b/drivers/usb/dwc3/core.c |
3765 | @@ -450,7 +450,7 @@ static int dwc3_probe(struct platform_device *pdev) |
3766 | } |
3767 | |
3768 | if (IS_ERR(dwc->usb3_phy)) { |
3769 | - ret = PTR_ERR(dwc->usb2_phy); |
3770 | + ret = PTR_ERR(dwc->usb3_phy); |
3771 | |
3772 | /* |
3773 | * if -ENXIO is returned, it means PHY layer wasn't |
3774 | diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h |
3775 | index b69d322..27dad99 100644 |
3776 | --- a/drivers/usb/dwc3/core.h |
3777 | +++ b/drivers/usb/dwc3/core.h |
3778 | @@ -759,8 +759,8 @@ struct dwc3 { |
3779 | |
3780 | struct dwc3_event_type { |
3781 | u32 is_devspec:1; |
3782 | - u32 type:6; |
3783 | - u32 reserved8_31:25; |
3784 | + u32 type:7; |
3785 | + u32 reserved8_31:24; |
3786 | } __packed; |
3787 | |
3788 | #define DWC3_DEPEVT_XFERCOMPLETE 0x01 |
3789 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
3790 | index b5e5b35..f77083f 100644 |
3791 | --- a/drivers/usb/dwc3/gadget.c |
3792 | +++ b/drivers/usb/dwc3/gadget.c |
3793 | @@ -1584,6 +1584,7 @@ err1: |
3794 | __dwc3_gadget_ep_disable(dwc->eps[0]); |
3795 | |
3796 | err0: |
3797 | + dwc->gadget_driver = NULL; |
3798 | spin_unlock_irqrestore(&dwc->lock, flags); |
3799 | |
3800 | return ret; |
3801 | diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c |
3802 | index ffd8fa5..5514822 100644 |
3803 | --- a/drivers/usb/gadget/udc-core.c |
3804 | +++ b/drivers/usb/gadget/udc-core.c |
3805 | @@ -105,7 +105,7 @@ void usb_gadget_set_state(struct usb_gadget *gadget, |
3806 | enum usb_device_state state) |
3807 | { |
3808 | gadget->state = state; |
3809 | - sysfs_notify(&gadget->dev.kobj, NULL, "status"); |
3810 | + sysfs_notify(&gadget->dev.kobj, NULL, "state"); |
3811 | } |
3812 | EXPORT_SYMBOL_GPL(usb_gadget_set_state); |
3813 | |
3814 | diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c |
3815 | index 9ab4a4d..ca6289b 100644 |
3816 | --- a/drivers/usb/host/ehci-hub.c |
3817 | +++ b/drivers/usb/host/ehci-hub.c |
3818 | @@ -858,6 +858,7 @@ static int ehci_hub_control ( |
3819 | ehci->reset_done[wIndex] = jiffies |
3820 | + msecs_to_jiffies(20); |
3821 | usb_hcd_start_port_resume(&hcd->self, wIndex); |
3822 | + set_bit(wIndex, &ehci->resuming_ports); |
3823 | /* check the port again */ |
3824 | mod_timer(&ehci_to_hcd(ehci)->rh_timer, |
3825 | ehci->reset_done[wIndex]); |
3826 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
3827 | index cc24e39..f00cb20 100644 |
3828 | --- a/drivers/usb/host/xhci-pci.c |
3829 | +++ b/drivers/usb/host/xhci-pci.c |
3830 | @@ -93,7 +93,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
3831 | } |
3832 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && |
3833 | pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) { |
3834 | - xhci->quirks |= XHCI_SPURIOUS_SUCCESS; |
3835 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; |
3836 | xhci->limit_active_eps = 64; |
3837 | xhci->quirks |= XHCI_SW_BW_CHECKING; |
3838 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
3839 | index 1969c00..cc3bfc5 100644 |
3840 | --- a/drivers/usb/host/xhci-ring.c |
3841 | +++ b/drivers/usb/host/xhci-ring.c |
3842 | @@ -434,7 +434,7 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci, |
3843 | |
3844 | /* A ring has pending URBs if its TD list is not empty */ |
3845 | if (!(ep->ep_state & EP_HAS_STREAMS)) { |
3846 | - if (!(list_empty(&ep->ring->td_list))) |
3847 | + if (ep->ring && !(list_empty(&ep->ring->td_list))) |
3848 | xhci_ring_ep_doorbell(xhci, slot_id, ep_index, 0); |
3849 | return; |
3850 | } |
3851 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
3852 | index d8f640b..9a550b6 100644 |
3853 | --- a/drivers/usb/host/xhci.c |
3854 | +++ b/drivers/usb/host/xhci.c |
3855 | @@ -1171,9 +1171,6 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, |
3856 | } |
3857 | |
3858 | xhci = hcd_to_xhci(hcd); |
3859 | - if (xhci->xhc_state & XHCI_STATE_HALTED) |
3860 | - return -ENODEV; |
3861 | - |
3862 | if (check_virt_dev) { |
3863 | if (!udev->slot_id || !xhci->devs[udev->slot_id]) { |
3864 | printk(KERN_DEBUG "xHCI %s called with unaddressed " |
3865 | @@ -1189,6 +1186,9 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, |
3866 | } |
3867 | } |
3868 | |
3869 | + if (xhci->xhc_state & XHCI_STATE_HALTED) |
3870 | + return -ENODEV; |
3871 | + |
3872 | return 1; |
3873 | } |
3874 | |
3875 | @@ -4697,6 +4697,13 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) |
3876 | |
3877 | get_quirks(dev, xhci); |
3878 | |
3879 | + /* In xhci controllers which follow xhci 1.0 spec gives a spurious |
3880 | + * success event after a short transfer. This quirk will ignore such |
3881 | + * spurious event. |
3882 | + */ |
3883 | + if (xhci->hci_version > 0x96) |
3884 | + xhci->quirks |= XHCI_SPURIOUS_SUCCESS; |
3885 | + |
3886 | /* Make sure the HC is halted. */ |
3887 | retval = xhci_halt(xhci); |
3888 | if (retval) |
3889 | diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c |
3890 | index c21386e..de98906 100644 |
3891 | --- a/drivers/usb/misc/sisusbvga/sisusb.c |
3892 | +++ b/drivers/usb/misc/sisusbvga/sisusb.c |
3893 | @@ -3247,6 +3247,7 @@ static const struct usb_device_id sisusb_table[] = { |
3894 | { USB_DEVICE(0x0711, 0x0903) }, |
3895 | { USB_DEVICE(0x0711, 0x0918) }, |
3896 | { USB_DEVICE(0x0711, 0x0920) }, |
3897 | + { USB_DEVICE(0x0711, 0x0950) }, |
3898 | { USB_DEVICE(0x182d, 0x021c) }, |
3899 | { USB_DEVICE(0x182d, 0x0269) }, |
3900 | { } |
3901 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
3902 | index 7260ec6..b65e657 100644 |
3903 | --- a/drivers/usb/serial/ftdi_sio.c |
3904 | +++ b/drivers/usb/serial/ftdi_sio.c |
3905 | @@ -735,9 +735,34 @@ static struct usb_device_id id_table_combined [] = { |
3906 | { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), |
3907 | .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, |
3908 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, |
3909 | - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, |
3910 | - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) }, |
3911 | - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) }, |
3912 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) }, |
3913 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) }, |
3914 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) }, |
3915 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) }, |
3916 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) }, |
3917 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) }, |
3918 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) }, |
3919 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) }, |
3920 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) }, |
3921 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) }, |
3922 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) }, |
3923 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) }, |
3924 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) }, |
3925 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) }, |
3926 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) }, |
3927 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) }, |
3928 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) }, |
3929 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) }, |
3930 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) }, |
3931 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) }, |
3932 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) }, |
3933 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) }, |
3934 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) }, |
3935 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) }, |
3936 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) }, |
3937 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) }, |
3938 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) }, |
3939 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) }, |
3940 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, |
3941 | { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, |
3942 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, |
3943 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
3944 | index 6dd7925..1b8af46 100644 |
3945 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
3946 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
3947 | @@ -815,11 +815,35 @@ |
3948 | /* |
3949 | * RT Systems programming cables for various ham radios |
3950 | */ |
3951 | -#define RTSYSTEMS_VID 0x2100 /* Vendor ID */ |
3952 | -#define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */ |
3953 | -#define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */ |
3954 | -#define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */ |
3955 | - |
3956 | +#define RTSYSTEMS_VID 0x2100 /* Vendor ID */ |
3957 | +#define RTSYSTEMS_USB_S03_PID 0x9001 /* RTS-03 USB to Serial Adapter */ |
3958 | +#define RTSYSTEMS_USB_59_PID 0x9e50 /* USB-59 USB to 8 pin plug */ |
3959 | +#define RTSYSTEMS_USB_57A_PID 0x9e51 /* USB-57A USB to 4pin 3.5mm plug */ |
3960 | +#define RTSYSTEMS_USB_57B_PID 0x9e52 /* USB-57B USB to extended 4pin 3.5mm plug */ |
3961 | +#define RTSYSTEMS_USB_29A_PID 0x9e53 /* USB-29A USB to 3.5mm stereo plug */ |
3962 | +#define RTSYSTEMS_USB_29B_PID 0x9e54 /* USB-29B USB to 6 pin mini din */ |
3963 | +#define RTSYSTEMS_USB_29F_PID 0x9e55 /* USB-29F USB to 6 pin modular plug */ |
3964 | +#define RTSYSTEMS_USB_62B_PID 0x9e56 /* USB-62B USB to 8 pin mini din plug*/ |
3965 | +#define RTSYSTEMS_USB_S01_PID 0x9e57 /* USB-RTS01 USB to 3.5 mm stereo plug*/ |
3966 | +#define RTSYSTEMS_USB_63_PID 0x9e58 /* USB-63 USB to 9 pin female*/ |
3967 | +#define RTSYSTEMS_USB_29C_PID 0x9e59 /* USB-29C USB to 4 pin modular plug*/ |
3968 | +#define RTSYSTEMS_USB_81B_PID 0x9e5A /* USB-81 USB to 8 pin mini din plug*/ |
3969 | +#define RTSYSTEMS_USB_82B_PID 0x9e5B /* USB-82 USB to 2.5 mm stereo plug*/ |
3970 | +#define RTSYSTEMS_USB_K5D_PID 0x9e5C /* USB-K5D USB to 8 pin modular plug*/ |
3971 | +#define RTSYSTEMS_USB_K4Y_PID 0x9e5D /* USB-K4Y USB to 2.5/3.5 mm plugs*/ |
3972 | +#define RTSYSTEMS_USB_K5G_PID 0x9e5E /* USB-K5G USB to 8 pin modular plug*/ |
3973 | +#define RTSYSTEMS_USB_S05_PID 0x9e5F /* USB-RTS05 USB to 2.5 mm stereo plug*/ |
3974 | +#define RTSYSTEMS_USB_60_PID 0x9e60 /* USB-60 USB to 6 pin din*/ |
3975 | +#define RTSYSTEMS_USB_61_PID 0x9e61 /* USB-61 USB to 6 pin mini din*/ |
3976 | +#define RTSYSTEMS_USB_62_PID 0x9e62 /* USB-62 USB to 8 pin mini din*/ |
3977 | +#define RTSYSTEMS_USB_63B_PID 0x9e63 /* USB-63 USB to 9 pin female*/ |
3978 | +#define RTSYSTEMS_USB_64_PID 0x9e64 /* USB-64 USB to 9 pin male*/ |
3979 | +#define RTSYSTEMS_USB_65_PID 0x9e65 /* USB-65 USB to 9 pin female null modem*/ |
3980 | +#define RTSYSTEMS_USB_92_PID 0x9e66 /* USB-92 USB to 12 pin plug*/ |
3981 | +#define RTSYSTEMS_USB_92D_PID 0x9e67 /* USB-92D USB to 12 pin plug data*/ |
3982 | +#define RTSYSTEMS_USB_W5R_PID 0x9e68 /* USB-W5R USB to 8 pin modular plug*/ |
3983 | +#define RTSYSTEMS_USB_A5R_PID 0x9e69 /* USB-A5R USB to 8 pin modular plug*/ |
3984 | +#define RTSYSTEMS_USB_PW1_PID 0x9e6A /* USB-PW1 USB to 8 pin modular plug*/ |
3985 | |
3986 | /* |
3987 | * Physik Instrumente |
3988 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c |
3989 | index 7e99808..62b86a6 100644 |
3990 | --- a/drivers/usb/serial/mos7840.c |
3991 | +++ b/drivers/usb/serial/mos7840.c |
3992 | @@ -914,20 +914,20 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) |
3993 | status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); |
3994 | if (status < 0) { |
3995 | dev_dbg(&port->dev, "Reading Spreg failed\n"); |
3996 | - return -1; |
3997 | + goto err; |
3998 | } |
3999 | Data |= 0x80; |
4000 | status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); |
4001 | if (status < 0) { |
4002 | dev_dbg(&port->dev, "writing Spreg failed\n"); |
4003 | - return -1; |
4004 | + goto err; |
4005 | } |
4006 | |
4007 | Data &= ~0x80; |
4008 | status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); |
4009 | if (status < 0) { |
4010 | dev_dbg(&port->dev, "writing Spreg failed\n"); |
4011 | - return -1; |
4012 | + goto err; |
4013 | } |
4014 | /* End of block to be checked */ |
4015 | |
4016 | @@ -936,7 +936,7 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) |
4017 | &Data); |
4018 | if (status < 0) { |
4019 | dev_dbg(&port->dev, "Reading Controlreg failed\n"); |
4020 | - return -1; |
4021 | + goto err; |
4022 | } |
4023 | Data |= 0x08; /* Driver done bit */ |
4024 | Data |= 0x20; /* rx_disable */ |
4025 | @@ -944,7 +944,7 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) |
4026 | mos7840_port->ControlRegOffset, Data); |
4027 | if (status < 0) { |
4028 | dev_dbg(&port->dev, "writing Controlreg failed\n"); |
4029 | - return -1; |
4030 | + goto err; |
4031 | } |
4032 | /* do register settings here */ |
4033 | /* Set all regs to the device default values. */ |
4034 | @@ -955,21 +955,21 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) |
4035 | status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); |
4036 | if (status < 0) { |
4037 | dev_dbg(&port->dev, "disabling interrupts failed\n"); |
4038 | - return -1; |
4039 | + goto err; |
4040 | } |
4041 | /* Set FIFO_CONTROL_REGISTER to the default value */ |
4042 | Data = 0x00; |
4043 | status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); |
4044 | if (status < 0) { |
4045 | dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); |
4046 | - return -1; |
4047 | + goto err; |
4048 | } |
4049 | |
4050 | Data = 0xcf; |
4051 | status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); |
4052 | if (status < 0) { |
4053 | dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); |
4054 | - return -1; |
4055 | + goto err; |
4056 | } |
4057 | |
4058 | Data = 0x03; |
4059 | @@ -1114,6 +1114,15 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) |
4060 | /* mos7840_change_port_settings(mos7840_port,old_termios); */ |
4061 | |
4062 | return 0; |
4063 | +err: |
4064 | + for (j = 0; j < NUM_URBS; ++j) { |
4065 | + urb = mos7840_port->write_urb_pool[j]; |
4066 | + if (!urb) |
4067 | + continue; |
4068 | + kfree(urb->transfer_buffer); |
4069 | + usb_free_urb(urb); |
4070 | + } |
4071 | + return status; |
4072 | } |
4073 | |
4074 | /***************************************************************************** |
4075 | diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c |
4076 | index e581c25..01f79f1 100644 |
4077 | --- a/drivers/usb/serial/ti_usb_3410_5052.c |
4078 | +++ b/drivers/usb/serial/ti_usb_3410_5052.c |
4079 | @@ -371,7 +371,7 @@ static int ti_startup(struct usb_serial *serial) |
4080 | usb_set_serial_data(serial, tdev); |
4081 | |
4082 | /* determine device type */ |
4083 | - if (usb_match_id(serial->interface, ti_id_table_3410)) |
4084 | + if (serial->type == &ti_1port_device) |
4085 | tdev->td_is_3410 = 1; |
4086 | dev_dbg(&dev->dev, "%s - device type is %s\n", __func__, |
4087 | tdev->td_is_3410 ? "3410" : "5052"); |
4088 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
4089 | index 179933528..c015f2c 100644 |
4090 | --- a/drivers/usb/storage/unusual_devs.h |
4091 | +++ b/drivers/usb/storage/unusual_devs.h |
4092 | @@ -665,6 +665,13 @@ UNUSUAL_DEV( 0x054c, 0x016a, 0x0000, 0x9999, |
4093 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
4094 | US_FL_FIX_INQUIRY ), |
4095 | |
4096 | +/* Submitted by Ren Bigcren <bigcren.ren@sonymobile.com> */ |
4097 | +UNUSUAL_DEV( 0x054c, 0x02a5, 0x0100, 0x0100, |
4098 | + "Sony Corp.", |
4099 | + "MicroVault Flash Drive", |
4100 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
4101 | + US_FL_NO_READ_CAPACITY_16 ), |
4102 | + |
4103 | /* floppy reports multiple luns */ |
4104 | UNUSUAL_DEV( 0x055d, 0x2020, 0x0000, 0x0210, |
4105 | "SAMSUNG", |
4106 | diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c |
4107 | index 45c8efa..34924fb 100644 |
4108 | --- a/drivers/xen/evtchn.c |
4109 | +++ b/drivers/xen/evtchn.c |
4110 | @@ -377,18 +377,12 @@ static long evtchn_ioctl(struct file *file, |
4111 | if (unbind.port >= NR_EVENT_CHANNELS) |
4112 | break; |
4113 | |
4114 | - spin_lock_irq(&port_user_lock); |
4115 | - |
4116 | rc = -ENOTCONN; |
4117 | - if (get_port_user(unbind.port) != u) { |
4118 | - spin_unlock_irq(&port_user_lock); |
4119 | + if (get_port_user(unbind.port) != u) |
4120 | break; |
4121 | - } |
4122 | |
4123 | disable_irq(irq_from_evtchn(unbind.port)); |
4124 | |
4125 | - spin_unlock_irq(&port_user_lock); |
4126 | - |
4127 | evtchn_unbind_from_user(u, unbind.port); |
4128 | |
4129 | rc = 0; |
4130 | @@ -488,26 +482,15 @@ static int evtchn_release(struct inode *inode, struct file *filp) |
4131 | int i; |
4132 | struct per_user_data *u = filp->private_data; |
4133 | |
4134 | - spin_lock_irq(&port_user_lock); |
4135 | - |
4136 | - free_page((unsigned long)u->ring); |
4137 | - |
4138 | for (i = 0; i < NR_EVENT_CHANNELS; i++) { |
4139 | if (get_port_user(i) != u) |
4140 | continue; |
4141 | |
4142 | disable_irq(irq_from_evtchn(i)); |
4143 | - } |
4144 | - |
4145 | - spin_unlock_irq(&port_user_lock); |
4146 | - |
4147 | - for (i = 0; i < NR_EVENT_CHANNELS; i++) { |
4148 | - if (get_port_user(i) != u) |
4149 | - continue; |
4150 | - |
4151 | evtchn_unbind_from_user(get_port_user(i), i); |
4152 | } |
4153 | |
4154 | + free_page((unsigned long)u->ring); |
4155 | kfree(u->name); |
4156 | kfree(u); |
4157 | |
4158 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c |
4159 | index df472ab..0b272d0 100644 |
4160 | --- a/fs/btrfs/extent-tree.c |
4161 | +++ b/fs/btrfs/extent-tree.c |
4162 | @@ -7298,6 +7298,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, |
4163 | int err = 0; |
4164 | int ret; |
4165 | int level; |
4166 | + bool root_dropped = false; |
4167 | |
4168 | path = btrfs_alloc_path(); |
4169 | if (!path) { |
4170 | @@ -7355,6 +7356,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, |
4171 | while (1) { |
4172 | btrfs_tree_lock(path->nodes[level]); |
4173 | btrfs_set_lock_blocking(path->nodes[level]); |
4174 | + path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING; |
4175 | |
4176 | ret = btrfs_lookup_extent_info(trans, root, |
4177 | path->nodes[level]->start, |
4178 | @@ -7370,6 +7372,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, |
4179 | break; |
4180 | |
4181 | btrfs_tree_unlock(path->nodes[level]); |
4182 | + path->locks[level] = 0; |
4183 | WARN_ON(wc->refs[level] != 1); |
4184 | level--; |
4185 | } |
4186 | @@ -7471,12 +7474,22 @@ int btrfs_drop_snapshot(struct btrfs_root *root, |
4187 | free_extent_buffer(root->commit_root); |
4188 | kfree(root); |
4189 | } |
4190 | + root_dropped = true; |
4191 | out_end_trans: |
4192 | btrfs_end_transaction_throttle(trans, tree_root); |
4193 | out_free: |
4194 | kfree(wc); |
4195 | btrfs_free_path(path); |
4196 | out: |
4197 | + /* |
4198 | + * So if we need to stop dropping the snapshot for whatever reason we |
4199 | + * need to make sure to add it back to the dead root list so that we |
4200 | + * keep trying to do the work later. This also cleans up roots if we |
4201 | + * don't have it in the radix (like when we recover after a power fail |
4202 | + * or unmount) so we don't leak memory. |
4203 | + */ |
4204 | + if (root_dropped == false) |
4205 | + btrfs_add_dead_root(root); |
4206 | if (err) |
4207 | btrfs_std_error(root->fs_info, err); |
4208 | return err; |
4209 | diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c |
4210 | index 79bd479..eb84c2d 100644 |
4211 | --- a/fs/btrfs/scrub.c |
4212 | +++ b/fs/btrfs/scrub.c |
4213 | @@ -2501,7 +2501,7 @@ again: |
4214 | ret = scrub_extent(sctx, extent_logical, extent_len, |
4215 | extent_physical, extent_dev, flags, |
4216 | generation, extent_mirror_num, |
4217 | - extent_physical); |
4218 | + extent_logical - logical + physical); |
4219 | if (ret) |
4220 | goto out; |
4221 | |
4222 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
4223 | index 84ce601..baf149a 100644 |
4224 | --- a/fs/nfsd/vfs.c |
4225 | +++ b/fs/nfsd/vfs.c |
4226 | @@ -802,9 +802,10 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, |
4227 | flags = O_WRONLY|O_LARGEFILE; |
4228 | } |
4229 | *filp = dentry_open(&path, flags, current_cred()); |
4230 | - if (IS_ERR(*filp)) |
4231 | + if (IS_ERR(*filp)) { |
4232 | host_err = PTR_ERR(*filp); |
4233 | - else { |
4234 | + *filp = NULL; |
4235 | + } else { |
4236 | host_err = ima_file_check(*filp, may_flags); |
4237 | |
4238 | if (may_flags & NFSD_MAY_64BIT_COOKIE) |
4239 | diff --git a/fs/super.c b/fs/super.c |
4240 | index 7465d43..68307c0 100644 |
4241 | --- a/fs/super.c |
4242 | +++ b/fs/super.c |
4243 | @@ -336,19 +336,19 @@ EXPORT_SYMBOL(deactivate_super); |
4244 | * and want to turn it into a full-blown active reference. grab_super() |
4245 | * is called with sb_lock held and drops it. Returns 1 in case of |
4246 | * success, 0 if we had failed (superblock contents was already dead or |
4247 | - * dying when grab_super() had been called). |
4248 | + * dying when grab_super() had been called). Note that this is only |
4249 | + * called for superblocks not in rundown mode (== ones still on ->fs_supers |
4250 | + * of their type), so increment of ->s_count is OK here. |
4251 | */ |
4252 | static int grab_super(struct super_block *s) __releases(sb_lock) |
4253 | { |
4254 | - if (atomic_inc_not_zero(&s->s_active)) { |
4255 | - spin_unlock(&sb_lock); |
4256 | - return 1; |
4257 | - } |
4258 | - /* it's going away */ |
4259 | s->s_count++; |
4260 | spin_unlock(&sb_lock); |
4261 | - /* wait for it to die */ |
4262 | down_write(&s->s_umount); |
4263 | + if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) { |
4264 | + put_super(s); |
4265 | + return 1; |
4266 | + } |
4267 | up_write(&s->s_umount); |
4268 | put_super(s); |
4269 | return 0; |
4270 | @@ -463,11 +463,6 @@ retry: |
4271 | destroy_super(s); |
4272 | s = NULL; |
4273 | } |
4274 | - down_write(&old->s_umount); |
4275 | - if (unlikely(!(old->s_flags & MS_BORN))) { |
4276 | - deactivate_locked_super(old); |
4277 | - goto retry; |
4278 | - } |
4279 | return old; |
4280 | } |
4281 | } |
4282 | @@ -660,10 +655,10 @@ restart: |
4283 | if (hlist_unhashed(&sb->s_instances)) |
4284 | continue; |
4285 | if (sb->s_bdev == bdev) { |
4286 | - if (grab_super(sb)) /* drops sb_lock */ |
4287 | - return sb; |
4288 | - else |
4289 | + if (!grab_super(sb)) |
4290 | goto restart; |
4291 | + up_write(&sb->s_umount); |
4292 | + return sb; |
4293 | } |
4294 | } |
4295 | spin_unlock(&sb_lock); |
4296 | diff --git a/include/linux/firewire.h b/include/linux/firewire.h |
4297 | index 191501a..217e4b4 100644 |
4298 | --- a/include/linux/firewire.h |
4299 | +++ b/include/linux/firewire.h |
4300 | @@ -434,6 +434,7 @@ struct fw_iso_context { |
4301 | int type; |
4302 | int channel; |
4303 | int speed; |
4304 | + bool drop_overflow_headers; |
4305 | size_t header_size; |
4306 | union { |
4307 | fw_iso_callback_t sc; |
4308 | diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h |
4309 | index 23a87d0..c5aade5 100644 |
4310 | --- a/include/target/iscsi/iscsi_transport.h |
4311 | +++ b/include/target/iscsi/iscsi_transport.h |
4312 | @@ -34,8 +34,6 @@ extern void iscsit_put_transport(struct iscsit_transport *); |
4313 | /* |
4314 | * From iscsi_target.c |
4315 | */ |
4316 | -extern int iscsit_add_reject_from_cmd(u8, int, int, unsigned char *, |
4317 | - struct iscsi_cmd *); |
4318 | extern int iscsit_setup_scsi_cmd(struct iscsi_conn *, struct iscsi_cmd *, |
4319 | unsigned char *); |
4320 | extern void iscsit_set_unsoliticed_dataout(struct iscsi_cmd *); |
4321 | @@ -67,6 +65,10 @@ extern int iscsit_logout_post_handler(struct iscsi_cmd *, struct iscsi_conn *); |
4322 | */ |
4323 | extern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *); |
4324 | /* |
4325 | + * From iscsi_target_erl0.c |
4326 | + */ |
4327 | +extern void iscsit_cause_connection_reinstatement(struct iscsi_conn *, int); |
4328 | +/* |
4329 | * From iscsi_target_erl1.c |
4330 | */ |
4331 | extern void iscsit_stop_dataout_timer(struct iscsi_cmd *); |
4332 | @@ -80,4 +82,5 @@ extern int iscsit_tmr_post_handler(struct iscsi_cmd *, struct iscsi_conn *); |
4333 | * From iscsi_target_util.c |
4334 | */ |
4335 | extern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, gfp_t); |
4336 | -extern int iscsit_sequence_cmd(struct iscsi_conn *, struct iscsi_cmd *, __be32); |
4337 | +extern int iscsit_sequence_cmd(struct iscsi_conn *, struct iscsi_cmd *, |
4338 | + unsigned char *, __be32); |
4339 | diff --git a/include/uapi/linux/firewire-cdev.h b/include/uapi/linux/firewire-cdev.h |
4340 | index d500369..1db453e 100644 |
4341 | --- a/include/uapi/linux/firewire-cdev.h |
4342 | +++ b/include/uapi/linux/firewire-cdev.h |
4343 | @@ -215,8 +215,8 @@ struct fw_cdev_event_request2 { |
4344 | * with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with |
4345 | * %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets |
4346 | * without the interrupt bit set that the kernel's internal buffer for @header |
4347 | - * is about to overflow. (In the last case, kernels with ABI version < 5 drop |
4348 | - * header data up to the next interrupt packet.) |
4349 | + * is about to overflow. (In the last case, ABI versions < 5 drop header data |
4350 | + * up to the next interrupt packet.) |
4351 | * |
4352 | * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT): |
4353 | * |
4354 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
4355 | index 0b936d8..f7bc3ce 100644 |
4356 | --- a/kernel/trace/trace.c |
4357 | +++ b/kernel/trace/trace.c |
4358 | @@ -1163,18 +1163,17 @@ void tracing_reset_current(int cpu) |
4359 | tracing_reset(&global_trace.trace_buffer, cpu); |
4360 | } |
4361 | |
4362 | +/* Must have trace_types_lock held */ |
4363 | void tracing_reset_all_online_cpus(void) |
4364 | { |
4365 | struct trace_array *tr; |
4366 | |
4367 | - mutex_lock(&trace_types_lock); |
4368 | list_for_each_entry(tr, &ftrace_trace_arrays, list) { |
4369 | tracing_reset_online_cpus(&tr->trace_buffer); |
4370 | #ifdef CONFIG_TRACER_MAX_TRACE |
4371 | tracing_reset_online_cpus(&tr->max_buffer); |
4372 | #endif |
4373 | } |
4374 | - mutex_unlock(&trace_types_lock); |
4375 | } |
4376 | |
4377 | #define SAVED_CMDLINES 128 |
4378 | @@ -2956,7 +2955,6 @@ static int tracing_release(struct inode *inode, struct file *file) |
4379 | |
4380 | iter = m->private; |
4381 | tr = iter->tr; |
4382 | - trace_array_put(tr); |
4383 | |
4384 | mutex_lock(&trace_types_lock); |
4385 | |
4386 | @@ -2971,6 +2969,9 @@ static int tracing_release(struct inode *inode, struct file *file) |
4387 | if (!iter->snapshot) |
4388 | /* reenable tracing if it was previously enabled */ |
4389 | tracing_start_tr(tr); |
4390 | + |
4391 | + __trace_array_put(tr); |
4392 | + |
4393 | mutex_unlock(&trace_types_lock); |
4394 | |
4395 | mutex_destroy(&iter->mutex); |
4396 | @@ -3395,6 +3396,7 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf, |
4397 | static int tracing_trace_options_open(struct inode *inode, struct file *file) |
4398 | { |
4399 | struct trace_array *tr = inode->i_private; |
4400 | + int ret; |
4401 | |
4402 | if (tracing_disabled) |
4403 | return -ENODEV; |
4404 | @@ -3402,7 +3404,11 @@ static int tracing_trace_options_open(struct inode *inode, struct file *file) |
4405 | if (trace_array_get(tr) < 0) |
4406 | return -ENODEV; |
4407 | |
4408 | - return single_open(file, tracing_trace_options_show, inode->i_private); |
4409 | + ret = single_open(file, tracing_trace_options_show, inode->i_private); |
4410 | + if (ret < 0) |
4411 | + trace_array_put(tr); |
4412 | + |
4413 | + return ret; |
4414 | } |
4415 | |
4416 | static const struct file_operations tracing_iter_fops = { |
4417 | @@ -3906,6 +3912,7 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp) |
4418 | iter = kzalloc(sizeof(*iter), GFP_KERNEL); |
4419 | if (!iter) { |
4420 | ret = -ENOMEM; |
4421 | + __trace_array_put(tr); |
4422 | goto out; |
4423 | } |
4424 | |
4425 | @@ -4652,21 +4659,24 @@ static int tracing_snapshot_open(struct inode *inode, struct file *file) |
4426 | ret = PTR_ERR(iter); |
4427 | } else { |
4428 | /* Writes still need the seq_file to hold the private data */ |
4429 | + ret = -ENOMEM; |
4430 | m = kzalloc(sizeof(*m), GFP_KERNEL); |
4431 | if (!m) |
4432 | - return -ENOMEM; |
4433 | + goto out; |
4434 | iter = kzalloc(sizeof(*iter), GFP_KERNEL); |
4435 | if (!iter) { |
4436 | kfree(m); |
4437 | - return -ENOMEM; |
4438 | + goto out; |
4439 | } |
4440 | + ret = 0; |
4441 | + |
4442 | iter->tr = tr; |
4443 | iter->trace_buffer = &tc->tr->max_buffer; |
4444 | iter->cpu_file = tc->cpu; |
4445 | m->private = iter; |
4446 | file->private_data = m; |
4447 | } |
4448 | - |
4449 | +out: |
4450 | if (ret < 0) |
4451 | trace_array_put(tr); |
4452 | |
4453 | @@ -4896,8 +4906,6 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp) |
4454 | |
4455 | mutex_lock(&trace_types_lock); |
4456 | |
4457 | - tr->ref++; |
4458 | - |
4459 | info->iter.tr = tr; |
4460 | info->iter.cpu_file = tc->cpu; |
4461 | info->iter.trace = tr->current_trace; |
4462 | @@ -5276,9 +5284,10 @@ tracing_stats_read(struct file *filp, char __user *ubuf, |
4463 | } |
4464 | |
4465 | static const struct file_operations tracing_stats_fops = { |
4466 | - .open = tracing_open_generic, |
4467 | + .open = tracing_open_generic_tc, |
4468 | .read = tracing_stats_read, |
4469 | .llseek = generic_file_llseek, |
4470 | + .release = tracing_release_generic_tc, |
4471 | }; |
4472 | |
4473 | #ifdef CONFIG_DYNAMIC_FTRACE |
4474 | @@ -5926,8 +5935,10 @@ static int new_instance_create(const char *name) |
4475 | goto out_free_tr; |
4476 | |
4477 | ret = event_trace_add_tracer(tr->dir, tr); |
4478 | - if (ret) |
4479 | + if (ret) { |
4480 | + debugfs_remove_recursive(tr->dir); |
4481 | goto out_free_tr; |
4482 | + } |
4483 | |
4484 | init_tracer_debugfs(tr, tr->dir); |
4485 | |
4486 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
4487 | index 6dfd48b..6953263 100644 |
4488 | --- a/kernel/trace/trace_events.c |
4489 | +++ b/kernel/trace/trace_events.c |
4490 | @@ -1221,6 +1221,7 @@ show_header(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) |
4491 | |
4492 | static int ftrace_event_avail_open(struct inode *inode, struct file *file); |
4493 | static int ftrace_event_set_open(struct inode *inode, struct file *file); |
4494 | +static int ftrace_event_release(struct inode *inode, struct file *file); |
4495 | |
4496 | static const struct seq_operations show_event_seq_ops = { |
4497 | .start = t_start, |
4498 | @@ -1248,7 +1249,7 @@ static const struct file_operations ftrace_set_event_fops = { |
4499 | .read = seq_read, |
4500 | .write = ftrace_event_write, |
4501 | .llseek = seq_lseek, |
4502 | - .release = seq_release, |
4503 | + .release = ftrace_event_release, |
4504 | }; |
4505 | |
4506 | static const struct file_operations ftrace_enable_fops = { |
4507 | @@ -1326,6 +1327,15 @@ ftrace_event_open(struct inode *inode, struct file *file, |
4508 | return ret; |
4509 | } |
4510 | |
4511 | +static int ftrace_event_release(struct inode *inode, struct file *file) |
4512 | +{ |
4513 | + struct trace_array *tr = inode->i_private; |
4514 | + |
4515 | + trace_array_put(tr); |
4516 | + |
4517 | + return seq_release(inode, file); |
4518 | +} |
4519 | + |
4520 | static int |
4521 | ftrace_event_avail_open(struct inode *inode, struct file *file) |
4522 | { |
4523 | @@ -1339,12 +1349,19 @@ ftrace_event_set_open(struct inode *inode, struct file *file) |
4524 | { |
4525 | const struct seq_operations *seq_ops = &show_set_event_seq_ops; |
4526 | struct trace_array *tr = inode->i_private; |
4527 | + int ret; |
4528 | + |
4529 | + if (trace_array_get(tr) < 0) |
4530 | + return -ENODEV; |
4531 | |
4532 | if ((file->f_mode & FMODE_WRITE) && |
4533 | (file->f_flags & O_TRUNC)) |
4534 | ftrace_clear_events(tr); |
4535 | |
4536 | - return ftrace_event_open(inode, file, seq_ops); |
4537 | + ret = ftrace_event_open(inode, file, seq_ops); |
4538 | + if (ret < 0) |
4539 | + trace_array_put(tr); |
4540 | + return ret; |
4541 | } |
4542 | |
4543 | static struct event_subsystem * |
4544 | diff --git a/mm/memory.c b/mm/memory.c |
4545 | index 61a262b..5e50800 100644 |
4546 | --- a/mm/memory.c |
4547 | +++ b/mm/memory.c |
4548 | @@ -1101,6 +1101,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, |
4549 | spinlock_t *ptl; |
4550 | pte_t *start_pte; |
4551 | pte_t *pte; |
4552 | + unsigned long range_start = addr; |
4553 | |
4554 | again: |
4555 | init_rss_vec(rss); |
4556 | @@ -1206,12 +1207,14 @@ again: |
4557 | force_flush = 0; |
4558 | |
4559 | #ifdef HAVE_GENERIC_MMU_GATHER |
4560 | - tlb->start = addr; |
4561 | - tlb->end = end; |
4562 | + tlb->start = range_start; |
4563 | + tlb->end = addr; |
4564 | #endif |
4565 | tlb_flush_mmu(tlb); |
4566 | - if (addr != end) |
4567 | + if (addr != end) { |
4568 | + range_start = addr; |
4569 | goto again; |
4570 | + } |
4571 | } |
4572 | |
4573 | return addr; |
4574 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
4575 | index 7431001..4baf12e 100644 |
4576 | --- a/mm/mempolicy.c |
4577 | +++ b/mm/mempolicy.c |
4578 | @@ -732,7 +732,10 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, |
4579 | if (prev) { |
4580 | vma = prev; |
4581 | next = vma->vm_next; |
4582 | - continue; |
4583 | + if (mpol_equal(vma_policy(vma), new_pol)) |
4584 | + continue; |
4585 | + /* vma_merge() joined vma && vma->next, case 8 */ |
4586 | + goto replace; |
4587 | } |
4588 | if (vma->vm_start != vmstart) { |
4589 | err = split_vma(vma->vm_mm, vma, vmstart, 1); |
4590 | @@ -744,6 +747,7 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, |
4591 | if (err) |
4592 | goto out; |
4593 | } |
4594 | + replace: |
4595 | err = vma_replace_policy(vma, new_pol); |
4596 | if (err) |
4597 | goto out; |
4598 | diff --git a/mm/mmap.c b/mm/mmap.c |
4599 | index f681e18..7dbe397 100644 |
4600 | --- a/mm/mmap.c |
4601 | +++ b/mm/mmap.c |
4602 | @@ -865,7 +865,7 @@ again: remove_next = 1 + (end > next->vm_end); |
4603 | if (next->anon_vma) |
4604 | anon_vma_merge(vma, next); |
4605 | mm->map_count--; |
4606 | - vma_set_policy(vma, vma_policy(next)); |
4607 | + mpol_put(vma_policy(next)); |
4608 | kmem_cache_free(vm_area_cachep, next); |
4609 | /* |
4610 | * In mprotect's case 6 (see comments on vma_merge), |
4611 | diff --git a/net/sunrpc/xprtrdma/svc_rdma_marshal.c b/net/sunrpc/xprtrdma/svc_rdma_marshal.c |
4612 | index 8d2eddd..65b1462 100644 |
4613 | --- a/net/sunrpc/xprtrdma/svc_rdma_marshal.c |
4614 | +++ b/net/sunrpc/xprtrdma/svc_rdma_marshal.c |
4615 | @@ -98,6 +98,7 @@ void svc_rdma_rcl_chunk_counts(struct rpcrdma_read_chunk *ch, |
4616 | */ |
4617 | static u32 *decode_write_list(u32 *va, u32 *vaend) |
4618 | { |
4619 | + unsigned long start, end; |
4620 | int nchunks; |
4621 | |
4622 | struct rpcrdma_write_array *ary = |
4623 | @@ -113,9 +114,12 @@ static u32 *decode_write_list(u32 *va, u32 *vaend) |
4624 | return NULL; |
4625 | } |
4626 | nchunks = ntohl(ary->wc_nchunks); |
4627 | - if (((unsigned long)&ary->wc_array[0] + |
4628 | - (sizeof(struct rpcrdma_write_chunk) * nchunks)) > |
4629 | - (unsigned long)vaend) { |
4630 | + |
4631 | + start = (unsigned long)&ary->wc_array[0]; |
4632 | + end = (unsigned long)vaend; |
4633 | + if (nchunks < 0 || |
4634 | + nchunks > (SIZE_MAX - start) / sizeof(struct rpcrdma_write_chunk) || |
4635 | + (start + (sizeof(struct rpcrdma_write_chunk) * nchunks)) > end) { |
4636 | dprintk("svcrdma: ary=%p, wc_nchunks=%d, vaend=%p\n", |
4637 | ary, nchunks, vaend); |
4638 | return NULL; |
4639 | @@ -129,6 +133,7 @@ static u32 *decode_write_list(u32 *va, u32 *vaend) |
4640 | |
4641 | static u32 *decode_reply_array(u32 *va, u32 *vaend) |
4642 | { |
4643 | + unsigned long start, end; |
4644 | int nchunks; |
4645 | struct rpcrdma_write_array *ary = |
4646 | (struct rpcrdma_write_array *)va; |
4647 | @@ -143,9 +148,12 @@ static u32 *decode_reply_array(u32 *va, u32 *vaend) |
4648 | return NULL; |
4649 | } |
4650 | nchunks = ntohl(ary->wc_nchunks); |
4651 | - if (((unsigned long)&ary->wc_array[0] + |
4652 | - (sizeof(struct rpcrdma_write_chunk) * nchunks)) > |
4653 | - (unsigned long)vaend) { |
4654 | + |
4655 | + start = (unsigned long)&ary->wc_array[0]; |
4656 | + end = (unsigned long)vaend; |
4657 | + if (nchunks < 0 || |
4658 | + nchunks > (SIZE_MAX - start) / sizeof(struct rpcrdma_write_chunk) || |
4659 | + (start + (sizeof(struct rpcrdma_write_chunk) * nchunks)) > end) { |
4660 | dprintk("svcrdma: ary=%p, wc_nchunks=%d, vaend=%p\n", |
4661 | ary, nchunks, vaend); |
4662 | return NULL; |
4663 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
4664 | index 403010c..051c03d 100644 |
4665 | --- a/sound/pci/hda/patch_realtek.c |
4666 | +++ b/sound/pci/hda/patch_realtek.c |
4667 | @@ -3495,9 +3495,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
4668 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4669 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4670 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4671 | + SND_PCI_QUIRK(0x1028, 0x05f9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4672 | + SND_PCI_QUIRK(0x1028, 0x05fb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4673 | SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4674 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4675 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4676 | + SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4677 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
4678 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), |
4679 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4680 | diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c |
4681 | index 3eeada5..566a367 100644 |
4682 | --- a/sound/soc/codecs/max98088.c |
4683 | +++ b/sound/soc/codecs/max98088.c |
4684 | @@ -1612,7 +1612,7 @@ static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute) |
4685 | |
4686 | static void max98088_sync_cache(struct snd_soc_codec *codec) |
4687 | { |
4688 | - u16 *reg_cache = codec->reg_cache; |
4689 | + u8 *reg_cache = codec->reg_cache; |
4690 | int i; |
4691 | |
4692 | if (!codec->cache_sync) |
4693 | diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c |
4694 | index 92bbfec..ea47938 100644 |
4695 | --- a/sound/soc/codecs/sgtl5000.c |
4696 | +++ b/sound/soc/codecs/sgtl5000.c |
4697 | @@ -37,7 +37,7 @@ |
4698 | static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET] = { |
4699 | [SGTL5000_CHIP_CLK_CTRL] = 0x0008, |
4700 | [SGTL5000_CHIP_I2S_CTRL] = 0x0010, |
4701 | - [SGTL5000_CHIP_SSS_CTRL] = 0x0008, |
4702 | + [SGTL5000_CHIP_SSS_CTRL] = 0x0010, |
4703 | [SGTL5000_CHIP_DAC_VOL] = 0x3c3c, |
4704 | [SGTL5000_CHIP_PAD_STRENGTH] = 0x015f, |
4705 | [SGTL5000_CHIP_ANA_HP_CTRL] = 0x1818, |
4706 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c |
4707 | index e971028..730dd0c 100644 |
4708 | --- a/sound/soc/codecs/wm8962.c |
4709 | +++ b/sound/soc/codecs/wm8962.c |
4710 | @@ -1600,7 +1600,6 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, |
4711 | struct snd_ctl_elem_value *ucontrol) |
4712 | { |
4713 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
4714 | - u16 *reg_cache = codec->reg_cache; |
4715 | int ret; |
4716 | |
4717 | /* Apply the update (if any) */ |
4718 | @@ -1609,16 +1608,19 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, |
4719 | return 0; |
4720 | |
4721 | /* If the left PGA is enabled hit that VU bit... */ |
4722 | - if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA) |
4723 | - return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, |
4724 | - reg_cache[WM8962_HPOUTL_VOLUME]); |
4725 | + ret = snd_soc_read(codec, WM8962_PWR_MGMT_2); |
4726 | + if (ret & WM8962_HPOUTL_PGA_ENA) { |
4727 | + snd_soc_write(codec, WM8962_HPOUTL_VOLUME, |
4728 | + snd_soc_read(codec, WM8962_HPOUTL_VOLUME)); |
4729 | + return 1; |
4730 | + } |
4731 | |
4732 | /* ...otherwise the right. The VU is stereo. */ |
4733 | - if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA) |
4734 | - return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, |
4735 | - reg_cache[WM8962_HPOUTR_VOLUME]); |
4736 | + if (ret & WM8962_HPOUTR_PGA_ENA) |
4737 | + snd_soc_write(codec, WM8962_HPOUTR_VOLUME, |
4738 | + snd_soc_read(codec, WM8962_HPOUTR_VOLUME)); |
4739 | |
4740 | - return 0; |
4741 | + return 1; |
4742 | } |
4743 | |
4744 | /* The VU bits for the speakers are in a different register to the mute |
4745 | @@ -3374,7 +3376,6 @@ static int wm8962_probe(struct snd_soc_codec *codec) |
4746 | int ret; |
4747 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); |
4748 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); |
4749 | - u16 *reg_cache = codec->reg_cache; |
4750 | int i, trigger, irq_pol; |
4751 | bool dmicclk, dmicdat; |
4752 | |
4753 | @@ -3432,8 +3433,9 @@ static int wm8962_probe(struct snd_soc_codec *codec) |
4754 | |
4755 | /* Put the speakers into mono mode? */ |
4756 | if (pdata->spk_mono) |
4757 | - reg_cache[WM8962_CLASS_D_CONTROL_2] |
4758 | - |= WM8962_SPK_MONO; |
4759 | + snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_2, |
4760 | + WM8962_SPK_MONO_MASK, WM8962_SPK_MONO); |
4761 | + |
4762 | |
4763 | /* Micbias setup, detection enable and detection |
4764 | * threasholds. */ |
4765 | diff --git a/sound/soc/tegra/tegra20_ac97.c b/sound/soc/tegra/tegra20_ac97.c |
4766 | index 2f70ea7..05676c0 100644 |
4767 | --- a/sound/soc/tegra/tegra20_ac97.c |
4768 | +++ b/sound/soc/tegra/tegra20_ac97.c |
4769 | @@ -399,9 +399,9 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) |
4770 | ac97->capture_dma_data.slave_id = of_dma[1]; |
4771 | |
4772 | ac97->playback_dma_data.addr = mem->start + TEGRA20_AC97_FIFO_TX1; |
4773 | - ac97->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
4774 | - ac97->capture_dma_data.maxburst = 4; |
4775 | - ac97->capture_dma_data.slave_id = of_dma[0]; |
4776 | + ac97->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
4777 | + ac97->playback_dma_data.maxburst = 4; |
4778 | + ac97->playback_dma_data.slave_id = of_dma[1]; |
4779 | |
4780 | ret = snd_soc_register_component(&pdev->dev, &tegra20_ac97_component, |
4781 | &tegra20_ac97_dai, 1); |
4782 | diff --git a/sound/soc/tegra/tegra20_spdif.c b/sound/soc/tegra/tegra20_spdif.c |
4783 | index 5eaa12c..551b3c9 100644 |
4784 | --- a/sound/soc/tegra/tegra20_spdif.c |
4785 | +++ b/sound/soc/tegra/tegra20_spdif.c |
4786 | @@ -323,8 +323,8 @@ static int tegra20_spdif_platform_probe(struct platform_device *pdev) |
4787 | } |
4788 | |
4789 | spdif->playback_dma_data.addr = mem->start + TEGRA20_SPDIF_DATA_OUT; |
4790 | - spdif->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
4791 | - spdif->capture_dma_data.maxburst = 4; |
4792 | + spdif->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
4793 | + spdif->playback_dma_data.maxburst = 4; |
4794 | spdif->playback_dma_data.slave_id = dmareq->start; |
4795 | |
4796 | pm_runtime_enable(&pdev->dev); |
4797 | diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c |
4798 | index 5a1f648..274e178 100644 |
4799 | --- a/tools/hv/hv_kvp_daemon.c |
4800 | +++ b/tools/hv/hv_kvp_daemon.c |
4801 | @@ -1016,9 +1016,10 @@ kvp_get_ip_info(int family, char *if_name, int op, |
4802 | |
4803 | if (sn_offset == 0) |
4804 | strcpy(sn_str, cidr_mask); |
4805 | - else |
4806 | + else { |
4807 | + strcat((char *)ip_buffer->sub_net, ";"); |
4808 | strcat(sn_str, cidr_mask); |
4809 | - strcat((char *)ip_buffer->sub_net, ";"); |
4810 | + } |
4811 | sn_offset += strlen(sn_str) + 1; |
4812 | } |
4813 | |
4814 | diff --git a/tools/perf/config/utilities.mak b/tools/perf/config/utilities.mak |
4815 | index 8ef3bd3..3e89719 100644 |
4816 | --- a/tools/perf/config/utilities.mak |
4817 | +++ b/tools/perf/config/utilities.mak |
4818 | @@ -173,7 +173,7 @@ _ge-abspath = $(if $(is-executable),$(1)) |
4819 | # Usage: absolute-executable-path-or-empty = $(call get-executable-or-default,variable,default) |
4820 | # |
4821 | define get-executable-or-default |
4822 | -$(if $($(1)),$(call _ge_attempt,$($(1)),$(1)),$(call _ge_attempt,$(2),$(1))) |
4823 | +$(if $($(1)),$(call _ge_attempt,$($(1)),$(1)),$(call _ge_attempt,$(2))) |
4824 | endef |
4825 | _ge_attempt = $(if $(get-executable),$(get-executable),$(_gea_warn)$(call _gea_err,$(2))) |
4826 | _gea_warn = $(warning The path '$(1)' is not executable.) |