Contents of /trunk/kernel-magellan/patches-3.11/0107-3.11.8-all-fixes.patch
Parent Directory | Revision Log
Revision 2318 -
(show annotations)
(download)
Mon Nov 18 11:55:33 2013 UTC (10 years, 10 months ago) by niro
File size: 125922 byte(s)
Mon Nov 18 11:55:33 2013 UTC (10 years, 10 months ago) by niro
File size: 125922 byte(s)
-linux-3.11.8
1 | diff --git a/Makefile b/Makefile |
2 | index 686adf7f2035..7521adbea135 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 11 |
8 | -SUBLEVEL = 7 |
9 | +SUBLEVEL = 8 |
10 | EXTRAVERSION = |
11 | NAME = Linux for Workgroups |
12 | |
13 | diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c |
14 | index 0fd1f0d515ff..da7764b5136d 100644 |
15 | --- a/arch/arc/mm/fault.c |
16 | +++ b/arch/arc/mm/fault.c |
17 | @@ -17,7 +17,7 @@ |
18 | #include <asm/pgalloc.h> |
19 | #include <asm/mmu.h> |
20 | |
21 | -static int handle_vmalloc_fault(struct mm_struct *mm, unsigned long address) |
22 | +static int handle_vmalloc_fault(unsigned long address) |
23 | { |
24 | /* |
25 | * Synchronize this task's top level page-table |
26 | @@ -27,7 +27,7 @@ static int handle_vmalloc_fault(struct mm_struct *mm, unsigned long address) |
27 | pud_t *pud, *pud_k; |
28 | pmd_t *pmd, *pmd_k; |
29 | |
30 | - pgd = pgd_offset_fast(mm, address); |
31 | + pgd = pgd_offset_fast(current->active_mm, address); |
32 | pgd_k = pgd_offset_k(address); |
33 | |
34 | if (!pgd_present(*pgd_k)) |
35 | @@ -73,7 +73,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address) |
36 | * nothing more. |
37 | */ |
38 | if (address >= VMALLOC_START && address <= VMALLOC_END) { |
39 | - ret = handle_vmalloc_fault(mm, address); |
40 | + ret = handle_vmalloc_fault(address); |
41 | if (unlikely(ret)) |
42 | goto bad_area_nosemaphore; |
43 | else |
44 | diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S |
45 | index 37aabd772fbb..d2d58258aea6 100644 |
46 | --- a/arch/parisc/kernel/head.S |
47 | +++ b/arch/parisc/kernel/head.S |
48 | @@ -195,6 +195,8 @@ common_stext: |
49 | ldw MEM_PDC_HI(%r0),%r6 |
50 | depd %r6, 31, 32, %r3 /* move to upper word */ |
51 | |
52 | + mfctl %cr30,%r6 /* PCX-W2 firmware bug */ |
53 | + |
54 | ldo PDC_PSW(%r0),%arg0 /* 21 */ |
55 | ldo PDC_PSW_SET_DEFAULTS(%r0),%arg1 /* 2 */ |
56 | ldo PDC_PSW_WIDE_BIT(%r0),%arg2 /* 2 */ |
57 | @@ -203,6 +205,8 @@ common_stext: |
58 | copy %r0,%arg3 |
59 | |
60 | stext_pdc_ret: |
61 | + mtctl %r6,%cr30 /* restore task thread info */ |
62 | + |
63 | /* restore rfi target address*/ |
64 | ldd TI_TASK-THREAD_SZ_ALGN(%sp), %r10 |
65 | tophys_r1 %r10 |
66 | diff --git a/arch/um/kernel/exitcode.c b/arch/um/kernel/exitcode.c |
67 | index 829df49dee99..41ebbfebb333 100644 |
68 | --- a/arch/um/kernel/exitcode.c |
69 | +++ b/arch/um/kernel/exitcode.c |
70 | @@ -40,9 +40,11 @@ static ssize_t exitcode_proc_write(struct file *file, |
71 | const char __user *buffer, size_t count, loff_t *pos) |
72 | { |
73 | char *end, buf[sizeof("nnnnn\0")]; |
74 | + size_t size; |
75 | int tmp; |
76 | |
77 | - if (copy_from_user(buf, buffer, count)) |
78 | + size = min(count, sizeof(buf)); |
79 | + if (copy_from_user(buf, buffer, size)) |
80 | return -EFAULT; |
81 | |
82 | tmp = simple_strtol(buf, &end, 0); |
83 | diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c |
84 | index 1191ac1c9d25..a419814cea57 100644 |
85 | --- a/arch/x86/kernel/apic/x2apic_uv_x.c |
86 | +++ b/arch/x86/kernel/apic/x2apic_uv_x.c |
87 | @@ -113,7 +113,7 @@ static int __init early_get_pnodeid(void) |
88 | break; |
89 | case UV3_HUB_PART_NUMBER: |
90 | case UV3_HUB_PART_NUMBER_X: |
91 | - uv_min_hub_revision_id += UV3_HUB_REVISION_BASE - 1; |
92 | + uv_min_hub_revision_id += UV3_HUB_REVISION_BASE; |
93 | break; |
94 | } |
95 | |
96 | diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c |
97 | index 718eca1850bd..98b67d5f1514 100644 |
98 | --- a/arch/xtensa/kernel/signal.c |
99 | +++ b/arch/xtensa/kernel/signal.c |
100 | @@ -341,7 +341,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
101 | |
102 | sp = regs->areg[1]; |
103 | |
104 | - if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) { |
105 | + if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) { |
106 | sp = current->sas_ss_sp + current->sas_ss_size; |
107 | } |
108 | |
109 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c |
110 | index c69fcce505c0..370462fa8e01 100644 |
111 | --- a/drivers/ata/libata-eh.c |
112 | +++ b/drivers/ata/libata-eh.c |
113 | @@ -1322,14 +1322,14 @@ void ata_eh_qc_complete(struct ata_queued_cmd *qc) |
114 | * should be retried. To be used from EH. |
115 | * |
116 | * SCSI midlayer limits the number of retries to scmd->allowed. |
117 | - * scmd->retries is decremented for commands which get retried |
118 | + * scmd->allowed is incremented for commands which get retried |
119 | * due to unrelated failures (qc->err_mask is zero). |
120 | */ |
121 | void ata_eh_qc_retry(struct ata_queued_cmd *qc) |
122 | { |
123 | struct scsi_cmnd *scmd = qc->scsicmd; |
124 | - if (!qc->err_mask && scmd->retries) |
125 | - scmd->retries--; |
126 | + if (!qc->err_mask) |
127 | + scmd->allowed++; |
128 | __ata_eh_qc_complete(qc); |
129 | } |
130 | |
131 | diff --git a/drivers/clk/clk-nomadik.c b/drivers/clk/clk-nomadik.c |
132 | index 6d819a37f647..c9771cc85582 100644 |
133 | --- a/drivers/clk/clk-nomadik.c |
134 | +++ b/drivers/clk/clk-nomadik.c |
135 | @@ -27,6 +27,14 @@ |
136 | */ |
137 | |
138 | #define SRC_CR 0x00U |
139 | +#define SRC_CR_T0_ENSEL BIT(15) |
140 | +#define SRC_CR_T1_ENSEL BIT(17) |
141 | +#define SRC_CR_T2_ENSEL BIT(19) |
142 | +#define SRC_CR_T3_ENSEL BIT(21) |
143 | +#define SRC_CR_T4_ENSEL BIT(23) |
144 | +#define SRC_CR_T5_ENSEL BIT(25) |
145 | +#define SRC_CR_T6_ENSEL BIT(27) |
146 | +#define SRC_CR_T7_ENSEL BIT(29) |
147 | #define SRC_XTALCR 0x0CU |
148 | #define SRC_XTALCR_XTALTIMEN BIT(20) |
149 | #define SRC_XTALCR_SXTALDIS BIT(19) |
150 | @@ -543,6 +551,19 @@ void __init nomadik_clk_init(void) |
151 | __func__, np->name); |
152 | return; |
153 | } |
154 | + |
155 | + /* Set all timers to use the 2.4 MHz TIMCLK */ |
156 | + val = readl(src_base + SRC_CR); |
157 | + val |= SRC_CR_T0_ENSEL; |
158 | + val |= SRC_CR_T1_ENSEL; |
159 | + val |= SRC_CR_T2_ENSEL; |
160 | + val |= SRC_CR_T3_ENSEL; |
161 | + val |= SRC_CR_T4_ENSEL; |
162 | + val |= SRC_CR_T5_ENSEL; |
163 | + val |= SRC_CR_T6_ENSEL; |
164 | + val |= SRC_CR_T7_ENSEL; |
165 | + writel(val, src_base + SRC_CR); |
166 | + |
167 | val = readl(src_base + SRC_XTALCR); |
168 | pr_info("SXTALO is %s\n", |
169 | (val & SRC_XTALCR_SXTALDIS) ? "disabled" : "enabled"); |
170 | diff --git a/drivers/clk/versatile/clk-icst.c b/drivers/clk/versatile/clk-icst.c |
171 | index 67ccf4aa7277..f5e4c21b301f 100644 |
172 | --- a/drivers/clk/versatile/clk-icst.c |
173 | +++ b/drivers/clk/versatile/clk-icst.c |
174 | @@ -107,7 +107,7 @@ static int icst_set_rate(struct clk_hw *hw, unsigned long rate, |
175 | |
176 | vco = icst_hz_to_vco(icst->params, rate); |
177 | icst->rate = icst_hz(icst->params, vco); |
178 | - vco_set(icst->vcoreg, icst->lockreg, vco); |
179 | + vco_set(icst->lockreg, icst->vcoreg, vco); |
180 | return 0; |
181 | } |
182 | |
183 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
184 | index 7cde885011ed..e8c3db810359 100644 |
185 | --- a/drivers/cpufreq/intel_pstate.c |
186 | +++ b/drivers/cpufreq/intel_pstate.c |
187 | @@ -629,8 +629,8 @@ static int intel_pstate_cpu_exit(struct cpufreq_policy *policy) |
188 | |
189 | static int intel_pstate_cpu_init(struct cpufreq_policy *policy) |
190 | { |
191 | - int rc, min_pstate, max_pstate; |
192 | struct cpudata *cpu; |
193 | + int rc; |
194 | |
195 | rc = intel_pstate_init_cpu(policy->cpu); |
196 | if (rc) |
197 | @@ -644,9 +644,8 @@ static int intel_pstate_cpu_init(struct cpufreq_policy *policy) |
198 | else |
199 | policy->policy = CPUFREQ_POLICY_POWERSAVE; |
200 | |
201 | - intel_pstate_get_min_max(cpu, &min_pstate, &max_pstate); |
202 | - policy->min = min_pstate * 100000; |
203 | - policy->max = max_pstate * 100000; |
204 | + policy->min = cpu->pstate.min_pstate * 100000; |
205 | + policy->max = cpu->pstate.turbo_pstate * 100000; |
206 | |
207 | /* cpuinfo and default policy values */ |
208 | policy->cpuinfo.min_freq = cpu->pstate.min_pstate * 100000; |
209 | diff --git a/drivers/cpufreq/s3c64xx-cpufreq.c b/drivers/cpufreq/s3c64xx-cpufreq.c |
210 | index 13bb4bae64ee..4c5cae6c0758 100644 |
211 | --- a/drivers/cpufreq/s3c64xx-cpufreq.c |
212 | +++ b/drivers/cpufreq/s3c64xx-cpufreq.c |
213 | @@ -166,7 +166,7 @@ static void __init s3c64xx_cpufreq_config_regulator(void) |
214 | if (freq->frequency == CPUFREQ_ENTRY_INVALID) |
215 | continue; |
216 | |
217 | - dvfs = &s3c64xx_dvfs_table[freq->index]; |
218 | + dvfs = &s3c64xx_dvfs_table[freq->driver_data]; |
219 | found = 0; |
220 | |
221 | for (i = 0; i < count; i++) { |
222 | diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c |
223 | index 99fcd7c32ea2..6dd71735cab4 100644 |
224 | --- a/drivers/gpu/drm/drm_drv.c |
225 | +++ b/drivers/gpu/drm/drm_drv.c |
226 | @@ -407,9 +407,16 @@ long drm_ioctl(struct file *filp, |
227 | cmd = ioctl->cmd_drv; |
228 | } |
229 | else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) { |
230 | + u32 drv_size; |
231 | + |
232 | ioctl = &drm_ioctls[nr]; |
233 | - cmd = ioctl->cmd; |
234 | + |
235 | + drv_size = _IOC_SIZE(ioctl->cmd); |
236 | usize = asize = _IOC_SIZE(cmd); |
237 | + if (drv_size > asize) |
238 | + asize = drv_size; |
239 | + |
240 | + cmd = ioctl->cmd; |
241 | } else |
242 | goto err_i1; |
243 | |
244 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
245 | index 3acec8c48166..6aa6ebd53f48 100644 |
246 | --- a/drivers/gpu/drm/i915/intel_crt.c |
247 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
248 | @@ -84,8 +84,7 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder, |
249 | return true; |
250 | } |
251 | |
252 | -static void intel_crt_get_config(struct intel_encoder *encoder, |
253 | - struct intel_crtc_config *pipe_config) |
254 | +static unsigned int intel_crt_get_flags(struct intel_encoder *encoder) |
255 | { |
256 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
257 | struct intel_crt *crt = intel_encoder_to_crt(encoder); |
258 | @@ -103,7 +102,27 @@ static void intel_crt_get_config(struct intel_encoder *encoder, |
259 | else |
260 | flags |= DRM_MODE_FLAG_NVSYNC; |
261 | |
262 | - pipe_config->adjusted_mode.flags |= flags; |
263 | + return flags; |
264 | +} |
265 | + |
266 | +static void intel_crt_get_config(struct intel_encoder *encoder, |
267 | + struct intel_crtc_config *pipe_config) |
268 | +{ |
269 | + struct drm_device *dev = encoder->base.dev; |
270 | + |
271 | + pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder); |
272 | +} |
273 | + |
274 | +static void hsw_crt_get_config(struct intel_encoder *encoder, |
275 | + struct intel_crtc_config *pipe_config) |
276 | +{ |
277 | + intel_ddi_get_config(encoder, pipe_config); |
278 | + |
279 | + pipe_config->adjusted_mode.flags &= ~(DRM_MODE_FLAG_PHSYNC | |
280 | + DRM_MODE_FLAG_NHSYNC | |
281 | + DRM_MODE_FLAG_PVSYNC | |
282 | + DRM_MODE_FLAG_NVSYNC); |
283 | + pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder); |
284 | } |
285 | |
286 | /* Note: The caller is required to filter out dpms modes not supported by the |
287 | @@ -802,7 +821,10 @@ void intel_crt_init(struct drm_device *dev) |
288 | crt->base.compute_config = intel_crt_compute_config; |
289 | crt->base.disable = intel_disable_crt; |
290 | crt->base.enable = intel_enable_crt; |
291 | - crt->base.get_config = intel_crt_get_config; |
292 | + if (IS_HASWELL(dev)) |
293 | + crt->base.get_config = hsw_crt_get_config; |
294 | + else |
295 | + crt->base.get_config = intel_crt_get_config; |
296 | if (I915_HAS_HOTPLUG(dev)) |
297 | crt->base.hpd_pin = HPD_CRT; |
298 | if (HAS_DDI(dev)) |
299 | diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c |
300 | index b042ee5c4070..5a6368dc414c 100644 |
301 | --- a/drivers/gpu/drm/i915/intel_ddi.c |
302 | +++ b/drivers/gpu/drm/i915/intel_ddi.c |
303 | @@ -1261,8 +1261,8 @@ static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder) |
304 | intel_dp_check_link_status(intel_dp); |
305 | } |
306 | |
307 | -static void intel_ddi_get_config(struct intel_encoder *encoder, |
308 | - struct intel_crtc_config *pipe_config) |
309 | +void intel_ddi_get_config(struct intel_encoder *encoder, |
310 | + struct intel_crtc_config *pipe_config) |
311 | { |
312 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
313 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); |
314 | @@ -1280,6 +1280,23 @@ static void intel_ddi_get_config(struct intel_encoder *encoder, |
315 | flags |= DRM_MODE_FLAG_NVSYNC; |
316 | |
317 | pipe_config->adjusted_mode.flags |= flags; |
318 | + |
319 | + switch (temp & TRANS_DDI_BPC_MASK) { |
320 | + case TRANS_DDI_BPC_6: |
321 | + pipe_config->pipe_bpp = 18; |
322 | + break; |
323 | + case TRANS_DDI_BPC_8: |
324 | + pipe_config->pipe_bpp = 24; |
325 | + break; |
326 | + case TRANS_DDI_BPC_10: |
327 | + pipe_config->pipe_bpp = 30; |
328 | + break; |
329 | + case TRANS_DDI_BPC_12: |
330 | + pipe_config->pipe_bpp = 36; |
331 | + break; |
332 | + default: |
333 | + break; |
334 | + } |
335 | } |
336 | |
337 | static void intel_ddi_destroy(struct drm_encoder *encoder) |
338 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
339 | index 90a7c1773a9a..ad2a258476da 100644 |
340 | --- a/drivers/gpu/drm/i915/intel_display.c |
341 | +++ b/drivers/gpu/drm/i915/intel_display.c |
342 | @@ -2251,9 +2251,10 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) |
343 | FDI_FE_ERRC_ENABLE); |
344 | } |
345 | |
346 | -static bool pipe_has_enabled_pch(struct intel_crtc *intel_crtc) |
347 | +static bool pipe_has_enabled_pch(struct intel_crtc *crtc) |
348 | { |
349 | - return intel_crtc->base.enabled && intel_crtc->config.has_pch_encoder; |
350 | + return crtc->base.enabled && crtc->active && |
351 | + crtc->config.has_pch_encoder; |
352 | } |
353 | |
354 | static void ivb_modeset_global_resources(struct drm_device *dev) |
355 | @@ -2901,6 +2902,48 @@ static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, |
356 | I915_READ(VSYNCSHIFT(cpu_transcoder))); |
357 | } |
358 | |
359 | +static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev) |
360 | +{ |
361 | + struct drm_i915_private *dev_priv = dev->dev_private; |
362 | + uint32_t temp; |
363 | + |
364 | + temp = I915_READ(SOUTH_CHICKEN1); |
365 | + if (temp & FDI_BC_BIFURCATION_SELECT) |
366 | + return; |
367 | + |
368 | + WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE); |
369 | + WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE); |
370 | + |
371 | + temp |= FDI_BC_BIFURCATION_SELECT; |
372 | + DRM_DEBUG_KMS("enabling fdi C rx\n"); |
373 | + I915_WRITE(SOUTH_CHICKEN1, temp); |
374 | + POSTING_READ(SOUTH_CHICKEN1); |
375 | +} |
376 | + |
377 | +static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc) |
378 | +{ |
379 | + struct drm_device *dev = intel_crtc->base.dev; |
380 | + struct drm_i915_private *dev_priv = dev->dev_private; |
381 | + |
382 | + switch (intel_crtc->pipe) { |
383 | + case PIPE_A: |
384 | + break; |
385 | + case PIPE_B: |
386 | + if (intel_crtc->config.fdi_lanes > 2) |
387 | + WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT); |
388 | + else |
389 | + cpt_enable_fdi_bc_bifurcation(dev); |
390 | + |
391 | + break; |
392 | + case PIPE_C: |
393 | + cpt_enable_fdi_bc_bifurcation(dev); |
394 | + |
395 | + break; |
396 | + default: |
397 | + BUG(); |
398 | + } |
399 | +} |
400 | + |
401 | /* |
402 | * Enable PCH resources required for PCH ports: |
403 | * - PCH PLLs |
404 | @@ -2919,6 +2962,9 @@ static void ironlake_pch_enable(struct drm_crtc *crtc) |
405 | |
406 | assert_pch_transcoder_disabled(dev_priv, pipe); |
407 | |
408 | + if (IS_IVYBRIDGE(dev)) |
409 | + ivybridge_update_fdi_bc_bifurcation(intel_crtc); |
410 | + |
411 | /* Write the TU size bits before fdi link training, so that error |
412 | * detection works. */ |
413 | I915_WRITE(FDI_RX_TUSIZE1(pipe), |
414 | @@ -4943,6 +4989,22 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc, |
415 | if (!(tmp & PIPECONF_ENABLE)) |
416 | return false; |
417 | |
418 | + if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) { |
419 | + switch (tmp & PIPECONF_BPC_MASK) { |
420 | + case PIPECONF_6BPC: |
421 | + pipe_config->pipe_bpp = 18; |
422 | + break; |
423 | + case PIPECONF_8BPC: |
424 | + pipe_config->pipe_bpp = 24; |
425 | + break; |
426 | + case PIPECONF_10BPC: |
427 | + pipe_config->pipe_bpp = 30; |
428 | + break; |
429 | + default: |
430 | + break; |
431 | + } |
432 | + } |
433 | + |
434 | intel_get_pipe_timings(crtc, pipe_config); |
435 | |
436 | i9xx_get_pfit_config(crtc, pipe_config); |
437 | @@ -5496,48 +5558,6 @@ static bool ironlake_compute_clocks(struct drm_crtc *crtc, |
438 | return true; |
439 | } |
440 | |
441 | -static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev) |
442 | -{ |
443 | - struct drm_i915_private *dev_priv = dev->dev_private; |
444 | - uint32_t temp; |
445 | - |
446 | - temp = I915_READ(SOUTH_CHICKEN1); |
447 | - if (temp & FDI_BC_BIFURCATION_SELECT) |
448 | - return; |
449 | - |
450 | - WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE); |
451 | - WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE); |
452 | - |
453 | - temp |= FDI_BC_BIFURCATION_SELECT; |
454 | - DRM_DEBUG_KMS("enabling fdi C rx\n"); |
455 | - I915_WRITE(SOUTH_CHICKEN1, temp); |
456 | - POSTING_READ(SOUTH_CHICKEN1); |
457 | -} |
458 | - |
459 | -static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc) |
460 | -{ |
461 | - struct drm_device *dev = intel_crtc->base.dev; |
462 | - struct drm_i915_private *dev_priv = dev->dev_private; |
463 | - |
464 | - switch (intel_crtc->pipe) { |
465 | - case PIPE_A: |
466 | - break; |
467 | - case PIPE_B: |
468 | - if (intel_crtc->config.fdi_lanes > 2) |
469 | - WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT); |
470 | - else |
471 | - cpt_enable_fdi_bc_bifurcation(dev); |
472 | - |
473 | - break; |
474 | - case PIPE_C: |
475 | - cpt_enable_fdi_bc_bifurcation(dev); |
476 | - |
477 | - break; |
478 | - default: |
479 | - BUG(); |
480 | - } |
481 | -} |
482 | - |
483 | int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp) |
484 | { |
485 | /* |
486 | @@ -5752,9 +5772,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, |
487 | &intel_crtc->config.fdi_m_n); |
488 | } |
489 | |
490 | - if (IS_IVYBRIDGE(dev)) |
491 | - ivybridge_update_fdi_bc_bifurcation(intel_crtc); |
492 | - |
493 | ironlake_set_pipeconf(crtc); |
494 | |
495 | /* Set up the display plane register */ |
496 | @@ -5821,6 +5838,23 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc, |
497 | if (!(tmp & PIPECONF_ENABLE)) |
498 | return false; |
499 | |
500 | + switch (tmp & PIPECONF_BPC_MASK) { |
501 | + case PIPECONF_6BPC: |
502 | + pipe_config->pipe_bpp = 18; |
503 | + break; |
504 | + case PIPECONF_8BPC: |
505 | + pipe_config->pipe_bpp = 24; |
506 | + break; |
507 | + case PIPECONF_10BPC: |
508 | + pipe_config->pipe_bpp = 30; |
509 | + break; |
510 | + case PIPECONF_12BPC: |
511 | + pipe_config->pipe_bpp = 36; |
512 | + break; |
513 | + default: |
514 | + break; |
515 | + } |
516 | + |
517 | if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) { |
518 | struct intel_shared_dpll *pll; |
519 | |
520 | @@ -8147,6 +8181,9 @@ intel_pipe_config_compare(struct drm_device *dev, |
521 | PIPE_CONF_CHECK_X(dpll_hw_state.fp0); |
522 | PIPE_CONF_CHECK_X(dpll_hw_state.fp1); |
523 | |
524 | + if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) |
525 | + PIPE_CONF_CHECK_I(pipe_bpp); |
526 | + |
527 | #undef PIPE_CONF_CHECK_X |
528 | #undef PIPE_CONF_CHECK_I |
529 | #undef PIPE_CONF_CHECK_FLAGS |
530 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
531 | index 3aed1fe0aa51..3a0f3a2d1666 100644 |
532 | --- a/drivers/gpu/drm/i915/intel_dp.c |
533 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
534 | @@ -276,29 +276,13 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq) |
535 | return status; |
536 | } |
537 | |
538 | -static int |
539 | -intel_dp_aux_ch(struct intel_dp *intel_dp, |
540 | - uint8_t *send, int send_bytes, |
541 | - uint8_t *recv, int recv_size) |
542 | +static uint32_t get_aux_clock_divider(struct intel_dp *intel_dp, |
543 | + int index) |
544 | { |
545 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
546 | struct drm_device *dev = intel_dig_port->base.base.dev; |
547 | struct drm_i915_private *dev_priv = dev->dev_private; |
548 | - uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg; |
549 | - uint32_t ch_data = ch_ctl + 4; |
550 | - int i, ret, recv_bytes; |
551 | - uint32_t status; |
552 | - uint32_t aux_clock_divider; |
553 | - int try, precharge; |
554 | - bool has_aux_irq = INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev); |
555 | |
556 | - /* dp aux is extremely sensitive to irq latency, hence request the |
557 | - * lowest possible wakeup latency and so prevent the cpu from going into |
558 | - * deep sleep states. |
559 | - */ |
560 | - pm_qos_update_request(&dev_priv->pm_qos, 0); |
561 | - |
562 | - intel_dp_check_edp(intel_dp); |
563 | /* The clock divider is based off the hrawclk, |
564 | * and would like to run at 2MHz. So, take the |
565 | * hrawclk value and divide by 2 and use that |
566 | @@ -307,23 +291,53 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, |
567 | * clock divider. |
568 | */ |
569 | if (IS_VALLEYVIEW(dev)) { |
570 | - aux_clock_divider = 100; |
571 | + return index ? 0 : 100; |
572 | } else if (intel_dig_port->port == PORT_A) { |
573 | + if (index) |
574 | + return 0; |
575 | if (HAS_DDI(dev)) |
576 | - aux_clock_divider = DIV_ROUND_CLOSEST( |
577 | - intel_ddi_get_cdclk_freq(dev_priv), 2000); |
578 | + return DIV_ROUND_CLOSEST(intel_ddi_get_cdclk_freq(dev_priv), 2000); |
579 | else if (IS_GEN6(dev) || IS_GEN7(dev)) |
580 | - aux_clock_divider = 200; /* SNB & IVB eDP input clock at 400Mhz */ |
581 | + return 200; /* SNB & IVB eDP input clock at 400Mhz */ |
582 | else |
583 | - aux_clock_divider = 225; /* eDP input clock at 450Mhz */ |
584 | + return 225; /* eDP input clock at 450Mhz */ |
585 | } else if (dev_priv->pch_id == INTEL_PCH_LPT_DEVICE_ID_TYPE) { |
586 | /* Workaround for non-ULT HSW */ |
587 | - aux_clock_divider = 74; |
588 | + switch (index) { |
589 | + case 0: return 63; |
590 | + case 1: return 72; |
591 | + default: return 0; |
592 | + } |
593 | } else if (HAS_PCH_SPLIT(dev)) { |
594 | - aux_clock_divider = DIV_ROUND_UP(intel_pch_rawclk(dev), 2); |
595 | + return index ? 0 : DIV_ROUND_UP(intel_pch_rawclk(dev), 2); |
596 | } else { |
597 | - aux_clock_divider = intel_hrawclk(dev) / 2; |
598 | + return index ? 0 :intel_hrawclk(dev) / 2; |
599 | } |
600 | +} |
601 | + |
602 | +static int |
603 | +intel_dp_aux_ch(struct intel_dp *intel_dp, |
604 | + uint8_t *send, int send_bytes, |
605 | + uint8_t *recv, int recv_size) |
606 | +{ |
607 | + struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
608 | + struct drm_device *dev = intel_dig_port->base.base.dev; |
609 | + struct drm_i915_private *dev_priv = dev->dev_private; |
610 | + uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg; |
611 | + uint32_t ch_data = ch_ctl + 4; |
612 | + uint32_t aux_clock_divider; |
613 | + int i, ret, recv_bytes; |
614 | + uint32_t status; |
615 | + int try, precharge, clock = 0; |
616 | + bool has_aux_irq = INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev); |
617 | + |
618 | + /* dp aux is extremely sensitive to irq latency, hence request the |
619 | + * lowest possible wakeup latency and so prevent the cpu from going into |
620 | + * deep sleep states. |
621 | + */ |
622 | + pm_qos_update_request(&dev_priv->pm_qos, 0); |
623 | + |
624 | + intel_dp_check_edp(intel_dp); |
625 | |
626 | if (IS_GEN6(dev)) |
627 | precharge = 3; |
628 | @@ -345,37 +359,41 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, |
629 | goto out; |
630 | } |
631 | |
632 | - /* Must try at least 3 times according to DP spec */ |
633 | - for (try = 0; try < 5; try++) { |
634 | - /* Load the send data into the aux channel data registers */ |
635 | - for (i = 0; i < send_bytes; i += 4) |
636 | - I915_WRITE(ch_data + i, |
637 | - pack_aux(send + i, send_bytes - i)); |
638 | - |
639 | - /* Send the command and wait for it to complete */ |
640 | - I915_WRITE(ch_ctl, |
641 | - DP_AUX_CH_CTL_SEND_BUSY | |
642 | - (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) | |
643 | - DP_AUX_CH_CTL_TIME_OUT_400us | |
644 | - (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | |
645 | - (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | |
646 | - (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) | |
647 | - DP_AUX_CH_CTL_DONE | |
648 | - DP_AUX_CH_CTL_TIME_OUT_ERROR | |
649 | - DP_AUX_CH_CTL_RECEIVE_ERROR); |
650 | - |
651 | - status = intel_dp_aux_wait_done(intel_dp, has_aux_irq); |
652 | - |
653 | - /* Clear done status and any errors */ |
654 | - I915_WRITE(ch_ctl, |
655 | - status | |
656 | - DP_AUX_CH_CTL_DONE | |
657 | - DP_AUX_CH_CTL_TIME_OUT_ERROR | |
658 | - DP_AUX_CH_CTL_RECEIVE_ERROR); |
659 | - |
660 | - if (status & (DP_AUX_CH_CTL_TIME_OUT_ERROR | |
661 | - DP_AUX_CH_CTL_RECEIVE_ERROR)) |
662 | - continue; |
663 | + while ((aux_clock_divider = get_aux_clock_divider(intel_dp, clock++))) { |
664 | + /* Must try at least 3 times according to DP spec */ |
665 | + for (try = 0; try < 5; try++) { |
666 | + /* Load the send data into the aux channel data registers */ |
667 | + for (i = 0; i < send_bytes; i += 4) |
668 | + I915_WRITE(ch_data + i, |
669 | + pack_aux(send + i, send_bytes - i)); |
670 | + |
671 | + /* Send the command and wait for it to complete */ |
672 | + I915_WRITE(ch_ctl, |
673 | + DP_AUX_CH_CTL_SEND_BUSY | |
674 | + (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) | |
675 | + DP_AUX_CH_CTL_TIME_OUT_400us | |
676 | + (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | |
677 | + (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | |
678 | + (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) | |
679 | + DP_AUX_CH_CTL_DONE | |
680 | + DP_AUX_CH_CTL_TIME_OUT_ERROR | |
681 | + DP_AUX_CH_CTL_RECEIVE_ERROR); |
682 | + |
683 | + status = intel_dp_aux_wait_done(intel_dp, has_aux_irq); |
684 | + |
685 | + /* Clear done status and any errors */ |
686 | + I915_WRITE(ch_ctl, |
687 | + status | |
688 | + DP_AUX_CH_CTL_DONE | |
689 | + DP_AUX_CH_CTL_TIME_OUT_ERROR | |
690 | + DP_AUX_CH_CTL_RECEIVE_ERROR); |
691 | + |
692 | + if (status & (DP_AUX_CH_CTL_TIME_OUT_ERROR | |
693 | + DP_AUX_CH_CTL_RECEIVE_ERROR)) |
694 | + continue; |
695 | + if (status & DP_AUX_CH_CTL_DONE) |
696 | + break; |
697 | + } |
698 | if (status & DP_AUX_CH_CTL_DONE) |
699 | break; |
700 | } |
701 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h |
702 | index b7d6e09456ce..ddf7e2f6dce4 100644 |
703 | --- a/drivers/gpu/drm/i915/intel_drv.h |
704 | +++ b/drivers/gpu/drm/i915/intel_drv.h |
705 | @@ -816,6 +816,8 @@ extern void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder); |
706 | extern bool |
707 | intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); |
708 | extern void intel_ddi_fdi_disable(struct drm_crtc *crtc); |
709 | +extern void intel_ddi_get_config(struct intel_encoder *encoder, |
710 | + struct intel_crtc_config *pipe_config); |
711 | |
712 | extern void intel_display_handle_reset(struct drm_device *dev); |
713 | extern bool intel_set_cpu_fifo_underrun_reporting(struct drm_device *dev, |
714 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
715 | index 61348eae2f04..44533dde25c1 100644 |
716 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
717 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
718 | @@ -696,6 +696,22 @@ static const struct dmi_system_id intel_no_lvds[] = { |
719 | }, |
720 | { |
721 | .callback = intel_no_lvds_dmi_callback, |
722 | + .ident = "Intel D410PT", |
723 | + .matches = { |
724 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), |
725 | + DMI_MATCH(DMI_BOARD_NAME, "D410PT"), |
726 | + }, |
727 | + }, |
728 | + { |
729 | + .callback = intel_no_lvds_dmi_callback, |
730 | + .ident = "Intel D425KT", |
731 | + .matches = { |
732 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), |
733 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "D425KT"), |
734 | + }, |
735 | + }, |
736 | + { |
737 | + .callback = intel_no_lvds_dmi_callback, |
738 | .ident = "Intel D510MO", |
739 | .matches = { |
740 | DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), |
741 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
742 | index 7c2a28531cab..56ed69ee6b91 100644 |
743 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
744 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
745 | @@ -1657,7 +1657,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) |
746 | * does the same thing and more. |
747 | */ |
748 | if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730) && |
749 | - (rdev->family != CHIP_RS880)) |
750 | + (rdev->family != CHIP_RS780) && (rdev->family != CHIP_RS880)) |
751 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
752 | } |
753 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
754 | diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c |
755 | index fc55256abda0..263d14bc73d7 100644 |
756 | --- a/drivers/gpu/drm/radeon/ni.c |
757 | +++ b/drivers/gpu/drm/radeon/ni.c |
758 | @@ -800,6 +800,7 @@ int ni_init_microcode(struct radeon_device *rdev) |
759 | fw_name); |
760 | release_firmware(rdev->smc_fw); |
761 | rdev->smc_fw = NULL; |
762 | + err = 0; |
763 | } else if (rdev->smc_fw->size != smc_req_size) { |
764 | printk(KERN_ERR |
765 | "ni_mc: Bogus length %zu in firmware \"%s\"\n", |
766 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
767 | index 739ffbe265cc..c2d7eb64eb14 100644 |
768 | --- a/drivers/gpu/drm/radeon/r600.c |
769 | +++ b/drivers/gpu/drm/radeon/r600.c |
770 | @@ -2310,6 +2310,7 @@ int r600_init_microcode(struct radeon_device *rdev) |
771 | fw_name); |
772 | release_firmware(rdev->smc_fw); |
773 | rdev->smc_fw = NULL; |
774 | + err = 0; |
775 | } else if (rdev->smc_fw->size != smc_req_size) { |
776 | printk(KERN_ERR |
777 | "smc: Bogus length %zu in firmware \"%s\"\n", |
778 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c |
779 | index 7af2113378a8..bf1fcb60b4dc 100644 |
780 | --- a/drivers/gpu/drm/radeon/si.c |
781 | +++ b/drivers/gpu/drm/radeon/si.c |
782 | @@ -1669,6 +1669,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
783 | fw_name); |
784 | release_firmware(rdev->smc_fw); |
785 | rdev->smc_fw = NULL; |
786 | + err = 0; |
787 | } else if (rdev->smc_fw->size != smc_req_size) { |
788 | printk(KERN_ERR |
789 | "si_smc: Bogus length %zu in firmware \"%s\"\n", |
790 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
791 | index 78e21649d48a..01642a3ed837 100644 |
792 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
793 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
794 | @@ -738,9 +738,17 @@ static void vmw_postclose(struct drm_device *dev, |
795 | struct vmw_fpriv *vmw_fp; |
796 | |
797 | vmw_fp = vmw_fpriv(file_priv); |
798 | - ttm_object_file_release(&vmw_fp->tfile); |
799 | - if (vmw_fp->locked_master) |
800 | + |
801 | + if (vmw_fp->locked_master) { |
802 | + struct vmw_master *vmaster = |
803 | + vmw_master(vmw_fp->locked_master); |
804 | + |
805 | + ttm_lock_set_kill(&vmaster->lock, true, SIGTERM); |
806 | + ttm_vt_unlock(&vmaster->lock); |
807 | drm_master_put(&vmw_fp->locked_master); |
808 | + } |
809 | + |
810 | + ttm_object_file_release(&vmw_fp->tfile); |
811 | kfree(vmw_fp); |
812 | } |
813 | |
814 | @@ -940,14 +948,13 @@ static void vmw_master_drop(struct drm_device *dev, |
815 | |
816 | vmw_fp->locked_master = drm_master_get(file_priv->master); |
817 | ret = ttm_vt_lock(&vmaster->lock, false, vmw_fp->tfile); |
818 | - vmw_execbuf_release_pinned_bo(dev_priv); |
819 | - |
820 | if (unlikely((ret != 0))) { |
821 | DRM_ERROR("Unable to lock TTM at VT switch.\n"); |
822 | drm_master_put(&vmw_fp->locked_master); |
823 | } |
824 | |
825 | - ttm_lock_set_kill(&vmaster->lock, true, SIGTERM); |
826 | + ttm_lock_set_kill(&vmaster->lock, false, SIGTERM); |
827 | + vmw_execbuf_release_pinned_bo(dev_priv); |
828 | |
829 | if (!dev_priv->enable_fb) { |
830 | ret = ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM); |
831 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |
832 | index 7953d1f90b63..ad2b05678503 100644 |
833 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |
834 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |
835 | @@ -970,7 +970,7 @@ void vmw_resource_unreserve(struct vmw_resource *res, |
836 | if (new_backup) |
837 | res->backup_offset = new_backup_offset; |
838 | |
839 | - if (!res->func->may_evict) |
840 | + if (!res->func->may_evict || res->id == -1) |
841 | return; |
842 | |
843 | write_lock(&dev_priv->resource_lock); |
844 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
845 | index 9f60d631f733..15323dab2c85 100644 |
846 | --- a/drivers/hid/hid-core.c |
847 | +++ b/drivers/hid/hid-core.c |
848 | @@ -1827,6 +1827,7 @@ static const struct hid_device_id hid_have_special_driver[] = { |
849 | |
850 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, |
851 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
852 | + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO2, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
853 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) }, |
854 | { } |
855 | }; |
856 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
857 | index 339623c1f7d3..e2808f5cc313 100644 |
858 | --- a/drivers/hid/hid-ids.h |
859 | +++ b/drivers/hid/hid-ids.h |
860 | @@ -633,6 +633,7 @@ |
861 | #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 |
862 | |
863 | #define USB_VENDOR_ID_NINTENDO 0x057e |
864 | +#define USB_VENDOR_ID_NINTENDO2 0x054c |
865 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306 |
866 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE2 0x0330 |
867 | |
868 | diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c |
869 | index 660209824e56..2dd88abdf24c 100644 |
870 | --- a/drivers/hid/hid-wiimote-core.c |
871 | +++ b/drivers/hid/hid-wiimote-core.c |
872 | @@ -838,7 +838,8 @@ static void wiimote_init_set_type(struct wiimote_data *wdata, |
873 | goto done; |
874 | } |
875 | |
876 | - if (vendor == USB_VENDOR_ID_NINTENDO) { |
877 | + if (vendor == USB_VENDOR_ID_NINTENDO || |
878 | + vendor == USB_VENDOR_ID_NINTENDO2) { |
879 | if (product == USB_DEVICE_ID_NINTENDO_WIIMOTE) { |
880 | devtype = WIIMOTE_DEV_GEN10; |
881 | goto done; |
882 | @@ -1860,6 +1861,8 @@ static void wiimote_hid_remove(struct hid_device *hdev) |
883 | static const struct hid_device_id wiimote_hid_devices[] = { |
884 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, |
885 | USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
886 | + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO2, |
887 | + USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
888 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, |
889 | USB_DEVICE_ID_NINTENDO_WIIMOTE2) }, |
890 | { } |
891 | diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c |
892 | index b6a74bcbb08f..2a7f0dd6abab 100644 |
893 | --- a/drivers/md/bcache/request.c |
894 | +++ b/drivers/md/bcache/request.c |
895 | @@ -1000,7 +1000,7 @@ static void request_write(struct cached_dev *dc, struct search *s) |
896 | |
897 | if (bio->bi_rw & REQ_FLUSH) { |
898 | /* Also need to send a flush to the backing device */ |
899 | - struct bio *flush = bio_alloc_bioset(0, GFP_NOIO, |
900 | + struct bio *flush = bio_alloc_bioset(GFP_NOIO, 0, |
901 | dc->disk.bio_split); |
902 | |
903 | flush->bi_rw = WRITE_FLUSH; |
904 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
905 | index 9f13e13506ef..866f48975ea6 100644 |
906 | --- a/drivers/md/md.c |
907 | +++ b/drivers/md/md.c |
908 | @@ -8093,6 +8093,7 @@ static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors, |
909 | u64 *p; |
910 | int lo, hi; |
911 | int rv = 1; |
912 | + unsigned long flags; |
913 | |
914 | if (bb->shift < 0) |
915 | /* badblocks are disabled */ |
916 | @@ -8107,7 +8108,7 @@ static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors, |
917 | sectors = next - s; |
918 | } |
919 | |
920 | - write_seqlock_irq(&bb->lock); |
921 | + write_seqlock_irqsave(&bb->lock, flags); |
922 | |
923 | p = bb->page; |
924 | lo = 0; |
925 | @@ -8223,7 +8224,7 @@ static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors, |
926 | bb->changed = 1; |
927 | if (!acknowledged) |
928 | bb->unacked_exist = 1; |
929 | - write_sequnlock_irq(&bb->lock); |
930 | + write_sequnlock_irqrestore(&bb->lock, flags); |
931 | |
932 | return rv; |
933 | } |
934 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
935 | index d60412c7f995..aacf6bf352d8 100644 |
936 | --- a/drivers/md/raid1.c |
937 | +++ b/drivers/md/raid1.c |
938 | @@ -1479,6 +1479,7 @@ static int raid1_spare_active(struct mddev *mddev) |
939 | } |
940 | } |
941 | if (rdev |
942 | + && rdev->recovery_offset == MaxSector |
943 | && !test_bit(Faulty, &rdev->flags) |
944 | && !test_and_set_bit(In_sync, &rdev->flags)) { |
945 | count++; |
946 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
947 | index df7b0a06b0ea..73dc8a377522 100644 |
948 | --- a/drivers/md/raid10.c |
949 | +++ b/drivers/md/raid10.c |
950 | @@ -1782,6 +1782,7 @@ static int raid10_spare_active(struct mddev *mddev) |
951 | } |
952 | sysfs_notify_dirent_safe(tmp->replacement->sysfs_state); |
953 | } else if (tmp->rdev |
954 | + && tmp->rdev->recovery_offset == MaxSector |
955 | && !test_bit(Faulty, &tmp->rdev->flags) |
956 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
957 | count++; |
958 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
959 | index 78ea44336e75..d825059d00ce 100644 |
960 | --- a/drivers/md/raid5.c |
961 | +++ b/drivers/md/raid5.c |
962 | @@ -668,6 +668,12 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) |
963 | bi->bi_io_vec[0].bv_len = STRIPE_SIZE; |
964 | bi->bi_io_vec[0].bv_offset = 0; |
965 | bi->bi_size = STRIPE_SIZE; |
966 | + /* |
967 | + * If this is discard request, set bi_vcnt 0. We don't |
968 | + * want to confuse SCSI because SCSI will replace payload |
969 | + */ |
970 | + if (rw & REQ_DISCARD) |
971 | + bi->bi_vcnt = 0; |
972 | if (rrdev) |
973 | set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags); |
974 | |
975 | @@ -706,6 +712,12 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) |
976 | rbi->bi_io_vec[0].bv_len = STRIPE_SIZE; |
977 | rbi->bi_io_vec[0].bv_offset = 0; |
978 | rbi->bi_size = STRIPE_SIZE; |
979 | + /* |
980 | + * If this is discard request, set bi_vcnt 0. We don't |
981 | + * want to confuse SCSI because SCSI will replace payload |
982 | + */ |
983 | + if (rw & REQ_DISCARD) |
984 | + rbi->bi_vcnt = 0; |
985 | if (conf->mddev->gendisk) |
986 | trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev), |
987 | rbi, disk_devt(conf->mddev->gendisk), |
988 | @@ -2800,6 +2812,14 @@ static void handle_stripe_clean_event(struct r5conf *conf, |
989 | } |
990 | /* now that discard is done we can proceed with any sync */ |
991 | clear_bit(STRIPE_DISCARD, &sh->state); |
992 | + /* |
993 | + * SCSI discard will change some bio fields and the stripe has |
994 | + * no updated data, so remove it from hash list and the stripe |
995 | + * will be reinitialized |
996 | + */ |
997 | + spin_lock_irq(&conf->device_lock); |
998 | + remove_hash(sh); |
999 | + spin_unlock_irq(&conf->device_lock); |
1000 | if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state)) |
1001 | set_bit(STRIPE_HANDLE, &sh->state); |
1002 | |
1003 | diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c |
1004 | index dbbe97ae121e..c1e654618891 100644 |
1005 | --- a/drivers/net/can/at91_can.c |
1006 | +++ b/drivers/net/can/at91_can.c |
1007 | @@ -1405,10 +1405,10 @@ static int at91_can_remove(struct platform_device *pdev) |
1008 | |
1009 | static const struct platform_device_id at91_can_id_table[] = { |
1010 | { |
1011 | - .name = "at91_can", |
1012 | + .name = "at91sam9x5_can", |
1013 | .driver_data = (kernel_ulong_t)&at91_at91sam9x5_data, |
1014 | }, { |
1015 | - .name = "at91sam9x5_can", |
1016 | + .name = "at91_can", |
1017 | .driver_data = (kernel_ulong_t)&at91_at91sam9263_data, |
1018 | }, { |
1019 | /* sentinel */ |
1020 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c |
1021 | index 7b0be0910f4b..d1968c83c561 100644 |
1022 | --- a/drivers/net/can/flexcan.c |
1023 | +++ b/drivers/net/can/flexcan.c |
1024 | @@ -62,7 +62,7 @@ |
1025 | #define FLEXCAN_MCR_BCC BIT(16) |
1026 | #define FLEXCAN_MCR_LPRIO_EN BIT(13) |
1027 | #define FLEXCAN_MCR_AEN BIT(12) |
1028 | -#define FLEXCAN_MCR_MAXMB(x) ((x) & 0xf) |
1029 | +#define FLEXCAN_MCR_MAXMB(x) ((x) & 0x1f) |
1030 | #define FLEXCAN_MCR_IDAM_A (0 << 8) |
1031 | #define FLEXCAN_MCR_IDAM_B (1 << 8) |
1032 | #define FLEXCAN_MCR_IDAM_C (2 << 8) |
1033 | @@ -736,9 +736,11 @@ static int flexcan_chip_start(struct net_device *dev) |
1034 | * |
1035 | */ |
1036 | reg_mcr = flexcan_read(®s->mcr); |
1037 | + reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); |
1038 | reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT | |
1039 | FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | |
1040 | - FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS; |
1041 | + FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS | |
1042 | + FLEXCAN_MCR_MAXMB(FLEXCAN_TX_BUF_ID); |
1043 | netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr); |
1044 | flexcan_write(reg_mcr, ®s->mcr); |
1045 | |
1046 | @@ -783,6 +785,10 @@ static int flexcan_chip_start(struct net_device *dev) |
1047 | ®s->cantxfg[i].can_ctrl); |
1048 | } |
1049 | |
1050 | + /* Abort any pending TX, mark Mailbox as INACTIVE */ |
1051 | + flexcan_write(FLEXCAN_MB_CNT_CODE(0x4), |
1052 | + ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); |
1053 | + |
1054 | /* acceptance mask/acceptance code (accept everything) */ |
1055 | flexcan_write(0x0, ®s->rxgmask); |
1056 | flexcan_write(0x0, ®s->rx14mask); |
1057 | @@ -979,9 +985,9 @@ static void unregister_flexcandev(struct net_device *dev) |
1058 | } |
1059 | |
1060 | static const struct of_device_id flexcan_of_match[] = { |
1061 | - { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, |
1062 | - { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, |
1063 | { .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, }, |
1064 | + { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, |
1065 | + { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, |
1066 | { /* sentinel */ }, |
1067 | }; |
1068 | MODULE_DEVICE_TABLE(of, flexcan_of_match); |
1069 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c |
1070 | index cb5a65553ac7..5697c7acd5c0 100644 |
1071 | --- a/drivers/net/wireless/ath/ath9k/main.c |
1072 | +++ b/drivers/net/wireless/ath/ath9k/main.c |
1073 | @@ -208,6 +208,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) |
1074 | struct ath_hw *ah = sc->sc_ah; |
1075 | struct ath_common *common = ath9k_hw_common(ah); |
1076 | unsigned long flags; |
1077 | + int i; |
1078 | |
1079 | if (ath_startrecv(sc) != 0) { |
1080 | ath_err(common, "Unable to restart recv logic\n"); |
1081 | @@ -235,6 +236,15 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) |
1082 | } |
1083 | work: |
1084 | ath_restart_work(sc); |
1085 | + |
1086 | + for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
1087 | + if (!ATH_TXQ_SETUP(sc, i)) |
1088 | + continue; |
1089 | + |
1090 | + spin_lock_bh(&sc->tx.txq[i].axq_lock); |
1091 | + ath_txq_schedule(sc, &sc->tx.txq[i]); |
1092 | + spin_unlock_bh(&sc->tx.txq[i].axq_lock); |
1093 | + } |
1094 | } |
1095 | |
1096 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) |
1097 | @@ -542,21 +552,10 @@ chip_reset: |
1098 | |
1099 | static int ath_reset(struct ath_softc *sc) |
1100 | { |
1101 | - int i, r; |
1102 | + int r; |
1103 | |
1104 | ath9k_ps_wakeup(sc); |
1105 | - |
1106 | r = ath_reset_internal(sc, NULL); |
1107 | - |
1108 | - for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
1109 | - if (!ATH_TXQ_SETUP(sc, i)) |
1110 | - continue; |
1111 | - |
1112 | - spin_lock_bh(&sc->tx.txq[i].axq_lock); |
1113 | - ath_txq_schedule(sc, &sc->tx.txq[i]); |
1114 | - spin_unlock_bh(&sc->tx.txq[i].axq_lock); |
1115 | - } |
1116 | - |
1117 | ath9k_ps_restore(sc); |
1118 | |
1119 | return r; |
1120 | diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c |
1121 | index 30d45e2fc193..8ac305be68f4 100644 |
1122 | --- a/drivers/net/wireless/iwlwifi/iwl-6000.c |
1123 | +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c |
1124 | @@ -240,6 +240,12 @@ const struct iwl_cfg iwl6035_2agn_cfg = { |
1125 | .ht_params = &iwl6000_ht_params, |
1126 | }; |
1127 | |
1128 | +const struct iwl_cfg iwl6035_2agn_sff_cfg = { |
1129 | + .name = "Intel(R) Centrino(R) Ultimate-N 6235 AGN", |
1130 | + IWL_DEVICE_6035, |
1131 | + .ht_params = &iwl6000_ht_params, |
1132 | +}; |
1133 | + |
1134 | const struct iwl_cfg iwl1030_bgn_cfg = { |
1135 | .name = "Intel(R) Centrino(R) Wireless-N 1030 BGN", |
1136 | IWL_DEVICE_6030, |
1137 | diff --git a/drivers/net/wireless/iwlwifi/iwl-config.h b/drivers/net/wireless/iwlwifi/iwl-config.h |
1138 | index 83b9ff6ff3ad..d97884618835 100644 |
1139 | --- a/drivers/net/wireless/iwlwifi/iwl-config.h |
1140 | +++ b/drivers/net/wireless/iwlwifi/iwl-config.h |
1141 | @@ -277,6 +277,7 @@ extern const struct iwl_cfg iwl2000_2bgn_cfg; |
1142 | extern const struct iwl_cfg iwl2000_2bgn_d_cfg; |
1143 | extern const struct iwl_cfg iwl2030_2bgn_cfg; |
1144 | extern const struct iwl_cfg iwl6035_2agn_cfg; |
1145 | +extern const struct iwl_cfg iwl6035_2agn_sff_cfg; |
1146 | extern const struct iwl_cfg iwl105_bgn_cfg; |
1147 | extern const struct iwl_cfg iwl105_bgn_d_cfg; |
1148 | extern const struct iwl_cfg iwl135_bgn_cfg; |
1149 | diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c |
1150 | index acdff6b67e04..c55d88f3cfd2 100644 |
1151 | --- a/drivers/net/wireless/iwlwifi/mvm/scan.c |
1152 | +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c |
1153 | @@ -392,6 +392,11 @@ static bool iwl_mvm_scan_abort_notif(struct iwl_notif_wait_data *notif_wait, |
1154 | return false; |
1155 | } |
1156 | |
1157 | + /* |
1158 | + * If scan cannot be aborted, it means that we had a |
1159 | + * SCAN_COMPLETE_NOTIFICATION in the pipe and it called |
1160 | + * ieee80211_scan_completed already. |
1161 | + */ |
1162 | IWL_DEBUG_SCAN(mvm, "Scan cannot be aborted, exit now: %d\n", |
1163 | *resp); |
1164 | return true; |
1165 | @@ -415,14 +420,19 @@ void iwl_mvm_cancel_scan(struct iwl_mvm *mvm) |
1166 | SCAN_COMPLETE_NOTIFICATION }; |
1167 | int ret; |
1168 | |
1169 | + if (mvm->scan_status == IWL_MVM_SCAN_NONE) |
1170 | + return; |
1171 | + |
1172 | iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_abort, |
1173 | scan_abort_notif, |
1174 | ARRAY_SIZE(scan_abort_notif), |
1175 | iwl_mvm_scan_abort_notif, NULL); |
1176 | |
1177 | - ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, CMD_SYNC, 0, NULL); |
1178 | + ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, |
1179 | + CMD_SYNC | CMD_SEND_IN_RFKILL, 0, NULL); |
1180 | if (ret) { |
1181 | IWL_ERR(mvm, "Couldn't send SCAN_ABORT_CMD: %d\n", ret); |
1182 | + /* mac80211's state will be cleaned in the fw_restart flow */ |
1183 | goto out_remove_notif; |
1184 | } |
1185 | |
1186 | diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c |
1187 | index ff13458efc27..058c6aa58b7a 100644 |
1188 | --- a/drivers/net/wireless/iwlwifi/pcie/drv.c |
1189 | +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c |
1190 | @@ -139,13 +139,16 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { |
1191 | |
1192 | /* 6x00 Series */ |
1193 | {IWL_PCI_DEVICE(0x422B, 0x1101, iwl6000_3agn_cfg)}, |
1194 | + {IWL_PCI_DEVICE(0x422B, 0x1108, iwl6000_3agn_cfg)}, |
1195 | {IWL_PCI_DEVICE(0x422B, 0x1121, iwl6000_3agn_cfg)}, |
1196 | + {IWL_PCI_DEVICE(0x422B, 0x1128, iwl6000_3agn_cfg)}, |
1197 | {IWL_PCI_DEVICE(0x422C, 0x1301, iwl6000i_2agn_cfg)}, |
1198 | {IWL_PCI_DEVICE(0x422C, 0x1306, iwl6000i_2abg_cfg)}, |
1199 | {IWL_PCI_DEVICE(0x422C, 0x1307, iwl6000i_2bg_cfg)}, |
1200 | {IWL_PCI_DEVICE(0x422C, 0x1321, iwl6000i_2agn_cfg)}, |
1201 | {IWL_PCI_DEVICE(0x422C, 0x1326, iwl6000i_2abg_cfg)}, |
1202 | {IWL_PCI_DEVICE(0x4238, 0x1111, iwl6000_3agn_cfg)}, |
1203 | + {IWL_PCI_DEVICE(0x4238, 0x1118, iwl6000_3agn_cfg)}, |
1204 | {IWL_PCI_DEVICE(0x4239, 0x1311, iwl6000i_2agn_cfg)}, |
1205 | {IWL_PCI_DEVICE(0x4239, 0x1316, iwl6000i_2abg_cfg)}, |
1206 | |
1207 | @@ -153,12 +156,16 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { |
1208 | {IWL_PCI_DEVICE(0x0082, 0x1301, iwl6005_2agn_cfg)}, |
1209 | {IWL_PCI_DEVICE(0x0082, 0x1306, iwl6005_2abg_cfg)}, |
1210 | {IWL_PCI_DEVICE(0x0082, 0x1307, iwl6005_2bg_cfg)}, |
1211 | + {IWL_PCI_DEVICE(0x0082, 0x1308, iwl6005_2agn_cfg)}, |
1212 | {IWL_PCI_DEVICE(0x0082, 0x1321, iwl6005_2agn_cfg)}, |
1213 | {IWL_PCI_DEVICE(0x0082, 0x1326, iwl6005_2abg_cfg)}, |
1214 | + {IWL_PCI_DEVICE(0x0082, 0x1328, iwl6005_2agn_cfg)}, |
1215 | {IWL_PCI_DEVICE(0x0085, 0x1311, iwl6005_2agn_cfg)}, |
1216 | + {IWL_PCI_DEVICE(0x0085, 0x1318, iwl6005_2agn_cfg)}, |
1217 | {IWL_PCI_DEVICE(0x0085, 0x1316, iwl6005_2abg_cfg)}, |
1218 | {IWL_PCI_DEVICE(0x0082, 0xC020, iwl6005_2agn_sff_cfg)}, |
1219 | {IWL_PCI_DEVICE(0x0085, 0xC220, iwl6005_2agn_sff_cfg)}, |
1220 | + {IWL_PCI_DEVICE(0x0085, 0xC228, iwl6005_2agn_sff_cfg)}, |
1221 | {IWL_PCI_DEVICE(0x0082, 0x4820, iwl6005_2agn_d_cfg)}, |
1222 | {IWL_PCI_DEVICE(0x0082, 0x1304, iwl6005_2agn_mow1_cfg)},/* low 5GHz active */ |
1223 | {IWL_PCI_DEVICE(0x0082, 0x1305, iwl6005_2agn_mow2_cfg)},/* high 5GHz active */ |
1224 | @@ -240,8 +247,11 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { |
1225 | |
1226 | /* 6x35 Series */ |
1227 | {IWL_PCI_DEVICE(0x088E, 0x4060, iwl6035_2agn_cfg)}, |
1228 | + {IWL_PCI_DEVICE(0x088E, 0x406A, iwl6035_2agn_sff_cfg)}, |
1229 | {IWL_PCI_DEVICE(0x088F, 0x4260, iwl6035_2agn_cfg)}, |
1230 | + {IWL_PCI_DEVICE(0x088F, 0x426A, iwl6035_2agn_sff_cfg)}, |
1231 | {IWL_PCI_DEVICE(0x088E, 0x4460, iwl6035_2agn_cfg)}, |
1232 | + {IWL_PCI_DEVICE(0x088E, 0x446A, iwl6035_2agn_sff_cfg)}, |
1233 | {IWL_PCI_DEVICE(0x088E, 0x4860, iwl6035_2agn_cfg)}, |
1234 | {IWL_PCI_DEVICE(0x088F, 0x5260, iwl6035_2agn_cfg)}, |
1235 | |
1236 | diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c |
1237 | index 108267d4e08c..02cc93b673c1 100644 |
1238 | --- a/drivers/net/wireless/mwifiex/main.c |
1239 | +++ b/drivers/net/wireless/mwifiex/main.c |
1240 | @@ -354,10 +354,12 @@ process_start: |
1241 | } |
1242 | } while (true); |
1243 | |
1244 | - if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) |
1245 | + spin_lock_irqsave(&adapter->main_proc_lock, flags); |
1246 | + if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) { |
1247 | + spin_unlock_irqrestore(&adapter->main_proc_lock, flags); |
1248 | goto process_start; |
1249 | + } |
1250 | |
1251 | - spin_lock_irqsave(&adapter->main_proc_lock, flags); |
1252 | adapter->mwifiex_processing = false; |
1253 | spin_unlock_irqrestore(&adapter->main_proc_lock, flags); |
1254 | |
1255 | diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c |
1256 | index 76d95deb274b..dc49e525ae5e 100644 |
1257 | --- a/drivers/net/wireless/rt2x00/rt2x00pci.c |
1258 | +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c |
1259 | @@ -105,13 +105,11 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops) |
1260 | goto exit_release_regions; |
1261 | } |
1262 | |
1263 | - pci_enable_msi(pci_dev); |
1264 | - |
1265 | hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw); |
1266 | if (!hw) { |
1267 | rt2x00_probe_err("Failed to allocate hardware\n"); |
1268 | retval = -ENOMEM; |
1269 | - goto exit_disable_msi; |
1270 | + goto exit_release_regions; |
1271 | } |
1272 | |
1273 | pci_set_drvdata(pci_dev, hw); |
1274 | @@ -152,9 +150,6 @@ exit_free_reg: |
1275 | exit_free_device: |
1276 | ieee80211_free_hw(hw); |
1277 | |
1278 | -exit_disable_msi: |
1279 | - pci_disable_msi(pci_dev); |
1280 | - |
1281 | exit_release_regions: |
1282 | pci_release_regions(pci_dev); |
1283 | |
1284 | @@ -179,8 +174,6 @@ void rt2x00pci_remove(struct pci_dev *pci_dev) |
1285 | rt2x00pci_free_reg(rt2x00dev); |
1286 | ieee80211_free_hw(hw); |
1287 | |
1288 | - pci_disable_msi(pci_dev); |
1289 | - |
1290 | /* |
1291 | * Free the PCI device data. |
1292 | */ |
1293 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c |
1294 | index 763cf1defab5..5a060e537fbe 100644 |
1295 | --- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c |
1296 | +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c |
1297 | @@ -343,7 +343,8 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw, |
1298 | (bool)GET_RX_DESC_PAGGR(pdesc)); |
1299 | rx_status->mactime = GET_RX_DESC_TSFL(pdesc); |
1300 | if (phystatus) { |
1301 | - p_drvinfo = (struct rx_fwinfo_92c *)(pdesc + RTL_RX_DESC_SIZE); |
1302 | + p_drvinfo = (struct rx_fwinfo_92c *)(skb->data + |
1303 | + stats->rx_bufshift); |
1304 | rtl92c_translate_rx_signal_stuff(hw, skb, stats, pdesc, |
1305 | p_drvinfo); |
1306 | } |
1307 | diff --git a/drivers/ntb/ntb_hw.c b/drivers/ntb/ntb_hw.c |
1308 | index 2dacd19e1b8a..b9bf8b551e3c 100644 |
1309 | --- a/drivers/ntb/ntb_hw.c |
1310 | +++ b/drivers/ntb/ntb_hw.c |
1311 | @@ -78,6 +78,8 @@ enum { |
1312 | BWD_HW, |
1313 | }; |
1314 | |
1315 | +static struct dentry *debugfs_dir; |
1316 | + |
1317 | /* Translate memory window 0,1 to BAR 2,4 */ |
1318 | #define MW_TO_BAR(mw) (mw * 2 + 2) |
1319 | |
1320 | @@ -531,9 +533,9 @@ static int ntb_xeon_setup(struct ntb_device *ndev) |
1321 | } |
1322 | |
1323 | if (val & SNB_PPD_DEV_TYPE) |
1324 | - ndev->dev_type = NTB_DEV_DSD; |
1325 | - else |
1326 | ndev->dev_type = NTB_DEV_USD; |
1327 | + else |
1328 | + ndev->dev_type = NTB_DEV_DSD; |
1329 | |
1330 | ndev->reg_ofs.pdb = ndev->reg_base + SNB_PDOORBELL_OFFSET; |
1331 | ndev->reg_ofs.pdb_mask = ndev->reg_base + SNB_PDBMSK_OFFSET; |
1332 | @@ -547,7 +549,7 @@ static int ntb_xeon_setup(struct ntb_device *ndev) |
1333 | if (ndev->conn_type == NTB_CONN_B2B) { |
1334 | ndev->reg_ofs.sdb = ndev->reg_base + SNB_B2B_DOORBELL_OFFSET; |
1335 | ndev->reg_ofs.spad_write = ndev->reg_base + SNB_B2B_SPAD_OFFSET; |
1336 | - ndev->limits.max_spads = SNB_MAX_SPADS; |
1337 | + ndev->limits.max_spads = SNB_MAX_B2B_SPADS; |
1338 | } else { |
1339 | ndev->reg_ofs.sdb = ndev->reg_base + SNB_SDOORBELL_OFFSET; |
1340 | ndev->reg_ofs.spad_write = ndev->reg_base + SNB_SPAD_OFFSET; |
1341 | @@ -644,10 +646,16 @@ static int ntb_device_setup(struct ntb_device *ndev) |
1342 | rc = -ENODEV; |
1343 | } |
1344 | |
1345 | + if (rc) |
1346 | + return rc; |
1347 | + |
1348 | + dev_info(&ndev->pdev->dev, "Device Type = %s\n", |
1349 | + ndev->dev_type == NTB_DEV_USD ? "USD/DSP" : "DSD/USP"); |
1350 | + |
1351 | /* Enable Bus Master and Memory Space on the secondary side */ |
1352 | writew(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, ndev->reg_ofs.spci_cmd); |
1353 | |
1354 | - return rc; |
1355 | + return 0; |
1356 | } |
1357 | |
1358 | static void ntb_device_free(struct ntb_device *ndev) |
1359 | @@ -992,6 +1000,28 @@ static void ntb_free_callbacks(struct ntb_device *ndev) |
1360 | kfree(ndev->db_cb); |
1361 | } |
1362 | |
1363 | +static void ntb_setup_debugfs(struct ntb_device *ndev) |
1364 | +{ |
1365 | + if (!debugfs_initialized()) |
1366 | + return; |
1367 | + |
1368 | + if (!debugfs_dir) |
1369 | + debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); |
1370 | + |
1371 | + ndev->debugfs_dir = debugfs_create_dir(pci_name(ndev->pdev), |
1372 | + debugfs_dir); |
1373 | +} |
1374 | + |
1375 | +static void ntb_free_debugfs(struct ntb_device *ndev) |
1376 | +{ |
1377 | + debugfs_remove_recursive(ndev->debugfs_dir); |
1378 | + |
1379 | + if (debugfs_dir && simple_empty(debugfs_dir)) { |
1380 | + debugfs_remove_recursive(debugfs_dir); |
1381 | + debugfs_dir = NULL; |
1382 | + } |
1383 | +} |
1384 | + |
1385 | static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
1386 | { |
1387 | struct ntb_device *ndev; |
1388 | @@ -1004,6 +1034,7 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
1389 | ndev->pdev = pdev; |
1390 | ndev->link_status = NTB_LINK_DOWN; |
1391 | pci_set_drvdata(pdev, ndev); |
1392 | + ntb_setup_debugfs(ndev); |
1393 | |
1394 | rc = pci_enable_device(pdev); |
1395 | if (rc) |
1396 | @@ -1100,6 +1131,7 @@ err2: |
1397 | err1: |
1398 | pci_disable_device(pdev); |
1399 | err: |
1400 | + ntb_free_debugfs(ndev); |
1401 | kfree(ndev); |
1402 | |
1403 | dev_err(&pdev->dev, "Error loading %s module\n", KBUILD_MODNAME); |
1404 | @@ -1129,6 +1161,7 @@ static void ntb_pci_remove(struct pci_dev *pdev) |
1405 | iounmap(ndev->reg_base); |
1406 | pci_release_selected_regions(pdev, NTB_BAR_MASK); |
1407 | pci_disable_device(pdev); |
1408 | + ntb_free_debugfs(ndev); |
1409 | kfree(ndev); |
1410 | } |
1411 | |
1412 | diff --git a/drivers/ntb/ntb_hw.h b/drivers/ntb/ntb_hw.h |
1413 | index 3a3038ca83e6..6a4f56f564ee 100644 |
1414 | --- a/drivers/ntb/ntb_hw.h |
1415 | +++ b/drivers/ntb/ntb_hw.h |
1416 | @@ -127,6 +127,8 @@ struct ntb_device { |
1417 | unsigned char link_status; |
1418 | struct delayed_work hb_timer; |
1419 | unsigned long last_ts; |
1420 | + |
1421 | + struct dentry *debugfs_dir; |
1422 | }; |
1423 | |
1424 | /** |
1425 | @@ -155,6 +157,20 @@ static inline struct pci_dev *ntb_query_pdev(struct ntb_device *ndev) |
1426 | return ndev->pdev; |
1427 | } |
1428 | |
1429 | +/** |
1430 | + * ntb_query_debugfs() - return the debugfs pointer |
1431 | + * @ndev: pointer to ntb_device instance |
1432 | + * |
1433 | + * Given the ntb pointer, return the debugfs directory pointer for the NTB |
1434 | + * hardware device |
1435 | + * |
1436 | + * RETURNS: a pointer to the debugfs directory |
1437 | + */ |
1438 | +static inline struct dentry *ntb_query_debugfs(struct ntb_device *ndev) |
1439 | +{ |
1440 | + return ndev->debugfs_dir; |
1441 | +} |
1442 | + |
1443 | struct ntb_device *ntb_register_transport(struct pci_dev *pdev, |
1444 | void *transport); |
1445 | void ntb_unregister_transport(struct ntb_device *ndev); |
1446 | diff --git a/drivers/ntb/ntb_regs.h b/drivers/ntb/ntb_regs.h |
1447 | index 5bfa8c06c059..96209b4abc22 100644 |
1448 | --- a/drivers/ntb/ntb_regs.h |
1449 | +++ b/drivers/ntb/ntb_regs.h |
1450 | @@ -53,8 +53,8 @@ |
1451 | #define NTB_LINK_WIDTH_MASK 0x03f0 |
1452 | |
1453 | #define SNB_MSIX_CNT 4 |
1454 | -#define SNB_MAX_SPADS 16 |
1455 | -#define SNB_MAX_COMPAT_SPADS 8 |
1456 | +#define SNB_MAX_B2B_SPADS 16 |
1457 | +#define SNB_MAX_COMPAT_SPADS 16 |
1458 | /* Reserve the uppermost bit for link interrupt */ |
1459 | #define SNB_MAX_DB_BITS 15 |
1460 | #define SNB_DB_BITS_PER_VEC 5 |
1461 | diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c |
1462 | index f8d7081ee301..c3089151aa49 100644 |
1463 | --- a/drivers/ntb/ntb_transport.c |
1464 | +++ b/drivers/ntb/ntb_transport.c |
1465 | @@ -157,7 +157,6 @@ struct ntb_transport { |
1466 | bool transport_link; |
1467 | struct delayed_work link_work; |
1468 | struct work_struct link_cleanup; |
1469 | - struct dentry *debugfs_dir; |
1470 | }; |
1471 | |
1472 | enum { |
1473 | @@ -824,12 +823,12 @@ static void ntb_transport_init_queue(struct ntb_transport *nt, |
1474 | qp->tx_max_frame = min(transport_mtu, tx_size / 2); |
1475 | qp->tx_max_entry = tx_size / qp->tx_max_frame; |
1476 | |
1477 | - if (nt->debugfs_dir) { |
1478 | + if (ntb_query_debugfs(nt->ndev)) { |
1479 | char debugfs_name[4]; |
1480 | |
1481 | snprintf(debugfs_name, 4, "qp%d", qp_num); |
1482 | qp->debugfs_dir = debugfs_create_dir(debugfs_name, |
1483 | - nt->debugfs_dir); |
1484 | + ntb_query_debugfs(nt->ndev)); |
1485 | |
1486 | qp->debugfs_stats = debugfs_create_file("stats", S_IRUSR, |
1487 | qp->debugfs_dir, qp, |
1488 | @@ -857,11 +856,6 @@ int ntb_transport_init(struct pci_dev *pdev) |
1489 | if (!nt) |
1490 | return -ENOMEM; |
1491 | |
1492 | - if (debugfs_initialized()) |
1493 | - nt->debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); |
1494 | - else |
1495 | - nt->debugfs_dir = NULL; |
1496 | - |
1497 | nt->ndev = ntb_register_transport(pdev, nt); |
1498 | if (!nt->ndev) { |
1499 | rc = -EIO; |
1500 | @@ -907,7 +901,6 @@ err2: |
1501 | err1: |
1502 | ntb_unregister_transport(nt->ndev); |
1503 | err: |
1504 | - debugfs_remove_recursive(nt->debugfs_dir); |
1505 | kfree(nt); |
1506 | return rc; |
1507 | } |
1508 | @@ -921,16 +914,16 @@ void ntb_transport_free(void *transport) |
1509 | nt->transport_link = NTB_LINK_DOWN; |
1510 | |
1511 | /* verify that all the qp's are freed */ |
1512 | - for (i = 0; i < nt->max_qps; i++) |
1513 | + for (i = 0; i < nt->max_qps; i++) { |
1514 | if (!test_bit(i, &nt->qp_bitmap)) |
1515 | ntb_transport_free_queue(&nt->qps[i]); |
1516 | + debugfs_remove_recursive(nt->qps[i].debugfs_dir); |
1517 | + } |
1518 | |
1519 | ntb_bus_remove(nt); |
1520 | |
1521 | cancel_delayed_work_sync(&nt->link_work); |
1522 | |
1523 | - debugfs_remove_recursive(nt->debugfs_dir); |
1524 | - |
1525 | ntb_unregister_event_callback(nt->ndev); |
1526 | |
1527 | pdev = ntb_query_pdev(nt->ndev); |
1528 | diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c |
1529 | index feab3a5e50b5..757eb0716d45 100644 |
1530 | --- a/drivers/scsi/BusLogic.c |
1531 | +++ b/drivers/scsi/BusLogic.c |
1532 | @@ -696,7 +696,7 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) |
1533 | while ((pci_device = pci_get_device(PCI_VENDOR_ID_BUSLOGIC, |
1534 | PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER, |
1535 | pci_device)) != NULL) { |
1536 | - struct blogic_adapter *adapter = adapter; |
1537 | + struct blogic_adapter *host_adapter = adapter; |
1538 | struct blogic_adapter_info adapter_info; |
1539 | enum blogic_isa_ioport mod_ioaddr_req; |
1540 | unsigned char bus; |
1541 | @@ -744,9 +744,9 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) |
1542 | known and enabled, note that the particular Standard ISA I/O |
1543 | Address should not be probed. |
1544 | */ |
1545 | - adapter->io_addr = io_addr; |
1546 | - blogic_intreset(adapter); |
1547 | - if (blogic_cmd(adapter, BLOGIC_INQ_PCI_INFO, NULL, 0, |
1548 | + host_adapter->io_addr = io_addr; |
1549 | + blogic_intreset(host_adapter); |
1550 | + if (blogic_cmd(host_adapter, BLOGIC_INQ_PCI_INFO, NULL, 0, |
1551 | &adapter_info, sizeof(adapter_info)) == |
1552 | sizeof(adapter_info)) { |
1553 | if (adapter_info.isa_port < 6) |
1554 | @@ -762,7 +762,7 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) |
1555 | I/O Address assigned at system initialization. |
1556 | */ |
1557 | mod_ioaddr_req = BLOGIC_IO_DISABLE; |
1558 | - blogic_cmd(adapter, BLOGIC_MOD_IOADDR, &mod_ioaddr_req, |
1559 | + blogic_cmd(host_adapter, BLOGIC_MOD_IOADDR, &mod_ioaddr_req, |
1560 | sizeof(mod_ioaddr_req), NULL, 0); |
1561 | /* |
1562 | For the first MultiMaster Host Adapter enumerated, |
1563 | @@ -779,12 +779,12 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) |
1564 | |
1565 | fetch_localram.offset = BLOGIC_AUTOSCSI_BASE + 45; |
1566 | fetch_localram.count = sizeof(autoscsi_byte45); |
1567 | - blogic_cmd(adapter, BLOGIC_FETCH_LOCALRAM, |
1568 | + blogic_cmd(host_adapter, BLOGIC_FETCH_LOCALRAM, |
1569 | &fetch_localram, sizeof(fetch_localram), |
1570 | &autoscsi_byte45, |
1571 | sizeof(autoscsi_byte45)); |
1572 | - blogic_cmd(adapter, BLOGIC_GET_BOARD_ID, NULL, 0, &id, |
1573 | - sizeof(id)); |
1574 | + blogic_cmd(host_adapter, BLOGIC_GET_BOARD_ID, NULL, 0, |
1575 | + &id, sizeof(id)); |
1576 | if (id.fw_ver_digit1 == '5') |
1577 | force_scan_order = |
1578 | autoscsi_byte45.force_scan_order; |
1579 | diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c |
1580 | index 408a42ef787a..f0d432c139d0 100644 |
1581 | --- a/drivers/scsi/aacraid/linit.c |
1582 | +++ b/drivers/scsi/aacraid/linit.c |
1583 | @@ -771,6 +771,8 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long |
1584 | static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) |
1585 | { |
1586 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; |
1587 | + if (!capable(CAP_SYS_RAWIO)) |
1588 | + return -EPERM; |
1589 | return aac_compat_do_ioctl(dev, cmd, (unsigned long)arg); |
1590 | } |
1591 | |
1592 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
1593 | index 2783dd7057ec..83e9070dc3c0 100644 |
1594 | --- a/drivers/scsi/sd.c |
1595 | +++ b/drivers/scsi/sd.c |
1596 | @@ -2853,6 +2853,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie) |
1597 | gd->events |= DISK_EVENT_MEDIA_CHANGE; |
1598 | } |
1599 | |
1600 | + blk_pm_runtime_init(sdp->request_queue, dev); |
1601 | add_disk(gd); |
1602 | if (sdkp->capacity) |
1603 | sd_dif_config_host(sdkp); |
1604 | @@ -2861,7 +2862,6 @@ static void sd_probe_async(void *data, async_cookie_t cookie) |
1605 | |
1606 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", |
1607 | sdp->removable ? "removable " : ""); |
1608 | - blk_pm_runtime_init(sdp->request_queue, dev); |
1609 | scsi_autopm_put_device(sdp); |
1610 | put_device(&sdkp->dev); |
1611 | } |
1612 | diff --git a/drivers/staging/bcm/Bcmchar.c b/drivers/staging/bcm/Bcmchar.c |
1613 | index f67a22536cbf..756b6344b1fd 100644 |
1614 | --- a/drivers/staging/bcm/Bcmchar.c |
1615 | +++ b/drivers/staging/bcm/Bcmchar.c |
1616 | @@ -1960,6 +1960,7 @@ cntrlEnd: |
1617 | |
1618 | BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n"); |
1619 | |
1620 | + memset(&DevInfo, 0, sizeof(DevInfo)); |
1621 | DevInfo.MaxRDMBufferSize = BUFFER_4K; |
1622 | DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START; |
1623 | DevInfo.u32RxAlignmentCorrection = 0; |
1624 | diff --git a/drivers/staging/ozwpan/ozcdev.c b/drivers/staging/ozwpan/ozcdev.c |
1625 | index 374fdc398641..ea5f9f3595fd 100644 |
1626 | --- a/drivers/staging/ozwpan/ozcdev.c |
1627 | +++ b/drivers/staging/ozwpan/ozcdev.c |
1628 | @@ -152,6 +152,9 @@ static ssize_t oz_cdev_write(struct file *filp, const char __user *buf, |
1629 | struct oz_app_hdr *app_hdr; |
1630 | struct oz_serial_ctx *ctx; |
1631 | |
1632 | + if (count > sizeof(ei->data) - sizeof(*elt) - sizeof(*app_hdr)) |
1633 | + return -EINVAL; |
1634 | + |
1635 | spin_lock_bh(&g_cdev.lock); |
1636 | pd = g_cdev.active_pd; |
1637 | if (pd) |
1638 | diff --git a/drivers/staging/sb105x/sb_pci_mp.c b/drivers/staging/sb105x/sb_pci_mp.c |
1639 | index 23db32f07fd5..a10cdb17038b 100644 |
1640 | --- a/drivers/staging/sb105x/sb_pci_mp.c |
1641 | +++ b/drivers/staging/sb105x/sb_pci_mp.c |
1642 | @@ -1063,7 +1063,7 @@ static int mp_wait_modem_status(struct sb_uart_state *state, unsigned long arg) |
1643 | |
1644 | static int mp_get_count(struct sb_uart_state *state, struct serial_icounter_struct *icnt) |
1645 | { |
1646 | - struct serial_icounter_struct icount; |
1647 | + struct serial_icounter_struct icount = {}; |
1648 | struct sb_uart_icount cnow; |
1649 | struct sb_uart_port *port = state->port; |
1650 | |
1651 | diff --git a/drivers/staging/wlags49_h2/wl_priv.c b/drivers/staging/wlags49_h2/wl_priv.c |
1652 | index c97e0e154d28..7e10dcdc3090 100644 |
1653 | --- a/drivers/staging/wlags49_h2/wl_priv.c |
1654 | +++ b/drivers/staging/wlags49_h2/wl_priv.c |
1655 | @@ -570,6 +570,7 @@ int wvlan_uil_put_info(struct uilreq *urq, struct wl_private *lp) |
1656 | ltv_t *pLtv; |
1657 | bool_t ltvAllocated = FALSE; |
1658 | ENCSTRCT sEncryption; |
1659 | + size_t len; |
1660 | |
1661 | #ifdef USE_WDS |
1662 | hcf_16 hcfPort = HCF_PORT_0; |
1663 | @@ -686,7 +687,8 @@ int wvlan_uil_put_info(struct uilreq *urq, struct wl_private *lp) |
1664 | break; |
1665 | case CFG_CNF_OWN_NAME: |
1666 | memset(lp->StationName, 0, sizeof(lp->StationName)); |
1667 | - memcpy((void *)lp->StationName, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]); |
1668 | + len = min_t(size_t, pLtv->u.u16[0], sizeof(lp->StationName)); |
1669 | + strlcpy(lp->StationName, &pLtv->u.u8[2], len); |
1670 | pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]); |
1671 | break; |
1672 | case CFG_CNF_LOAD_BALANCING: |
1673 | @@ -1783,6 +1785,7 @@ int wvlan_set_station_nickname(struct net_device *dev, |
1674 | { |
1675 | struct wl_private *lp = wl_priv(dev); |
1676 | unsigned long flags; |
1677 | + size_t len; |
1678 | int ret = 0; |
1679 | /*------------------------------------------------------------------------*/ |
1680 | |
1681 | @@ -1793,8 +1796,8 @@ int wvlan_set_station_nickname(struct net_device *dev, |
1682 | wl_lock(lp, &flags); |
1683 | |
1684 | memset(lp->StationName, 0, sizeof(lp->StationName)); |
1685 | - |
1686 | - memcpy(lp->StationName, extra, wrqu->data.length); |
1687 | + len = min_t(size_t, wrqu->data.length, sizeof(lp->StationName)); |
1688 | + strlcpy(lp->StationName, extra, len); |
1689 | |
1690 | /* Commit the adapter parameters */ |
1691 | wl_apply(lp); |
1692 | diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c |
1693 | index e992b27aa090..3250ba2594e0 100644 |
1694 | --- a/drivers/target/target_core_pscsi.c |
1695 | +++ b/drivers/target/target_core_pscsi.c |
1696 | @@ -134,10 +134,10 @@ static int pscsi_pmode_enable_hba(struct se_hba *hba, unsigned long mode_flag) |
1697 | * pSCSI Host ID and enable for phba mode |
1698 | */ |
1699 | sh = scsi_host_lookup(phv->phv_host_id); |
1700 | - if (IS_ERR(sh)) { |
1701 | + if (!sh) { |
1702 | pr_err("pSCSI: Unable to locate SCSI Host for" |
1703 | " phv_host_id: %d\n", phv->phv_host_id); |
1704 | - return PTR_ERR(sh); |
1705 | + return -EINVAL; |
1706 | } |
1707 | |
1708 | phv->phv_lld_host = sh; |
1709 | @@ -515,10 +515,10 @@ static int pscsi_configure_device(struct se_device *dev) |
1710 | sh = phv->phv_lld_host; |
1711 | } else { |
1712 | sh = scsi_host_lookup(pdv->pdv_host_id); |
1713 | - if (IS_ERR(sh)) { |
1714 | + if (!sh) { |
1715 | pr_err("pSCSI: Unable to locate" |
1716 | " pdv_host_id: %d\n", pdv->pdv_host_id); |
1717 | - return PTR_ERR(sh); |
1718 | + return -EINVAL; |
1719 | } |
1720 | } |
1721 | } else { |
1722 | diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c |
1723 | index 3b96f18593b3..4bf4bb24ee8f 100644 |
1724 | --- a/drivers/uio/uio.c |
1725 | +++ b/drivers/uio/uio.c |
1726 | @@ -630,36 +630,57 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
1727 | return 0; |
1728 | } |
1729 | |
1730 | -static const struct vm_operations_struct uio_vm_ops = { |
1731 | +static const struct vm_operations_struct uio_logical_vm_ops = { |
1732 | .open = uio_vma_open, |
1733 | .close = uio_vma_close, |
1734 | .fault = uio_vma_fault, |
1735 | }; |
1736 | |
1737 | +static int uio_mmap_logical(struct vm_area_struct *vma) |
1738 | +{ |
1739 | + vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP; |
1740 | + vma->vm_ops = &uio_logical_vm_ops; |
1741 | + uio_vma_open(vma); |
1742 | + return 0; |
1743 | +} |
1744 | + |
1745 | +static const struct vm_operations_struct uio_physical_vm_ops = { |
1746 | +#ifdef CONFIG_HAVE_IOREMAP_PROT |
1747 | + .access = generic_access_phys, |
1748 | +#endif |
1749 | +}; |
1750 | + |
1751 | static int uio_mmap_physical(struct vm_area_struct *vma) |
1752 | { |
1753 | struct uio_device *idev = vma->vm_private_data; |
1754 | int mi = uio_find_mem_index(vma); |
1755 | + struct uio_mem *mem; |
1756 | if (mi < 0) |
1757 | return -EINVAL; |
1758 | + mem = idev->info->mem + mi; |
1759 | |
1760 | + if (vma->vm_end - vma->vm_start > mem->size) |
1761 | + return -EINVAL; |
1762 | + |
1763 | + vma->vm_ops = &uio_physical_vm_ops; |
1764 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
1765 | |
1766 | + /* |
1767 | + * We cannot use the vm_iomap_memory() helper here, |
1768 | + * because vma->vm_pgoff is the map index we looked |
1769 | + * up above in uio_find_mem_index(), rather than an |
1770 | + * actual page offset into the mmap. |
1771 | + * |
1772 | + * So we just do the physical mmap without a page |
1773 | + * offset. |
1774 | + */ |
1775 | return remap_pfn_range(vma, |
1776 | vma->vm_start, |
1777 | - idev->info->mem[mi].addr >> PAGE_SHIFT, |
1778 | + mem->addr >> PAGE_SHIFT, |
1779 | vma->vm_end - vma->vm_start, |
1780 | vma->vm_page_prot); |
1781 | } |
1782 | |
1783 | -static int uio_mmap_logical(struct vm_area_struct *vma) |
1784 | -{ |
1785 | - vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP; |
1786 | - vma->vm_ops = &uio_vm_ops; |
1787 | - uio_vma_open(vma); |
1788 | - return 0; |
1789 | -} |
1790 | - |
1791 | static int uio_mmap(struct file *filep, struct vm_area_struct *vma) |
1792 | { |
1793 | struct uio_listener *listener = filep->private_data; |
1794 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
1795 | index 5b44cd47da5b..01fe36273f3b 100644 |
1796 | --- a/drivers/usb/core/quirks.c |
1797 | +++ b/drivers/usb/core/quirks.c |
1798 | @@ -97,6 +97,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
1799 | /* Alcor Micro Corp. Hub */ |
1800 | { USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME }, |
1801 | |
1802 | + /* MicroTouch Systems touchscreen */ |
1803 | + { USB_DEVICE(0x0596, 0x051e), .driver_info = USB_QUIRK_RESET_RESUME }, |
1804 | + |
1805 | /* appletouch */ |
1806 | { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, |
1807 | |
1808 | @@ -130,6 +133,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
1809 | /* Broadcom BCM92035DGROM BT dongle */ |
1810 | { USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME }, |
1811 | |
1812 | + /* MAYA44USB sound device */ |
1813 | + { USB_DEVICE(0x0a92, 0x0091), .driver_info = USB_QUIRK_RESET_RESUME }, |
1814 | + |
1815 | /* Action Semiconductor flash disk */ |
1816 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = |
1817 | USB_QUIRK_STRING_FETCH_255 }, |
1818 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
1819 | index ad5b99bd56b6..1f582d969f97 100644 |
1820 | --- a/drivers/usb/host/xhci-hub.c |
1821 | +++ b/drivers/usb/host/xhci-hub.c |
1822 | @@ -1092,18 +1092,6 @@ int xhci_bus_suspend(struct usb_hcd *hcd) |
1823 | t1 = xhci_port_state_to_neutral(t1); |
1824 | if (t1 != t2) |
1825 | xhci_writel(xhci, t2, port_array[port_index]); |
1826 | - |
1827 | - if (hcd->speed != HCD_USB3) { |
1828 | - /* enable remote wake up for USB 2.0 */ |
1829 | - __le32 __iomem *addr; |
1830 | - u32 tmp; |
1831 | - |
1832 | - /* Get the port power control register address. */ |
1833 | - addr = port_array[port_index] + PORTPMSC; |
1834 | - tmp = xhci_readl(xhci, addr); |
1835 | - tmp |= PORT_RWE; |
1836 | - xhci_writel(xhci, tmp, addr); |
1837 | - } |
1838 | } |
1839 | hcd->state = HC_STATE_SUSPENDED; |
1840 | bus_state->next_statechange = jiffies + msecs_to_jiffies(10); |
1841 | @@ -1182,20 +1170,6 @@ int xhci_bus_resume(struct usb_hcd *hcd) |
1842 | xhci_ring_device(xhci, slot_id); |
1843 | } else |
1844 | xhci_writel(xhci, temp, port_array[port_index]); |
1845 | - |
1846 | - if (hcd->speed != HCD_USB3) { |
1847 | - /* disable remote wake up for USB 2.0 */ |
1848 | - __le32 __iomem *addr; |
1849 | - u32 tmp; |
1850 | - |
1851 | - /* Add one to the port status register address to get |
1852 | - * the port power control register address. |
1853 | - */ |
1854 | - addr = port_array[port_index] + PORTPMSC; |
1855 | - tmp = xhci_readl(xhci, addr); |
1856 | - tmp &= ~PORT_RWE; |
1857 | - xhci_writel(xhci, tmp, addr); |
1858 | - } |
1859 | } |
1860 | |
1861 | (void) xhci_readl(xhci, &xhci->op_regs->command); |
1862 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c |
1863 | index 29a24ced6748..6ef8c9407e25 100644 |
1864 | --- a/drivers/usb/musb/musb_core.c |
1865 | +++ b/drivers/usb/musb/musb_core.c |
1866 | @@ -923,6 +923,52 @@ static void musb_generic_disable(struct musb *musb) |
1867 | } |
1868 | |
1869 | /* |
1870 | + * Program the HDRC to start (enable interrupts, dma, etc.). |
1871 | + */ |
1872 | +void musb_start(struct musb *musb) |
1873 | +{ |
1874 | + void __iomem *regs = musb->mregs; |
1875 | + u8 devctl = musb_readb(regs, MUSB_DEVCTL); |
1876 | + |
1877 | + dev_dbg(musb->controller, "<== devctl %02x\n", devctl); |
1878 | + |
1879 | + /* Set INT enable registers, enable interrupts */ |
1880 | + musb->intrtxe = musb->epmask; |
1881 | + musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); |
1882 | + musb->intrrxe = musb->epmask & 0xfffe; |
1883 | + musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); |
1884 | + musb_writeb(regs, MUSB_INTRUSBE, 0xf7); |
1885 | + |
1886 | + musb_writeb(regs, MUSB_TESTMODE, 0); |
1887 | + |
1888 | + /* put into basic highspeed mode and start session */ |
1889 | + musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE |
1890 | + | MUSB_POWER_HSENAB |
1891 | + /* ENSUSPEND wedges tusb */ |
1892 | + /* | MUSB_POWER_ENSUSPEND */ |
1893 | + ); |
1894 | + |
1895 | + musb->is_active = 0; |
1896 | + devctl = musb_readb(regs, MUSB_DEVCTL); |
1897 | + devctl &= ~MUSB_DEVCTL_SESSION; |
1898 | + |
1899 | + /* session started after: |
1900 | + * (a) ID-grounded irq, host mode; |
1901 | + * (b) vbus present/connect IRQ, peripheral mode; |
1902 | + * (c) peripheral initiates, using SRP |
1903 | + */ |
1904 | + if (musb->port_mode != MUSB_PORT_MODE_HOST && |
1905 | + (devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) { |
1906 | + musb->is_active = 1; |
1907 | + } else { |
1908 | + devctl |= MUSB_DEVCTL_SESSION; |
1909 | + } |
1910 | + |
1911 | + musb_platform_enable(musb); |
1912 | + musb_writeb(regs, MUSB_DEVCTL, devctl); |
1913 | +} |
1914 | + |
1915 | +/* |
1916 | * Make the HDRC stop (disable interrupts, etc.); |
1917 | * reversible by musb_start |
1918 | * called on gadget driver unregister |
1919 | diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h |
1920 | index 7d341c387eab..679dd5b82cc5 100644 |
1921 | --- a/drivers/usb/musb/musb_core.h |
1922 | +++ b/drivers/usb/musb/musb_core.h |
1923 | @@ -511,6 +511,7 @@ static inline void musb_configure_ep0(struct musb *musb) |
1924 | extern const char musb_driver_name[]; |
1925 | |
1926 | extern void musb_stop(struct musb *musb); |
1927 | +extern void musb_start(struct musb *musb); |
1928 | |
1929 | extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src); |
1930 | extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst); |
1931 | diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c |
1932 | index 0414bc19d009..d95378a68f6c 100644 |
1933 | --- a/drivers/usb/musb/musb_gadget.c |
1934 | +++ b/drivers/usb/musb/musb_gadget.c |
1935 | @@ -1842,6 +1842,8 @@ static int musb_gadget_start(struct usb_gadget *g, |
1936 | musb->xceiv->state = OTG_STATE_B_IDLE; |
1937 | spin_unlock_irqrestore(&musb->lock, flags); |
1938 | |
1939 | + musb_start(musb); |
1940 | + |
1941 | /* REVISIT: funcall to other code, which also |
1942 | * handles power budgeting ... this way also |
1943 | * ensures HdrcStart is indirectly called. |
1944 | diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c |
1945 | index a523950c2b32..d1d6b83aabca 100644 |
1946 | --- a/drivers/usb/musb/musb_virthub.c |
1947 | +++ b/drivers/usb/musb/musb_virthub.c |
1948 | @@ -44,52 +44,6 @@ |
1949 | |
1950 | #include "musb_core.h" |
1951 | |
1952 | -/* |
1953 | -* Program the HDRC to start (enable interrupts, dma, etc.). |
1954 | -*/ |
1955 | -static void musb_start(struct musb *musb) |
1956 | -{ |
1957 | - void __iomem *regs = musb->mregs; |
1958 | - u8 devctl = musb_readb(regs, MUSB_DEVCTL); |
1959 | - |
1960 | - dev_dbg(musb->controller, "<== devctl %02x\n", devctl); |
1961 | - |
1962 | - /* Set INT enable registers, enable interrupts */ |
1963 | - musb->intrtxe = musb->epmask; |
1964 | - musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); |
1965 | - musb->intrrxe = musb->epmask & 0xfffe; |
1966 | - musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); |
1967 | - musb_writeb(regs, MUSB_INTRUSBE, 0xf7); |
1968 | - |
1969 | - musb_writeb(regs, MUSB_TESTMODE, 0); |
1970 | - |
1971 | - /* put into basic highspeed mode and start session */ |
1972 | - musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE |
1973 | - | MUSB_POWER_HSENAB |
1974 | - /* ENSUSPEND wedges tusb */ |
1975 | - /* | MUSB_POWER_ENSUSPEND */ |
1976 | - ); |
1977 | - |
1978 | - musb->is_active = 0; |
1979 | - devctl = musb_readb(regs, MUSB_DEVCTL); |
1980 | - devctl &= ~MUSB_DEVCTL_SESSION; |
1981 | - |
1982 | - /* session started after: |
1983 | - * (a) ID-grounded irq, host mode; |
1984 | - * (b) vbus present/connect IRQ, peripheral mode; |
1985 | - * (c) peripheral initiates, using SRP |
1986 | - */ |
1987 | - if (musb->port_mode != MUSB_PORT_MODE_HOST && |
1988 | - (devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) { |
1989 | - musb->is_active = 1; |
1990 | - } else { |
1991 | - devctl |= MUSB_DEVCTL_SESSION; |
1992 | - } |
1993 | - |
1994 | - musb_platform_enable(musb); |
1995 | - musb_writeb(regs, MUSB_DEVCTL, devctl); |
1996 | -} |
1997 | - |
1998 | static void musb_port_suspend(struct musb *musb, bool do_suspend) |
1999 | { |
2000 | struct usb_otg *otg = musb->xceiv->otg; |
2001 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
2002 | index b65e657c641d..aa3aed5458a6 100644 |
2003 | --- a/drivers/usb/serial/ftdi_sio.c |
2004 | +++ b/drivers/usb/serial/ftdi_sio.c |
2005 | @@ -906,6 +906,7 @@ static struct usb_device_id id_table_combined [] = { |
2006 | { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, |
2007 | /* Crucible Devices */ |
2008 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, |
2009 | + { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, |
2010 | { }, /* Optional parameter entry */ |
2011 | { } /* Terminating entry */ |
2012 | }; |
2013 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
2014 | index 1b8af461b522..a7019d1e3058 100644 |
2015 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
2016 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
2017 | @@ -1307,3 +1307,9 @@ |
2018 | * Manufacturer: Crucible Technologies |
2019 | */ |
2020 | #define FTDI_CT_COMET_PID 0x8e08 |
2021 | + |
2022 | +/* |
2023 | + * Product: Z3X Box |
2024 | + * Manufacturer: Smart GSM Team |
2025 | + */ |
2026 | +#define FTDI_Z3X_PID 0x0011 |
2027 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
2028 | index f1507c052a2e..acaee066b99a 100644 |
2029 | --- a/drivers/usb/serial/option.c |
2030 | +++ b/drivers/usb/serial/option.c |
2031 | @@ -693,6 +693,222 @@ static const struct usb_device_id option_ids[] = { |
2032 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) }, |
2033 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7B) }, |
2034 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7C) }, |
2035 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x01) }, |
2036 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x02) }, |
2037 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x03) }, |
2038 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x04) }, |
2039 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x05) }, |
2040 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x06) }, |
2041 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0A) }, |
2042 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0B) }, |
2043 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0D) }, |
2044 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0E) }, |
2045 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0F) }, |
2046 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x10) }, |
2047 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x12) }, |
2048 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x13) }, |
2049 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x14) }, |
2050 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x15) }, |
2051 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x17) }, |
2052 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x18) }, |
2053 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x19) }, |
2054 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1A) }, |
2055 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1B) }, |
2056 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1C) }, |
2057 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x31) }, |
2058 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x32) }, |
2059 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x33) }, |
2060 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x34) }, |
2061 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x35) }, |
2062 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x36) }, |
2063 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3A) }, |
2064 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3B) }, |
2065 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3D) }, |
2066 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3E) }, |
2067 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3F) }, |
2068 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x48) }, |
2069 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x49) }, |
2070 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4A) }, |
2071 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4B) }, |
2072 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4C) }, |
2073 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x61) }, |
2074 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x62) }, |
2075 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x63) }, |
2076 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x64) }, |
2077 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x65) }, |
2078 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x66) }, |
2079 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6A) }, |
2080 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6B) }, |
2081 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) }, |
2082 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) }, |
2083 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) }, |
2084 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) }, |
2085 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) }, |
2086 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) }, |
2087 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7B) }, |
2088 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7C) }, |
2089 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x01) }, |
2090 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x02) }, |
2091 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x03) }, |
2092 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x04) }, |
2093 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x05) }, |
2094 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x06) }, |
2095 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0A) }, |
2096 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0B) }, |
2097 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0D) }, |
2098 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0E) }, |
2099 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0F) }, |
2100 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x10) }, |
2101 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x12) }, |
2102 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x13) }, |
2103 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x14) }, |
2104 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x15) }, |
2105 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x17) }, |
2106 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x18) }, |
2107 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x19) }, |
2108 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1A) }, |
2109 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1B) }, |
2110 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1C) }, |
2111 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x31) }, |
2112 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x32) }, |
2113 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x33) }, |
2114 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x34) }, |
2115 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x35) }, |
2116 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x36) }, |
2117 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3A) }, |
2118 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3B) }, |
2119 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3D) }, |
2120 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3E) }, |
2121 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3F) }, |
2122 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x48) }, |
2123 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x49) }, |
2124 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4A) }, |
2125 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4B) }, |
2126 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4C) }, |
2127 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x61) }, |
2128 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x62) }, |
2129 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x63) }, |
2130 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x64) }, |
2131 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x65) }, |
2132 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x66) }, |
2133 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6A) }, |
2134 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6B) }, |
2135 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) }, |
2136 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) }, |
2137 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) }, |
2138 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) }, |
2139 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) }, |
2140 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) }, |
2141 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7B) }, |
2142 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7C) }, |
2143 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x01) }, |
2144 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x02) }, |
2145 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x03) }, |
2146 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x04) }, |
2147 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x05) }, |
2148 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x06) }, |
2149 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0A) }, |
2150 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0B) }, |
2151 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0D) }, |
2152 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0E) }, |
2153 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0F) }, |
2154 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x10) }, |
2155 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x12) }, |
2156 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x13) }, |
2157 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x14) }, |
2158 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x15) }, |
2159 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x17) }, |
2160 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x18) }, |
2161 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x19) }, |
2162 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1A) }, |
2163 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1B) }, |
2164 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1C) }, |
2165 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x31) }, |
2166 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x32) }, |
2167 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x33) }, |
2168 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x34) }, |
2169 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x35) }, |
2170 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x36) }, |
2171 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3A) }, |
2172 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3B) }, |
2173 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3D) }, |
2174 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3E) }, |
2175 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3F) }, |
2176 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x48) }, |
2177 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x49) }, |
2178 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4A) }, |
2179 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4B) }, |
2180 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4C) }, |
2181 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x61) }, |
2182 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x62) }, |
2183 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x63) }, |
2184 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x64) }, |
2185 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x65) }, |
2186 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x66) }, |
2187 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6A) }, |
2188 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6B) }, |
2189 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) }, |
2190 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) }, |
2191 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) }, |
2192 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) }, |
2193 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) }, |
2194 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) }, |
2195 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7B) }, |
2196 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7C) }, |
2197 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x01) }, |
2198 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x02) }, |
2199 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x03) }, |
2200 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x04) }, |
2201 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x05) }, |
2202 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x06) }, |
2203 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0A) }, |
2204 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0B) }, |
2205 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0D) }, |
2206 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0E) }, |
2207 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0F) }, |
2208 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x10) }, |
2209 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x12) }, |
2210 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x13) }, |
2211 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x14) }, |
2212 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x15) }, |
2213 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x17) }, |
2214 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x18) }, |
2215 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x19) }, |
2216 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1A) }, |
2217 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1B) }, |
2218 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1C) }, |
2219 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x31) }, |
2220 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x32) }, |
2221 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x33) }, |
2222 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x34) }, |
2223 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x35) }, |
2224 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x36) }, |
2225 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3A) }, |
2226 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3B) }, |
2227 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3D) }, |
2228 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3E) }, |
2229 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3F) }, |
2230 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x48) }, |
2231 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x49) }, |
2232 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4A) }, |
2233 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4B) }, |
2234 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4C) }, |
2235 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x61) }, |
2236 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x62) }, |
2237 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x63) }, |
2238 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x64) }, |
2239 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x65) }, |
2240 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x66) }, |
2241 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6A) }, |
2242 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6B) }, |
2243 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) }, |
2244 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) }, |
2245 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) }, |
2246 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) }, |
2247 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) }, |
2248 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) }, |
2249 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7B) }, |
2250 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7C) }, |
2251 | |
2252 | |
2253 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, |
2254 | diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c |
2255 | index 92b05d95ec5e..5db153260827 100644 |
2256 | --- a/drivers/usb/storage/scsiglue.c |
2257 | +++ b/drivers/usb/storage/scsiglue.c |
2258 | @@ -211,8 +211,11 @@ static int slave_configure(struct scsi_device *sdev) |
2259 | /* |
2260 | * Many devices do not respond properly to READ_CAPACITY_16. |
2261 | * Tell the SCSI layer to try READ_CAPACITY_10 first. |
2262 | + * However some USB 3.0 drive enclosures return capacity |
2263 | + * modulo 2TB. Those must use READ_CAPACITY_16 |
2264 | */ |
2265 | - sdev->try_rc_10_first = 1; |
2266 | + if (!(us->fflags & US_FL_NEEDS_CAP16)) |
2267 | + sdev->try_rc_10_first = 1; |
2268 | |
2269 | /* assume SPC3 or latter devices support sense size > 18 */ |
2270 | if (sdev->scsi_level > SCSI_SPC_2) |
2271 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
2272 | index c015f2c16729..de32cfa5bfa6 100644 |
2273 | --- a/drivers/usb/storage/unusual_devs.h |
2274 | +++ b/drivers/usb/storage/unusual_devs.h |
2275 | @@ -1925,6 +1925,13 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201, |
2276 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2277 | US_FL_IGNORE_RESIDUE ), |
2278 | |
2279 | +/* Reported by Oliver Neukum <oneukum@suse.com> */ |
2280 | +UNUSUAL_DEV( 0x174c, 0x55aa, 0x0100, 0x0100, |
2281 | + "ASMedia", |
2282 | + "AS2105", |
2283 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2284 | + US_FL_NEEDS_CAP16), |
2285 | + |
2286 | /* Reported by Jesse Feddema <jdfeddema@gmail.com> */ |
2287 | UNUSUAL_DEV( 0x177f, 0x0400, 0x0000, 0x0000, |
2288 | "Yarvik", |
2289 | diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c |
2290 | index 0c27c7df1b09..1869237efbed 100644 |
2291 | --- a/drivers/vhost/scsi.c |
2292 | +++ b/drivers/vhost/scsi.c |
2293 | @@ -1030,7 +1030,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) |
2294 | if (data_direction != DMA_NONE) { |
2295 | ret = vhost_scsi_map_iov_to_sgl(cmd, |
2296 | &vq->iov[data_first], data_num, |
2297 | - data_direction == DMA_TO_DEVICE); |
2298 | + data_direction == DMA_FROM_DEVICE); |
2299 | if (unlikely(ret)) { |
2300 | vq_err(vq, "Failed to map iov to sgl\n"); |
2301 | goto err_free; |
2302 | diff --git a/drivers/video/au1100fb.c b/drivers/video/au1100fb.c |
2303 | index a54ccdc4d661..22ad85242e5b 100644 |
2304 | --- a/drivers/video/au1100fb.c |
2305 | +++ b/drivers/video/au1100fb.c |
2306 | @@ -361,37 +361,13 @@ void au1100fb_fb_rotate(struct fb_info *fbi, int angle) |
2307 | int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) |
2308 | { |
2309 | struct au1100fb_device *fbdev; |
2310 | - unsigned int len; |
2311 | - unsigned long start=0, off; |
2312 | |
2313 | fbdev = to_au1100fb_device(fbi); |
2314 | |
2315 | - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) { |
2316 | - return -EINVAL; |
2317 | - } |
2318 | - |
2319 | - start = fbdev->fb_phys & PAGE_MASK; |
2320 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + fbdev->fb_len); |
2321 | - |
2322 | - off = vma->vm_pgoff << PAGE_SHIFT; |
2323 | - |
2324 | - if ((vma->vm_end - vma->vm_start + off) > len) { |
2325 | - return -EINVAL; |
2326 | - } |
2327 | - |
2328 | - off += start; |
2329 | - vma->vm_pgoff = off >> PAGE_SHIFT; |
2330 | - |
2331 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
2332 | pgprot_val(vma->vm_page_prot) |= (6 << 9); //CCA=6 |
2333 | |
2334 | - if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, |
2335 | - vma->vm_end - vma->vm_start, |
2336 | - vma->vm_page_prot)) { |
2337 | - return -EAGAIN; |
2338 | - } |
2339 | - |
2340 | - return 0; |
2341 | + return vm_iomap_memory(vma, fbdev->fb_phys, fbdev->fb_len); |
2342 | } |
2343 | |
2344 | static struct fb_ops au1100fb_ops = |
2345 | diff --git a/drivers/video/au1200fb.c b/drivers/video/au1200fb.c |
2346 | index 301224ecc950..1d02897d17f2 100644 |
2347 | --- a/drivers/video/au1200fb.c |
2348 | +++ b/drivers/video/au1200fb.c |
2349 | @@ -1233,34 +1233,13 @@ static int au1200fb_fb_blank(int blank_mode, struct fb_info *fbi) |
2350 | * method mainly to allow the use of the TLB streaming flag (CCA=6) |
2351 | */ |
2352 | static int au1200fb_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) |
2353 | - |
2354 | { |
2355 | - unsigned int len; |
2356 | - unsigned long start=0, off; |
2357 | struct au1200fb_device *fbdev = info->par; |
2358 | |
2359 | - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) { |
2360 | - return -EINVAL; |
2361 | - } |
2362 | - |
2363 | - start = fbdev->fb_phys & PAGE_MASK; |
2364 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + fbdev->fb_len); |
2365 | - |
2366 | - off = vma->vm_pgoff << PAGE_SHIFT; |
2367 | - |
2368 | - if ((vma->vm_end - vma->vm_start + off) > len) { |
2369 | - return -EINVAL; |
2370 | - } |
2371 | - |
2372 | - off += start; |
2373 | - vma->vm_pgoff = off >> PAGE_SHIFT; |
2374 | - |
2375 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
2376 | pgprot_val(vma->vm_page_prot) |= _CACHE_MASK; /* CCA=7 */ |
2377 | |
2378 | - return io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, |
2379 | - vma->vm_end - vma->vm_start, |
2380 | - vma->vm_page_prot); |
2381 | + return vm_iomap_memory(vma, fbdev->fb_phys, fbdev->fb_len); |
2382 | } |
2383 | |
2384 | static void set_global(u_int cmd, struct au1200_lcd_global_regs_t *pdata) |
2385 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c |
2386 | index 85ea98d139fc..40cfef58dcc3 100644 |
2387 | --- a/fs/cifs/cifsfs.c |
2388 | +++ b/fs/cifs/cifsfs.c |
2389 | @@ -120,14 +120,16 @@ cifs_read_super(struct super_block *sb) |
2390 | { |
2391 | struct inode *inode; |
2392 | struct cifs_sb_info *cifs_sb; |
2393 | + struct cifs_tcon *tcon; |
2394 | int rc = 0; |
2395 | |
2396 | cifs_sb = CIFS_SB(sb); |
2397 | + tcon = cifs_sb_master_tcon(cifs_sb); |
2398 | |
2399 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL) |
2400 | sb->s_flags |= MS_POSIXACL; |
2401 | |
2402 | - if (cifs_sb_master_tcon(cifs_sb)->ses->capabilities & CAP_LARGE_FILES) |
2403 | + if (tcon->ses->capabilities & tcon->ses->server->vals->cap_large_files) |
2404 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
2405 | else |
2406 | sb->s_maxbytes = MAX_NON_LFS; |
2407 | @@ -147,7 +149,7 @@ cifs_read_super(struct super_block *sb) |
2408 | goto out_no_root; |
2409 | } |
2410 | |
2411 | - if (cifs_sb_master_tcon(cifs_sb)->nocase) |
2412 | + if (tcon->nocase) |
2413 | sb->s_d_op = &cifs_ci_dentry_ops; |
2414 | else |
2415 | sb->s_d_op = &cifs_dentry_ops; |
2416 | diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c |
2417 | index d10757635b9c..40db6880cdd6 100644 |
2418 | --- a/fs/ecryptfs/crypto.c |
2419 | +++ b/fs/ecryptfs/crypto.c |
2420 | @@ -408,7 +408,7 @@ static loff_t lower_offset_for_page(struct ecryptfs_crypt_stat *crypt_stat, |
2421 | struct page *page) |
2422 | { |
2423 | return ecryptfs_lower_header_size(crypt_stat) + |
2424 | - (page->index << PAGE_CACHE_SHIFT); |
2425 | + ((loff_t)page->index << PAGE_CACHE_SHIFT); |
2426 | } |
2427 | |
2428 | /** |
2429 | diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c |
2430 | index 7d52806c2119..4725a07f003c 100644 |
2431 | --- a/fs/ecryptfs/keystore.c |
2432 | +++ b/fs/ecryptfs/keystore.c |
2433 | @@ -1149,7 +1149,7 @@ decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, |
2434 | struct ecryptfs_msg_ctx *msg_ctx; |
2435 | struct ecryptfs_message *msg = NULL; |
2436 | char *auth_tok_sig; |
2437 | - char *payload; |
2438 | + char *payload = NULL; |
2439 | size_t payload_len = 0; |
2440 | int rc; |
2441 | |
2442 | @@ -1203,6 +1203,7 @@ decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, |
2443 | } |
2444 | out: |
2445 | kfree(msg); |
2446 | + kfree(payload); |
2447 | return rc; |
2448 | } |
2449 | |
2450 | diff --git a/fs/eventpoll.c b/fs/eventpoll.c |
2451 | index 9ad17b15b454..0f0f73624a88 100644 |
2452 | --- a/fs/eventpoll.c |
2453 | +++ b/fs/eventpoll.c |
2454 | @@ -34,7 +34,6 @@ |
2455 | #include <linux/mutex.h> |
2456 | #include <linux/anon_inodes.h> |
2457 | #include <linux/device.h> |
2458 | -#include <linux/freezer.h> |
2459 | #include <asm/uaccess.h> |
2460 | #include <asm/io.h> |
2461 | #include <asm/mman.h> |
2462 | @@ -1603,8 +1602,7 @@ fetch_events: |
2463 | } |
2464 | |
2465 | spin_unlock_irqrestore(&ep->lock, flags); |
2466 | - if (!freezable_schedule_hrtimeout_range(to, slack, |
2467 | - HRTIMER_MODE_ABS)) |
2468 | + if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS)) |
2469 | timed_out = 1; |
2470 | |
2471 | spin_lock_irqsave(&ep->lock, flags); |
2472 | diff --git a/fs/jfs/jfs_inode.c b/fs/jfs/jfs_inode.c |
2473 | index c1a3e603279c..7f464c513ba0 100644 |
2474 | --- a/fs/jfs/jfs_inode.c |
2475 | +++ b/fs/jfs/jfs_inode.c |
2476 | @@ -95,7 +95,7 @@ struct inode *ialloc(struct inode *parent, umode_t mode) |
2477 | |
2478 | if (insert_inode_locked(inode) < 0) { |
2479 | rc = -EINVAL; |
2480 | - goto fail_unlock; |
2481 | + goto fail_put; |
2482 | } |
2483 | |
2484 | inode_init_owner(inode, parent, mode); |
2485 | @@ -156,7 +156,6 @@ struct inode *ialloc(struct inode *parent, umode_t mode) |
2486 | fail_drop: |
2487 | dquot_drop(inode); |
2488 | inode->i_flags |= S_NOQUOTA; |
2489 | -fail_unlock: |
2490 | clear_nlink(inode); |
2491 | unlock_new_inode(inode); |
2492 | fail_put: |
2493 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c |
2494 | index 107d026f5d6e..7a9e255f195d 100644 |
2495 | --- a/fs/proc/task_mmu.c |
2496 | +++ b/fs/proc/task_mmu.c |
2497 | @@ -938,6 +938,8 @@ static void pte_to_pagemap_entry(pagemap_entry_t *pme, struct pagemapread *pm, |
2498 | frame = pte_pfn(pte); |
2499 | flags = PM_PRESENT; |
2500 | page = vm_normal_page(vma, addr, pte); |
2501 | + if (pte_soft_dirty(pte)) |
2502 | + flags2 |= __PM_SOFT_DIRTY; |
2503 | } else if (is_swap_pte(pte)) { |
2504 | swp_entry_t entry; |
2505 | if (pte_swp_soft_dirty(pte)) |
2506 | @@ -955,8 +957,6 @@ static void pte_to_pagemap_entry(pagemap_entry_t *pme, struct pagemapread *pm, |
2507 | |
2508 | if (page && !PageAnon(page)) |
2509 | flags |= PM_FILE; |
2510 | - if (pte_soft_dirty(pte)) |
2511 | - flags2 |= __PM_SOFT_DIRTY; |
2512 | |
2513 | *pme = make_pme(PM_PFRAME(frame) | PM_STATUS2(pm->v2, flags2) | flags); |
2514 | } |
2515 | diff --git a/fs/select.c b/fs/select.c |
2516 | index 35d4adc749d9..dfd5cb18c012 100644 |
2517 | --- a/fs/select.c |
2518 | +++ b/fs/select.c |
2519 | @@ -238,8 +238,7 @@ int poll_schedule_timeout(struct poll_wqueues *pwq, int state, |
2520 | |
2521 | set_current_state(state); |
2522 | if (!pwq->triggered) |
2523 | - rc = freezable_schedule_hrtimeout_range(expires, slack, |
2524 | - HRTIMER_MODE_ABS); |
2525 | + rc = schedule_hrtimeout_range(expires, slack, HRTIMER_MODE_ABS); |
2526 | __set_current_state(TASK_RUNNING); |
2527 | |
2528 | /* |
2529 | diff --git a/fs/seq_file.c b/fs/seq_file.c |
2530 | index 3135c2525c76..a290157265ef 100644 |
2531 | --- a/fs/seq_file.c |
2532 | +++ b/fs/seq_file.c |
2533 | @@ -328,6 +328,8 @@ loff_t seq_lseek(struct file *file, loff_t offset, int whence) |
2534 | m->read_pos = offset; |
2535 | retval = file->f_pos = offset; |
2536 | } |
2537 | + } else { |
2538 | + file->f_pos = offset; |
2539 | } |
2540 | } |
2541 | file->f_version = m->version; |
2542 | diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h |
2543 | index bf99cd01be20..630356866030 100644 |
2544 | --- a/include/linux/usb_usual.h |
2545 | +++ b/include/linux/usb_usual.h |
2546 | @@ -66,7 +66,9 @@ |
2547 | US_FLAG(INITIAL_READ10, 0x00100000) \ |
2548 | /* Initial READ(10) (and others) must be retried */ \ |
2549 | US_FLAG(WRITE_CACHE, 0x00200000) \ |
2550 | - /* Write Cache status is not available */ |
2551 | + /* Write Cache status is not available */ \ |
2552 | + US_FLAG(NEEDS_CAP16, 0x00400000) |
2553 | + /* cannot handle READ_CAPACITY_10 */ |
2554 | |
2555 | #define US_FLAG(name, value) US_FL_##name = value , |
2556 | enum { US_DO_ALL_FLAGS }; |
2557 | diff --git a/include/trace/events/target.h b/include/trace/events/target.h |
2558 | index aef8fc354025..da9cc0f05c93 100644 |
2559 | --- a/include/trace/events/target.h |
2560 | +++ b/include/trace/events/target.h |
2561 | @@ -144,7 +144,7 @@ TRACE_EVENT(target_sequencer_start, |
2562 | ), |
2563 | |
2564 | TP_fast_assign( |
2565 | - __entry->unpacked_lun = cmd->se_lun->unpacked_lun; |
2566 | + __entry->unpacked_lun = cmd->orig_fe_lun; |
2567 | __entry->opcode = cmd->t_task_cdb[0]; |
2568 | __entry->data_length = cmd->data_length; |
2569 | __entry->task_attribute = cmd->sam_task_attr; |
2570 | @@ -182,7 +182,7 @@ TRACE_EVENT(target_cmd_complete, |
2571 | ), |
2572 | |
2573 | TP_fast_assign( |
2574 | - __entry->unpacked_lun = cmd->se_lun->unpacked_lun; |
2575 | + __entry->unpacked_lun = cmd->orig_fe_lun; |
2576 | __entry->opcode = cmd->t_task_cdb[0]; |
2577 | __entry->data_length = cmd->data_length; |
2578 | __entry->task_attribute = cmd->sam_task_attr; |
2579 | diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h |
2580 | index 53db7cea373b..7830754c9b4a 100644 |
2581 | --- a/include/uapi/drm/drm_mode.h |
2582 | +++ b/include/uapi/drm/drm_mode.h |
2583 | @@ -223,6 +223,8 @@ struct drm_mode_get_connector { |
2584 | __u32 connection; |
2585 | __u32 mm_width, mm_height; /**< HxW in millimeters */ |
2586 | __u32 subpixel; |
2587 | + |
2588 | + __u32 pad; |
2589 | }; |
2590 | |
2591 | #define DRM_MODE_PROP_PENDING (1<<0) |
2592 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
2593 | index e91963302c0d..d22f5977a31b 100644 |
2594 | --- a/kernel/cgroup.c |
2595 | +++ b/kernel/cgroup.c |
2596 | @@ -2054,7 +2054,7 @@ static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, |
2597 | |
2598 | /* @tsk either already exited or can't exit until the end */ |
2599 | if (tsk->flags & PF_EXITING) |
2600 | - continue; |
2601 | + goto next; |
2602 | |
2603 | /* as per above, nr_threads may decrease, but not increase. */ |
2604 | BUG_ON(i >= group_size); |
2605 | @@ -2062,7 +2062,7 @@ static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, |
2606 | ent.cgrp = task_cgroup_from_root(tsk, root); |
2607 | /* nothing to do if this task is already in the cgroup */ |
2608 | if (ent.cgrp == cgrp) |
2609 | - continue; |
2610 | + goto next; |
2611 | /* |
2612 | * saying GFP_ATOMIC has no effect here because we did prealloc |
2613 | * earlier, but it's good form to communicate our expectations. |
2614 | @@ -2070,7 +2070,7 @@ static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, |
2615 | retval = flex_array_put(group, i, &ent, GFP_ATOMIC); |
2616 | BUG_ON(retval != 0); |
2617 | i++; |
2618 | - |
2619 | + next: |
2620 | if (!threadgroup) |
2621 | break; |
2622 | } while_each_thread(leader, tsk); |
2623 | diff --git a/kernel/mutex.c b/kernel/mutex.c |
2624 | index a52ee7bb830d..a2b80f162f39 100644 |
2625 | --- a/kernel/mutex.c |
2626 | +++ b/kernel/mutex.c |
2627 | @@ -408,7 +408,7 @@ ww_mutex_set_context_fastpath(struct ww_mutex *lock, |
2628 | static __always_inline int __sched |
2629 | __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, |
2630 | struct lockdep_map *nest_lock, unsigned long ip, |
2631 | - struct ww_acquire_ctx *ww_ctx) |
2632 | + struct ww_acquire_ctx *ww_ctx, const bool use_ww_ctx) |
2633 | { |
2634 | struct task_struct *task = current; |
2635 | struct mutex_waiter waiter; |
2636 | @@ -448,7 +448,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, |
2637 | struct task_struct *owner; |
2638 | struct mspin_node node; |
2639 | |
2640 | - if (!__builtin_constant_p(ww_ctx == NULL) && ww_ctx->acquired > 0) { |
2641 | + if (use_ww_ctx && ww_ctx->acquired > 0) { |
2642 | struct ww_mutex *ww; |
2643 | |
2644 | ww = container_of(lock, struct ww_mutex, base); |
2645 | @@ -478,7 +478,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, |
2646 | if ((atomic_read(&lock->count) == 1) && |
2647 | (atomic_cmpxchg(&lock->count, 1, 0) == 1)) { |
2648 | lock_acquired(&lock->dep_map, ip); |
2649 | - if (!__builtin_constant_p(ww_ctx == NULL)) { |
2650 | + if (use_ww_ctx) { |
2651 | struct ww_mutex *ww; |
2652 | ww = container_of(lock, struct ww_mutex, base); |
2653 | |
2654 | @@ -548,7 +548,7 @@ slowpath: |
2655 | goto err; |
2656 | } |
2657 | |
2658 | - if (!__builtin_constant_p(ww_ctx == NULL) && ww_ctx->acquired > 0) { |
2659 | + if (use_ww_ctx && ww_ctx->acquired > 0) { |
2660 | ret = __mutex_lock_check_stamp(lock, ww_ctx); |
2661 | if (ret) |
2662 | goto err; |
2663 | @@ -568,7 +568,7 @@ done: |
2664 | mutex_remove_waiter(lock, &waiter, current_thread_info()); |
2665 | mutex_set_owner(lock); |
2666 | |
2667 | - if (!__builtin_constant_p(ww_ctx == NULL)) { |
2668 | + if (use_ww_ctx) { |
2669 | struct ww_mutex *ww = container_of(lock, |
2670 | struct ww_mutex, |
2671 | base); |
2672 | @@ -618,7 +618,7 @@ mutex_lock_nested(struct mutex *lock, unsigned int subclass) |
2673 | { |
2674 | might_sleep(); |
2675 | __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, |
2676 | - subclass, NULL, _RET_IP_, NULL); |
2677 | + subclass, NULL, _RET_IP_, NULL, 0); |
2678 | } |
2679 | |
2680 | EXPORT_SYMBOL_GPL(mutex_lock_nested); |
2681 | @@ -628,7 +628,7 @@ _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest) |
2682 | { |
2683 | might_sleep(); |
2684 | __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, |
2685 | - 0, nest, _RET_IP_, NULL); |
2686 | + 0, nest, _RET_IP_, NULL, 0); |
2687 | } |
2688 | |
2689 | EXPORT_SYMBOL_GPL(_mutex_lock_nest_lock); |
2690 | @@ -638,7 +638,7 @@ mutex_lock_killable_nested(struct mutex *lock, unsigned int subclass) |
2691 | { |
2692 | might_sleep(); |
2693 | return __mutex_lock_common(lock, TASK_KILLABLE, |
2694 | - subclass, NULL, _RET_IP_, NULL); |
2695 | + subclass, NULL, _RET_IP_, NULL, 0); |
2696 | } |
2697 | EXPORT_SYMBOL_GPL(mutex_lock_killable_nested); |
2698 | |
2699 | @@ -647,7 +647,7 @@ mutex_lock_interruptible_nested(struct mutex *lock, unsigned int subclass) |
2700 | { |
2701 | might_sleep(); |
2702 | return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, |
2703 | - subclass, NULL, _RET_IP_, NULL); |
2704 | + subclass, NULL, _RET_IP_, NULL, 0); |
2705 | } |
2706 | |
2707 | EXPORT_SYMBOL_GPL(mutex_lock_interruptible_nested); |
2708 | @@ -685,7 +685,7 @@ __ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) |
2709 | |
2710 | might_sleep(); |
2711 | ret = __mutex_lock_common(&lock->base, TASK_UNINTERRUPTIBLE, |
2712 | - 0, &ctx->dep_map, _RET_IP_, ctx); |
2713 | + 0, &ctx->dep_map, _RET_IP_, ctx, 1); |
2714 | if (!ret && ctx->acquired > 1) |
2715 | return ww_mutex_deadlock_injection(lock, ctx); |
2716 | |
2717 | @@ -700,7 +700,7 @@ __ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) |
2718 | |
2719 | might_sleep(); |
2720 | ret = __mutex_lock_common(&lock->base, TASK_INTERRUPTIBLE, |
2721 | - 0, &ctx->dep_map, _RET_IP_, ctx); |
2722 | + 0, &ctx->dep_map, _RET_IP_, ctx, 1); |
2723 | |
2724 | if (!ret && ctx->acquired > 1) |
2725 | return ww_mutex_deadlock_injection(lock, ctx); |
2726 | @@ -812,28 +812,28 @@ __mutex_lock_slowpath(atomic_t *lock_count) |
2727 | struct mutex *lock = container_of(lock_count, struct mutex, count); |
2728 | |
2729 | __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0, |
2730 | - NULL, _RET_IP_, NULL); |
2731 | + NULL, _RET_IP_, NULL, 0); |
2732 | } |
2733 | |
2734 | static noinline int __sched |
2735 | __mutex_lock_killable_slowpath(struct mutex *lock) |
2736 | { |
2737 | return __mutex_lock_common(lock, TASK_KILLABLE, 0, |
2738 | - NULL, _RET_IP_, NULL); |
2739 | + NULL, _RET_IP_, NULL, 0); |
2740 | } |
2741 | |
2742 | static noinline int __sched |
2743 | __mutex_lock_interruptible_slowpath(struct mutex *lock) |
2744 | { |
2745 | return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, 0, |
2746 | - NULL, _RET_IP_, NULL); |
2747 | + NULL, _RET_IP_, NULL, 0); |
2748 | } |
2749 | |
2750 | static noinline int __sched |
2751 | __ww_mutex_lock_slowpath(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) |
2752 | { |
2753 | return __mutex_lock_common(&lock->base, TASK_UNINTERRUPTIBLE, 0, |
2754 | - NULL, _RET_IP_, ctx); |
2755 | + NULL, _RET_IP_, ctx, 1); |
2756 | } |
2757 | |
2758 | static noinline int __sched |
2759 | @@ -841,7 +841,7 @@ __ww_mutex_lock_interruptible_slowpath(struct ww_mutex *lock, |
2760 | struct ww_acquire_ctx *ctx) |
2761 | { |
2762 | return __mutex_lock_common(&lock->base, TASK_INTERRUPTIBLE, 0, |
2763 | - NULL, _RET_IP_, ctx); |
2764 | + NULL, _RET_IP_, ctx, 1); |
2765 | } |
2766 | |
2767 | #endif |
2768 | diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c |
2769 | index 38959c866789..662c5798a685 100644 |
2770 | --- a/kernel/time/clockevents.c |
2771 | +++ b/kernel/time/clockevents.c |
2772 | @@ -33,29 +33,64 @@ struct ce_unbind { |
2773 | int res; |
2774 | }; |
2775 | |
2776 | -/** |
2777 | - * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds |
2778 | - * @latch: value to convert |
2779 | - * @evt: pointer to clock event device descriptor |
2780 | - * |
2781 | - * Math helper, returns latch value converted to nanoseconds (bound checked) |
2782 | - */ |
2783 | -u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt) |
2784 | +static u64 cev_delta2ns(unsigned long latch, struct clock_event_device *evt, |
2785 | + bool ismax) |
2786 | { |
2787 | u64 clc = (u64) latch << evt->shift; |
2788 | + u64 rnd; |
2789 | |
2790 | if (unlikely(!evt->mult)) { |
2791 | evt->mult = 1; |
2792 | WARN_ON(1); |
2793 | } |
2794 | + rnd = (u64) evt->mult - 1; |
2795 | + |
2796 | + /* |
2797 | + * Upper bound sanity check. If the backwards conversion is |
2798 | + * not equal latch, we know that the above shift overflowed. |
2799 | + */ |
2800 | + if ((clc >> evt->shift) != (u64)latch) |
2801 | + clc = ~0ULL; |
2802 | + |
2803 | + /* |
2804 | + * Scaled math oddities: |
2805 | + * |
2806 | + * For mult <= (1 << shift) we can safely add mult - 1 to |
2807 | + * prevent integer rounding loss. So the backwards conversion |
2808 | + * from nsec to device ticks will be correct. |
2809 | + * |
2810 | + * For mult > (1 << shift), i.e. device frequency is > 1GHz we |
2811 | + * need to be careful. Adding mult - 1 will result in a value |
2812 | + * which when converted back to device ticks can be larger |
2813 | + * than latch by up to (mult - 1) >> shift. For the min_delta |
2814 | + * calculation we still want to apply this in order to stay |
2815 | + * above the minimum device ticks limit. For the upper limit |
2816 | + * we would end up with a latch value larger than the upper |
2817 | + * limit of the device, so we omit the add to stay below the |
2818 | + * device upper boundary. |
2819 | + * |
2820 | + * Also omit the add if it would overflow the u64 boundary. |
2821 | + */ |
2822 | + if ((~0ULL - clc > rnd) && |
2823 | + (!ismax || evt->mult <= (1U << evt->shift))) |
2824 | + clc += rnd; |
2825 | |
2826 | do_div(clc, evt->mult); |
2827 | - if (clc < 1000) |
2828 | - clc = 1000; |
2829 | - if (clc > KTIME_MAX) |
2830 | - clc = KTIME_MAX; |
2831 | |
2832 | - return clc; |
2833 | + /* Deltas less than 1usec are pointless noise */ |
2834 | + return clc > 1000 ? clc : 1000; |
2835 | +} |
2836 | + |
2837 | +/** |
2838 | + * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds |
2839 | + * @latch: value to convert |
2840 | + * @evt: pointer to clock event device descriptor |
2841 | + * |
2842 | + * Math helper, returns latch value converted to nanoseconds (bound checked) |
2843 | + */ |
2844 | +u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt) |
2845 | +{ |
2846 | + return cev_delta2ns(latch, evt, false); |
2847 | } |
2848 | EXPORT_SYMBOL_GPL(clockevent_delta2ns); |
2849 | |
2850 | @@ -380,8 +415,8 @@ void clockevents_config(struct clock_event_device *dev, u32 freq) |
2851 | sec = 600; |
2852 | |
2853 | clockevents_calc_mult_shift(dev, freq, sec); |
2854 | - dev->min_delta_ns = clockevent_delta2ns(dev->min_delta_ticks, dev); |
2855 | - dev->max_delta_ns = clockevent_delta2ns(dev->max_delta_ticks, dev); |
2856 | + dev->min_delta_ns = cev_delta2ns(dev->min_delta_ticks, dev, false); |
2857 | + dev->max_delta_ns = cev_delta2ns(dev->max_delta_ticks, dev, true); |
2858 | } |
2859 | |
2860 | /** |
2861 | diff --git a/lib/scatterlist.c b/lib/scatterlist.c |
2862 | index a685c8a79578..d16fa295ae1d 100644 |
2863 | --- a/lib/scatterlist.c |
2864 | +++ b/lib/scatterlist.c |
2865 | @@ -577,7 +577,8 @@ void sg_miter_stop(struct sg_mapping_iter *miter) |
2866 | miter->__offset += miter->consumed; |
2867 | miter->__remaining -= miter->consumed; |
2868 | |
2869 | - if (miter->__flags & SG_MITER_TO_SG) |
2870 | + if ((miter->__flags & SG_MITER_TO_SG) && |
2871 | + !PageSlab(miter->page)) |
2872 | flush_kernel_dcache_page(miter->page); |
2873 | |
2874 | if (miter->__flags & SG_MITER_ATOMIC) { |
2875 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
2876 | index 70861a1fdd64..12acb0ba7991 100644 |
2877 | --- a/mm/huge_memory.c |
2878 | +++ b/mm/huge_memory.c |
2879 | @@ -1290,64 +1290,90 @@ out: |
2880 | int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
2881 | unsigned long addr, pmd_t pmd, pmd_t *pmdp) |
2882 | { |
2883 | + struct anon_vma *anon_vma = NULL; |
2884 | struct page *page; |
2885 | unsigned long haddr = addr & HPAGE_PMD_MASK; |
2886 | + int page_nid = -1, this_nid = numa_node_id(); |
2887 | int target_nid; |
2888 | - int current_nid = -1; |
2889 | - bool migrated; |
2890 | + bool page_locked; |
2891 | + bool migrated = false; |
2892 | |
2893 | spin_lock(&mm->page_table_lock); |
2894 | if (unlikely(!pmd_same(pmd, *pmdp))) |
2895 | goto out_unlock; |
2896 | |
2897 | page = pmd_page(pmd); |
2898 | - get_page(page); |
2899 | - current_nid = page_to_nid(page); |
2900 | + page_nid = page_to_nid(page); |
2901 | count_vm_numa_event(NUMA_HINT_FAULTS); |
2902 | - if (current_nid == numa_node_id()) |
2903 | + if (page_nid == this_nid) |
2904 | count_vm_numa_event(NUMA_HINT_FAULTS_LOCAL); |
2905 | |
2906 | + /* |
2907 | + * Acquire the page lock to serialise THP migrations but avoid dropping |
2908 | + * page_table_lock if at all possible |
2909 | + */ |
2910 | + page_locked = trylock_page(page); |
2911 | target_nid = mpol_misplaced(page, vma, haddr); |
2912 | if (target_nid == -1) { |
2913 | - put_page(page); |
2914 | - goto clear_pmdnuma; |
2915 | + /* If the page was locked, there are no parallel migrations */ |
2916 | + if (page_locked) |
2917 | + goto clear_pmdnuma; |
2918 | + |
2919 | + /* |
2920 | + * Otherwise wait for potential migrations and retry. We do |
2921 | + * relock and check_same as the page may no longer be mapped. |
2922 | + * As the fault is being retried, do not account for it. |
2923 | + */ |
2924 | + spin_unlock(&mm->page_table_lock); |
2925 | + wait_on_page_locked(page); |
2926 | + page_nid = -1; |
2927 | + goto out; |
2928 | } |
2929 | |
2930 | - /* Acquire the page lock to serialise THP migrations */ |
2931 | + /* Page is misplaced, serialise migrations and parallel THP splits */ |
2932 | + get_page(page); |
2933 | spin_unlock(&mm->page_table_lock); |
2934 | - lock_page(page); |
2935 | + if (!page_locked) |
2936 | + lock_page(page); |
2937 | + anon_vma = page_lock_anon_vma_read(page); |
2938 | |
2939 | /* Confirm the PTE did not while locked */ |
2940 | spin_lock(&mm->page_table_lock); |
2941 | if (unlikely(!pmd_same(pmd, *pmdp))) { |
2942 | unlock_page(page); |
2943 | put_page(page); |
2944 | + page_nid = -1; |
2945 | goto out_unlock; |
2946 | } |
2947 | - spin_unlock(&mm->page_table_lock); |
2948 | |
2949 | - /* Migrate the THP to the requested node */ |
2950 | + /* |
2951 | + * Migrate the THP to the requested node, returns with page unlocked |
2952 | + * and pmd_numa cleared. |
2953 | + */ |
2954 | + spin_unlock(&mm->page_table_lock); |
2955 | migrated = migrate_misplaced_transhuge_page(mm, vma, |
2956 | pmdp, pmd, addr, page, target_nid); |
2957 | - if (!migrated) |
2958 | - goto check_same; |
2959 | - |
2960 | - task_numa_fault(target_nid, HPAGE_PMD_NR, true); |
2961 | - return 0; |
2962 | + if (migrated) |
2963 | + page_nid = target_nid; |
2964 | |
2965 | -check_same: |
2966 | - spin_lock(&mm->page_table_lock); |
2967 | - if (unlikely(!pmd_same(pmd, *pmdp))) |
2968 | - goto out_unlock; |
2969 | + goto out; |
2970 | clear_pmdnuma: |
2971 | + BUG_ON(!PageLocked(page)); |
2972 | pmd = pmd_mknonnuma(pmd); |
2973 | set_pmd_at(mm, haddr, pmdp, pmd); |
2974 | VM_BUG_ON(pmd_numa(*pmdp)); |
2975 | update_mmu_cache_pmd(vma, addr, pmdp); |
2976 | + unlock_page(page); |
2977 | out_unlock: |
2978 | spin_unlock(&mm->page_table_lock); |
2979 | - if (current_nid != -1) |
2980 | - task_numa_fault(current_nid, HPAGE_PMD_NR, false); |
2981 | + |
2982 | +out: |
2983 | + if (anon_vma) |
2984 | + page_unlock_anon_vma_read(anon_vma); |
2985 | + |
2986 | + if (page_nid != -1) |
2987 | + task_numa_fault(page_nid, HPAGE_PMD_NR, migrated); |
2988 | + |
2989 | return 0; |
2990 | } |
2991 | |
2992 | diff --git a/mm/memory.c b/mm/memory.c |
2993 | index 440986e57218..168a090acd02 100644 |
2994 | --- a/mm/memory.c |
2995 | +++ b/mm/memory.c |
2996 | @@ -3532,12 +3532,12 @@ static int do_nonlinear_fault(struct mm_struct *mm, struct vm_area_struct *vma, |
2997 | } |
2998 | |
2999 | int numa_migrate_prep(struct page *page, struct vm_area_struct *vma, |
3000 | - unsigned long addr, int current_nid) |
3001 | + unsigned long addr, int page_nid) |
3002 | { |
3003 | get_page(page); |
3004 | |
3005 | count_vm_numa_event(NUMA_HINT_FAULTS); |
3006 | - if (current_nid == numa_node_id()) |
3007 | + if (page_nid == numa_node_id()) |
3008 | count_vm_numa_event(NUMA_HINT_FAULTS_LOCAL); |
3009 | |
3010 | return mpol_misplaced(page, vma, addr); |
3011 | @@ -3548,7 +3548,7 @@ int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3012 | { |
3013 | struct page *page = NULL; |
3014 | spinlock_t *ptl; |
3015 | - int current_nid = -1; |
3016 | + int page_nid = -1; |
3017 | int target_nid; |
3018 | bool migrated = false; |
3019 | |
3020 | @@ -3578,15 +3578,10 @@ int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3021 | return 0; |
3022 | } |
3023 | |
3024 | - current_nid = page_to_nid(page); |
3025 | - target_nid = numa_migrate_prep(page, vma, addr, current_nid); |
3026 | + page_nid = page_to_nid(page); |
3027 | + target_nid = numa_migrate_prep(page, vma, addr, page_nid); |
3028 | pte_unmap_unlock(ptep, ptl); |
3029 | if (target_nid == -1) { |
3030 | - /* |
3031 | - * Account for the fault against the current node if it not |
3032 | - * being replaced regardless of where the page is located. |
3033 | - */ |
3034 | - current_nid = numa_node_id(); |
3035 | put_page(page); |
3036 | goto out; |
3037 | } |
3038 | @@ -3594,11 +3589,11 @@ int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3039 | /* Migrate to the requested node */ |
3040 | migrated = migrate_misplaced_page(page, target_nid); |
3041 | if (migrated) |
3042 | - current_nid = target_nid; |
3043 | + page_nid = target_nid; |
3044 | |
3045 | out: |
3046 | - if (current_nid != -1) |
3047 | - task_numa_fault(current_nid, 1, migrated); |
3048 | + if (page_nid != -1) |
3049 | + task_numa_fault(page_nid, 1, migrated); |
3050 | return 0; |
3051 | } |
3052 | |
3053 | @@ -3613,7 +3608,6 @@ static int do_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3054 | unsigned long offset; |
3055 | spinlock_t *ptl; |
3056 | bool numa = false; |
3057 | - int local_nid = numa_node_id(); |
3058 | |
3059 | spin_lock(&mm->page_table_lock); |
3060 | pmd = *pmdp; |
3061 | @@ -3636,9 +3630,10 @@ static int do_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3062 | for (addr = _addr + offset; addr < _addr + PMD_SIZE; pte++, addr += PAGE_SIZE) { |
3063 | pte_t pteval = *pte; |
3064 | struct page *page; |
3065 | - int curr_nid = local_nid; |
3066 | + int page_nid = -1; |
3067 | int target_nid; |
3068 | - bool migrated; |
3069 | + bool migrated = false; |
3070 | + |
3071 | if (!pte_present(pteval)) |
3072 | continue; |
3073 | if (!pte_numa(pteval)) |
3074 | @@ -3660,25 +3655,19 @@ static int do_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
3075 | if (unlikely(page_mapcount(page) != 1)) |
3076 | continue; |
3077 | |
3078 | - /* |
3079 | - * Note that the NUMA fault is later accounted to either |
3080 | - * the node that is currently running or where the page is |
3081 | - * migrated to. |
3082 | - */ |
3083 | - curr_nid = local_nid; |
3084 | - target_nid = numa_migrate_prep(page, vma, addr, |
3085 | - page_to_nid(page)); |
3086 | - if (target_nid == -1) { |
3087 | + page_nid = page_to_nid(page); |
3088 | + target_nid = numa_migrate_prep(page, vma, addr, page_nid); |
3089 | + pte_unmap_unlock(pte, ptl); |
3090 | + if (target_nid != -1) { |
3091 | + migrated = migrate_misplaced_page(page, target_nid); |
3092 | + if (migrated) |
3093 | + page_nid = target_nid; |
3094 | + } else { |
3095 | put_page(page); |
3096 | - continue; |
3097 | } |
3098 | |
3099 | - /* Migrate to the requested node */ |
3100 | - pte_unmap_unlock(pte, ptl); |
3101 | - migrated = migrate_misplaced_page(page, target_nid); |
3102 | - if (migrated) |
3103 | - curr_nid = target_nid; |
3104 | - task_numa_fault(curr_nid, 1, migrated); |
3105 | + if (page_nid != -1) |
3106 | + task_numa_fault(page_nid, 1, migrated); |
3107 | |
3108 | pte = pte_offset_map_lock(mm, pmdp, addr, &ptl); |
3109 | } |
3110 | @@ -4081,6 +4070,7 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr, |
3111 | |
3112 | return len; |
3113 | } |
3114 | +EXPORT_SYMBOL_GPL(generic_access_phys); |
3115 | #endif |
3116 | |
3117 | /* |
3118 | diff --git a/mm/migrate.c b/mm/migrate.c |
3119 | index 81af4e678101..d22f6f0a62e0 100644 |
3120 | --- a/mm/migrate.c |
3121 | +++ b/mm/migrate.c |
3122 | @@ -1712,12 +1712,12 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, |
3123 | unlock_page(new_page); |
3124 | put_page(new_page); /* Free it */ |
3125 | |
3126 | - unlock_page(page); |
3127 | + /* Retake the callers reference and putback on LRU */ |
3128 | + get_page(page); |
3129 | putback_lru_page(page); |
3130 | - |
3131 | - count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); |
3132 | - isolated = 0; |
3133 | - goto out; |
3134 | + mod_zone_page_state(page_zone(page), |
3135 | + NR_ISOLATED_ANON + page_lru, -HPAGE_PMD_NR); |
3136 | + goto out_fail; |
3137 | } |
3138 | |
3139 | /* |
3140 | @@ -1734,9 +1734,9 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, |
3141 | entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); |
3142 | entry = pmd_mkhuge(entry); |
3143 | |
3144 | - page_add_new_anon_rmap(new_page, vma, haddr); |
3145 | - |
3146 | + pmdp_clear_flush(vma, haddr, pmd); |
3147 | set_pmd_at(mm, haddr, pmd, entry); |
3148 | + page_add_new_anon_rmap(new_page, vma, haddr); |
3149 | update_mmu_cache_pmd(vma, address, &entry); |
3150 | page_remove_rmap(page); |
3151 | /* |
3152 | @@ -1755,7 +1755,6 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, |
3153 | count_vm_events(PGMIGRATE_SUCCESS, HPAGE_PMD_NR); |
3154 | count_vm_numa_events(NUMA_PAGE_MIGRATE, HPAGE_PMD_NR); |
3155 | |
3156 | -out: |
3157 | mod_zone_page_state(page_zone(page), |
3158 | NR_ISOLATED_ANON + page_lru, |
3159 | -HPAGE_PMD_NR); |
3160 | @@ -1764,6 +1763,10 @@ out: |
3161 | out_fail: |
3162 | count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); |
3163 | out_dropref: |
3164 | + entry = pmd_mknonnuma(entry); |
3165 | + set_pmd_at(mm, haddr, pmd, entry); |
3166 | + update_mmu_cache_pmd(vma, address, &entry); |
3167 | + |
3168 | unlock_page(page); |
3169 | put_page(page); |
3170 | return 0; |
3171 | diff --git a/mm/mprotect.c b/mm/mprotect.c |
3172 | index a3af058f68e4..412ba2b7326a 100644 |
3173 | --- a/mm/mprotect.c |
3174 | +++ b/mm/mprotect.c |
3175 | @@ -148,7 +148,7 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma, |
3176 | split_huge_page_pmd(vma, addr, pmd); |
3177 | else if (change_huge_pmd(vma, pmd, addr, newprot, |
3178 | prot_numa)) { |
3179 | - pages += HPAGE_PMD_NR; |
3180 | + pages++; |
3181 | continue; |
3182 | } |
3183 | /* fall through */ |
3184 | diff --git a/mm/pagewalk.c b/mm/pagewalk.c |
3185 | index 5da2cbcfdbb5..2beeabf502c5 100644 |
3186 | --- a/mm/pagewalk.c |
3187 | +++ b/mm/pagewalk.c |
3188 | @@ -242,7 +242,7 @@ int walk_page_range(unsigned long addr, unsigned long end, |
3189 | if (err) |
3190 | break; |
3191 | pgd++; |
3192 | - } while (addr = next, addr != end); |
3193 | + } while (addr = next, addr < end); |
3194 | |
3195 | return err; |
3196 | } |
3197 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c |
3198 | index 43dd7525bfcb..a4b2154d47d8 100644 |
3199 | --- a/net/mac80211/cfg.c |
3200 | +++ b/net/mac80211/cfg.c |
3201 | @@ -3334,7 +3334,7 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev, |
3202 | return -EINVAL; |
3203 | } |
3204 | band = chanctx_conf->def.chan->band; |
3205 | - sta = sta_info_get(sdata, peer); |
3206 | + sta = sta_info_get_bss(sdata, peer); |
3207 | if (sta) { |
3208 | qos = test_sta_flag(sta, WLAN_STA_WME); |
3209 | } else { |
3210 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h |
3211 | index 8412a303993a..8c0f8e69f244 100644 |
3212 | --- a/net/mac80211/ieee80211_i.h |
3213 | +++ b/net/mac80211/ieee80211_i.h |
3214 | @@ -858,6 +858,8 @@ struct tpt_led_trigger { |
3215 | * that the scan completed. |
3216 | * @SCAN_ABORTED: Set for our scan work function when the driver reported |
3217 | * a scan complete for an aborted scan. |
3218 | + * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being |
3219 | + * cancelled. |
3220 | */ |
3221 | enum { |
3222 | SCAN_SW_SCANNING, |
3223 | @@ -865,6 +867,7 @@ enum { |
3224 | SCAN_ONCHANNEL_SCANNING, |
3225 | SCAN_COMPLETED, |
3226 | SCAN_ABORTED, |
3227 | + SCAN_HW_CANCELLED, |
3228 | }; |
3229 | |
3230 | /** |
3231 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
3232 | index 2c5a79bd3777..2b88d77cf9f0 100644 |
3233 | --- a/net/mac80211/rx.c |
3234 | +++ b/net/mac80211/rx.c |
3235 | @@ -3014,6 +3014,9 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx, |
3236 | case NL80211_IFTYPE_ADHOC: |
3237 | if (!bssid) |
3238 | return 0; |
3239 | + if (ether_addr_equal(sdata->vif.addr, hdr->addr2) || |
3240 | + ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2)) |
3241 | + return 0; |
3242 | if (ieee80211_is_beacon(hdr->frame_control)) { |
3243 | return 1; |
3244 | } else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) { |
3245 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c |
3246 | index 1b122a79b0d8..7aafa54eaef1 100644 |
3247 | --- a/net/mac80211/scan.c |
3248 | +++ b/net/mac80211/scan.c |
3249 | @@ -211,6 +211,9 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local) |
3250 | enum ieee80211_band band; |
3251 | int i, ielen, n_chans; |
3252 | |
3253 | + if (test_bit(SCAN_HW_CANCELLED, &local->scanning)) |
3254 | + return false; |
3255 | + |
3256 | do { |
3257 | if (local->hw_scan_band == IEEE80211_NUM_BANDS) |
3258 | return false; |
3259 | @@ -887,7 +890,23 @@ void ieee80211_scan_cancel(struct ieee80211_local *local) |
3260 | if (!local->scan_req) |
3261 | goto out; |
3262 | |
3263 | + /* |
3264 | + * We have a scan running and the driver already reported completion, |
3265 | + * but the worker hasn't run yet or is stuck on the mutex - mark it as |
3266 | + * cancelled. |
3267 | + */ |
3268 | + if (test_bit(SCAN_HW_SCANNING, &local->scanning) && |
3269 | + test_bit(SCAN_COMPLETED, &local->scanning)) { |
3270 | + set_bit(SCAN_HW_CANCELLED, &local->scanning); |
3271 | + goto out; |
3272 | + } |
3273 | + |
3274 | if (test_bit(SCAN_HW_SCANNING, &local->scanning)) { |
3275 | + /* |
3276 | + * Make sure that __ieee80211_scan_completed doesn't trigger a |
3277 | + * scan on another band. |
3278 | + */ |
3279 | + set_bit(SCAN_HW_CANCELLED, &local->scanning); |
3280 | if (local->ops->cancel_hw_scan) |
3281 | drv_cancel_hw_scan(local, |
3282 | rcu_dereference_protected(local->scan_sdata, |
3283 | diff --git a/net/mac80211/status.c b/net/mac80211/status.c |
3284 | index 43439203f4e4..9e78206bd9bb 100644 |
3285 | --- a/net/mac80211/status.c |
3286 | +++ b/net/mac80211/status.c |
3287 | @@ -180,6 +180,9 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb) |
3288 | struct ieee80211_local *local = sta->local; |
3289 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
3290 | |
3291 | + if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) |
3292 | + sta->last_rx = jiffies; |
3293 | + |
3294 | if (ieee80211_is_data_qos(mgmt->frame_control)) { |
3295 | struct ieee80211_hdr *hdr = (void *) skb->data; |
3296 | u8 *qc = ieee80211_get_qos_ctl(hdr); |
3297 | diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c |
3298 | index 4105d0ca963e..4438aed3cb99 100644 |
3299 | --- a/net/mac80211/tx.c |
3300 | +++ b/net/mac80211/tx.c |
3301 | @@ -1101,7 +1101,8 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, |
3302 | tx->sta = rcu_dereference(sdata->u.vlan.sta); |
3303 | if (!tx->sta && sdata->dev->ieee80211_ptr->use_4addr) |
3304 | return TX_DROP; |
3305 | - } else if (info->flags & IEEE80211_TX_CTL_INJECTED || |
3306 | + } else if (info->flags & (IEEE80211_TX_CTL_INJECTED | |
3307 | + IEEE80211_TX_INTFL_NL80211_FRAME_TX) || |
3308 | tx->sdata->control_port_protocol == tx->skb->protocol) { |
3309 | tx->sta = sta_info_get_bss(sdata, hdr->addr1); |
3310 | } |
3311 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c |
3312 | index 22654452a561..31e78ae59cbf 100644 |
3313 | --- a/net/mac80211/util.c |
3314 | +++ b/net/mac80211/util.c |
3315 | @@ -2155,6 +2155,10 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, |
3316 | } |
3317 | |
3318 | rate = cfg80211_calculate_bitrate(&ri); |
3319 | + if (WARN_ONCE(!rate, |
3320 | + "Invalid bitrate: flags=0x%x, idx=%d, vht_nss=%d\n", |
3321 | + status->flag, status->rate_idx, status->vht_nss)) |
3322 | + return 0; |
3323 | |
3324 | /* rewind from end of MPDU */ |
3325 | if (status->flag & RX_FLAG_MACTIME_END) |
3326 | diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c |
3327 | index 39bff7d36768..403fe29c024d 100644 |
3328 | --- a/net/wireless/ibss.c |
3329 | +++ b/net/wireless/ibss.c |
3330 | @@ -263,6 +263,8 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev, |
3331 | if (chan->flags & IEEE80211_CHAN_DISABLED) |
3332 | continue; |
3333 | wdev->wext.ibss.chandef.chan = chan; |
3334 | + wdev->wext.ibss.chandef.center_freq1 = |
3335 | + chan->center_freq; |
3336 | break; |
3337 | } |
3338 | |
3339 | @@ -347,6 +349,7 @@ int cfg80211_ibss_wext_siwfreq(struct net_device *dev, |
3340 | if (chan) { |
3341 | wdev->wext.ibss.chandef.chan = chan; |
3342 | wdev->wext.ibss.chandef.width = NL80211_CHAN_WIDTH_20_NOHT; |
3343 | + wdev->wext.ibss.chandef.center_freq1 = freq; |
3344 | wdev->wext.ibss.channel_fixed = true; |
3345 | } else { |
3346 | /* cfg80211_ibss_wext_join will pick one if needed */ |
3347 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
3348 | index 5f6e982cdcf4..7956f41798c3 100644 |
3349 | --- a/net/wireless/nl80211.c |
3350 | +++ b/net/wireless/nl80211.c |
3351 | @@ -2379,7 +2379,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) |
3352 | change = true; |
3353 | } |
3354 | |
3355 | - if (flags && (*flags & NL80211_MNTR_FLAG_ACTIVE) && |
3356 | + if (flags && (*flags & MONITOR_FLAG_ACTIVE) && |
3357 | !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) |
3358 | return -EOPNOTSUPP; |
3359 | |
3360 | @@ -2441,7 +2441,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) |
3361 | info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, |
3362 | &flags); |
3363 | |
3364 | - if (!err && (flags & NL80211_MNTR_FLAG_ACTIVE) && |
3365 | + if (!err && (flags & MONITOR_FLAG_ACTIVE) && |
3366 | !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) |
3367 | return -EOPNOTSUPP; |
3368 | |
3369 | diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c |
3370 | index 487ac6f37ca2..9a11f9f799f4 100644 |
3371 | --- a/scripts/kallsyms.c |
3372 | +++ b/scripts/kallsyms.c |
3373 | @@ -55,6 +55,7 @@ static struct sym_entry *table; |
3374 | static unsigned int table_size, table_cnt; |
3375 | static int all_symbols = 0; |
3376 | static char symbol_prefix_char = '\0'; |
3377 | +static unsigned long long kernel_start_addr = 0; |
3378 | |
3379 | int token_profit[0x10000]; |
3380 | |
3381 | @@ -65,7 +66,10 @@ unsigned char best_table_len[256]; |
3382 | |
3383 | static void usage(void) |
3384 | { |
3385 | - fprintf(stderr, "Usage: kallsyms [--all-symbols] [--symbol-prefix=<prefix char>] < in.map > out.S\n"); |
3386 | + fprintf(stderr, "Usage: kallsyms [--all-symbols] " |
3387 | + "[--symbol-prefix=<prefix char>] " |
3388 | + "[--page-offset=<CONFIG_PAGE_OFFSET>] " |
3389 | + "< in.map > out.S\n"); |
3390 | exit(1); |
3391 | } |
3392 | |
3393 | @@ -194,6 +198,9 @@ static int symbol_valid(struct sym_entry *s) |
3394 | int i; |
3395 | int offset = 1; |
3396 | |
3397 | + if (s->addr < kernel_start_addr) |
3398 | + return 0; |
3399 | + |
3400 | /* skip prefix char */ |
3401 | if (symbol_prefix_char && *(s->sym + 1) == symbol_prefix_char) |
3402 | offset++; |
3403 | @@ -646,6 +653,9 @@ int main(int argc, char **argv) |
3404 | if ((*p == '"' && *(p+2) == '"') || (*p == '\'' && *(p+2) == '\'')) |
3405 | p++; |
3406 | symbol_prefix_char = *p; |
3407 | + } else if (strncmp(argv[i], "--page-offset=", 14) == 0) { |
3408 | + const char *p = &argv[i][14]; |
3409 | + kernel_start_addr = strtoull(p, NULL, 16); |
3410 | } else |
3411 | usage(); |
3412 | } |
3413 | diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh |
3414 | index 014994936b1c..32b10f53d0b4 100644 |
3415 | --- a/scripts/link-vmlinux.sh |
3416 | +++ b/scripts/link-vmlinux.sh |
3417 | @@ -82,6 +82,8 @@ kallsyms() |
3418 | kallsymopt="${kallsymopt} --all-symbols" |
3419 | fi |
3420 | |
3421 | + kallsymopt="${kallsymopt} --page-offset=$CONFIG_PAGE_OFFSET" |
3422 | + |
3423 | local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ |
3424 | ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}" |
3425 | |
3426 | diff --git a/sound/core/pcm.c b/sound/core/pcm.c |
3427 | index 17f45e8aa89c..e1e9e0c999fe 100644 |
3428 | --- a/sound/core/pcm.c |
3429 | +++ b/sound/core/pcm.c |
3430 | @@ -49,6 +49,8 @@ static struct snd_pcm *snd_pcm_get(struct snd_card *card, int device) |
3431 | struct snd_pcm *pcm; |
3432 | |
3433 | list_for_each_entry(pcm, &snd_pcm_devices, list) { |
3434 | + if (pcm->internal) |
3435 | + continue; |
3436 | if (pcm->card == card && pcm->device == device) |
3437 | return pcm; |
3438 | } |
3439 | @@ -60,6 +62,8 @@ static int snd_pcm_next(struct snd_card *card, int device) |
3440 | struct snd_pcm *pcm; |
3441 | |
3442 | list_for_each_entry(pcm, &snd_pcm_devices, list) { |
3443 | + if (pcm->internal) |
3444 | + continue; |
3445 | if (pcm->card == card && pcm->device > device) |
3446 | return pcm->device; |
3447 | else if (pcm->card->number > card->number) |
3448 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
3449 | index 8a005f0e5ca4..7c9e7dccebed 100644 |
3450 | --- a/sound/pci/hda/hda_codec.c |
3451 | +++ b/sound/pci/hda/hda_codec.c |
3452 | @@ -4804,8 +4804,8 @@ static void hda_power_work(struct work_struct *work) |
3453 | spin_unlock(&codec->power_lock); |
3454 | |
3455 | state = hda_call_codec_suspend(codec, true); |
3456 | - codec->pm_down_notified = 0; |
3457 | - if (!bus->power_keep_link_on && (state & AC_PWRST_CLK_STOP_OK)) { |
3458 | + if (!codec->pm_down_notified && |
3459 | + !bus->power_keep_link_on && (state & AC_PWRST_CLK_STOP_OK)) { |
3460 | codec->pm_down_notified = 1; |
3461 | hda_call_pm_notify(bus, false); |
3462 | } |
3463 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
3464 | index adabdeb7b15d..9e44e4a2df4a 100644 |
3465 | --- a/sound/pci/hda/hda_generic.c |
3466 | +++ b/sound/pci/hda/hda_generic.c |
3467 | @@ -4428,9 +4428,11 @@ int snd_hda_gen_build_controls(struct hda_codec *codec) |
3468 | true, &spec->vmaster_mute.sw_kctl); |
3469 | if (err < 0) |
3470 | return err; |
3471 | - if (spec->vmaster_mute.hook) |
3472 | + if (spec->vmaster_mute.hook) { |
3473 | snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute, |
3474 | spec->vmaster_mute_enum); |
3475 | + snd_hda_sync_vmaster_hook(&spec->vmaster_mute); |
3476 | + } |
3477 | } |
3478 | |
3479 | free_kctls(spec); /* no longer needed */ |
3480 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3481 | index 1383f38997c1..0ce3ed68b835 100644 |
3482 | --- a/sound/pci/hda/patch_realtek.c |
3483 | +++ b/sound/pci/hda/patch_realtek.c |
3484 | @@ -4382,6 +4382,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { |
3485 | SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
3486 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), |
3487 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_ASUS_MODE4), |
3488 | + SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_ASUS_MODE4), |
3489 | SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT), |
3490 | SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2), |
3491 | SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), |
3492 | diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c |
3493 | index 2d9e099415a5..8f6069017105 100644 |
3494 | --- a/sound/soc/codecs/wm_hubs.c |
3495 | +++ b/sound/soc/codecs/wm_hubs.c |
3496 | @@ -530,6 +530,7 @@ static int hp_supply_event(struct snd_soc_dapm_widget *w, |
3497 | hubs->hp_startup_mode); |
3498 | break; |
3499 | } |
3500 | + break; |
3501 | |
3502 | case SND_SOC_DAPM_PRE_PMD: |
3503 | snd_soc_update_bits(codec, WM8993_CHARGE_PUMP_1, |
3504 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c |
3505 | index 4375c9f2b791..8e90cbed07d8 100644 |
3506 | --- a/sound/soc/soc-dapm.c |
3507 | +++ b/sound/soc/soc-dapm.c |
3508 | @@ -1810,7 +1810,7 @@ static ssize_t dapm_widget_power_read_file(struct file *file, |
3509 | w->active ? "active" : "inactive"); |
3510 | |
3511 | list_for_each_entry(p, &w->sources, list_sink) { |
3512 | - if (p->connected && !p->connected(w, p->sink)) |
3513 | + if (p->connected && !p->connected(w, p->source)) |
3514 | continue; |
3515 | |
3516 | if (p->connect) |