Contents of /trunk/kernel-alx/patches-3.10/0114-3.10.15-all-fixes.patch
Parent Directory | Revision Log
Revision 2342 -
(show annotations)
(download)
Mon Dec 16 10:04:20 2013 UTC (10 years, 9 months ago) by niro
File size: 56226 byte(s)
Mon Dec 16 10:04:20 2013 UTC (10 years, 9 months ago) by niro
File size: 56226 byte(s)
-linux-3.10.15
1 | diff --git a/Makefile b/Makefile |
2 | index 129c49f..9a77179 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 14 |
9 | +SUBLEVEL = 15 |
10 | EXTRAVERSION = |
11 | NAME = TOSSUG Baby Fish |
12 | |
13 | diff --git a/arch/arm/crypto/aes-armv4.S b/arch/arm/crypto/aes-armv4.S |
14 | index 19d6cd6..3a14ea8 100644 |
15 | --- a/arch/arm/crypto/aes-armv4.S |
16 | +++ b/arch/arm/crypto/aes-armv4.S |
17 | @@ -148,7 +148,7 @@ AES_Te: |
18 | @ const AES_KEY *key) { |
19 | .align 5 |
20 | ENTRY(AES_encrypt) |
21 | - sub r3,pc,#8 @ AES_encrypt |
22 | + adr r3,AES_encrypt |
23 | stmdb sp!,{r1,r4-r12,lr} |
24 | mov r12,r0 @ inp |
25 | mov r11,r2 |
26 | @@ -381,7 +381,7 @@ _armv4_AES_encrypt: |
27 | .align 5 |
28 | ENTRY(private_AES_set_encrypt_key) |
29 | _armv4_AES_set_encrypt_key: |
30 | - sub r3,pc,#8 @ AES_set_encrypt_key |
31 | + adr r3,_armv4_AES_set_encrypt_key |
32 | teq r0,#0 |
33 | moveq r0,#-1 |
34 | beq .Labrt |
35 | @@ -843,7 +843,7 @@ AES_Td: |
36 | @ const AES_KEY *key) { |
37 | .align 5 |
38 | ENTRY(AES_decrypt) |
39 | - sub r3,pc,#8 @ AES_decrypt |
40 | + adr r3,AES_decrypt |
41 | stmdb sp!,{r1,r4-r12,lr} |
42 | mov r12,r0 @ inp |
43 | mov r11,r2 |
44 | diff --git a/arch/arm/mach-mxs/pm.h b/arch/arm/mach-mxs/pm.h |
45 | index f57e7cd..09d77b0 100644 |
46 | --- a/arch/arm/mach-mxs/pm.h |
47 | +++ b/arch/arm/mach-mxs/pm.h |
48 | @@ -9,6 +9,10 @@ |
49 | #ifndef __ARCH_MXS_PM_H |
50 | #define __ARCH_MXS_PM_H |
51 | |
52 | +#ifdef CONFIG_PM |
53 | void mxs_pm_init(void); |
54 | +#else |
55 | +#define mxs_pm_init NULL |
56 | +#endif |
57 | |
58 | #endif |
59 | diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c |
60 | index 76fa1e9..90fd119 100644 |
61 | --- a/arch/x86/kernel/reboot.c |
62 | +++ b/arch/x86/kernel/reboot.c |
63 | @@ -447,6 +447,22 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { |
64 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"), |
65 | }, |
66 | }, |
67 | + { /* Handle problems with rebooting on the Dell PowerEdge C6100. */ |
68 | + .callback = set_pci_reboot, |
69 | + .ident = "Dell PowerEdge C6100", |
70 | + .matches = { |
71 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
72 | + DMI_MATCH(DMI_PRODUCT_NAME, "C6100"), |
73 | + }, |
74 | + }, |
75 | + { /* Some C6100 machines were shipped with vendor being 'Dell'. */ |
76 | + .callback = set_pci_reboot, |
77 | + .ident = "Dell PowerEdge C6100", |
78 | + .matches = { |
79 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell"), |
80 | + DMI_MATCH(DMI_PRODUCT_NAME, "C6100"), |
81 | + }, |
82 | + }, |
83 | { } |
84 | }; |
85 | |
86 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c |
87 | index d2fbced..91ac654 100644 |
88 | --- a/arch/x86/platform/efi/efi.c |
89 | +++ b/arch/x86/platform/efi/efi.c |
90 | @@ -910,10 +910,13 @@ void __init efi_enter_virtual_mode(void) |
91 | |
92 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
93 | md = p; |
94 | - if (!(md->attribute & EFI_MEMORY_RUNTIME) && |
95 | - md->type != EFI_BOOT_SERVICES_CODE && |
96 | - md->type != EFI_BOOT_SERVICES_DATA) |
97 | - continue; |
98 | + if (!(md->attribute & EFI_MEMORY_RUNTIME)) { |
99 | +#ifdef CONFIG_X86_64 |
100 | + if (md->type != EFI_BOOT_SERVICES_CODE && |
101 | + md->type != EFI_BOOT_SERVICES_DATA) |
102 | +#endif |
103 | + continue; |
104 | + } |
105 | |
106 | size = md->num_pages << EFI_PAGE_SHIFT; |
107 | end = md->phys_addr + size; |
108 | diff --git a/drivers/base/core.c b/drivers/base/core.c |
109 | index 2499cef..ca4bcb8 100644 |
110 | --- a/drivers/base/core.c |
111 | +++ b/drivers/base/core.c |
112 | @@ -1839,7 +1839,7 @@ EXPORT_SYMBOL_GPL(device_move); |
113 | */ |
114 | void device_shutdown(void) |
115 | { |
116 | - struct device *dev; |
117 | + struct device *dev, *parent; |
118 | |
119 | spin_lock(&devices_kset->list_lock); |
120 | /* |
121 | @@ -1856,7 +1856,7 @@ void device_shutdown(void) |
122 | * prevent it from being freed because parent's |
123 | * lock is to be held |
124 | */ |
125 | - get_device(dev->parent); |
126 | + parent = get_device(dev->parent); |
127 | get_device(dev); |
128 | /* |
129 | * Make sure the device is off the kset list, in the |
130 | @@ -1866,8 +1866,8 @@ void device_shutdown(void) |
131 | spin_unlock(&devices_kset->list_lock); |
132 | |
133 | /* hold lock to avoid race with probe/release */ |
134 | - if (dev->parent) |
135 | - device_lock(dev->parent); |
136 | + if (parent) |
137 | + device_lock(parent); |
138 | device_lock(dev); |
139 | |
140 | /* Don't allow any more runtime suspends */ |
141 | @@ -1885,11 +1885,11 @@ void device_shutdown(void) |
142 | } |
143 | |
144 | device_unlock(dev); |
145 | - if (dev->parent) |
146 | - device_unlock(dev->parent); |
147 | + if (parent) |
148 | + device_unlock(parent); |
149 | |
150 | put_device(dev); |
151 | - put_device(dev->parent); |
152 | + put_device(parent); |
153 | |
154 | spin_lock(&devices_kset->list_lock); |
155 | } |
156 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
157 | index a365780..b1a0cdb 100644 |
158 | --- a/drivers/gpu/drm/i915/i915_reg.h |
159 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
160 | @@ -1675,10 +1675,16 @@ |
161 | #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) |
162 | |
163 | #define PORT_HOTPLUG_STAT (dev_priv->info->display_mmio_offset + 0x61114) |
164 | -/* HDMI/DP bits are gen4+ */ |
165 | -#define PORTB_HOTPLUG_LIVE_STATUS (1 << 29) |
166 | +/* |
167 | + * HDMI/DP bits are gen4+ |
168 | + * |
169 | + * WARNING: Bspec for hpd status bits on gen4 seems to be completely confused. |
170 | + * Please check the detailed lore in the commit message for for experimental |
171 | + * evidence. |
172 | + */ |
173 | +#define PORTD_HOTPLUG_LIVE_STATUS (1 << 29) |
174 | #define PORTC_HOTPLUG_LIVE_STATUS (1 << 28) |
175 | -#define PORTD_HOTPLUG_LIVE_STATUS (1 << 27) |
176 | +#define PORTB_HOTPLUG_LIVE_STATUS (1 << 27) |
177 | #define PORTD_HOTPLUG_INT_STATUS (3 << 21) |
178 | #define PORTC_HOTPLUG_INT_STATUS (3 << 19) |
179 | #define PORTB_HOTPLUG_INT_STATUS (3 << 17) |
180 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
181 | index eea5982..2667d6d 100644 |
182 | --- a/drivers/gpu/drm/i915/intel_display.c |
183 | +++ b/drivers/gpu/drm/i915/intel_display.c |
184 | @@ -4564,6 +4564,10 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc) |
185 | |
186 | pipeconf = I915_READ(PIPECONF(intel_crtc->pipe)); |
187 | |
188 | + if (dev_priv->quirks & QUIRK_PIPEA_FORCE && |
189 | + I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE) |
190 | + pipeconf |= PIPECONF_ENABLE; |
191 | + |
192 | if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) { |
193 | /* Enable pixel doubling when the dot clock is > 90% of the (display) |
194 | * core speed. |
195 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
196 | index 70789b1..80feaec 100644 |
197 | --- a/drivers/gpu/drm/i915/intel_dp.c |
198 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
199 | @@ -604,7 +604,18 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, |
200 | DRM_DEBUG_KMS("aux_ch native nack\n"); |
201 | return -EREMOTEIO; |
202 | case AUX_NATIVE_REPLY_DEFER: |
203 | - udelay(100); |
204 | + /* |
205 | + * For now, just give more slack to branch devices. We |
206 | + * could check the DPCD for I2C bit rate capabilities, |
207 | + * and if available, adjust the interval. We could also |
208 | + * be more careful with DP-to-Legacy adapters where a |
209 | + * long legacy cable may force very low I2C bit rates. |
210 | + */ |
211 | + if (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & |
212 | + DP_DWN_STRM_PORT_PRESENT) |
213 | + usleep_range(500, 600); |
214 | + else |
215 | + usleep_range(300, 400); |
216 | continue; |
217 | default: |
218 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", |
219 | diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c |
220 | index b945bc5..a202d8d 100644 |
221 | --- a/drivers/gpu/drm/i915/intel_tv.c |
222 | +++ b/drivers/gpu/drm/i915/intel_tv.c |
223 | @@ -921,6 +921,14 @@ intel_tv_compute_config(struct intel_encoder *encoder, |
224 | DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); |
225 | pipe_config->pipe_bpp = 8*3; |
226 | |
227 | + /* TV has it's own notion of sync and other mode flags, so clear them. */ |
228 | + pipe_config->adjusted_mode.flags = 0; |
229 | + |
230 | + /* |
231 | + * FIXME: We don't check whether the input mode is actually what we want |
232 | + * or whether userspace is doing something stupid. |
233 | + */ |
234 | + |
235 | return true; |
236 | } |
237 | |
238 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c |
239 | index d0314ec..46470dd 100644 |
240 | --- a/drivers/gpu/drm/radeon/r100.c |
241 | +++ b/drivers/gpu/drm/radeon/r100.c |
242 | @@ -2935,9 +2935,11 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data) |
243 | seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp); |
244 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); |
245 | seq_printf(m, "%u dwords in ring\n", count); |
246 | - for (j = 0; j <= count; j++) { |
247 | - i = (rdp + j) & ring->ptr_mask; |
248 | - seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); |
249 | + if (ring->ready) { |
250 | + for (j = 0; j <= count; j++) { |
251 | + i = (rdp + j) & ring->ptr_mask; |
252 | + seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); |
253 | + } |
254 | } |
255 | return 0; |
256 | } |
257 | diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c |
258 | index b9b1139..0efe2a9 100644 |
259 | --- a/drivers/gpu/drm/radeon/r600_hdmi.c |
260 | +++ b/drivers/gpu/drm/radeon/r600_hdmi.c |
261 | @@ -238,9 +238,19 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
262 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
263 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
264 | */ |
265 | - if (ASIC_IS_DCE3(rdev)) { |
266 | + if (ASIC_IS_DCE32(rdev)) { |
267 | + if (dig->dig_encoder == 0) { |
268 | + WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); |
269 | + WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); |
270 | + WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */ |
271 | + } else { |
272 | + WREG32(DCCG_AUDIO_DTO1_PHASE, base_rate * 100); |
273 | + WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100); |
274 | + WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ |
275 | + } |
276 | + } else if (ASIC_IS_DCE3(rdev)) { |
277 | /* according to the reg specs, this should DCE3.2 only, but in |
278 | - * practice it seems to cover DCE3.0 as well. |
279 | + * practice it seems to cover DCE3.0/3.1 as well. |
280 | */ |
281 | if (dig->dig_encoder == 0) { |
282 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); |
283 | @@ -252,7 +262,7 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
284 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ |
285 | } |
286 | } else { |
287 | - /* according to the reg specs, this should be DCE2.0 and DCE3.0 */ |
288 | + /* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */ |
289 | WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | |
290 | AUDIO_DTO_MODULE(clock / 10)); |
291 | } |
292 | diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c |
293 | index de36c47..7fadfd5 100644 |
294 | --- a/drivers/gpu/drm/radeon/radeon_asic.c |
295 | +++ b/drivers/gpu/drm/radeon/radeon_asic.c |
296 | @@ -892,6 +892,8 @@ static struct radeon_asic r520_asic = { |
297 | .wait_for_vblank = &avivo_wait_for_vblank, |
298 | .set_backlight_level = &atombios_set_backlight_level, |
299 | .get_backlight_level = &atombios_get_backlight_level, |
300 | + .hdmi_enable = &r600_hdmi_enable, |
301 | + .hdmi_setmode = &r600_hdmi_setmode, |
302 | }, |
303 | .copy = { |
304 | .blit = &r100_copy_blit, |
305 | diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c |
306 | index 6337f67..fe36f1d 100644 |
307 | --- a/drivers/gpu/drm/radeon/radeon_cs.c |
308 | +++ b/drivers/gpu/drm/radeon/radeon_cs.c |
309 | @@ -84,7 +84,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) |
310 | VRAM, also but everything into VRAM on AGP cards to avoid |
311 | image corruptions */ |
312 | if (p->ring == R600_RING_TYPE_UVD_INDEX && |
313 | - (i == 0 || p->rdev->flags & RADEON_IS_AGP)) { |
314 | + (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { |
315 | /* TODO: is this still needed for NI+ ? */ |
316 | p->relocs[i].lobj.domain = |
317 | RADEON_GEM_DOMAIN_VRAM; |
318 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
319 | index b0dc0b6..8df1525 100644 |
320 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
321 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
322 | @@ -1196,13 +1196,22 @@ int radeon_device_init(struct radeon_device *rdev, |
323 | return r; |
324 | } |
325 | if ((radeon_testing & 1)) { |
326 | - radeon_test_moves(rdev); |
327 | + if (rdev->accel_working) |
328 | + radeon_test_moves(rdev); |
329 | + else |
330 | + DRM_INFO("radeon: acceleration disabled, skipping move tests\n"); |
331 | } |
332 | if ((radeon_testing & 2)) { |
333 | - radeon_test_syncing(rdev); |
334 | + if (rdev->accel_working) |
335 | + radeon_test_syncing(rdev); |
336 | + else |
337 | + DRM_INFO("radeon: acceleration disabled, skipping sync tests\n"); |
338 | } |
339 | if (radeon_benchmarking) { |
340 | - radeon_benchmark(rdev, radeon_benchmarking); |
341 | + if (rdev->accel_working) |
342 | + radeon_benchmark(rdev, radeon_benchmarking); |
343 | + else |
344 | + DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n"); |
345 | } |
346 | return 0; |
347 | } |
348 | diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c |
349 | index 83f6295..6e0f480 100644 |
350 | --- a/drivers/gpu/drm/radeon/radeon_ring.c |
351 | +++ b/drivers/gpu/drm/radeon/radeon_ring.c |
352 | @@ -823,9 +823,11 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) |
353 | * packet that is the root issue |
354 | */ |
355 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; |
356 | - for (j = 0; j <= (count + 32); j++) { |
357 | - seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); |
358 | - i = (i + 1) & ring->ptr_mask; |
359 | + if (ring->ready) { |
360 | + for (j = 0; j <= (count + 32); j++) { |
361 | + seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); |
362 | + i = (i + 1) & ring->ptr_mask; |
363 | + } |
364 | } |
365 | return 0; |
366 | } |
367 | diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c |
368 | index 62c2e32..98814d1 100644 |
369 | --- a/drivers/hwmon/applesmc.c |
370 | +++ b/drivers/hwmon/applesmc.c |
371 | @@ -525,16 +525,25 @@ static int applesmc_init_smcreg_try(void) |
372 | { |
373 | struct applesmc_registers *s = &smcreg; |
374 | bool left_light_sensor, right_light_sensor; |
375 | + unsigned int count; |
376 | u8 tmp[1]; |
377 | int ret; |
378 | |
379 | if (s->init_complete) |
380 | return 0; |
381 | |
382 | - ret = read_register_count(&s->key_count); |
383 | + ret = read_register_count(&count); |
384 | if (ret) |
385 | return ret; |
386 | |
387 | + if (s->cache && s->key_count != count) { |
388 | + pr_warn("key count changed from %d to %d\n", |
389 | + s->key_count, count); |
390 | + kfree(s->cache); |
391 | + s->cache = NULL; |
392 | + } |
393 | + s->key_count = count; |
394 | + |
395 | if (!s->cache) |
396 | s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL); |
397 | if (!s->cache) |
398 | diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h |
399 | index c42b14b..6bc016e 100644 |
400 | --- a/drivers/md/bcache/bcache.h |
401 | +++ b/drivers/md/bcache/bcache.h |
402 | @@ -499,7 +499,7 @@ struct cached_dev { |
403 | */ |
404 | atomic_t has_dirty; |
405 | |
406 | - struct ratelimit writeback_rate; |
407 | + struct bch_ratelimit writeback_rate; |
408 | struct delayed_work writeback_rate_update; |
409 | |
410 | /* |
411 | @@ -508,10 +508,9 @@ struct cached_dev { |
412 | */ |
413 | sector_t last_read; |
414 | |
415 | - /* Number of writeback bios in flight */ |
416 | - atomic_t in_flight; |
417 | + /* Limit number of writeback bios in flight */ |
418 | + struct semaphore in_flight; |
419 | struct closure_with_timer writeback; |
420 | - struct closure_waitlist writeback_wait; |
421 | |
422 | struct keybuf writeback_keys; |
423 | |
424 | diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c |
425 | index cb4578a..14032e8 100644 |
426 | --- a/drivers/md/bcache/bset.c |
427 | +++ b/drivers/md/bcache/bset.c |
428 | @@ -918,28 +918,45 @@ struct bkey *bch_next_recurse_key(struct btree *b, struct bkey *search) |
429 | |
430 | /* Mergesort */ |
431 | |
432 | +static void sort_key_next(struct btree_iter *iter, |
433 | + struct btree_iter_set *i) |
434 | +{ |
435 | + i->k = bkey_next(i->k); |
436 | + |
437 | + if (i->k == i->end) |
438 | + *i = iter->data[--iter->used]; |
439 | +} |
440 | + |
441 | static void btree_sort_fixup(struct btree_iter *iter) |
442 | { |
443 | while (iter->used > 1) { |
444 | struct btree_iter_set *top = iter->data, *i = top + 1; |
445 | - struct bkey *k; |
446 | |
447 | if (iter->used > 2 && |
448 | btree_iter_cmp(i[0], i[1])) |
449 | i++; |
450 | |
451 | - for (k = i->k; |
452 | - k != i->end && bkey_cmp(top->k, &START_KEY(k)) > 0; |
453 | - k = bkey_next(k)) |
454 | - if (top->k > i->k) |
455 | - __bch_cut_front(top->k, k); |
456 | - else if (KEY_SIZE(k)) |
457 | - bch_cut_back(&START_KEY(k), top->k); |
458 | - |
459 | - if (top->k < i->k || k == i->k) |
460 | + if (bkey_cmp(top->k, &START_KEY(i->k)) <= 0) |
461 | break; |
462 | |
463 | - heap_sift(iter, i - top, btree_iter_cmp); |
464 | + if (!KEY_SIZE(i->k)) { |
465 | + sort_key_next(iter, i); |
466 | + heap_sift(iter, i - top, btree_iter_cmp); |
467 | + continue; |
468 | + } |
469 | + |
470 | + if (top->k > i->k) { |
471 | + if (bkey_cmp(top->k, i->k) >= 0) |
472 | + sort_key_next(iter, i); |
473 | + else |
474 | + bch_cut_front(top->k, i->k); |
475 | + |
476 | + heap_sift(iter, i - top, btree_iter_cmp); |
477 | + } else { |
478 | + /* can't happen because of comparison func */ |
479 | + BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k))); |
480 | + bch_cut_back(&START_KEY(i->k), top->k); |
481 | + } |
482 | } |
483 | } |
484 | |
485 | diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c |
486 | index 833c590..7d3deab 100644 |
487 | --- a/drivers/md/bcache/btree.c |
488 | +++ b/drivers/md/bcache/btree.c |
489 | @@ -633,7 +633,7 @@ static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc) |
490 | return mca_can_free(c) * c->btree_pages; |
491 | |
492 | /* Return -1 if we can't do anything right now */ |
493 | - if (sc->gfp_mask & __GFP_WAIT) |
494 | + if (sc->gfp_mask & __GFP_IO) |
495 | mutex_lock(&c->bucket_lock); |
496 | else if (!mutex_trylock(&c->bucket_lock)) |
497 | return -1; |
498 | diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c |
499 | index b49abb2..151a4ab 100644 |
500 | --- a/drivers/md/bcache/journal.c |
501 | +++ b/drivers/md/bcache/journal.c |
502 | @@ -151,7 +151,8 @@ int bch_journal_read(struct cache_set *c, struct list_head *list, |
503 | bitmap_zero(bitmap, SB_JOURNAL_BUCKETS); |
504 | pr_debug("%u journal buckets", ca->sb.njournal_buckets); |
505 | |
506 | - /* Read journal buckets ordered by golden ratio hash to quickly |
507 | + /* |
508 | + * Read journal buckets ordered by golden ratio hash to quickly |
509 | * find a sequence of buckets with valid journal entries |
510 | */ |
511 | for (i = 0; i < ca->sb.njournal_buckets; i++) { |
512 | @@ -164,18 +165,20 @@ int bch_journal_read(struct cache_set *c, struct list_head *list, |
513 | goto bsearch; |
514 | } |
515 | |
516 | - /* If that fails, check all the buckets we haven't checked |
517 | + /* |
518 | + * If that fails, check all the buckets we haven't checked |
519 | * already |
520 | */ |
521 | pr_debug("falling back to linear search"); |
522 | |
523 | - for (l = 0; l < ca->sb.njournal_buckets; l++) { |
524 | - if (test_bit(l, bitmap)) |
525 | - continue; |
526 | - |
527 | + for (l = find_first_zero_bit(bitmap, ca->sb.njournal_buckets); |
528 | + l < ca->sb.njournal_buckets; |
529 | + l = find_next_zero_bit(bitmap, ca->sb.njournal_buckets, l + 1)) |
530 | if (read_bucket(l)) |
531 | goto bsearch; |
532 | - } |
533 | + |
534 | + if (list_empty(list)) |
535 | + continue; |
536 | bsearch: |
537 | /* Binary search */ |
538 | m = r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1); |
539 | @@ -195,10 +198,12 @@ bsearch: |
540 | r = m; |
541 | } |
542 | |
543 | - /* Read buckets in reverse order until we stop finding more |
544 | + /* |
545 | + * Read buckets in reverse order until we stop finding more |
546 | * journal entries |
547 | */ |
548 | - pr_debug("finishing up"); |
549 | + pr_debug("finishing up: m %u njournal_buckets %u", |
550 | + m, ca->sb.njournal_buckets); |
551 | l = m; |
552 | |
553 | while (1) { |
554 | @@ -226,9 +231,10 @@ bsearch: |
555 | } |
556 | } |
557 | |
558 | - c->journal.seq = list_entry(list->prev, |
559 | - struct journal_replay, |
560 | - list)->j.seq; |
561 | + if (!list_empty(list)) |
562 | + c->journal.seq = list_entry(list->prev, |
563 | + struct journal_replay, |
564 | + list)->j.seq; |
565 | |
566 | return 0; |
567 | #undef read_bucket |
568 | @@ -425,7 +431,7 @@ static void do_journal_discard(struct cache *ca) |
569 | return; |
570 | } |
571 | |
572 | - switch (atomic_read(&ja->discard_in_flight) == DISCARD_IN_FLIGHT) { |
573 | + switch (atomic_read(&ja->discard_in_flight)) { |
574 | case DISCARD_IN_FLIGHT: |
575 | return; |
576 | |
577 | @@ -686,6 +692,7 @@ void bch_journal_meta(struct cache_set *c, struct closure *cl) |
578 | if (cl) |
579 | BUG_ON(!closure_wait(&w->wait, cl)); |
580 | |
581 | + closure_flush(&c->journal.io); |
582 | __journal_try_write(c, true); |
583 | } |
584 | } |
585 | diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c |
586 | index afb9a99..2fe37fa 100644 |
587 | --- a/drivers/md/bcache/request.c |
588 | +++ b/drivers/md/bcache/request.c |
589 | @@ -1056,14 +1056,17 @@ static void request_write(struct cached_dev *dc, struct search *s) |
590 | trace_bcache_writeback(s->orig_bio); |
591 | bch_writeback_add(dc, bio_sectors(bio)); |
592 | |
593 | - if (s->op.flush_journal) { |
594 | + if (bio->bi_rw & REQ_FLUSH) { |
595 | /* Also need to send a flush to the backing device */ |
596 | - s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO, |
597 | - dc->disk.bio_split); |
598 | + struct bio *flush = bio_alloc_bioset(0, GFP_NOIO, |
599 | + dc->disk.bio_split); |
600 | |
601 | - bio->bi_size = 0; |
602 | - bio->bi_vcnt = 0; |
603 | - closure_bio_submit(bio, cl, s->d); |
604 | + flush->bi_rw = WRITE_FLUSH; |
605 | + flush->bi_bdev = bio->bi_bdev; |
606 | + flush->bi_end_io = request_endio; |
607 | + flush->bi_private = cl; |
608 | + |
609 | + closure_bio_submit(flush, cl, s->d); |
610 | } else { |
611 | s->op.cache_bio = bio; |
612 | } |
613 | diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c |
614 | index 4d9cca4..e9bd6c0 100644 |
615 | --- a/drivers/md/bcache/sysfs.c |
616 | +++ b/drivers/md/bcache/sysfs.c |
617 | @@ -214,7 +214,13 @@ STORE(__cached_dev) |
618 | } |
619 | |
620 | if (attr == &sysfs_label) { |
621 | - memcpy(dc->sb.label, buf, SB_LABEL_SIZE); |
622 | + if (size > SB_LABEL_SIZE) |
623 | + return -EINVAL; |
624 | + memcpy(dc->sb.label, buf, size); |
625 | + if (size < SB_LABEL_SIZE) |
626 | + dc->sb.label[size] = '\0'; |
627 | + if (size && dc->sb.label[size - 1] == '\n') |
628 | + dc->sb.label[size - 1] = '\0'; |
629 | bch_write_bdev_super(dc, NULL); |
630 | if (dc->disk.c) { |
631 | memcpy(dc->disk.c->uuids[dc->disk.id].label, |
632 | diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c |
633 | index da3a99e..38a43f8 100644 |
634 | --- a/drivers/md/bcache/util.c |
635 | +++ b/drivers/md/bcache/util.c |
636 | @@ -190,7 +190,16 @@ void bch_time_stats_update(struct time_stats *stats, uint64_t start_time) |
637 | stats->last = now ?: 1; |
638 | } |
639 | |
640 | -unsigned bch_next_delay(struct ratelimit *d, uint64_t done) |
641 | +/** |
642 | + * bch_next_delay() - increment @d by the amount of work done, and return how |
643 | + * long to delay until the next time to do some work. |
644 | + * |
645 | + * @d - the struct bch_ratelimit to update |
646 | + * @done - the amount of work done, in arbitrary units |
647 | + * |
648 | + * Returns the amount of time to delay by, in jiffies |
649 | + */ |
650 | +uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done) |
651 | { |
652 | uint64_t now = local_clock(); |
653 | |
654 | diff --git a/drivers/md/bcache/util.h b/drivers/md/bcache/util.h |
655 | index 577393e..43fd78a 100644 |
656 | --- a/drivers/md/bcache/util.h |
657 | +++ b/drivers/md/bcache/util.h |
658 | @@ -452,17 +452,23 @@ read_attribute(name ## _last_ ## frequency_units) |
659 | (ewma) >> factor; \ |
660 | }) |
661 | |
662 | -struct ratelimit { |
663 | +struct bch_ratelimit { |
664 | + /* Next time we want to do some work, in nanoseconds */ |
665 | uint64_t next; |
666 | + |
667 | + /* |
668 | + * Rate at which we want to do work, in units per nanosecond |
669 | + * The units here correspond to the units passed to bch_next_delay() |
670 | + */ |
671 | unsigned rate; |
672 | }; |
673 | |
674 | -static inline void ratelimit_reset(struct ratelimit *d) |
675 | +static inline void bch_ratelimit_reset(struct bch_ratelimit *d) |
676 | { |
677 | d->next = local_clock(); |
678 | } |
679 | |
680 | -unsigned bch_next_delay(struct ratelimit *d, uint64_t done); |
681 | +uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done); |
682 | |
683 | #define __DIV_SAFE(n, d, zero) \ |
684 | ({ \ |
685 | diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c |
686 | index 2714ed3..841f049 100644 |
687 | --- a/drivers/md/bcache/writeback.c |
688 | +++ b/drivers/md/bcache/writeback.c |
689 | @@ -91,11 +91,15 @@ static void update_writeback_rate(struct work_struct *work) |
690 | |
691 | static unsigned writeback_delay(struct cached_dev *dc, unsigned sectors) |
692 | { |
693 | + uint64_t ret; |
694 | + |
695 | if (atomic_read(&dc->disk.detaching) || |
696 | !dc->writeback_percent) |
697 | return 0; |
698 | |
699 | - return bch_next_delay(&dc->writeback_rate, sectors * 10000000ULL); |
700 | + ret = bch_next_delay(&dc->writeback_rate, sectors * 10000000ULL); |
701 | + |
702 | + return min_t(uint64_t, ret, HZ); |
703 | } |
704 | |
705 | /* Background writeback */ |
706 | @@ -165,7 +169,7 @@ static void refill_dirty(struct closure *cl) |
707 | |
708 | up_write(&dc->writeback_lock); |
709 | |
710 | - ratelimit_reset(&dc->writeback_rate); |
711 | + bch_ratelimit_reset(&dc->writeback_rate); |
712 | |
713 | /* Punt to workqueue only so we don't recurse and blow the stack */ |
714 | continue_at(cl, read_dirty, dirty_wq); |
715 | @@ -246,9 +250,7 @@ static void write_dirty_finish(struct closure *cl) |
716 | } |
717 | |
718 | bch_keybuf_del(&dc->writeback_keys, w); |
719 | - atomic_dec_bug(&dc->in_flight); |
720 | - |
721 | - closure_wake_up(&dc->writeback_wait); |
722 | + up(&dc->in_flight); |
723 | |
724 | closure_return_with_destructor(cl, dirty_io_destructor); |
725 | } |
726 | @@ -278,7 +280,7 @@ static void write_dirty(struct closure *cl) |
727 | trace_bcache_write_dirty(&io->bio); |
728 | closure_bio_submit(&io->bio, cl, &io->dc->disk); |
729 | |
730 | - continue_at(cl, write_dirty_finish, dirty_wq); |
731 | + continue_at(cl, write_dirty_finish, system_wq); |
732 | } |
733 | |
734 | static void read_dirty_endio(struct bio *bio, int error) |
735 | @@ -299,7 +301,7 @@ static void read_dirty_submit(struct closure *cl) |
736 | trace_bcache_read_dirty(&io->bio); |
737 | closure_bio_submit(&io->bio, cl, &io->dc->disk); |
738 | |
739 | - continue_at(cl, write_dirty, dirty_wq); |
740 | + continue_at(cl, write_dirty, system_wq); |
741 | } |
742 | |
743 | static void read_dirty(struct closure *cl) |
744 | @@ -324,12 +326,8 @@ static void read_dirty(struct closure *cl) |
745 | |
746 | if (delay > 0 && |
747 | (KEY_START(&w->key) != dc->last_read || |
748 | - jiffies_to_msecs(delay) > 50)) { |
749 | - w->private = NULL; |
750 | - |
751 | - closure_delay(&dc->writeback, delay); |
752 | - continue_at(cl, read_dirty, dirty_wq); |
753 | - } |
754 | + jiffies_to_msecs(delay) > 50)) |
755 | + delay = schedule_timeout_uninterruptible(delay); |
756 | |
757 | dc->last_read = KEY_OFFSET(&w->key); |
758 | |
759 | @@ -354,15 +352,10 @@ static void read_dirty(struct closure *cl) |
760 | |
761 | pr_debug("%s", pkey(&w->key)); |
762 | |
763 | - closure_call(&io->cl, read_dirty_submit, NULL, &dc->disk.cl); |
764 | + down(&dc->in_flight); |
765 | + closure_call(&io->cl, read_dirty_submit, NULL, cl); |
766 | |
767 | delay = writeback_delay(dc, KEY_SIZE(&w->key)); |
768 | - |
769 | - atomic_inc(&dc->in_flight); |
770 | - |
771 | - if (!closure_wait_event(&dc->writeback_wait, cl, |
772 | - atomic_read(&dc->in_flight) < 64)) |
773 | - continue_at(cl, read_dirty, dirty_wq); |
774 | } |
775 | |
776 | if (0) { |
777 | @@ -372,11 +365,16 @@ err: |
778 | bch_keybuf_del(&dc->writeback_keys, w); |
779 | } |
780 | |
781 | - refill_dirty(cl); |
782 | + /* |
783 | + * Wait for outstanding writeback IOs to finish (and keybuf slots to be |
784 | + * freed) before refilling again |
785 | + */ |
786 | + continue_at(cl, refill_dirty, dirty_wq); |
787 | } |
788 | |
789 | void bch_cached_dev_writeback_init(struct cached_dev *dc) |
790 | { |
791 | + sema_init(&dc->in_flight, 64); |
792 | closure_init_unlocked(&dc->writeback); |
793 | init_rwsem(&dc->writeback_lock); |
794 | |
795 | @@ -406,7 +404,7 @@ void bch_writeback_exit(void) |
796 | |
797 | int __init bch_writeback_init(void) |
798 | { |
799 | - dirty_wq = create_singlethread_workqueue("bcache_writeback"); |
800 | + dirty_wq = create_workqueue("bcache_writeback"); |
801 | if (!dirty_wq) |
802 | return -ENOMEM; |
803 | |
804 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
805 | index 5adede1..c5b7b3d 100644 |
806 | --- a/drivers/md/dm-mpath.c |
807 | +++ b/drivers/md/dm-mpath.c |
808 | @@ -1284,8 +1284,17 @@ static int do_end_io(struct multipath *m, struct request *clone, |
809 | if (!error && !clone->errors) |
810 | return 0; /* I/O complete */ |
811 | |
812 | - if (error == -EOPNOTSUPP || error == -EREMOTEIO || error == -EILSEQ) |
813 | + if (error == -EOPNOTSUPP || error == -EREMOTEIO || error == -EILSEQ) { |
814 | + if ((clone->cmd_flags & REQ_WRITE_SAME) && |
815 | + !clone->q->limits.max_write_same_sectors) { |
816 | + struct queue_limits *limits; |
817 | + |
818 | + /* device doesn't really support WRITE SAME, disable it */ |
819 | + limits = dm_get_queue_limits(dm_table_get_md(m->ti->table)); |
820 | + limits->max_write_same_sectors = 0; |
821 | + } |
822 | return error; |
823 | + } |
824 | |
825 | if (mpio->pgpath) |
826 | fail_path(mpio->pgpath); |
827 | diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c |
828 | index 1d3fe1a..2dea49c 100644 |
829 | --- a/drivers/md/dm-raid.c |
830 | +++ b/drivers/md/dm-raid.c |
831 | @@ -380,7 +380,7 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size) |
832 | static int validate_raid_redundancy(struct raid_set *rs) |
833 | { |
834 | unsigned i, rebuild_cnt = 0; |
835 | - unsigned rebuilds_per_group, copies, d; |
836 | + unsigned rebuilds_per_group = 0, copies, d; |
837 | unsigned group_size, last_group_start; |
838 | |
839 | for (i = 0; i < rs->md.raid_disks; i++) |
840 | diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c |
841 | index 3ac4156..4caa8e6 100644 |
842 | --- a/drivers/md/dm-snap-persistent.c |
843 | +++ b/drivers/md/dm-snap-persistent.c |
844 | @@ -256,7 +256,7 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, |
845 | */ |
846 | INIT_WORK_ONSTACK(&req.work, do_metadata); |
847 | queue_work(ps->metadata_wq, &req.work); |
848 | - flush_work(&req.work); |
849 | + flush_workqueue(ps->metadata_wq); |
850 | |
851 | return req.result; |
852 | } |
853 | diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c |
854 | index c434e5a..aec57d7 100644 |
855 | --- a/drivers/md/dm-snap.c |
856 | +++ b/drivers/md/dm-snap.c |
857 | @@ -725,17 +725,16 @@ static int calc_max_buckets(void) |
858 | */ |
859 | static int init_hash_tables(struct dm_snapshot *s) |
860 | { |
861 | - sector_t hash_size, cow_dev_size, origin_dev_size, max_buckets; |
862 | + sector_t hash_size, cow_dev_size, max_buckets; |
863 | |
864 | /* |
865 | * Calculate based on the size of the original volume or |
866 | * the COW volume... |
867 | */ |
868 | cow_dev_size = get_dev_size(s->cow->bdev); |
869 | - origin_dev_size = get_dev_size(s->origin->bdev); |
870 | max_buckets = calc_max_buckets(); |
871 | |
872 | - hash_size = min(origin_dev_size, cow_dev_size) >> s->store->chunk_shift; |
873 | + hash_size = cow_dev_size >> s->store->chunk_shift; |
874 | hash_size = min(hash_size, max_buckets); |
875 | |
876 | if (hash_size < 64) |
877 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
878 | index 33f2010..1c13071 100644 |
879 | --- a/drivers/md/dm.c |
880 | +++ b/drivers/md/dm.c |
881 | @@ -2219,6 +2219,17 @@ struct target_type *dm_get_immutable_target_type(struct mapped_device *md) |
882 | } |
883 | |
884 | /* |
885 | + * The queue_limits are only valid as long as you have a reference |
886 | + * count on 'md'. |
887 | + */ |
888 | +struct queue_limits *dm_get_queue_limits(struct mapped_device *md) |
889 | +{ |
890 | + BUG_ON(!atomic_read(&md->holders)); |
891 | + return &md->queue->limits; |
892 | +} |
893 | +EXPORT_SYMBOL_GPL(dm_get_queue_limits); |
894 | + |
895 | +/* |
896 | * Fully initialize a request-based queue (->elevator, ->request_fn, etc). |
897 | */ |
898 | static int dm_init_request_based_queue(struct mapped_device *md) |
899 | diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c |
900 | index b3e5098..3db9291 100644 |
901 | --- a/drivers/misc/mei/amthif.c |
902 | +++ b/drivers/misc/mei/amthif.c |
903 | @@ -57,6 +57,7 @@ void mei_amthif_reset_params(struct mei_device *dev) |
904 | dev->iamthif_ioctl = false; |
905 | dev->iamthif_state = MEI_IAMTHIF_IDLE; |
906 | dev->iamthif_timer = 0; |
907 | + dev->iamthif_stall_timer = 0; |
908 | } |
909 | |
910 | /** |
911 | diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c |
912 | index 9ecd49a..99cc0b0 100644 |
913 | --- a/drivers/misc/mei/bus.c |
914 | +++ b/drivers/misc/mei/bus.c |
915 | @@ -295,10 +295,13 @@ int __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) |
916 | |
917 | if (cl->reading_state != MEI_READ_COMPLETE && |
918 | !waitqueue_active(&cl->rx_wait)) { |
919 | + |
920 | mutex_unlock(&dev->device_lock); |
921 | |
922 | if (wait_event_interruptible(cl->rx_wait, |
923 | - (MEI_READ_COMPLETE == cl->reading_state))) { |
924 | + cl->reading_state == MEI_READ_COMPLETE || |
925 | + mei_cl_is_transitioning(cl))) { |
926 | + |
927 | if (signal_pending(current)) |
928 | return -EINTR; |
929 | return -ERESTARTSYS; |
930 | diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h |
931 | index cfdb144..467d9dd 100644 |
932 | --- a/drivers/misc/mei/client.h |
933 | +++ b/drivers/misc/mei/client.h |
934 | @@ -76,6 +76,12 @@ static inline bool mei_cl_cmp_id(const struct mei_cl *cl1, |
935 | (cl1->host_client_id == cl2->host_client_id) && |
936 | (cl1->me_client_id == cl2->me_client_id); |
937 | } |
938 | +static inline bool mei_cl_is_transitioning(struct mei_cl *cl) |
939 | +{ |
940 | + return (MEI_FILE_INITIALIZING == cl->state || |
941 | + MEI_FILE_DISCONNECTED == cl->state || |
942 | + MEI_FILE_DISCONNECTING == cl->state); |
943 | +} |
944 | |
945 | |
946 | int mei_cl_flow_ctrl_creds(struct mei_cl *cl); |
947 | diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c |
948 | index 6916045..23b5b7b 100644 |
949 | --- a/drivers/misc/mei/hbm.c |
950 | +++ b/drivers/misc/mei/hbm.c |
951 | @@ -35,11 +35,15 @@ static void mei_hbm_me_cl_allocate(struct mei_device *dev) |
952 | struct mei_me_client *clients; |
953 | int b; |
954 | |
955 | + dev->me_clients_num = 0; |
956 | + dev->me_client_presentation_num = 0; |
957 | + dev->me_client_index = 0; |
958 | + |
959 | /* count how many ME clients we have */ |
960 | for_each_set_bit(b, dev->me_clients_map, MEI_CLIENTS_MAX) |
961 | dev->me_clients_num++; |
962 | |
963 | - if (dev->me_clients_num <= 0) |
964 | + if (dev->me_clients_num == 0) |
965 | return; |
966 | |
967 | kfree(dev->me_clients); |
968 | @@ -221,7 +225,7 @@ static int mei_hbm_prop_req(struct mei_device *dev) |
969 | struct hbm_props_request *prop_req; |
970 | const size_t len = sizeof(struct hbm_props_request); |
971 | unsigned long next_client_index; |
972 | - u8 client_num; |
973 | + unsigned long client_num; |
974 | |
975 | |
976 | client_num = dev->me_client_presentation_num; |
977 | @@ -650,8 +654,6 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) |
978 | if (dev->dev_state == MEI_DEV_INIT_CLIENTS && |
979 | dev->hbm_state == MEI_HBM_ENUM_CLIENTS) { |
980 | dev->init_clients_timer = 0; |
981 | - dev->me_client_presentation_num = 0; |
982 | - dev->me_client_index = 0; |
983 | mei_hbm_me_cl_allocate(dev); |
984 | dev->hbm_state = MEI_HBM_CLIENT_PROPERTIES; |
985 | |
986 | diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c |
987 | index 6eec689..878bc1c 100644 |
988 | --- a/drivers/misc/mei/init.c |
989 | +++ b/drivers/misc/mei/init.c |
990 | @@ -164,6 +164,9 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) |
991 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); |
992 | } |
993 | |
994 | + /* we're already in reset, cancel the init timer */ |
995 | + dev->init_clients_timer = 0; |
996 | + |
997 | dev->me_clients_num = 0; |
998 | dev->rd_msg_hdr = 0; |
999 | dev->wd_pending = false; |
1000 | diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c |
1001 | index 053139f..701698d 100644 |
1002 | --- a/drivers/misc/mei/main.c |
1003 | +++ b/drivers/misc/mei/main.c |
1004 | @@ -262,19 +262,16 @@ static ssize_t mei_read(struct file *file, char __user *ubuf, |
1005 | mutex_unlock(&dev->device_lock); |
1006 | |
1007 | if (wait_event_interruptible(cl->rx_wait, |
1008 | - (MEI_READ_COMPLETE == cl->reading_state || |
1009 | - MEI_FILE_INITIALIZING == cl->state || |
1010 | - MEI_FILE_DISCONNECTED == cl->state || |
1011 | - MEI_FILE_DISCONNECTING == cl->state))) { |
1012 | + MEI_READ_COMPLETE == cl->reading_state || |
1013 | + mei_cl_is_transitioning(cl))) { |
1014 | + |
1015 | if (signal_pending(current)) |
1016 | return -EINTR; |
1017 | return -ERESTARTSYS; |
1018 | } |
1019 | |
1020 | mutex_lock(&dev->device_lock); |
1021 | - if (MEI_FILE_INITIALIZING == cl->state || |
1022 | - MEI_FILE_DISCONNECTED == cl->state || |
1023 | - MEI_FILE_DISCONNECTING == cl->state) { |
1024 | + if (mei_cl_is_transitioning(cl)) { |
1025 | rets = -EBUSY; |
1026 | goto out; |
1027 | } |
1028 | diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h |
1029 | index 4de5140..73c7700 100644 |
1030 | --- a/drivers/misc/mei/mei_dev.h |
1031 | +++ b/drivers/misc/mei/mei_dev.h |
1032 | @@ -402,9 +402,9 @@ struct mei_device { |
1033 | struct mei_me_client *me_clients; /* Note: memory has to be allocated */ |
1034 | DECLARE_BITMAP(me_clients_map, MEI_CLIENTS_MAX); |
1035 | DECLARE_BITMAP(host_clients_map, MEI_CLIENTS_MAX); |
1036 | - u8 me_clients_num; |
1037 | - u8 me_client_presentation_num; |
1038 | - u8 me_client_index; |
1039 | + unsigned long me_clients_num; |
1040 | + unsigned long me_client_presentation_num; |
1041 | + unsigned long me_client_index; |
1042 | |
1043 | struct mei_cl wd_cl; |
1044 | enum mei_wd_states wd_state; |
1045 | diff --git a/drivers/staging/vt6656/iwctl.c b/drivers/staging/vt6656/iwctl.c |
1046 | index d0cf7d8..8872e0f 100644 |
1047 | --- a/drivers/staging/vt6656/iwctl.c |
1048 | +++ b/drivers/staging/vt6656/iwctl.c |
1049 | @@ -1634,6 +1634,9 @@ int iwctl_siwencodeext(struct net_device *dev, struct iw_request_info *info, |
1050 | if (pMgmt == NULL) |
1051 | return -EFAULT; |
1052 | |
1053 | + if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) |
1054 | + return -ENODEV; |
1055 | + |
1056 | buf = kzalloc(sizeof(struct viawget_wpa_param), GFP_KERNEL); |
1057 | if (buf == NULL) |
1058 | return -ENOMEM; |
1059 | diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c |
1060 | index 3a3fdc5..06b966c 100644 |
1061 | --- a/drivers/staging/vt6656/main_usb.c |
1062 | +++ b/drivers/staging/vt6656/main_usb.c |
1063 | @@ -1099,6 +1099,8 @@ static int device_close(struct net_device *dev) |
1064 | memset(pMgmt->abyCurrBSSID, 0, 6); |
1065 | pMgmt->eCurrState = WMAC_STATE_IDLE; |
1066 | |
1067 | + pDevice->flags &= ~DEVICE_FLAGS_OPENED; |
1068 | + |
1069 | device_free_tx_bufs(pDevice); |
1070 | device_free_rx_bufs(pDevice); |
1071 | device_free_int_bufs(pDevice); |
1072 | @@ -1110,7 +1112,6 @@ static int device_close(struct net_device *dev) |
1073 | usb_free_urb(pDevice->pInterruptURB); |
1074 | |
1075 | BSSvClearNodeDBTable(pDevice, 0); |
1076 | - pDevice->flags &=(~DEVICE_FLAGS_OPENED); |
1077 | |
1078 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n"); |
1079 | |
1080 | diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c |
1081 | index 572d481..20e4c94 100644 |
1082 | --- a/drivers/tty/serial/pch_uart.c |
1083 | +++ b/drivers/tty/serial/pch_uart.c |
1084 | @@ -658,11 +658,12 @@ static int dma_push_rx(struct eg20t_port *priv, int size) |
1085 | dev_warn(port->dev, "Rx overrun: dropping %u bytes\n", |
1086 | size - room); |
1087 | if (!room) |
1088 | - return room; |
1089 | + goto out; |
1090 | |
1091 | tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size); |
1092 | |
1093 | port->icount.rx += room; |
1094 | +out: |
1095 | tty_kref_put(tty); |
1096 | |
1097 | return room; |
1098 | @@ -1071,6 +1072,8 @@ static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr) |
1099 | if (tty == NULL) { |
1100 | for (i = 0; error_msg[i] != NULL; i++) |
1101 | dev_err(&priv->pdev->dev, error_msg[i]); |
1102 | + } else { |
1103 | + tty_kref_put(tty); |
1104 | } |
1105 | } |
1106 | |
1107 | diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c |
1108 | index 9799d04..357a837 100644 |
1109 | --- a/drivers/tty/serial/serial-tegra.c |
1110 | +++ b/drivers/tty/serial/serial-tegra.c |
1111 | @@ -726,7 +726,7 @@ static irqreturn_t tegra_uart_isr(int irq, void *data) |
1112 | static void tegra_uart_stop_rx(struct uart_port *u) |
1113 | { |
1114 | struct tegra_uart_port *tup = to_tegra_uport(u); |
1115 | - struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port); |
1116 | + struct tty_struct *tty; |
1117 | struct tty_port *port = &u->state->port; |
1118 | struct dma_tx_state state; |
1119 | unsigned long ier; |
1120 | @@ -738,6 +738,8 @@ static void tegra_uart_stop_rx(struct uart_port *u) |
1121 | if (!tup->rx_in_progress) |
1122 | return; |
1123 | |
1124 | + tty = tty_port_tty_get(&tup->uport.state->port); |
1125 | + |
1126 | tegra_uart_wait_sym_time(tup, 1); /* wait a character interval */ |
1127 | |
1128 | ier = tup->ier_shadow; |
1129 | diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c |
1130 | index 3500d41..088b4ca 100644 |
1131 | --- a/drivers/tty/tty_ioctl.c |
1132 | +++ b/drivers/tty/tty_ioctl.c |
1133 | @@ -1201,6 +1201,9 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file, |
1134 | } |
1135 | return 0; |
1136 | case TCFLSH: |
1137 | + retval = tty_check_change(tty); |
1138 | + if (retval) |
1139 | + return retval; |
1140 | return __tty_perform_flush(tty, arg); |
1141 | default: |
1142 | /* Try the mode commands */ |
1143 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
1144 | index c88c4fb..ce773cc 100644 |
1145 | --- a/drivers/usb/core/devio.c |
1146 | +++ b/drivers/usb/core/devio.c |
1147 | @@ -742,6 +742,22 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, |
1148 | if ((index & ~USB_DIR_IN) == 0) |
1149 | return 0; |
1150 | ret = findintfep(ps->dev, index); |
1151 | + if (ret < 0) { |
1152 | + /* |
1153 | + * Some not fully compliant Win apps seem to get |
1154 | + * index wrong and have the endpoint number here |
1155 | + * rather than the endpoint address (with the |
1156 | + * correct direction). Win does let this through, |
1157 | + * so we'll not reject it here but leave it to |
1158 | + * the device to not break KVM. But we warn. |
1159 | + */ |
1160 | + ret = findintfep(ps->dev, index ^ 0x80); |
1161 | + if (ret >= 0) |
1162 | + dev_info(&ps->dev->dev, |
1163 | + "%s: process %i (%s) requesting ep %02x but needs %02x\n", |
1164 | + __func__, task_pid_nr(current), |
1165 | + current->comm, index, index ^ 0x80); |
1166 | + } |
1167 | if (ret >= 0) |
1168 | ret = checkintf(ps, ret); |
1169 | break; |
1170 | diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c |
1171 | index eba9e2b..2357c4e 100644 |
1172 | --- a/drivers/usb/dwc3/dwc3-pci.c |
1173 | +++ b/drivers/usb/dwc3/dwc3-pci.c |
1174 | @@ -48,6 +48,8 @@ |
1175 | /* FIXME define these in <linux/pci_ids.h> */ |
1176 | #define PCI_VENDOR_ID_SYNOPSYS 0x16c3 |
1177 | #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd |
1178 | +#define PCI_DEVICE_ID_INTEL_BYT 0x0f37 |
1179 | +#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e |
1180 | |
1181 | struct dwc3_pci { |
1182 | struct device *dev; |
1183 | @@ -208,6 +210,8 @@ static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { |
1184 | PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, |
1185 | PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), |
1186 | }, |
1187 | + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, |
1188 | + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, |
1189 | { } /* Terminating Entry */ |
1190 | }; |
1191 | MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table); |
1192 | diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c |
1193 | index f394f29..b6e9d91 100644 |
1194 | --- a/drivers/usb/gadget/f_fs.c |
1195 | +++ b/drivers/usb/gadget/f_fs.c |
1196 | @@ -1034,37 +1034,19 @@ struct ffs_sb_fill_data { |
1197 | struct ffs_file_perms perms; |
1198 | umode_t root_mode; |
1199 | const char *dev_name; |
1200 | - union { |
1201 | - /* set by ffs_fs_mount(), read by ffs_sb_fill() */ |
1202 | - void *private_data; |
1203 | - /* set by ffs_sb_fill(), read by ffs_fs_mount */ |
1204 | - struct ffs_data *ffs_data; |
1205 | - }; |
1206 | + struct ffs_data *ffs_data; |
1207 | }; |
1208 | |
1209 | static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) |
1210 | { |
1211 | struct ffs_sb_fill_data *data = _data; |
1212 | struct inode *inode; |
1213 | - struct ffs_data *ffs; |
1214 | + struct ffs_data *ffs = data->ffs_data; |
1215 | |
1216 | ENTER(); |
1217 | |
1218 | - /* Initialise data */ |
1219 | - ffs = ffs_data_new(); |
1220 | - if (unlikely(!ffs)) |
1221 | - goto Enomem; |
1222 | - |
1223 | ffs->sb = sb; |
1224 | - ffs->dev_name = kstrdup(data->dev_name, GFP_KERNEL); |
1225 | - if (unlikely(!ffs->dev_name)) |
1226 | - goto Enomem; |
1227 | - ffs->file_perms = data->perms; |
1228 | - ffs->private_data = data->private_data; |
1229 | - |
1230 | - /* used by the caller of this function */ |
1231 | - data->ffs_data = ffs; |
1232 | - |
1233 | + data->ffs_data = NULL; |
1234 | sb->s_fs_info = ffs; |
1235 | sb->s_blocksize = PAGE_CACHE_SIZE; |
1236 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; |
1237 | @@ -1080,17 +1062,14 @@ static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) |
1238 | &data->perms); |
1239 | sb->s_root = d_make_root(inode); |
1240 | if (unlikely(!sb->s_root)) |
1241 | - goto Enomem; |
1242 | + return -ENOMEM; |
1243 | |
1244 | /* EP0 file */ |
1245 | if (unlikely(!ffs_sb_create_file(sb, "ep0", ffs, |
1246 | &ffs_ep0_operations, NULL))) |
1247 | - goto Enomem; |
1248 | + return -ENOMEM; |
1249 | |
1250 | return 0; |
1251 | - |
1252 | -Enomem: |
1253 | - return -ENOMEM; |
1254 | } |
1255 | |
1256 | static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts) |
1257 | @@ -1193,6 +1172,7 @@ ffs_fs_mount(struct file_system_type *t, int flags, |
1258 | struct dentry *rv; |
1259 | int ret; |
1260 | void *ffs_dev; |
1261 | + struct ffs_data *ffs; |
1262 | |
1263 | ENTER(); |
1264 | |
1265 | @@ -1200,18 +1180,30 @@ ffs_fs_mount(struct file_system_type *t, int flags, |
1266 | if (unlikely(ret < 0)) |
1267 | return ERR_PTR(ret); |
1268 | |
1269 | + ffs = ffs_data_new(); |
1270 | + if (unlikely(!ffs)) |
1271 | + return ERR_PTR(-ENOMEM); |
1272 | + ffs->file_perms = data.perms; |
1273 | + |
1274 | + ffs->dev_name = kstrdup(dev_name, GFP_KERNEL); |
1275 | + if (unlikely(!ffs->dev_name)) { |
1276 | + ffs_data_put(ffs); |
1277 | + return ERR_PTR(-ENOMEM); |
1278 | + } |
1279 | + |
1280 | ffs_dev = functionfs_acquire_dev_callback(dev_name); |
1281 | - if (IS_ERR(ffs_dev)) |
1282 | - return ffs_dev; |
1283 | + if (IS_ERR(ffs_dev)) { |
1284 | + ffs_data_put(ffs); |
1285 | + return ERR_CAST(ffs_dev); |
1286 | + } |
1287 | + ffs->private_data = ffs_dev; |
1288 | + data.ffs_data = ffs; |
1289 | |
1290 | - data.dev_name = dev_name; |
1291 | - data.private_data = ffs_dev; |
1292 | rv = mount_nodev(t, flags, &data, ffs_sb_fill); |
1293 | - |
1294 | - /* data.ffs_data is set by ffs_sb_fill */ |
1295 | - if (IS_ERR(rv)) |
1296 | + if (IS_ERR(rv) && data.ffs_data) { |
1297 | functionfs_release_dev_callback(data.ffs_data); |
1298 | - |
1299 | + ffs_data_put(data.ffs_data); |
1300 | + } |
1301 | return rv; |
1302 | } |
1303 | |
1304 | diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c |
1305 | index 3be3df2..3c0a49a 100644 |
1306 | --- a/drivers/usb/host/ehci-fsl.c |
1307 | +++ b/drivers/usb/host/ehci-fsl.c |
1308 | @@ -130,7 +130,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, |
1309 | } |
1310 | |
1311 | /* Enable USB controller, 83xx or 8536 */ |
1312 | - if (pdata->have_sysif_regs) |
1313 | + if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) |
1314 | setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4); |
1315 | |
1316 | /* Don't need to set host mode here. It will be done by tdi_reset() */ |
1317 | @@ -232,15 +232,9 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd, |
1318 | case FSL_USB2_PHY_ULPI: |
1319 | if (pdata->have_sysif_regs && pdata->controller_ver) { |
1320 | /* controller version 1.6 or above */ |
1321 | + clrbits32(non_ehci + FSL_SOC_USB_CTRL, UTMI_PHY_EN); |
1322 | setbits32(non_ehci + FSL_SOC_USB_CTRL, |
1323 | - ULPI_PHY_CLK_SEL); |
1324 | - /* |
1325 | - * Due to controller issue of PHY_CLK_VALID in ULPI |
1326 | - * mode, we set USB_CTRL_USB_EN before checking |
1327 | - * PHY_CLK_VALID, otherwise PHY_CLK_VALID doesn't work. |
1328 | - */ |
1329 | - clrsetbits_be32(non_ehci + FSL_SOC_USB_CTRL, |
1330 | - UTMI_PHY_EN, USB_CTRL_USB_EN); |
1331 | + ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN); |
1332 | } |
1333 | portsc |= PORT_PTS_ULPI; |
1334 | break; |
1335 | diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c |
1336 | index 595d210..8fe401c 100644 |
1337 | --- a/drivers/usb/host/ehci-pci.c |
1338 | +++ b/drivers/usb/host/ehci-pci.c |
1339 | @@ -403,7 +403,7 @@ static struct pci_driver ehci_pci_driver = { |
1340 | .remove = usb_hcd_pci_remove, |
1341 | .shutdown = usb_hcd_pci_shutdown, |
1342 | |
1343 | -#ifdef CONFIG_PM_SLEEP |
1344 | +#ifdef CONFIG_PM |
1345 | .driver = { |
1346 | .pm = &usb_hcd_pci_pm_ops |
1347 | }, |
1348 | diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c |
1349 | index fc627fd..865946c 100644 |
1350 | --- a/drivers/usb/host/ohci-hcd.c |
1351 | +++ b/drivers/usb/host/ohci-hcd.c |
1352 | @@ -231,31 +231,26 @@ static int ohci_urb_enqueue ( |
1353 | frame &= ~(ed->interval - 1); |
1354 | frame |= ed->branch; |
1355 | urb->start_frame = frame; |
1356 | + ed->last_iso = frame + ed->interval * (size - 1); |
1357 | } |
1358 | } else if (ed->type == PIPE_ISOCHRONOUS) { |
1359 | u16 next = ohci_frame_no(ohci) + 1; |
1360 | u16 frame = ed->last_iso + ed->interval; |
1361 | + u16 length = ed->interval * (size - 1); |
1362 | |
1363 | /* Behind the scheduling threshold? */ |
1364 | if (unlikely(tick_before(frame, next))) { |
1365 | |
1366 | - /* USB_ISO_ASAP: Round up to the first available slot */ |
1367 | + /* URB_ISO_ASAP: Round up to the first available slot */ |
1368 | if (urb->transfer_flags & URB_ISO_ASAP) { |
1369 | frame += (next - frame + ed->interval - 1) & |
1370 | -ed->interval; |
1371 | |
1372 | /* |
1373 | - * Not ASAP: Use the next slot in the stream. If |
1374 | - * the entire URB falls before the threshold, fail. |
1375 | + * Not ASAP: Use the next slot in the stream, |
1376 | + * no matter what. |
1377 | */ |
1378 | } else { |
1379 | - if (tick_before(frame + ed->interval * |
1380 | - (urb->number_of_packets - 1), next)) { |
1381 | - retval = -EXDEV; |
1382 | - usb_hcd_unlink_urb_from_ep(hcd, urb); |
1383 | - goto fail; |
1384 | - } |
1385 | - |
1386 | /* |
1387 | * Some OHCI hardware doesn't handle late TDs |
1388 | * correctly. After retiring them it proceeds |
1389 | @@ -266,9 +261,16 @@ static int ohci_urb_enqueue ( |
1390 | urb_priv->td_cnt = DIV_ROUND_UP( |
1391 | (u16) (next - frame), |
1392 | ed->interval); |
1393 | + if (urb_priv->td_cnt >= urb_priv->length) { |
1394 | + ++urb_priv->td_cnt; /* Mark it */ |
1395 | + ohci_dbg(ohci, "iso underrun %p (%u+%u < %u)\n", |
1396 | + urb, frame, length, |
1397 | + next); |
1398 | + } |
1399 | } |
1400 | } |
1401 | urb->start_frame = frame; |
1402 | + ed->last_iso = frame + length; |
1403 | } |
1404 | |
1405 | /* fill the TDs and link them to the ed; and |
1406 | diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c |
1407 | index 88731b7..37dc837 100644 |
1408 | --- a/drivers/usb/host/ohci-q.c |
1409 | +++ b/drivers/usb/host/ohci-q.c |
1410 | @@ -41,8 +41,12 @@ finish_urb(struct ohci_hcd *ohci, struct urb *urb, int status) |
1411 | __releases(ohci->lock) |
1412 | __acquires(ohci->lock) |
1413 | { |
1414 | + struct usb_host_endpoint *ep = urb->ep; |
1415 | + struct urb_priv *urb_priv; |
1416 | + |
1417 | // ASSERT (urb->hcpriv != 0); |
1418 | |
1419 | + restart: |
1420 | urb_free_priv (ohci, urb->hcpriv); |
1421 | urb->hcpriv = NULL; |
1422 | if (likely(status == -EINPROGRESS)) |
1423 | @@ -79,6 +83,21 @@ __acquires(ohci->lock) |
1424 | ohci->hc_control &= ~(OHCI_CTRL_PLE|OHCI_CTRL_IE); |
1425 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); |
1426 | } |
1427 | + |
1428 | + /* |
1429 | + * An isochronous URB that is sumitted too late won't have any TDs |
1430 | + * (marked by the fact that the td_cnt value is larger than the |
1431 | + * actual number of TDs). If the next URB on this endpoint is like |
1432 | + * that, give it back now. |
1433 | + */ |
1434 | + if (!list_empty(&ep->urb_list)) { |
1435 | + urb = list_first_entry(&ep->urb_list, struct urb, urb_list); |
1436 | + urb_priv = urb->hcpriv; |
1437 | + if (urb_priv->td_cnt > urb_priv->length) { |
1438 | + status = 0; |
1439 | + goto restart; |
1440 | + } |
1441 | + } |
1442 | } |
1443 | |
1444 | |
1445 | @@ -545,7 +564,6 @@ td_fill (struct ohci_hcd *ohci, u32 info, |
1446 | td->hwCBP = cpu_to_hc32 (ohci, data & 0xFFFFF000); |
1447 | *ohci_hwPSWp(ohci, td, 0) = cpu_to_hc16 (ohci, |
1448 | (data & 0x0FFF) | 0xE000); |
1449 | - td->ed->last_iso = info & 0xffff; |
1450 | } else { |
1451 | td->hwCBP = cpu_to_hc32 (ohci, data); |
1452 | } |
1453 | @@ -994,7 +1012,7 @@ rescan_this: |
1454 | urb_priv->td_cnt++; |
1455 | |
1456 | /* if URB is done, clean up */ |
1457 | - if (urb_priv->td_cnt == urb_priv->length) { |
1458 | + if (urb_priv->td_cnt >= urb_priv->length) { |
1459 | modified = completed = 1; |
1460 | finish_urb(ohci, urb, 0); |
1461 | } |
1462 | @@ -1084,7 +1102,7 @@ static void takeback_td(struct ohci_hcd *ohci, struct td *td) |
1463 | urb_priv->td_cnt++; |
1464 | |
1465 | /* If all this urb's TDs are done, call complete() */ |
1466 | - if (urb_priv->td_cnt == urb_priv->length) |
1467 | + if (urb_priv->td_cnt >= urb_priv->length) |
1468 | finish_urb(ohci, urb, status); |
1469 | |
1470 | /* clean schedule: unlink EDs that are no longer busy */ |
1471 | diff --git a/drivers/usb/host/uhci-pci.c b/drivers/usb/host/uhci-pci.c |
1472 | index c300bd2f7..0f228c4 100644 |
1473 | --- a/drivers/usb/host/uhci-pci.c |
1474 | +++ b/drivers/usb/host/uhci-pci.c |
1475 | @@ -293,7 +293,7 @@ static struct pci_driver uhci_pci_driver = { |
1476 | .remove = usb_hcd_pci_remove, |
1477 | .shutdown = uhci_shutdown, |
1478 | |
1479 | -#ifdef CONFIG_PM_SLEEP |
1480 | +#ifdef CONFIG_PM |
1481 | .driver = { |
1482 | .pm = &usb_hcd_pci_pm_ops |
1483 | }, |
1484 | diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c |
1485 | index 041c6dd..da6f56d 100644 |
1486 | --- a/drivers/usb/host/uhci-q.c |
1487 | +++ b/drivers/usb/host/uhci-q.c |
1488 | @@ -1303,7 +1303,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, |
1489 | } |
1490 | |
1491 | /* Fell behind? */ |
1492 | - if (uhci_frame_before_eq(frame, next)) { |
1493 | + if (!uhci_frame_before_eq(next, frame)) { |
1494 | |
1495 | /* USB_ISO_ASAP: Round up to the first available slot */ |
1496 | if (urb->transfer_flags & URB_ISO_ASAP) |
1497 | @@ -1311,13 +1311,17 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, |
1498 | -qh->period; |
1499 | |
1500 | /* |
1501 | - * Not ASAP: Use the next slot in the stream. If |
1502 | - * the entire URB falls before the threshold, fail. |
1503 | + * Not ASAP: Use the next slot in the stream, |
1504 | + * no matter what. |
1505 | */ |
1506 | else if (!uhci_frame_before_eq(next, |
1507 | frame + (urb->number_of_packets - 1) * |
1508 | qh->period)) |
1509 | - return -EXDEV; |
1510 | + dev_dbg(uhci_dev(uhci), "iso underrun %p (%u+%u < %u)\n", |
1511 | + urb, frame, |
1512 | + (urb->number_of_packets - 1) * |
1513 | + qh->period, |
1514 | + next); |
1515 | } |
1516 | } |
1517 | |
1518 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
1519 | index 187a3ec..7cdcfd0 100644 |
1520 | --- a/drivers/usb/host/xhci-hub.c |
1521 | +++ b/drivers/usb/host/xhci-hub.c |
1522 | @@ -286,7 +286,7 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend) |
1523 | if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) |
1524 | xhci_queue_stop_endpoint(xhci, slot_id, i, suspend); |
1525 | } |
1526 | - cmd->command_trb = xhci->cmd_ring->enqueue; |
1527 | + cmd->command_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
1528 | list_add_tail(&cmd->cmd_list, &virt_dev->cmd_list); |
1529 | xhci_queue_stop_endpoint(xhci, slot_id, 0, suspend); |
1530 | xhci_ring_cmd_db(xhci); |
1531 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1532 | index f00cb20..159e3c6 100644 |
1533 | --- a/drivers/usb/host/xhci-pci.c |
1534 | +++ b/drivers/usb/host/xhci-pci.c |
1535 | @@ -345,7 +345,7 @@ static struct pci_driver xhci_pci_driver = { |
1536 | /* suspend and resume implemented later */ |
1537 | |
1538 | .shutdown = usb_hcd_pci_shutdown, |
1539 | -#ifdef CONFIG_PM_SLEEP |
1540 | +#ifdef CONFIG_PM |
1541 | .driver = { |
1542 | .pm = &usb_hcd_pci_pm_ops |
1543 | }, |
1544 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1545 | index cc3bfc5..bcfb08e 100644 |
1546 | --- a/drivers/usb/host/xhci-ring.c |
1547 | +++ b/drivers/usb/host/xhci-ring.c |
1548 | @@ -122,6 +122,16 @@ static int enqueue_is_link_trb(struct xhci_ring *ring) |
1549 | return TRB_TYPE_LINK_LE32(link->control); |
1550 | } |
1551 | |
1552 | +union xhci_trb *xhci_find_next_enqueue(struct xhci_ring *ring) |
1553 | +{ |
1554 | + /* Enqueue pointer can be left pointing to the link TRB, |
1555 | + * we must handle that |
1556 | + */ |
1557 | + if (TRB_TYPE_LINK_LE32(ring->enqueue->link.control)) |
1558 | + return ring->enq_seg->next->trbs; |
1559 | + return ring->enqueue; |
1560 | +} |
1561 | + |
1562 | /* Updates trb to point to the next TRB in the ring, and updates seg if the next |
1563 | * TRB is in a new segment. This does not skip over link TRBs, and it does not |
1564 | * effect the ring dequeue or enqueue pointers. |
1565 | @@ -847,8 +857,12 @@ remove_finished_td: |
1566 | /* Otherwise ring the doorbell(s) to restart queued transfers */ |
1567 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
1568 | } |
1569 | - ep->stopped_td = NULL; |
1570 | - ep->stopped_trb = NULL; |
1571 | + |
1572 | + /* Clear stopped_td and stopped_trb if endpoint is not halted */ |
1573 | + if (!(ep->ep_state & EP_HALTED)) { |
1574 | + ep->stopped_td = NULL; |
1575 | + ep->stopped_trb = NULL; |
1576 | + } |
1577 | |
1578 | /* |
1579 | * Drop the lock and complete the URBs in the cancelled TD list. |
1580 | @@ -1390,6 +1404,12 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, |
1581 | inc_deq(xhci, xhci->cmd_ring); |
1582 | return; |
1583 | } |
1584 | + /* There is no command to handle if we get a stop event when the |
1585 | + * command ring is empty, event->cmd_trb points to the next |
1586 | + * unset command |
1587 | + */ |
1588 | + if (xhci->cmd_ring->dequeue == xhci->cmd_ring->enqueue) |
1589 | + return; |
1590 | } |
1591 | |
1592 | switch (le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3]) |
1593 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1594 | index f4a49c4..4a5251f 100644 |
1595 | --- a/drivers/usb/host/xhci.c |
1596 | +++ b/drivers/usb/host/xhci.c |
1597 | @@ -2592,15 +2592,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
1598 | if (command) { |
1599 | cmd_completion = command->completion; |
1600 | cmd_status = &command->status; |
1601 | - command->command_trb = xhci->cmd_ring->enqueue; |
1602 | - |
1603 | - /* Enqueue pointer can be left pointing to the link TRB, |
1604 | - * we must handle that |
1605 | - */ |
1606 | - if (TRB_TYPE_LINK_LE32(command->command_trb->link.control)) |
1607 | - command->command_trb = |
1608 | - xhci->cmd_ring->enq_seg->next->trbs; |
1609 | - |
1610 | + command->command_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
1611 | list_add_tail(&command->cmd_list, &virt_dev->cmd_list); |
1612 | } else { |
1613 | cmd_completion = &virt_dev->cmd_completion; |
1614 | @@ -2608,7 +2600,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
1615 | } |
1616 | init_completion(cmd_completion); |
1617 | |
1618 | - cmd_trb = xhci->cmd_ring->dequeue; |
1619 | + cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
1620 | if (!ctx_change) |
1621 | ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma, |
1622 | udev->slot_id, must_succeed); |
1623 | @@ -3393,14 +3385,7 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) |
1624 | |
1625 | /* Attempt to submit the Reset Device command to the command ring */ |
1626 | spin_lock_irqsave(&xhci->lock, flags); |
1627 | - reset_device_cmd->command_trb = xhci->cmd_ring->enqueue; |
1628 | - |
1629 | - /* Enqueue pointer can be left pointing to the link TRB, |
1630 | - * we must handle that |
1631 | - */ |
1632 | - if (TRB_TYPE_LINK_LE32(reset_device_cmd->command_trb->link.control)) |
1633 | - reset_device_cmd->command_trb = |
1634 | - xhci->cmd_ring->enq_seg->next->trbs; |
1635 | + reset_device_cmd->command_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
1636 | |
1637 | list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list); |
1638 | ret = xhci_queue_reset_device(xhci, slot_id); |
1639 | @@ -3604,7 +3589,7 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) |
1640 | union xhci_trb *cmd_trb; |
1641 | |
1642 | spin_lock_irqsave(&xhci->lock, flags); |
1643 | - cmd_trb = xhci->cmd_ring->dequeue; |
1644 | + cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
1645 | ret = xhci_queue_slot_control(xhci, TRB_ENABLE_SLOT, 0); |
1646 | if (ret) { |
1647 | spin_unlock_irqrestore(&xhci->lock, flags); |
1648 | @@ -3731,7 +3716,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) |
1649 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); |
1650 | |
1651 | spin_lock_irqsave(&xhci->lock, flags); |
1652 | - cmd_trb = xhci->cmd_ring->dequeue; |
1653 | + cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); |
1654 | ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, |
1655 | udev->slot_id); |
1656 | if (ret) { |
1657 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
1658 | index 3638f1d..627fcd9 100644 |
1659 | --- a/drivers/usb/host/xhci.h |
1660 | +++ b/drivers/usb/host/xhci.h |
1661 | @@ -1821,6 +1821,7 @@ int xhci_cancel_cmd(struct xhci_hcd *xhci, struct xhci_command *command, |
1662 | union xhci_trb *cmd_trb); |
1663 | void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id, |
1664 | unsigned int ep_index, unsigned int stream_id); |
1665 | +union xhci_trb *xhci_find_next_enqueue(struct xhci_ring *ring); |
1666 | |
1667 | /* xHCI roothub code */ |
1668 | void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, |
1669 | diff --git a/fs/bio.c b/fs/bio.c |
1670 | index c5eae72..5e7507d 100644 |
1671 | --- a/fs/bio.c |
1672 | +++ b/fs/bio.c |
1673 | @@ -917,8 +917,8 @@ void bio_copy_data(struct bio *dst, struct bio *src) |
1674 | src_p = kmap_atomic(src_bv->bv_page); |
1675 | dst_p = kmap_atomic(dst_bv->bv_page); |
1676 | |
1677 | - memcpy(dst_p + dst_bv->bv_offset, |
1678 | - src_p + src_bv->bv_offset, |
1679 | + memcpy(dst_p + dst_offset, |
1680 | + src_p + src_offset, |
1681 | bytes); |
1682 | |
1683 | kunmap_atomic(dst_p); |
1684 | diff --git a/fs/sysv/super.c b/fs/sysv/super.c |
1685 | index d0c6a00..eda1095 100644 |
1686 | --- a/fs/sysv/super.c |
1687 | +++ b/fs/sysv/super.c |
1688 | @@ -487,6 +487,7 @@ static int v7_fill_super(struct super_block *sb, void *data, int silent) |
1689 | sbi->s_sb = sb; |
1690 | sbi->s_block_base = 0; |
1691 | sbi->s_type = FSTYPE_V7; |
1692 | + mutex_init(&sbi->s_lock); |
1693 | sb->s_fs_info = sbi; |
1694 | |
1695 | sb_set_blocksize(sb, 512); |
1696 | diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h |
1697 | index 3cd3247..ef5bd3f 100644 |
1698 | --- a/include/linux/device-mapper.h |
1699 | +++ b/include/linux/device-mapper.h |
1700 | @@ -405,13 +405,14 @@ int dm_noflush_suspending(struct dm_target *ti); |
1701 | union map_info *dm_get_mapinfo(struct bio *bio); |
1702 | union map_info *dm_get_rq_mapinfo(struct request *rq); |
1703 | |
1704 | +struct queue_limits *dm_get_queue_limits(struct mapped_device *md); |
1705 | + |
1706 | /* |
1707 | * Geometry functions. |
1708 | */ |
1709 | int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo); |
1710 | int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo); |
1711 | |
1712 | - |
1713 | /*----------------------------------------------------------------- |
1714 | * Functions for manipulating device-mapper tables. |
1715 | *---------------------------------------------------------------*/ |
1716 | diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c |
1717 | index 9896954..5863ba6 100644 |
1718 | --- a/sound/core/compress_offload.c |
1719 | +++ b/sound/core/compress_offload.c |
1720 | @@ -837,7 +837,8 @@ static int snd_compress_dev_disconnect(struct snd_device *device) |
1721 | struct snd_compr *compr; |
1722 | |
1723 | compr = device->device_data; |
1724 | - snd_unregister_device(compr->direction, compr->card, compr->device); |
1725 | + snd_unregister_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card, |
1726 | + compr->device); |
1727 | return 0; |
1728 | } |
1729 | |
1730 | diff --git a/tools/lib/lk/debugfs.c b/tools/lib/lk/debugfs.c |
1731 | index 099e7cd..7c43479 100644 |
1732 | --- a/tools/lib/lk/debugfs.c |
1733 | +++ b/tools/lib/lk/debugfs.c |
1734 | @@ -5,7 +5,6 @@ |
1735 | #include <stdbool.h> |
1736 | #include <sys/vfs.h> |
1737 | #include <sys/mount.h> |
1738 | -#include <linux/magic.h> |
1739 | #include <linux/kernel.h> |
1740 | |
1741 | #include "debugfs.h" |