Contents of /trunk/kernel-lts/patches-3.4/0148-3.4.48-all-fixes.patch
Parent Directory | Revision Log
Revision 2208 -
(show annotations)
(download)
Fri Jun 14 09:37:30 2013 UTC (11 years, 3 months ago) by niro
File size: 39167 byte(s)
Fri Jun 14 09:37:30 2013 UTC (11 years, 3 months ago) by niro
File size: 39167 byte(s)
-linux-3.4.49
1 | diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c |
2 | index 8752f79..8a811d9 100644 |
3 | --- a/arch/powerpc/platforms/pseries/eeh_pseries.c |
4 | +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c |
5 | @@ -83,7 +83,11 @@ static int pseries_eeh_init(void) |
6 | ibm_configure_pe = rtas_token("ibm,configure-pe"); |
7 | ibm_configure_bridge = rtas_token ("ibm,configure-bridge"); |
8 | |
9 | - /* necessary sanity check */ |
10 | + /* |
11 | + * Necessary sanity check. We needn't check "get-config-addr-info" |
12 | + * and its variant since the old firmware probably support address |
13 | + * of domain/bus/slot/function for EEH RTAS operations. |
14 | + */ |
15 | if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) { |
16 | pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n", |
17 | __func__); |
18 | @@ -102,12 +106,6 @@ static int pseries_eeh_init(void) |
19 | pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n", |
20 | __func__); |
21 | return -EINVAL; |
22 | - } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE && |
23 | - ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) { |
24 | - pr_warning("%s: RTAS service <ibm,get-config-addr-info2> and " |
25 | - "<ibm,get-config-addr-info> invalid\n", |
26 | - __func__); |
27 | - return -EINVAL; |
28 | } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE && |
29 | ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) { |
30 | pr_warning("%s: RTAS service <ibm,configure-pe> and " |
31 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
32 | index 91357e1..6d2c49b 100644 |
33 | --- a/drivers/acpi/video.c |
34 | +++ b/drivers/acpi/video.c |
35 | @@ -447,6 +447,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
36 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"), |
37 | }, |
38 | }, |
39 | + { |
40 | + .callback = video_ignore_initial_backlight, |
41 | + .ident = "HP Pavilion g6 Notebook PC", |
42 | + .matches = { |
43 | + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
44 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), |
45 | + }, |
46 | + }, |
47 | + { |
48 | + .callback = video_ignore_initial_backlight, |
49 | + .ident = "HP Pavilion m4", |
50 | + .matches = { |
51 | + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
52 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), |
53 | + }, |
54 | + }, |
55 | {} |
56 | }; |
57 | |
58 | diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c |
59 | index c869436..dc33ba5 100644 |
60 | --- a/drivers/gpu/drm/drm_irq.c |
61 | +++ b/drivers/gpu/drm/drm_irq.c |
62 | @@ -981,7 +981,7 @@ EXPORT_SYMBOL(drm_vblank_off); |
63 | */ |
64 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) |
65 | { |
66 | - /* vblank is not initialized (IRQ not installed ?) */ |
67 | + /* vblank is not initialized (IRQ not installed ?), or has been freed */ |
68 | if (!dev->num_crtcs) |
69 | return; |
70 | /* |
71 | @@ -1003,6 +1003,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc) |
72 | { |
73 | unsigned long irqflags; |
74 | |
75 | + /* vblank is not initialized (IRQ not installed ?), or has been freed */ |
76 | + if (!dev->num_crtcs) |
77 | + return; |
78 | + |
79 | if (dev->vblank_inmodeset[crtc]) { |
80 | spin_lock_irqsave(&dev->vbl_lock, irqflags); |
81 | dev->vblank_disable_allowed = 1; |
82 | diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c |
83 | index 8ea202f..fa74a86 100644 |
84 | --- a/drivers/gpu/drm/gma500/framebuffer.c |
85 | +++ b/drivers/gpu/drm/gma500/framebuffer.c |
86 | @@ -782,8 +782,8 @@ void psb_modeset_init(struct drm_device *dev) |
87 | for (i = 0; i < dev_priv->num_pipe; i++) |
88 | psb_intel_crtc_init(dev, i, mode_dev); |
89 | |
90 | - dev->mode_config.max_width = 2048; |
91 | - dev->mode_config.max_height = 2048; |
92 | + dev->mode_config.max_width = 4096; |
93 | + dev->mode_config.max_height = 4096; |
94 | |
95 | psb_setup_outputs(dev); |
96 | } |
97 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
98 | index 1ad5906..207180d 100644 |
99 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
100 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
101 | @@ -747,10 +747,10 @@ static const struct dmi_system_id intel_no_lvds[] = { |
102 | }, |
103 | { |
104 | .callback = intel_no_lvds_dmi_callback, |
105 | - .ident = "Hewlett-Packard HP t5740e Thin Client", |
106 | + .ident = "Hewlett-Packard HP t5740", |
107 | .matches = { |
108 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
109 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), |
110 | + DMI_MATCH(DMI_PRODUCT_NAME, " t5740"), |
111 | }, |
112 | }, |
113 | { |
114 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c |
115 | index 1b6b157..aeb9d6e 100644 |
116 | --- a/drivers/gpu/drm/i915/intel_sdvo.c |
117 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c |
118 | @@ -1581,7 +1581,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) |
119 | * Assume that the preferred modes are |
120 | * arranged in priority order. |
121 | */ |
122 | - intel_ddc_get_modes(connector, intel_sdvo->i2c); |
123 | + intel_ddc_get_modes(connector, &intel_sdvo->ddc); |
124 | if (list_empty(&connector->probed_modes) == false) |
125 | goto end; |
126 | |
127 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
128 | index 23e3ea6..ced9370 100644 |
129 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
130 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
131 | @@ -396,6 +396,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) |
132 | int |
133 | atombios_get_encoder_mode(struct drm_encoder *encoder) |
134 | { |
135 | + struct drm_device *dev = encoder->dev; |
136 | + struct radeon_device *rdev = dev->dev_private; |
137 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
138 | struct drm_connector *connector; |
139 | struct radeon_connector *radeon_connector; |
140 | @@ -421,7 +423,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) |
141 | case DRM_MODE_CONNECTOR_DVII: |
142 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ |
143 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
144 | - radeon_audio) |
145 | + radeon_audio && |
146 | + !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ |
147 | return ATOM_ENCODER_MODE_HDMI; |
148 | else if (radeon_connector->use_digital) |
149 | return ATOM_ENCODER_MODE_DVI; |
150 | @@ -432,7 +435,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) |
151 | case DRM_MODE_CONNECTOR_HDMIA: |
152 | default: |
153 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
154 | - radeon_audio) |
155 | + radeon_audio && |
156 | + !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ |
157 | return ATOM_ENCODER_MODE_HDMI; |
158 | else |
159 | return ATOM_ENCODER_MODE_DVI; |
160 | @@ -446,7 +450,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) |
161 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) |
162 | return ATOM_ENCODER_MODE_DP; |
163 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
164 | - radeon_audio) |
165 | + radeon_audio && |
166 | + !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ |
167 | return ATOM_ENCODER_MODE_HDMI; |
168 | else |
169 | return ATOM_ENCODER_MODE_DVI; |
170 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c |
171 | index 6a8776e..300099d 100644 |
172 | --- a/drivers/gpu/drm/radeon/evergreen.c |
173 | +++ b/drivers/gpu/drm/radeon/evergreen.c |
174 | @@ -3258,6 +3258,12 @@ static int evergreen_startup(struct radeon_device *rdev) |
175 | } |
176 | |
177 | /* Enable IRQ */ |
178 | + if (!rdev->irq.installed) { |
179 | + r = radeon_irq_kms_init(rdev); |
180 | + if (r) |
181 | + return r; |
182 | + } |
183 | + |
184 | r = r600_irq_init(rdev); |
185 | if (r) { |
186 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
187 | @@ -3409,10 +3415,6 @@ int evergreen_init(struct radeon_device *rdev) |
188 | if (r) |
189 | return r; |
190 | |
191 | - r = radeon_irq_kms_init(rdev); |
192 | - if (r) |
193 | - return r; |
194 | - |
195 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
196 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
197 | |
198 | diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c |
199 | index d706da8..f5387b3 100644 |
200 | --- a/drivers/gpu/drm/radeon/ni.c |
201 | +++ b/drivers/gpu/drm/radeon/ni.c |
202 | @@ -1614,6 +1614,12 @@ static int cayman_startup(struct radeon_device *rdev) |
203 | } |
204 | |
205 | /* Enable IRQ */ |
206 | + if (!rdev->irq.installed) { |
207 | + r = radeon_irq_kms_init(rdev); |
208 | + if (r) |
209 | + return r; |
210 | + } |
211 | + |
212 | r = r600_irq_init(rdev); |
213 | if (r) { |
214 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
215 | @@ -1744,10 +1750,6 @@ int cayman_init(struct radeon_device *rdev) |
216 | if (r) |
217 | return r; |
218 | |
219 | - r = radeon_irq_kms_init(rdev); |
220 | - if (r) |
221 | - return r; |
222 | - |
223 | ring->ring_obj = NULL; |
224 | r600_ring_init(rdev, ring, 1024 * 1024); |
225 | |
226 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c |
227 | index fe33d35..40ed0e5 100644 |
228 | --- a/drivers/gpu/drm/radeon/r100.c |
229 | +++ b/drivers/gpu/drm/radeon/r100.c |
230 | @@ -3952,6 +3952,12 @@ static int r100_startup(struct radeon_device *rdev) |
231 | } |
232 | |
233 | /* Enable IRQ */ |
234 | + if (!rdev->irq.installed) { |
235 | + r = radeon_irq_kms_init(rdev); |
236 | + if (r) |
237 | + return r; |
238 | + } |
239 | + |
240 | r100_irq_set(rdev); |
241 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
242 | /* 1M ring buffer */ |
243 | @@ -4113,9 +4119,6 @@ int r100_init(struct radeon_device *rdev) |
244 | r = radeon_fence_driver_init(rdev); |
245 | if (r) |
246 | return r; |
247 | - r = radeon_irq_kms_init(rdev); |
248 | - if (r) |
249 | - return r; |
250 | /* Memory manager */ |
251 | r = radeon_bo_init(rdev); |
252 | if (r) |
253 | diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c |
254 | index fa14383..63b53aa 100644 |
255 | --- a/drivers/gpu/drm/radeon/r300.c |
256 | +++ b/drivers/gpu/drm/radeon/r300.c |
257 | @@ -1405,6 +1405,12 @@ static int r300_startup(struct radeon_device *rdev) |
258 | } |
259 | |
260 | /* Enable IRQ */ |
261 | + if (!rdev->irq.installed) { |
262 | + r = radeon_irq_kms_init(rdev); |
263 | + if (r) |
264 | + return r; |
265 | + } |
266 | + |
267 | r100_irq_set(rdev); |
268 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
269 | /* 1M ring buffer */ |
270 | @@ -1545,9 +1551,6 @@ int r300_init(struct radeon_device *rdev) |
271 | r = radeon_fence_driver_init(rdev); |
272 | if (r) |
273 | return r; |
274 | - r = radeon_irq_kms_init(rdev); |
275 | - if (r) |
276 | - return r; |
277 | /* Memory manager */ |
278 | r = radeon_bo_init(rdev); |
279 | if (r) |
280 | diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c |
281 | index f3fcaac..1a9347f 100644 |
282 | --- a/drivers/gpu/drm/radeon/r420.c |
283 | +++ b/drivers/gpu/drm/radeon/r420.c |
284 | @@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev) |
285 | } |
286 | |
287 | /* Enable IRQ */ |
288 | + if (!rdev->irq.installed) { |
289 | + r = radeon_irq_kms_init(rdev); |
290 | + if (r) |
291 | + return r; |
292 | + } |
293 | + |
294 | r100_irq_set(rdev); |
295 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
296 | /* 1M ring buffer */ |
297 | @@ -417,10 +423,6 @@ int r420_init(struct radeon_device *rdev) |
298 | if (r) { |
299 | return r; |
300 | } |
301 | - r = radeon_irq_kms_init(rdev); |
302 | - if (r) { |
303 | - return r; |
304 | - } |
305 | /* Memory manager */ |
306 | r = radeon_bo_init(rdev); |
307 | if (r) { |
308 | diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c |
309 | index ebcc15b..57be784 100644 |
310 | --- a/drivers/gpu/drm/radeon/r520.c |
311 | +++ b/drivers/gpu/drm/radeon/r520.c |
312 | @@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev) |
313 | } |
314 | |
315 | /* Enable IRQ */ |
316 | + if (!rdev->irq.installed) { |
317 | + r = radeon_irq_kms_init(rdev); |
318 | + if (r) |
319 | + return r; |
320 | + } |
321 | + |
322 | rs600_irq_set(rdev); |
323 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
324 | /* 1M ring buffer */ |
325 | @@ -301,9 +307,6 @@ int r520_init(struct radeon_device *rdev) |
326 | r = radeon_fence_driver_init(rdev); |
327 | if (r) |
328 | return r; |
329 | - r = radeon_irq_kms_init(rdev); |
330 | - if (r) |
331 | - return r; |
332 | /* Memory manager */ |
333 | r = radeon_bo_init(rdev); |
334 | if (r) |
335 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
336 | index b1ff9cc..8c403d9 100644 |
337 | --- a/drivers/gpu/drm/radeon/r600.c |
338 | +++ b/drivers/gpu/drm/radeon/r600.c |
339 | @@ -2470,6 +2470,12 @@ int r600_startup(struct radeon_device *rdev) |
340 | } |
341 | |
342 | /* Enable IRQ */ |
343 | + if (!rdev->irq.installed) { |
344 | + r = radeon_irq_kms_init(rdev); |
345 | + if (r) |
346 | + return r; |
347 | + } |
348 | + |
349 | r = r600_irq_init(rdev); |
350 | if (r) { |
351 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
352 | @@ -2624,10 +2630,6 @@ int r600_init(struct radeon_device *rdev) |
353 | if (r) |
354 | return r; |
355 | |
356 | - r = radeon_irq_kms_init(rdev); |
357 | - if (r) |
358 | - return r; |
359 | - |
360 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
361 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
362 | |
363 | diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c |
364 | index 4cf381b..5099bd3 100644 |
365 | --- a/drivers/gpu/drm/radeon/rs400.c |
366 | +++ b/drivers/gpu/drm/radeon/rs400.c |
367 | @@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev) |
368 | } |
369 | |
370 | /* Enable IRQ */ |
371 | + if (!rdev->irq.installed) { |
372 | + r = radeon_irq_kms_init(rdev); |
373 | + if (r) |
374 | + return r; |
375 | + } |
376 | + |
377 | r100_irq_set(rdev); |
378 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
379 | /* 1M ring buffer */ |
380 | @@ -541,9 +547,6 @@ int rs400_init(struct radeon_device *rdev) |
381 | r = radeon_fence_driver_init(rdev); |
382 | if (r) |
383 | return r; |
384 | - r = radeon_irq_kms_init(rdev); |
385 | - if (r) |
386 | - return r; |
387 | /* Memory manager */ |
388 | r = radeon_bo_init(rdev); |
389 | if (r) |
390 | diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c |
391 | index d25cf86..5248001 100644 |
392 | --- a/drivers/gpu/drm/radeon/rs600.c |
393 | +++ b/drivers/gpu/drm/radeon/rs600.c |
394 | @@ -864,6 +864,12 @@ static int rs600_startup(struct radeon_device *rdev) |
395 | } |
396 | |
397 | /* Enable IRQ */ |
398 | + if (!rdev->irq.installed) { |
399 | + r = radeon_irq_kms_init(rdev); |
400 | + if (r) |
401 | + return r; |
402 | + } |
403 | + |
404 | rs600_irq_set(rdev); |
405 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
406 | /* 1M ring buffer */ |
407 | @@ -994,9 +1000,6 @@ int rs600_init(struct radeon_device *rdev) |
408 | r = radeon_fence_driver_init(rdev); |
409 | if (r) |
410 | return r; |
411 | - r = radeon_irq_kms_init(rdev); |
412 | - if (r) |
413 | - return r; |
414 | /* Memory manager */ |
415 | r = radeon_bo_init(rdev); |
416 | if (r) |
417 | diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c |
418 | index f2c3b9d..c46900c 100644 |
419 | --- a/drivers/gpu/drm/radeon/rs690.c |
420 | +++ b/drivers/gpu/drm/radeon/rs690.c |
421 | @@ -628,6 +628,12 @@ static int rs690_startup(struct radeon_device *rdev) |
422 | } |
423 | |
424 | /* Enable IRQ */ |
425 | + if (!rdev->irq.installed) { |
426 | + r = radeon_irq_kms_init(rdev); |
427 | + if (r) |
428 | + return r; |
429 | + } |
430 | + |
431 | rs600_irq_set(rdev); |
432 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
433 | /* 1M ring buffer */ |
434 | @@ -759,9 +765,6 @@ int rs690_init(struct radeon_device *rdev) |
435 | r = radeon_fence_driver_init(rdev); |
436 | if (r) |
437 | return r; |
438 | - r = radeon_irq_kms_init(rdev); |
439 | - if (r) |
440 | - return r; |
441 | /* Memory manager */ |
442 | r = radeon_bo_init(rdev); |
443 | if (r) |
444 | diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c |
445 | index 43af363..0532bbe 100644 |
446 | --- a/drivers/gpu/drm/radeon/rv515.c |
447 | +++ b/drivers/gpu/drm/radeon/rv515.c |
448 | @@ -386,6 +386,12 @@ static int rv515_startup(struct radeon_device *rdev) |
449 | } |
450 | |
451 | /* Enable IRQ */ |
452 | + if (!rdev->irq.installed) { |
453 | + r = radeon_irq_kms_init(rdev); |
454 | + if (r) |
455 | + return r; |
456 | + } |
457 | + |
458 | rs600_irq_set(rdev); |
459 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
460 | /* 1M ring buffer */ |
461 | @@ -520,9 +526,6 @@ int rv515_init(struct radeon_device *rdev) |
462 | r = radeon_fence_driver_init(rdev); |
463 | if (r) |
464 | return r; |
465 | - r = radeon_irq_kms_init(rdev); |
466 | - if (r) |
467 | - return r; |
468 | /* Memory manager */ |
469 | r = radeon_bo_init(rdev); |
470 | if (r) |
471 | diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c |
472 | index 591040b..4a3937f 100644 |
473 | --- a/drivers/gpu/drm/radeon/rv770.c |
474 | +++ b/drivers/gpu/drm/radeon/rv770.c |
475 | @@ -1099,6 +1099,12 @@ static int rv770_startup(struct radeon_device *rdev) |
476 | } |
477 | |
478 | /* Enable IRQ */ |
479 | + if (!rdev->irq.installed) { |
480 | + r = radeon_irq_kms_init(rdev); |
481 | + if (r) |
482 | + return r; |
483 | + } |
484 | + |
485 | r = r600_irq_init(rdev); |
486 | if (r) { |
487 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
488 | @@ -1237,10 +1243,6 @@ int rv770_init(struct radeon_device *rdev) |
489 | if (r) |
490 | return r; |
491 | |
492 | - r = radeon_irq_kms_init(rdev); |
493 | - if (r) |
494 | - return r; |
495 | - |
496 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
497 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
498 | |
499 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c |
500 | index 2dbd585..e22b460 100644 |
501 | --- a/drivers/gpu/drm/radeon/si.c |
502 | +++ b/drivers/gpu/drm/radeon/si.c |
503 | @@ -3876,6 +3876,12 @@ static int si_startup(struct radeon_device *rdev) |
504 | } |
505 | |
506 | /* Enable IRQ */ |
507 | + if (!rdev->irq.installed) { |
508 | + r = radeon_irq_kms_init(rdev); |
509 | + if (r) |
510 | + return r; |
511 | + } |
512 | + |
513 | r = si_irq_init(rdev); |
514 | if (r) { |
515 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
516 | @@ -4044,10 +4050,6 @@ int si_init(struct radeon_device *rdev) |
517 | if (r) |
518 | return r; |
519 | |
520 | - r = radeon_irq_kms_init(rdev); |
521 | - if (r) |
522 | - return r; |
523 | - |
524 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
525 | ring->ring_obj = NULL; |
526 | r600_ring_init(rdev, ring, 1024 * 1024); |
527 | diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c |
528 | index 4394e7e..5653461 100644 |
529 | --- a/drivers/hwmon/adm1021.c |
530 | +++ b/drivers/hwmon/adm1021.c |
531 | @@ -332,26 +332,68 @@ static int adm1021_detect(struct i2c_client *client, |
532 | man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID); |
533 | dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID); |
534 | |
535 | + if (man_id < 0 || dev_id < 0) |
536 | + return -ENODEV; |
537 | + |
538 | if (man_id == 0x4d && dev_id == 0x01) |
539 | type_name = "max1617a"; |
540 | else if (man_id == 0x41) { |
541 | if ((dev_id & 0xF0) == 0x30) |
542 | type_name = "adm1023"; |
543 | - else |
544 | + else if ((dev_id & 0xF0) == 0x00) |
545 | type_name = "adm1021"; |
546 | + else |
547 | + return -ENODEV; |
548 | } else if (man_id == 0x49) |
549 | type_name = "thmc10"; |
550 | else if (man_id == 0x23) |
551 | type_name = "gl523sm"; |
552 | else if (man_id == 0x54) |
553 | type_name = "mc1066"; |
554 | - /* LM84 Mfr ID in a different place, and it has more unused bits */ |
555 | - else if (conv_rate == 0x00 |
556 | - && (config & 0x7F) == 0x00 |
557 | - && (status & 0xAB) == 0x00) |
558 | - type_name = "lm84"; |
559 | - else |
560 | - type_name = "max1617"; |
561 | + else { |
562 | + int lte, rte, lhi, rhi, llo, rlo; |
563 | + |
564 | + /* extra checks for LM84 and MAX1617 to avoid misdetections */ |
565 | + |
566 | + llo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(0)); |
567 | + rlo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(1)); |
568 | + |
569 | + /* fail if any of the additional register reads failed */ |
570 | + if (llo < 0 || rlo < 0) |
571 | + return -ENODEV; |
572 | + |
573 | + lte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(0)); |
574 | + rte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(1)); |
575 | + lhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(0)); |
576 | + rhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(1)); |
577 | + |
578 | + /* |
579 | + * Fail for negative temperatures and negative high limits. |
580 | + * This check also catches read errors on the tested registers. |
581 | + */ |
582 | + if ((s8)lte < 0 || (s8)rte < 0 || (s8)lhi < 0 || (s8)rhi < 0) |
583 | + return -ENODEV; |
584 | + |
585 | + /* fail if all registers hold the same value */ |
586 | + if (lte == rte && lte == lhi && lte == rhi && lte == llo |
587 | + && lte == rlo) |
588 | + return -ENODEV; |
589 | + |
590 | + /* |
591 | + * LM84 Mfr ID is in a different place, |
592 | + * and it has more unused bits. |
593 | + */ |
594 | + if (conv_rate == 0x00 |
595 | + && (config & 0x7F) == 0x00 |
596 | + && (status & 0xAB) == 0x00) { |
597 | + type_name = "lm84"; |
598 | + } else { |
599 | + /* fail if low limits are larger than high limits */ |
600 | + if ((s8)llo > lhi || (s8)rlo > rhi) |
601 | + return -ENODEV; |
602 | + type_name = "max1617"; |
603 | + } |
604 | + } |
605 | |
606 | pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n", |
607 | type_name, i2c_adapter_id(adapter), client->addr); |
608 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
609 | index 14d2d71..a60679c 100644 |
610 | --- a/drivers/usb/host/ehci-sched.c |
611 | +++ b/drivers/usb/host/ehci-sched.c |
612 | @@ -236,7 +236,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask) |
613 | } |
614 | |
615 | static const unsigned char |
616 | -max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 }; |
617 | +max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 }; |
618 | |
619 | /* carryover low/fullspeed bandwidth that crosses uframe boundries */ |
620 | static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) |
621 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
622 | index f059222..5080b1d 100644 |
623 | --- a/drivers/usb/host/xhci-mem.c |
624 | +++ b/drivers/usb/host/xhci-mem.c |
625 | @@ -1845,6 +1845,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) |
626 | } |
627 | spin_unlock_irqrestore(&xhci->lock, flags); |
628 | |
629 | + if (!xhci->rh_bw) |
630 | + goto no_bw; |
631 | + |
632 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
633 | for (i = 0; i < num_ports; i++) { |
634 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; |
635 | @@ -1863,6 +1866,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) |
636 | } |
637 | } |
638 | |
639 | +no_bw: |
640 | xhci->num_usb2_ports = 0; |
641 | xhci->num_usb3_ports = 0; |
642 | xhci->num_active_eps = 0; |
643 | @@ -2274,6 +2278,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) |
644 | u32 page_size, temp; |
645 | int i; |
646 | |
647 | + INIT_LIST_HEAD(&xhci->lpm_failed_devs); |
648 | + INIT_LIST_HEAD(&xhci->cancel_cmd_list); |
649 | + |
650 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); |
651 | xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); |
652 | for (i = 0; i < 16; i++) { |
653 | @@ -2352,7 +2359,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) |
654 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); |
655 | if (!xhci->cmd_ring) |
656 | goto fail; |
657 | - INIT_LIST_HEAD(&xhci->cancel_cmd_list); |
658 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); |
659 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", |
660 | (unsigned long long)xhci->cmd_ring->first_seg->dma); |
661 | @@ -2453,8 +2459,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) |
662 | if (xhci_setup_port_arrays(xhci, flags)) |
663 | goto fail; |
664 | |
665 | - INIT_LIST_HEAD(&xhci->lpm_failed_devs); |
666 | - |
667 | /* Enable USB 3.0 device notifications for function remote wake, which |
668 | * is necessary for allowing USB 3.0 devices to do remote wakeup from |
669 | * U3 (device suspend). |
670 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
671 | index ec2c89f..0f928b3 100644 |
672 | --- a/drivers/usb/host/xhci.c |
673 | +++ b/drivers/usb/host/xhci.c |
674 | @@ -947,6 +947,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
675 | struct usb_hcd *hcd = xhci_to_hcd(xhci); |
676 | struct usb_hcd *secondary_hcd; |
677 | int retval = 0; |
678 | + bool comp_timer_running = false; |
679 | |
680 | /* Wait a bit if either of the roothubs need to settle from the |
681 | * transition into bus suspend. |
682 | @@ -984,6 +985,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
683 | |
684 | /* If restore operation fails, re-initialize the HC during resume */ |
685 | if ((temp & STS_SRE) || hibernated) { |
686 | + |
687 | + if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && |
688 | + !(xhci_all_ports_seen_u0(xhci))) { |
689 | + del_timer_sync(&xhci->comp_mode_recovery_timer); |
690 | + xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n"); |
691 | + } |
692 | + |
693 | /* Let the USB core know _both_ roothubs lost power. */ |
694 | usb_root_hub_lost_power(xhci->main_hcd->self.root_hub); |
695 | usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub); |
696 | @@ -1026,6 +1034,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
697 | retval = xhci_init(hcd->primary_hcd); |
698 | if (retval) |
699 | return retval; |
700 | + comp_timer_running = true; |
701 | + |
702 | xhci_dbg(xhci, "Start the primary HCD\n"); |
703 | retval = xhci_run(hcd->primary_hcd); |
704 | if (!retval) { |
705 | @@ -1067,7 +1077,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
706 | * to suffer the Compliance Mode issue again. It doesn't matter if |
707 | * ports have entered previously to U0 before system's suspension. |
708 | */ |
709 | - if (xhci->quirks & XHCI_COMP_MODE_QUIRK) |
710 | + if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running) |
711 | compliance_mode_recovery_timer_init(xhci); |
712 | |
713 | /* Re-enable port polling. */ |
714 | diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c |
715 | index f99f471..31bfe60 100644 |
716 | --- a/drivers/usb/serial/ark3116.c |
717 | +++ b/drivers/usb/serial/ark3116.c |
718 | @@ -49,7 +49,7 @@ static bool debug; |
719 | #define DRIVER_NAME "ark3116" |
720 | |
721 | /* usb timeout of 1 second */ |
722 | -#define ARK_TIMEOUT (1*HZ) |
723 | +#define ARK_TIMEOUT 1000 |
724 | |
725 | static const struct usb_device_id id_table[] = { |
726 | { USB_DEVICE(0x6547, 0x0232) }, |
727 | diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c |
728 | index afc886c..270bda8 100644 |
729 | --- a/drivers/usb/serial/cypress_m8.c |
730 | +++ b/drivers/usb/serial/cypress_m8.c |
731 | @@ -70,6 +70,7 @@ static const struct usb_device_id id_table_earthmate[] = { |
732 | static const struct usb_device_id id_table_cyphidcomrs232[] = { |
733 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
734 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, |
735 | + { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, |
736 | { } /* Terminating entry */ |
737 | }; |
738 | |
739 | @@ -83,6 +84,7 @@ static const struct usb_device_id id_table_combined[] = { |
740 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, |
741 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
742 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, |
743 | + { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, |
744 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, |
745 | { } /* Terminating entry */ |
746 | }; |
747 | @@ -243,6 +245,12 @@ static struct usb_serial_driver * const serial_drivers[] = { |
748 | * Cypress serial helper functions |
749 | *****************************************************************************/ |
750 | |
751 | +/* FRWD Dongle hidcom needs to skip reset and speed checks */ |
752 | +static inline bool is_frwd(struct usb_device *dev) |
753 | +{ |
754 | + return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) && |
755 | + (le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD)); |
756 | +} |
757 | |
758 | static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) |
759 | { |
760 | @@ -252,6 +260,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) |
761 | if (unstable_bauds) |
762 | return new_rate; |
763 | |
764 | + /* FRWD Dongle uses 115200 bps */ |
765 | + if (is_frwd(port->serial->dev)) |
766 | + return new_rate; |
767 | + |
768 | /* |
769 | * The general purpose firmware for the Cypress M8 allows for |
770 | * a maximum speed of 57600bps (I have no idea whether DeLorme |
771 | @@ -465,7 +477,11 @@ static int generic_startup(struct usb_serial *serial) |
772 | } |
773 | init_waitqueue_head(&priv->delta_msr_wait); |
774 | |
775 | - usb_reset_configuration(serial->dev); |
776 | + /* Skip reset for FRWD device. It is a workaound: |
777 | + device hangs if it receives SET_CONFIGURE in Configured |
778 | + state. */ |
779 | + if (!is_frwd(serial->dev)) |
780 | + usb_reset_configuration(serial->dev); |
781 | |
782 | priv->cmd_ctrl = 0; |
783 | priv->line_control = 0; |
784 | diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h |
785 | index 67cf608..b461311 100644 |
786 | --- a/drivers/usb/serial/cypress_m8.h |
787 | +++ b/drivers/usb/serial/cypress_m8.h |
788 | @@ -24,6 +24,10 @@ |
789 | #define VENDOR_ID_CYPRESS 0x04b4 |
790 | #define PRODUCT_ID_CYPHIDCOM 0x5500 |
791 | |
792 | +/* FRWD Dongle - a GPS sports watch */ |
793 | +#define VENDOR_ID_FRWD 0x6737 |
794 | +#define PRODUCT_ID_CYPHIDCOM_FRWD 0x0001 |
795 | + |
796 | /* Powercom UPS, chip CY7C63723 */ |
797 | #define VENDOR_ID_POWERCOM 0x0d9f |
798 | #define PRODUCT_ID_UPS 0x0002 |
799 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
800 | index c6f8e62..f8a9cd7 100644 |
801 | --- a/drivers/usb/serial/ftdi_sio.c |
802 | +++ b/drivers/usb/serial/ftdi_sio.c |
803 | @@ -2173,7 +2173,7 @@ static void ftdi_set_termios(struct tty_struct *tty, |
804 | |
805 | cflag = termios->c_cflag; |
806 | |
807 | - if (old_termios == 0) |
808 | + if (!old_termios) |
809 | goto no_skip; |
810 | |
811 | if (old_termios->c_cflag == termios->c_cflag |
812 | diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c |
813 | index f2192d5..53c639c 100644 |
814 | --- a/drivers/usb/serial/iuu_phoenix.c |
815 | +++ b/drivers/usb/serial/iuu_phoenix.c |
816 | @@ -326,7 +326,7 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count) |
817 | usb_bulk_msg(serial->dev, |
818 | usb_sndbulkpipe(serial->dev, |
819 | port->bulk_out_endpointAddress), buf, |
820 | - count, &actual, HZ * 1); |
821 | + count, &actual, 1000); |
822 | |
823 | if (status != IUU_OPERATION_OK) |
824 | dbg("%s - error = %2x", __func__, status); |
825 | @@ -349,7 +349,7 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count) |
826 | usb_bulk_msg(serial->dev, |
827 | usb_rcvbulkpipe(serial->dev, |
828 | port->bulk_in_endpointAddress), buf, |
829 | - count, &actual, HZ * 1); |
830 | + count, &actual, 1000); |
831 | |
832 | if (status != IUU_OPERATION_OK) |
833 | dbg("%s - error = %2x", __func__, status); |
834 | diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c |
835 | index a39ddd1..253bff6 100644 |
836 | --- a/drivers/usb/serial/keyspan.c |
837 | +++ b/drivers/usb/serial/keyspan.c |
838 | @@ -1705,7 +1705,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial, |
839 | d_details = s_priv->device_details; |
840 | device_port = port->number - port->serial->minor; |
841 | |
842 | - outcont_urb = d_details->outcont_endpoints[port->number]; |
843 | + outcont_urb = d_details->outcont_endpoints[device_port]; |
844 | this_urb = p_priv->outcont_urb; |
845 | |
846 | dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe)); |
847 | diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c |
848 | index bdce820..77d974d 100644 |
849 | --- a/drivers/usb/serial/mos7720.c |
850 | +++ b/drivers/usb/serial/mos7720.c |
851 | @@ -44,7 +44,7 @@ |
852 | #define DRIVER_DESC "Moschip USB Serial Driver" |
853 | |
854 | /* default urb timeout */ |
855 | -#define MOS_WDR_TIMEOUT (HZ * 5) |
856 | +#define MOS_WDR_TIMEOUT 5000 |
857 | |
858 | #define MOS_MAX_PORT 0x02 |
859 | #define MOS_WRITE 0x0E |
860 | @@ -234,11 +234,22 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum, |
861 | __u8 requesttype = (__u8)0xc0; |
862 | __u16 index = get_reg_index(reg); |
863 | __u16 value = get_reg_value(reg, serial_portnum); |
864 | - int status = usb_control_msg(usbdev, pipe, request, requesttype, value, |
865 | - index, data, 1, MOS_WDR_TIMEOUT); |
866 | - if (status < 0) |
867 | + u8 *buf; |
868 | + int status; |
869 | + |
870 | + buf = kmalloc(1, GFP_KERNEL); |
871 | + if (!buf) |
872 | + return -ENOMEM; |
873 | + |
874 | + status = usb_control_msg(usbdev, pipe, request, requesttype, value, |
875 | + index, buf, 1, MOS_WDR_TIMEOUT); |
876 | + if (status == 1) |
877 | + *data = *buf; |
878 | + else if (status < 0) |
879 | dev_err(&usbdev->dev, |
880 | "mos7720: usb_control_msg() failed: %d", status); |
881 | + kfree(buf); |
882 | + |
883 | return status; |
884 | } |
885 | |
886 | @@ -1690,7 +1701,7 @@ static void change_port_settings(struct tty_struct *tty, |
887 | mos7720_port->shadowMCR |= (UART_MCR_XONANY); |
888 | /* To set hardware flow control to the specified * |
889 | * serial port, in SP1/2_CONTROL_REG */ |
890 | - if (port->number) |
891 | + if (port_number) |
892 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01); |
893 | else |
894 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); |
895 | @@ -2094,7 +2105,7 @@ static int mos7720_startup(struct usb_serial *serial) |
896 | |
897 | /* setting configuration feature to one */ |
898 | usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), |
899 | - (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ); |
900 | + (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000); |
901 | |
902 | /* start the interrupt urb */ |
903 | ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL); |
904 | @@ -2139,7 +2150,7 @@ static void mos7720_release(struct usb_serial *serial) |
905 | /* wait for synchronous usb calls to return */ |
906 | if (mos_parport->msg_pending) |
907 | wait_for_completion_timeout(&mos_parport->syncmsg_compl, |
908 | - MOS_WDR_TIMEOUT); |
909 | + msecs_to_jiffies(MOS_WDR_TIMEOUT)); |
910 | |
911 | parport_remove_port(mos_parport->pp); |
912 | usb_set_serial_data(serial, NULL); |
913 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
914 | index 386b3ab..5b24260 100644 |
915 | --- a/drivers/usb/serial/option.c |
916 | +++ b/drivers/usb/serial/option.c |
917 | @@ -593,6 +593,8 @@ static const struct usb_device_id option_ids[] = { |
918 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
919 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), |
920 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
921 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff), /* Huawei E1820 */ |
922 | + .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, |
923 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff), |
924 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
925 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) }, |
926 | diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c |
927 | index 71d6964..b3afd19 100644 |
928 | --- a/drivers/usb/serial/visor.c |
929 | +++ b/drivers/usb/serial/visor.c |
930 | @@ -596,10 +596,19 @@ static int treo_attach(struct usb_serial *serial) |
931 | */ |
932 | #define COPY_PORT(dest, src) \ |
933 | do { \ |
934 | + int i; \ |
935 | + \ |
936 | + for (i = 0; i < ARRAY_SIZE(src->read_urbs); ++i) { \ |
937 | + dest->read_urbs[i] = src->read_urbs[i]; \ |
938 | + dest->read_urbs[i]->context = dest; \ |
939 | + dest->bulk_in_buffers[i] = src->bulk_in_buffers[i]; \ |
940 | + } \ |
941 | dest->read_urb = src->read_urb; \ |
942 | dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\ |
943 | dest->bulk_in_buffer = src->bulk_in_buffer; \ |
944 | + dest->bulk_in_size = src->bulk_in_size; \ |
945 | dest->interrupt_in_urb = src->interrupt_in_urb; \ |
946 | + dest->interrupt_in_urb->context = dest; \ |
947 | dest->interrupt_in_endpointAddress = \ |
948 | src->interrupt_in_endpointAddress;\ |
949 | dest->interrupt_in_buffer = src->interrupt_in_buffer; \ |
950 | diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c |
951 | index 171226a..0d06d7c 100644 |
952 | --- a/drivers/usb/serial/whiteheat.c |
953 | +++ b/drivers/usb/serial/whiteheat.c |
954 | @@ -1154,7 +1154,7 @@ static void firm_setup_port(struct tty_struct *tty) |
955 | struct whiteheat_port_settings port_settings; |
956 | unsigned int cflag = tty->termios->c_cflag; |
957 | |
958 | - port_settings.port = port->number + 1; |
959 | + port_settings.port = port->number - port->serial->minor + 1; |
960 | |
961 | /* get the byte size */ |
962 | switch (cflag & CSIZE) { |
963 | diff --git a/drivers/xen/xen-pciback/pciback_ops.c b/drivers/xen/xen-pciback/pciback_ops.c |
964 | index b6df20a..d52703c 100644 |
965 | --- a/drivers/xen/xen-pciback/pciback_ops.c |
966 | +++ b/drivers/xen/xen-pciback/pciback_ops.c |
967 | @@ -9,6 +9,8 @@ |
968 | #include <xen/events.h> |
969 | #include <linux/sched.h> |
970 | #include "pciback.h" |
971 | +#include <linux/ratelimit.h> |
972 | +#include <linux/printk.h> |
973 | |
974 | int verbose_request; |
975 | module_param(verbose_request, int, 0644); |
976 | @@ -136,7 +138,6 @@ int xen_pcibk_enable_msi(struct xen_pcibk_device *pdev, |
977 | struct pci_dev *dev, struct xen_pci_op *op) |
978 | { |
979 | struct xen_pcibk_dev_data *dev_data; |
980 | - int otherend = pdev->xdev->otherend_id; |
981 | int status; |
982 | |
983 | if (unlikely(verbose_request)) |
984 | @@ -145,8 +146,9 @@ int xen_pcibk_enable_msi(struct xen_pcibk_device *pdev, |
985 | status = pci_enable_msi(dev); |
986 | |
987 | if (status) { |
988 | - printk(KERN_ERR "error enable msi for guest %x status %x\n", |
989 | - otherend, status); |
990 | + pr_warn_ratelimited(DRV_NAME ": %s: error enabling MSI for guest %u: err %d\n", |
991 | + pci_name(dev), pdev->xdev->otherend_id, |
992 | + status); |
993 | op->value = 0; |
994 | return XEN_PCI_ERR_op_failed; |
995 | } |
996 | @@ -224,10 +226,10 @@ int xen_pcibk_enable_msix(struct xen_pcibk_device *pdev, |
997 | pci_name(dev), i, |
998 | op->msix_entries[i].vector); |
999 | } |
1000 | - } else { |
1001 | - printk(KERN_WARNING DRV_NAME ": %s: failed to enable MSI-X: err %d!\n", |
1002 | - pci_name(dev), result); |
1003 | - } |
1004 | + } else |
1005 | + pr_warn_ratelimited(DRV_NAME ": %s: error enabling MSI-X for guest %u: err %d!\n", |
1006 | + pci_name(dev), pdev->xdev->otherend_id, |
1007 | + result); |
1008 | kfree(entries); |
1009 | |
1010 | op->value = result; |
1011 | diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h |
1012 | index 72a6cab..f80ca4a 100644 |
1013 | --- a/include/linux/ftrace.h |
1014 | +++ b/include/linux/ftrace.h |
1015 | @@ -299,7 +299,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf, |
1016 | size_t cnt, loff_t *ppos); |
1017 | ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf, |
1018 | size_t cnt, loff_t *ppos); |
1019 | -loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int origin); |
1020 | int ftrace_regex_release(struct inode *inode, struct file *file); |
1021 | |
1022 | void __init |
1023 | @@ -420,6 +419,8 @@ static inline int |
1024 | ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } |
1025 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
1026 | |
1027 | +loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); |
1028 | + |
1029 | /* totally disable ftrace - can not re-enable after this */ |
1030 | void ftrace_kill(void); |
1031 | |
1032 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
1033 | index c962d31..e101cf9 100644 |
1034 | --- a/kernel/trace/ftrace.c |
1035 | +++ b/kernel/trace/ftrace.c |
1036 | @@ -999,6 +999,19 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer) |
1037 | |
1038 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; |
1039 | |
1040 | +loff_t |
1041 | +ftrace_filter_lseek(struct file *file, loff_t offset, int whence) |
1042 | +{ |
1043 | + loff_t ret; |
1044 | + |
1045 | + if (file->f_mode & FMODE_READ) |
1046 | + ret = seq_lseek(file, offset, whence); |
1047 | + else |
1048 | + file->f_pos = ret = 1; |
1049 | + |
1050 | + return ret; |
1051 | +} |
1052 | + |
1053 | #ifdef CONFIG_DYNAMIC_FTRACE |
1054 | |
1055 | #ifndef CONFIG_FTRACE_MCOUNT_RECORD |
1056 | @@ -2541,7 +2554,7 @@ static void ftrace_filter_reset(struct ftrace_hash *hash) |
1057 | * routine, you can use ftrace_filter_write() for the write |
1058 | * routine if @flag has FTRACE_ITER_FILTER set, or |
1059 | * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set. |
1060 | - * ftrace_regex_lseek() should be used as the lseek routine, and |
1061 | + * ftrace_filter_lseek() should be used as the lseek routine, and |
1062 | * release must call ftrace_regex_release(). |
1063 | */ |
1064 | int |
1065 | @@ -2625,19 +2638,6 @@ ftrace_notrace_open(struct inode *inode, struct file *file) |
1066 | inode, file); |
1067 | } |
1068 | |
1069 | -loff_t |
1070 | -ftrace_regex_lseek(struct file *file, loff_t offset, int origin) |
1071 | -{ |
1072 | - loff_t ret; |
1073 | - |
1074 | - if (file->f_mode & FMODE_READ) |
1075 | - ret = seq_lseek(file, offset, origin); |
1076 | - else |
1077 | - file->f_pos = ret = 1; |
1078 | - |
1079 | - return ret; |
1080 | -} |
1081 | - |
1082 | static int ftrace_match(char *str, char *regex, int len, int type) |
1083 | { |
1084 | int matched = 0; |
1085 | @@ -3445,7 +3445,7 @@ static const struct file_operations ftrace_filter_fops = { |
1086 | .open = ftrace_filter_open, |
1087 | .read = seq_read, |
1088 | .write = ftrace_filter_write, |
1089 | - .llseek = ftrace_regex_lseek, |
1090 | + .llseek = ftrace_filter_lseek, |
1091 | .release = ftrace_regex_release, |
1092 | }; |
1093 | |
1094 | @@ -3453,7 +3453,7 @@ static const struct file_operations ftrace_notrace_fops = { |
1095 | .open = ftrace_notrace_open, |
1096 | .read = seq_read, |
1097 | .write = ftrace_notrace_write, |
1098 | - .llseek = ftrace_regex_lseek, |
1099 | + .llseek = ftrace_filter_lseek, |
1100 | .release = ftrace_regex_release, |
1101 | }; |
1102 | |
1103 | @@ -3659,8 +3659,8 @@ static const struct file_operations ftrace_graph_fops = { |
1104 | .open = ftrace_graph_open, |
1105 | .read = seq_read, |
1106 | .write = ftrace_graph_write, |
1107 | + .llseek = ftrace_filter_lseek, |
1108 | .release = ftrace_graph_release, |
1109 | - .llseek = seq_lseek, |
1110 | }; |
1111 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
1112 | |
1113 | @@ -4261,7 +4261,7 @@ static const struct file_operations ftrace_pid_fops = { |
1114 | .open = ftrace_pid_open, |
1115 | .write = ftrace_pid_write, |
1116 | .read = seq_read, |
1117 | - .llseek = seq_lseek, |
1118 | + .llseek = ftrace_filter_lseek, |
1119 | .release = ftrace_pid_release, |
1120 | }; |
1121 | |
1122 | diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c |
1123 | index c70f6bf..8298997 100644 |
1124 | --- a/kernel/trace/trace_stack.c |
1125 | +++ b/kernel/trace/trace_stack.c |
1126 | @@ -384,7 +384,7 @@ static const struct file_operations stack_trace_filter_fops = { |
1127 | .open = stack_trace_filter_open, |
1128 | .read = seq_read, |
1129 | .write = ftrace_filter_write, |
1130 | - .llseek = ftrace_regex_lseek, |
1131 | + .llseek = ftrace_filter_lseek, |
1132 | .release = ftrace_regex_release, |
1133 | }; |
1134 | |
1135 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c |
1136 | index f008fc7..e075a67 100644 |
1137 | --- a/sound/usb/mixer.c |
1138 | +++ b/sound/usb/mixer.c |
1139 | @@ -822,6 +822,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, |
1140 | case USB_ID(0x046d, 0x0808): |
1141 | case USB_ID(0x046d, 0x0809): |
1142 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ |
1143 | + case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ |
1144 | case USB_ID(0x046d, 0x0991): |
1145 | /* Most audio usb devices lie about volume resolution. |
1146 | * Most Logitech webcams have res = 384. |
1147 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h |
1148 | index fa4c2f7..915bc2c 100644 |
1149 | --- a/sound/usb/quirks-table.h |
1150 | +++ b/sound/usb/quirks-table.h |
1151 | @@ -157,7 +157,13 @@ |
1152 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL |
1153 | }, |
1154 | { |
1155 | - USB_DEVICE(0x046d, 0x0990), |
1156 | + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | |
1157 | + USB_DEVICE_ID_MATCH_INT_CLASS | |
1158 | + USB_DEVICE_ID_MATCH_INT_SUBCLASS, |
1159 | + .idVendor = 0x046d, |
1160 | + .idProduct = 0x0990, |
1161 | + .bInterfaceClass = USB_CLASS_AUDIO, |
1162 | + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, |
1163 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
1164 | .vendor_name = "Logitech, Inc.", |
1165 | .product_name = "QuickCam Pro 9000", |
1166 | @@ -1622,7 +1628,11 @@ YAMAHA_DEVICE(0x7010, "UB99"), |
1167 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), |
1168 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
1169 | .ifnum = 0, |
1170 | - .type = QUIRK_MIDI_STANDARD_INTERFACE |
1171 | + .type = QUIRK_MIDI_FIXED_ENDPOINT, |
1172 | + .data = & (const struct snd_usb_midi_endpoint_info) { |
1173 | + .out_cables = 0x0007, |
1174 | + .in_cables = 0x0007 |
1175 | + } |
1176 | } |
1177 | }, |
1178 | { |