Contents of /trunk/kernel-magellan/patches-3.2/0105-3.2.6-all-fixes.patch
Parent Directory | Revision Log
Revision 1644 -
(show annotations)
(download)
Thu Feb 16 12:24:52 2012 UTC (12 years, 7 months ago) by niro
File size: 99436 byte(s)
Thu Feb 16 12:24:52 2012 UTC (12 years, 7 months ago) by niro
File size: 99436 byte(s)
-3.2.6-magellan-r1
1 | diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c |
2 | index 483727a..90fa8b3 100644 |
3 | --- a/arch/arm/kernel/ptrace.c |
4 | +++ b/arch/arm/kernel/ptrace.c |
5 | @@ -699,10 +699,13 @@ static int vfp_set(struct task_struct *target, |
6 | { |
7 | int ret; |
8 | struct thread_info *thread = task_thread_info(target); |
9 | - struct vfp_hard_struct new_vfp = thread->vfpstate.hard; |
10 | + struct vfp_hard_struct new_vfp; |
11 | const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs); |
12 | const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr); |
13 | |
14 | + vfp_sync_hwstate(thread); |
15 | + new_vfp = thread->vfpstate.hard; |
16 | + |
17 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
18 | &new_vfp.fpregs, |
19 | user_fpregs_offset, |
20 | @@ -723,9 +726,8 @@ static int vfp_set(struct task_struct *target, |
21 | if (ret) |
22 | return ret; |
23 | |
24 | - vfp_sync_hwstate(thread); |
25 | - thread->vfpstate.hard = new_vfp; |
26 | vfp_flush_hwstate(thread); |
27 | + thread->vfpstate.hard = new_vfp; |
28 | |
29 | return 0; |
30 | } |
31 | diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c |
32 | index 0340224..9e617bd 100644 |
33 | --- a/arch/arm/kernel/signal.c |
34 | +++ b/arch/arm/kernel/signal.c |
35 | @@ -227,6 +227,8 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame) |
36 | if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE) |
37 | return -EINVAL; |
38 | |
39 | + vfp_flush_hwstate(thread); |
40 | + |
41 | /* |
42 | * Copy the floating point registers. There can be unused |
43 | * registers see asm/hwcap.h for details. |
44 | @@ -251,9 +253,6 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame) |
45 | __get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err); |
46 | __get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err); |
47 | |
48 | - if (!err) |
49 | - vfp_flush_hwstate(thread); |
50 | - |
51 | return err ? -EFAULT : 0; |
52 | } |
53 | |
54 | diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c |
55 | index 130034b..dfffbbf 100644 |
56 | --- a/arch/arm/mach-omap2/gpmc.c |
57 | +++ b/arch/arm/mach-omap2/gpmc.c |
58 | @@ -528,7 +528,13 @@ int gpmc_cs_configure(int cs, int cmd, int wval) |
59 | |
60 | case GPMC_CONFIG_DEV_SIZE: |
61 | regval = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); |
62 | + |
63 | + /* clear 2 target bits */ |
64 | + regval &= ~GPMC_CONFIG1_DEVICESIZE(3); |
65 | + |
66 | + /* set the proper value */ |
67 | regval |= GPMC_CONFIG1_DEVICESIZE(wval); |
68 | + |
69 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval); |
70 | break; |
71 | |
72 | diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c |
73 | index bce576d..ad683ec 100644 |
74 | --- a/drivers/cpufreq/powernow-k8.c |
75 | +++ b/drivers/cpufreq/powernow-k8.c |
76 | @@ -54,6 +54,9 @@ static DEFINE_PER_CPU(struct powernow_k8_data *, powernow_data); |
77 | |
78 | static int cpu_family = CPU_OPTERON; |
79 | |
80 | +/* array to map SW pstate number to acpi state */ |
81 | +static u32 ps_to_as[8]; |
82 | + |
83 | /* core performance boost */ |
84 | static bool cpb_capable, cpb_enabled; |
85 | static struct msr __percpu *msrs; |
86 | @@ -80,9 +83,9 @@ static u32 find_khz_freq_from_fid(u32 fid) |
87 | } |
88 | |
89 | static u32 find_khz_freq_from_pstate(struct cpufreq_frequency_table *data, |
90 | - u32 pstate) |
91 | + u32 pstate) |
92 | { |
93 | - return data[pstate].frequency; |
94 | + return data[ps_to_as[pstate]].frequency; |
95 | } |
96 | |
97 | /* Return the vco fid for an input fid |
98 | @@ -926,23 +929,27 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, |
99 | invalidate_entry(powernow_table, i); |
100 | continue; |
101 | } |
102 | - rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); |
103 | - if (!(hi & HW_PSTATE_VALID_MASK)) { |
104 | - pr_debug("invalid pstate %d, ignoring\n", index); |
105 | - invalidate_entry(powernow_table, i); |
106 | - continue; |
107 | - } |
108 | |
109 | - powernow_table[i].index = index; |
110 | + ps_to_as[index] = i; |
111 | |
112 | /* Frequency may be rounded for these */ |
113 | if ((boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model < 10) |
114 | || boot_cpu_data.x86 == 0x11) { |
115 | + |
116 | + rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); |
117 | + if (!(hi & HW_PSTATE_VALID_MASK)) { |
118 | + pr_debug("invalid pstate %d, ignoring\n", index); |
119 | + invalidate_entry(powernow_table, i); |
120 | + continue; |
121 | + } |
122 | + |
123 | powernow_table[i].frequency = |
124 | freq_from_fid_did(lo & 0x3f, (lo >> 6) & 7); |
125 | } else |
126 | powernow_table[i].frequency = |
127 | data->acpi_data.states[i].core_frequency * 1000; |
128 | + |
129 | + powernow_table[i].index = index; |
130 | } |
131 | return 0; |
132 | } |
133 | @@ -1189,7 +1196,8 @@ static int powernowk8_target(struct cpufreq_policy *pol, |
134 | powernow_k8_acpi_pst_values(data, newstate); |
135 | |
136 | if (cpu_family == CPU_HW_PSTATE) |
137 | - ret = transition_frequency_pstate(data, newstate); |
138 | + ret = transition_frequency_pstate(data, |
139 | + data->powernow_table[newstate].index); |
140 | else |
141 | ret = transition_frequency_fidvid(data, newstate); |
142 | if (ret) { |
143 | @@ -1202,7 +1210,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, |
144 | |
145 | if (cpu_family == CPU_HW_PSTATE) |
146 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, |
147 | - newstate); |
148 | + data->powernow_table[newstate].index); |
149 | else |
150 | pol->cur = find_khz_freq_from_fid(data->currfid); |
151 | ret = 0; |
152 | diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c |
153 | index fcfa0a8..a60adbf 100644 |
154 | --- a/drivers/dma/at_hdmac.c |
155 | +++ b/drivers/dma/at_hdmac.c |
156 | @@ -1286,7 +1286,7 @@ static int __init at_dma_probe(struct platform_device *pdev) |
157 | |
158 | tasklet_init(&atchan->tasklet, atc_tasklet, |
159 | (unsigned long)atchan); |
160 | - atc_enable_irq(atchan); |
161 | + atc_enable_chan_irq(atdma, i); |
162 | } |
163 | |
164 | /* set base routines */ |
165 | @@ -1353,7 +1353,7 @@ static int __exit at_dma_remove(struct platform_device *pdev) |
166 | struct at_dma_chan *atchan = to_at_dma_chan(chan); |
167 | |
168 | /* Disable interrupts */ |
169 | - atc_disable_irq(atchan); |
170 | + atc_disable_chan_irq(atdma, chan->chan_id); |
171 | tasklet_disable(&atchan->tasklet); |
172 | |
173 | tasklet_kill(&atchan->tasklet); |
174 | diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h |
175 | index aa4c9ae..5aa82b4 100644 |
176 | --- a/drivers/dma/at_hdmac_regs.h |
177 | +++ b/drivers/dma/at_hdmac_regs.h |
178 | @@ -326,28 +326,27 @@ static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli) |
179 | } |
180 | |
181 | |
182 | -static void atc_setup_irq(struct at_dma_chan *atchan, int on) |
183 | +static void atc_setup_irq(struct at_dma *atdma, int chan_id, int on) |
184 | { |
185 | - struct at_dma *atdma = to_at_dma(atchan->chan_common.device); |
186 | - u32 ebci; |
187 | + u32 ebci; |
188 | |
189 | /* enable interrupts on buffer transfer completion & error */ |
190 | - ebci = AT_DMA_BTC(atchan->chan_common.chan_id) |
191 | - | AT_DMA_ERR(atchan->chan_common.chan_id); |
192 | + ebci = AT_DMA_BTC(chan_id) |
193 | + | AT_DMA_ERR(chan_id); |
194 | if (on) |
195 | dma_writel(atdma, EBCIER, ebci); |
196 | else |
197 | dma_writel(atdma, EBCIDR, ebci); |
198 | } |
199 | |
200 | -static inline void atc_enable_irq(struct at_dma_chan *atchan) |
201 | +static void atc_enable_chan_irq(struct at_dma *atdma, int chan_id) |
202 | { |
203 | - atc_setup_irq(atchan, 1); |
204 | + atc_setup_irq(atdma, chan_id, 1); |
205 | } |
206 | |
207 | -static inline void atc_disable_irq(struct at_dma_chan *atchan) |
208 | +static void atc_disable_chan_irq(struct at_dma *atdma, int chan_id) |
209 | { |
210 | - atc_setup_irq(atchan, 0); |
211 | + atc_setup_irq(atdma, chan_id, 0); |
212 | } |
213 | |
214 | |
215 | diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c |
216 | index 6628fea..7f5f0da 100644 |
217 | --- a/drivers/firewire/ohci.c |
218 | +++ b/drivers/firewire/ohci.c |
219 | @@ -263,6 +263,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card) |
220 | static char ohci_driver_name[] = KBUILD_MODNAME; |
221 | |
222 | #define PCI_DEVICE_ID_AGERE_FW643 0x5901 |
223 | +#define PCI_DEVICE_ID_CREATIVE_SB1394 0x4001 |
224 | #define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380 |
225 | #define PCI_DEVICE_ID_TI_TSB12LV22 0x8009 |
226 | #define PCI_DEVICE_ID_TI_TSB12LV26 0x8020 |
227 | @@ -289,6 +290,9 @@ static const struct { |
228 | {PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, |
229 | QUIRK_NO_MSI}, |
230 | |
231 | + {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID, |
232 | + QUIRK_RESET_PACKET}, |
233 | + |
234 | {PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID, |
235 | QUIRK_NO_MSI}, |
236 | |
237 | @@ -299,7 +303,7 @@ static const struct { |
238 | QUIRK_NO_MSI}, |
239 | |
240 | {PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID, |
241 | - QUIRK_CYCLE_TIMER}, |
242 | + QUIRK_CYCLE_TIMER | QUIRK_NO_MSI}, |
243 | |
244 | {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID, |
245 | QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A}, |
246 | diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c |
247 | index 004b048..b2e3c97 100644 |
248 | --- a/drivers/gpu/drm/i915/i915_debugfs.c |
249 | +++ b/drivers/gpu/drm/i915/i915_debugfs.c |
250 | @@ -1314,9 +1314,13 @@ static int i915_gen6_forcewake_count_info(struct seq_file *m, void *data) |
251 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
252 | struct drm_device *dev = node->minor->dev; |
253 | struct drm_i915_private *dev_priv = dev->dev_private; |
254 | + unsigned forcewake_count; |
255 | |
256 | - seq_printf(m, "forcewake count = %d\n", |
257 | - atomic_read(&dev_priv->forcewake_count)); |
258 | + spin_lock_irq(&dev_priv->gt_lock); |
259 | + forcewake_count = dev_priv->forcewake_count; |
260 | + spin_unlock_irq(&dev_priv->gt_lock); |
261 | + |
262 | + seq_printf(m, "forcewake count = %u\n", forcewake_count); |
263 | |
264 | return 0; |
265 | } |
266 | diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c |
267 | index a9ae374..c4da951 100644 |
268 | --- a/drivers/gpu/drm/i915/i915_dma.c |
269 | +++ b/drivers/gpu/drm/i915/i915_dma.c |
270 | @@ -2042,6 +2042,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
271 | if (!IS_I945G(dev) && !IS_I945GM(dev)) |
272 | pci_enable_msi(dev->pdev); |
273 | |
274 | + spin_lock_init(&dev_priv->gt_lock); |
275 | spin_lock_init(&dev_priv->irq_lock); |
276 | spin_lock_init(&dev_priv->error_lock); |
277 | spin_lock_init(&dev_priv->rps_lock); |
278 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
279 | index a1103fc..e2d85a9 100644 |
280 | --- a/drivers/gpu/drm/i915/i915_drv.c |
281 | +++ b/drivers/gpu/drm/i915/i915_drv.c |
282 | @@ -368,11 +368,12 @@ void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) |
283 | */ |
284 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
285 | { |
286 | - WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); |
287 | + unsigned long irqflags; |
288 | |
289 | - /* Forcewake is atomic in case we get in here without the lock */ |
290 | - if (atomic_add_return(1, &dev_priv->forcewake_count) == 1) |
291 | + spin_lock_irqsave(&dev_priv->gt_lock, irqflags); |
292 | + if (dev_priv->forcewake_count++ == 0) |
293 | dev_priv->display.force_wake_get(dev_priv); |
294 | + spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); |
295 | } |
296 | |
297 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
298 | @@ -392,10 +393,12 @@ void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv) |
299 | */ |
300 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
301 | { |
302 | - WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); |
303 | + unsigned long irqflags; |
304 | |
305 | - if (atomic_dec_and_test(&dev_priv->forcewake_count)) |
306 | + spin_lock_irqsave(&dev_priv->gt_lock, irqflags); |
307 | + if (--dev_priv->forcewake_count == 0) |
308 | dev_priv->display.force_wake_put(dev_priv); |
309 | + spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); |
310 | } |
311 | |
312 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) |
313 | @@ -626,6 +629,7 @@ int i915_reset(struct drm_device *dev, u8 flags) |
314 | * need to |
315 | */ |
316 | bool need_display = true; |
317 | + unsigned long irqflags; |
318 | int ret; |
319 | |
320 | if (!i915_try_reset) |
321 | @@ -644,8 +648,10 @@ int i915_reset(struct drm_device *dev, u8 flags) |
322 | case 6: |
323 | ret = gen6_do_reset(dev, flags); |
324 | /* If reset with a user forcewake, try to restore */ |
325 | - if (atomic_read(&dev_priv->forcewake_count)) |
326 | - __gen6_gt_force_wake_get(dev_priv); |
327 | + spin_lock_irqsave(&dev_priv->gt_lock, irqflags); |
328 | + if (dev_priv->forcewake_count) |
329 | + dev_priv->display.force_wake_get(dev_priv); |
330 | + spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); |
331 | break; |
332 | case 5: |
333 | ret = ironlake_do_reset(dev, flags); |
334 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
335 | index 554bef7..ae294a0 100644 |
336 | --- a/drivers/gpu/drm/i915/i915_drv.h |
337 | +++ b/drivers/gpu/drm/i915/i915_drv.h |
338 | @@ -286,7 +286,13 @@ typedef struct drm_i915_private { |
339 | int relative_constants_mode; |
340 | |
341 | void __iomem *regs; |
342 | - u32 gt_fifo_count; |
343 | + /** gt_fifo_count and the subsequent register write are synchronized |
344 | + * with dev->struct_mutex. */ |
345 | + unsigned gt_fifo_count; |
346 | + /** forcewake_count is protected by gt_lock */ |
347 | + unsigned forcewake_count; |
348 | + /** gt_lock is also taken in irq contexts. */ |
349 | + struct spinlock gt_lock; |
350 | |
351 | struct intel_gmbus { |
352 | struct i2c_adapter adapter; |
353 | @@ -337,6 +343,8 @@ typedef struct drm_i915_private { |
354 | struct timer_list hangcheck_timer; |
355 | int hangcheck_count; |
356 | uint32_t last_acthd; |
357 | + uint32_t last_acthd_bsd; |
358 | + uint32_t last_acthd_blt; |
359 | uint32_t last_instdone; |
360 | uint32_t last_instdone1; |
361 | |
362 | @@ -736,8 +744,6 @@ typedef struct drm_i915_private { |
363 | |
364 | struct drm_property *broadcast_rgb_property; |
365 | struct drm_property *force_audio_property; |
366 | - |
367 | - atomic_t forcewake_count; |
368 | } drm_i915_private_t; |
369 | |
370 | enum i915_cache_level { |
371 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
372 | index b40004b..d47a53b 100644 |
373 | --- a/drivers/gpu/drm/i915/i915_irq.c |
374 | +++ b/drivers/gpu/drm/i915/i915_irq.c |
375 | @@ -1669,7 +1669,7 @@ void i915_hangcheck_elapsed(unsigned long data) |
376 | { |
377 | struct drm_device *dev = (struct drm_device *)data; |
378 | drm_i915_private_t *dev_priv = dev->dev_private; |
379 | - uint32_t acthd, instdone, instdone1; |
380 | + uint32_t acthd, instdone, instdone1, acthd_bsd, acthd_blt; |
381 | bool err = false; |
382 | |
383 | if (!i915_enable_hangcheck) |
384 | @@ -1686,16 +1686,21 @@ void i915_hangcheck_elapsed(unsigned long data) |
385 | } |
386 | |
387 | if (INTEL_INFO(dev)->gen < 4) { |
388 | - acthd = I915_READ(ACTHD); |
389 | instdone = I915_READ(INSTDONE); |
390 | instdone1 = 0; |
391 | } else { |
392 | - acthd = I915_READ(ACTHD_I965); |
393 | instdone = I915_READ(INSTDONE_I965); |
394 | instdone1 = I915_READ(INSTDONE1); |
395 | } |
396 | + acthd = intel_ring_get_active_head(&dev_priv->ring[RCS]); |
397 | + acthd_bsd = HAS_BSD(dev) ? |
398 | + intel_ring_get_active_head(&dev_priv->ring[VCS]) : 0; |
399 | + acthd_blt = HAS_BLT(dev) ? |
400 | + intel_ring_get_active_head(&dev_priv->ring[BCS]) : 0; |
401 | |
402 | if (dev_priv->last_acthd == acthd && |
403 | + dev_priv->last_acthd_bsd == acthd_bsd && |
404 | + dev_priv->last_acthd_blt == acthd_blt && |
405 | dev_priv->last_instdone == instdone && |
406 | dev_priv->last_instdone1 == instdone1) { |
407 | if (dev_priv->hangcheck_count++ > 1) { |
408 | @@ -1727,6 +1732,8 @@ void i915_hangcheck_elapsed(unsigned long data) |
409 | dev_priv->hangcheck_count = 0; |
410 | |
411 | dev_priv->last_acthd = acthd; |
412 | + dev_priv->last_acthd_bsd = acthd_bsd; |
413 | + dev_priv->last_acthd_blt = acthd_blt; |
414 | dev_priv->last_instdone = instdone; |
415 | dev_priv->last_instdone1 = instdone1; |
416 | } |
417 | diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c |
418 | index 43cbafe..a1eb83d 100644 |
419 | --- a/drivers/gpu/drm/i915/i915_suspend.c |
420 | +++ b/drivers/gpu/drm/i915/i915_suspend.c |
421 | @@ -34,6 +34,10 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) |
422 | struct drm_i915_private *dev_priv = dev->dev_private; |
423 | u32 dpll_reg; |
424 | |
425 | + /* On IVB, 3rd pipe shares PLL with another one */ |
426 | + if (pipe > 1) |
427 | + return false; |
428 | + |
429 | if (HAS_PCH_SPLIT(dev)) |
430 | dpll_reg = (pipe == PIPE_A) ? _PCH_DPLL_A : _PCH_DPLL_B; |
431 | else |
432 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
433 | index 92b041b..db3b461 100644 |
434 | --- a/drivers/gpu/drm/i915/intel_dp.c |
435 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
436 | @@ -1926,6 +1926,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) |
437 | intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe); |
438 | } |
439 | |
440 | + DP &= ~DP_AUDIO_OUTPUT_ENABLE; |
441 | I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); |
442 | POSTING_READ(intel_dp->output_reg); |
443 | msleep(intel_dp->panel_power_down_delay); |
444 | diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c |
445 | index d4f5a0b..64541f7 100644 |
446 | --- a/drivers/gpu/drm/i915/intel_hdmi.c |
447 | +++ b/drivers/gpu/drm/i915/intel_hdmi.c |
448 | @@ -269,6 +269,10 @@ static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) |
449 | struct drm_i915_private *dev_priv = dev->dev_private; |
450 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); |
451 | u32 temp; |
452 | + u32 enable_bits = SDVO_ENABLE; |
453 | + |
454 | + if (intel_hdmi->has_audio) |
455 | + enable_bits |= SDVO_AUDIO_ENABLE; |
456 | |
457 | temp = I915_READ(intel_hdmi->sdvox_reg); |
458 | |
459 | @@ -281,9 +285,9 @@ static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) |
460 | } |
461 | |
462 | if (mode != DRM_MODE_DPMS_ON) { |
463 | - temp &= ~SDVO_ENABLE; |
464 | + temp &= ~enable_bits; |
465 | } else { |
466 | - temp |= SDVO_ENABLE; |
467 | + temp |= enable_bits; |
468 | } |
469 | |
470 | I915_WRITE(intel_hdmi->sdvox_reg, temp); |
471 | diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c |
472 | index f3c6a9a..2b1fcad 100644 |
473 | --- a/drivers/gpu/drm/i915/intel_tv.c |
474 | +++ b/drivers/gpu/drm/i915/intel_tv.c |
475 | @@ -417,7 +417,7 @@ static const struct tv_mode tv_modes[] = { |
476 | { |
477 | .name = "NTSC-M", |
478 | .clock = 108000, |
479 | - .refresh = 29970, |
480 | + .refresh = 59940, |
481 | .oversample = TV_OVERSAMPLE_8X, |
482 | .component_only = 0, |
483 | /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ |
484 | @@ -460,7 +460,7 @@ static const struct tv_mode tv_modes[] = { |
485 | { |
486 | .name = "NTSC-443", |
487 | .clock = 108000, |
488 | - .refresh = 29970, |
489 | + .refresh = 59940, |
490 | .oversample = TV_OVERSAMPLE_8X, |
491 | .component_only = 0, |
492 | /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */ |
493 | @@ -502,7 +502,7 @@ static const struct tv_mode tv_modes[] = { |
494 | { |
495 | .name = "NTSC-J", |
496 | .clock = 108000, |
497 | - .refresh = 29970, |
498 | + .refresh = 59940, |
499 | .oversample = TV_OVERSAMPLE_8X, |
500 | .component_only = 0, |
501 | |
502 | @@ -545,7 +545,7 @@ static const struct tv_mode tv_modes[] = { |
503 | { |
504 | .name = "PAL-M", |
505 | .clock = 108000, |
506 | - .refresh = 29970, |
507 | + .refresh = 59940, |
508 | .oversample = TV_OVERSAMPLE_8X, |
509 | .component_only = 0, |
510 | |
511 | @@ -589,7 +589,7 @@ static const struct tv_mode tv_modes[] = { |
512 | /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ |
513 | .name = "PAL-N", |
514 | .clock = 108000, |
515 | - .refresh = 25000, |
516 | + .refresh = 50000, |
517 | .oversample = TV_OVERSAMPLE_8X, |
518 | .component_only = 0, |
519 | |
520 | @@ -634,7 +634,7 @@ static const struct tv_mode tv_modes[] = { |
521 | /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ |
522 | .name = "PAL", |
523 | .clock = 108000, |
524 | - .refresh = 25000, |
525 | + .refresh = 50000, |
526 | .oversample = TV_OVERSAMPLE_8X, |
527 | .component_only = 0, |
528 | |
529 | @@ -821,7 +821,7 @@ static const struct tv_mode tv_modes[] = { |
530 | { |
531 | .name = "1080i@50Hz", |
532 | .clock = 148800, |
533 | - .refresh = 25000, |
534 | + .refresh = 50000, |
535 | .oversample = TV_OVERSAMPLE_2X, |
536 | .component_only = 1, |
537 | |
538 | @@ -847,7 +847,7 @@ static const struct tv_mode tv_modes[] = { |
539 | { |
540 | .name = "1080i@60Hz", |
541 | .clock = 148800, |
542 | - .refresh = 30000, |
543 | + .refresh = 60000, |
544 | .oversample = TV_OVERSAMPLE_2X, |
545 | .component_only = 1, |
546 | |
547 | diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c |
548 | index 5f0bc57..7ce3fde 100644 |
549 | --- a/drivers/gpu/drm/nouveau/nouveau_gem.c |
550 | +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c |
551 | @@ -380,6 +380,25 @@ retry: |
552 | } |
553 | |
554 | static int |
555 | +validate_sync(struct nouveau_channel *chan, struct nouveau_bo *nvbo) |
556 | +{ |
557 | + struct nouveau_fence *fence = NULL; |
558 | + int ret = 0; |
559 | + |
560 | + spin_lock(&nvbo->bo.bdev->fence_lock); |
561 | + if (nvbo->bo.sync_obj) |
562 | + fence = nouveau_fence_ref(nvbo->bo.sync_obj); |
563 | + spin_unlock(&nvbo->bo.bdev->fence_lock); |
564 | + |
565 | + if (fence) { |
566 | + ret = nouveau_fence_sync(fence, chan); |
567 | + nouveau_fence_unref(&fence); |
568 | + } |
569 | + |
570 | + return ret; |
571 | +} |
572 | + |
573 | +static int |
574 | validate_list(struct nouveau_channel *chan, struct list_head *list, |
575 | struct drm_nouveau_gem_pushbuf_bo *pbbo, uint64_t user_pbbo_ptr) |
576 | { |
577 | @@ -393,7 +412,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list, |
578 | list_for_each_entry(nvbo, list, entry) { |
579 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; |
580 | |
581 | - ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan); |
582 | + ret = validate_sync(chan, nvbo); |
583 | if (unlikely(ret)) { |
584 | NV_ERROR(dev, "fail pre-validate sync\n"); |
585 | return ret; |
586 | @@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list, |
587 | return ret; |
588 | } |
589 | |
590 | - ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan); |
591 | + ret = validate_sync(chan, nvbo); |
592 | if (unlikely(ret)) { |
593 | NV_ERROR(dev, "fail post-validate sync\n"); |
594 | return ret; |
595 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
596 | index 2b97262..b30081f 100644 |
597 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
598 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
599 | @@ -1189,7 +1189,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, |
600 | WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1); |
601 | |
602 | WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, |
603 | - crtc->mode.vdisplay); |
604 | + target_fb->height); |
605 | x &= ~3; |
606 | y &= ~1; |
607 | WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, |
608 | @@ -1358,7 +1358,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, |
609 | WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1); |
610 | |
611 | WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, |
612 | - crtc->mode.vdisplay); |
613 | + target_fb->height); |
614 | x &= ~3; |
615 | y &= ~1; |
616 | WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, |
617 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c |
618 | index a71557c..552b436 100644 |
619 | --- a/drivers/gpu/drm/radeon/atombios_dp.c |
620 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c |
621 | @@ -564,9 +564,21 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder, |
622 | ENCODER_OBJECT_ID_NUTMEG) |
623 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; |
624 | else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == |
625 | - ENCODER_OBJECT_ID_TRAVIS) |
626 | - panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
627 | - else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
628 | + ENCODER_OBJECT_ID_TRAVIS) { |
629 | + u8 id[6]; |
630 | + int i; |
631 | + for (i = 0; i < 6; i++) |
632 | + id[i] = radeon_read_dpcd_reg(radeon_connector, 0x503 + i); |
633 | + if (id[0] == 0x73 && |
634 | + id[1] == 0x69 && |
635 | + id[2] == 0x76 && |
636 | + id[3] == 0x61 && |
637 | + id[4] == 0x72 && |
638 | + id[5] == 0x54) |
639 | + panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; |
640 | + else |
641 | + panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
642 | + } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
643 | u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); |
644 | if (tmp & 1) |
645 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
646 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
647 | index 9b39145..9231564 100644 |
648 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
649 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
650 | @@ -864,6 +864,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) |
651 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
652 | return 0; |
653 | |
654 | + drm_kms_helper_poll_disable(dev); |
655 | + |
656 | /* turn off display hw */ |
657 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
658 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
659 | @@ -950,6 +952,8 @@ int radeon_resume_kms(struct drm_device *dev) |
660 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
661 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
662 | } |
663 | + |
664 | + drm_kms_helper_poll_enable(dev); |
665 | return 0; |
666 | } |
667 | |
668 | diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c |
669 | index 4b57ab6..c25387d 100644 |
670 | --- a/drivers/hwmon/w83627ehf.c |
671 | +++ b/drivers/hwmon/w83627ehf.c |
672 | @@ -1920,9 +1920,26 @@ w83627ehf_check_fan_inputs(const struct w83627ehf_sio_data *sio_data, |
673 | fan4min = 0; |
674 | fan5pin = 0; |
675 | } else if (sio_data->kind == nct6776) { |
676 | - fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40); |
677 | - fan4pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x01); |
678 | - fan5pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x02); |
679 | + bool gpok = superio_inb(sio_data->sioreg, 0x27) & 0x80; |
680 | + |
681 | + superio_select(sio_data->sioreg, W83627EHF_LD_HWM); |
682 | + regval = superio_inb(sio_data->sioreg, SIO_REG_ENABLE); |
683 | + |
684 | + if (regval & 0x80) |
685 | + fan3pin = gpok; |
686 | + else |
687 | + fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40); |
688 | + |
689 | + if (regval & 0x40) |
690 | + fan4pin = gpok; |
691 | + else |
692 | + fan4pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x01); |
693 | + |
694 | + if (regval & 0x20) |
695 | + fan5pin = gpok; |
696 | + else |
697 | + fan5pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x02); |
698 | + |
699 | fan4min = fan4pin; |
700 | } else if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { |
701 | fan3pin = 1; |
702 | diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c |
703 | index e3db8ef..a8445b8 100644 |
704 | --- a/drivers/infiniband/core/uverbs_cmd.c |
705 | +++ b/drivers/infiniband/core/uverbs_cmd.c |
706 | @@ -1485,6 +1485,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file, |
707 | qp->event_handler = attr.event_handler; |
708 | qp->qp_context = attr.qp_context; |
709 | qp->qp_type = attr.qp_type; |
710 | + atomic_set(&qp->usecnt, 0); |
711 | atomic_inc(&pd->usecnt); |
712 | atomic_inc(&attr.send_cq->usecnt); |
713 | if (attr.recv_cq) |
714 | diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c |
715 | index 602b1bd..575b780 100644 |
716 | --- a/drivers/infiniband/core/verbs.c |
717 | +++ b/drivers/infiniband/core/verbs.c |
718 | @@ -421,6 +421,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
719 | qp->uobject = NULL; |
720 | qp->qp_type = qp_init_attr->qp_type; |
721 | |
722 | + atomic_set(&qp->usecnt, 0); |
723 | if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) { |
724 | qp->event_handler = __ib_shared_qp_event_handler; |
725 | qp->qp_context = qp; |
726 | @@ -430,7 +431,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
727 | qp->xrcd = qp_init_attr->xrcd; |
728 | atomic_inc(&qp_init_attr->xrcd->usecnt); |
729 | INIT_LIST_HEAD(&qp->open_list); |
730 | - atomic_set(&qp->usecnt, 0); |
731 | |
732 | real_qp = qp; |
733 | qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, |
734 | diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c |
735 | index f36da99..77702c0 100644 |
736 | --- a/drivers/infiniband/hw/mlx4/mad.c |
737 | +++ b/drivers/infiniband/hw/mlx4/mad.c |
738 | @@ -256,12 +256,9 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, |
739 | return IB_MAD_RESULT_SUCCESS; |
740 | |
741 | /* |
742 | - * Don't process SMInfo queries or vendor-specific |
743 | - * MADs -- the SMA can't handle them. |
744 | + * Don't process SMInfo queries -- the SMA can't handle them. |
745 | */ |
746 | - if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO || |
747 | - ((in_mad->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) == |
748 | - IB_SMP_ATTR_VENDOR_MASK)) |
749 | + if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO) |
750 | return IB_MAD_RESULT_SUCCESS; |
751 | } else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT || |
752 | in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 || |
753 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
754 | index 4ee277a..e0b3e33 100644 |
755 | --- a/drivers/iommu/amd_iommu.c |
756 | +++ b/drivers/iommu/amd_iommu.c |
757 | @@ -2479,6 +2479,9 @@ static unsigned device_dma_ops_init(void) |
758 | |
759 | for_each_pci_dev(pdev) { |
760 | if (!check_device(&pdev->dev)) { |
761 | + |
762 | + iommu_ignore_device(&pdev->dev); |
763 | + |
764 | unhandled += 1; |
765 | continue; |
766 | } |
767 | diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c |
768 | index 5865dd2..a4d134d 100644 |
769 | --- a/drivers/iommu/msm_iommu.c |
770 | +++ b/drivers/iommu/msm_iommu.c |
771 | @@ -481,23 +481,19 @@ static int msm_iommu_unmap(struct iommu_domain *domain, unsigned long va, |
772 | |
773 | priv = domain->priv; |
774 | |
775 | - if (!priv) { |
776 | - ret = -ENODEV; |
777 | + if (!priv) |
778 | goto fail; |
779 | - } |
780 | |
781 | fl_table = priv->pgtable; |
782 | |
783 | if (len != SZ_16M && len != SZ_1M && |
784 | len != SZ_64K && len != SZ_4K) { |
785 | pr_debug("Bad length: %d\n", len); |
786 | - ret = -EINVAL; |
787 | goto fail; |
788 | } |
789 | |
790 | if (!fl_table) { |
791 | pr_debug("Null page table\n"); |
792 | - ret = -EINVAL; |
793 | goto fail; |
794 | } |
795 | |
796 | @@ -506,7 +502,6 @@ static int msm_iommu_unmap(struct iommu_domain *domain, unsigned long va, |
797 | |
798 | if (*fl_pte == 0) { |
799 | pr_debug("First level PTE is 0\n"); |
800 | - ret = -ENODEV; |
801 | goto fail; |
802 | } |
803 | |
804 | diff --git a/drivers/misc/cb710/core.c b/drivers/misc/cb710/core.c |
805 | index 68cd05b..85cc771 100644 |
806 | --- a/drivers/misc/cb710/core.c |
807 | +++ b/drivers/misc/cb710/core.c |
808 | @@ -245,6 +245,7 @@ static int __devinit cb710_probe(struct pci_dev *pdev, |
809 | if (err) |
810 | return err; |
811 | |
812 | + spin_lock_init(&chip->irq_lock); |
813 | chip->pdev = pdev; |
814 | chip->iobase = pcim_iomap_table(pdev)[0]; |
815 | |
816 | diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c |
817 | index 23e5d77..ee6e26e 100644 |
818 | --- a/drivers/mtd/nand/atmel_nand.c |
819 | +++ b/drivers/mtd/nand/atmel_nand.c |
820 | @@ -161,6 +161,37 @@ static int atmel_nand_device_ready(struct mtd_info *mtd) |
821 | !!host->board->rdy_pin_active_low; |
822 | } |
823 | |
824 | +/* |
825 | + * Minimal-overhead PIO for data access. |
826 | + */ |
827 | +static void atmel_read_buf8(struct mtd_info *mtd, u8 *buf, int len) |
828 | +{ |
829 | + struct nand_chip *nand_chip = mtd->priv; |
830 | + |
831 | + __raw_readsb(nand_chip->IO_ADDR_R, buf, len); |
832 | +} |
833 | + |
834 | +static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len) |
835 | +{ |
836 | + struct nand_chip *nand_chip = mtd->priv; |
837 | + |
838 | + __raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2); |
839 | +} |
840 | + |
841 | +static void atmel_write_buf8(struct mtd_info *mtd, const u8 *buf, int len) |
842 | +{ |
843 | + struct nand_chip *nand_chip = mtd->priv; |
844 | + |
845 | + __raw_writesb(nand_chip->IO_ADDR_W, buf, len); |
846 | +} |
847 | + |
848 | +static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len) |
849 | +{ |
850 | + struct nand_chip *nand_chip = mtd->priv; |
851 | + |
852 | + __raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2); |
853 | +} |
854 | + |
855 | static void dma_complete_func(void *completion) |
856 | { |
857 | complete(completion); |
858 | @@ -235,27 +266,33 @@ err_buf: |
859 | static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len) |
860 | { |
861 | struct nand_chip *chip = mtd->priv; |
862 | + struct atmel_nand_host *host = chip->priv; |
863 | |
864 | if (use_dma && len > mtd->oobsize) |
865 | /* only use DMA for bigger than oob size: better performances */ |
866 | if (atmel_nand_dma_op(mtd, buf, len, 1) == 0) |
867 | return; |
868 | |
869 | - /* if no DMA operation possible, use PIO */ |
870 | - memcpy_fromio(buf, chip->IO_ADDR_R, len); |
871 | + if (host->board->bus_width_16) |
872 | + atmel_read_buf16(mtd, buf, len); |
873 | + else |
874 | + atmel_read_buf8(mtd, buf, len); |
875 | } |
876 | |
877 | static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len) |
878 | { |
879 | struct nand_chip *chip = mtd->priv; |
880 | + struct atmel_nand_host *host = chip->priv; |
881 | |
882 | if (use_dma && len > mtd->oobsize) |
883 | /* only use DMA for bigger than oob size: better performances */ |
884 | if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0) |
885 | return; |
886 | |
887 | - /* if no DMA operation possible, use PIO */ |
888 | - memcpy_toio(chip->IO_ADDR_W, buf, len); |
889 | + if (host->board->bus_width_16) |
890 | + atmel_write_buf16(mtd, buf, len); |
891 | + else |
892 | + atmel_write_buf8(mtd, buf, len); |
893 | } |
894 | |
895 | /* |
896 | diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c |
897 | index de4db76..bb2fe60 100644 |
898 | --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c |
899 | +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c |
900 | @@ -69,17 +69,19 @@ static int clear_poll_bit(void __iomem *addr, u32 mask) |
901 | * [1] enable the module. |
902 | * [2] reset the module. |
903 | * |
904 | - * In most of the cases, it's ok. But there is a hardware bug in the BCH block. |
905 | + * In most of the cases, it's ok. |
906 | + * But in MX23, there is a hardware bug in the BCH block (see erratum #2847). |
907 | * If you try to soft reset the BCH block, it becomes unusable until |
908 | * the next hard reset. This case occurs in the NAND boot mode. When the board |
909 | * boots by NAND, the ROM of the chip will initialize the BCH blocks itself. |
910 | * So If the driver tries to reset the BCH again, the BCH will not work anymore. |
911 | - * You will see a DMA timeout in this case. |
912 | + * You will see a DMA timeout in this case. The bug has been fixed |
913 | + * in the following chips, such as MX28. |
914 | * |
915 | * To avoid this bug, just add a new parameter `just_enable` for |
916 | * the mxs_reset_block(), and rewrite it here. |
917 | */ |
918 | -int gpmi_reset_block(void __iomem *reset_addr, bool just_enable) |
919 | +static int gpmi_reset_block(void __iomem *reset_addr, bool just_enable) |
920 | { |
921 | int ret; |
922 | int timeout = 0x400; |
923 | @@ -206,7 +208,15 @@ int bch_set_geometry(struct gpmi_nand_data *this) |
924 | if (ret) |
925 | goto err_out; |
926 | |
927 | - ret = gpmi_reset_block(r->bch_regs, true); |
928 | + /* |
929 | + * Due to erratum #2847 of the MX23, the BCH cannot be soft reset on this |
930 | + * chip, otherwise it will lock up. So we skip resetting BCH on the MX23. |
931 | + * On the other hand, the MX28 needs the reset, because one case has been |
932 | + * seen where the BCH produced ECC errors constantly after 10000 |
933 | + * consecutive reboots. The latter case has not been seen on the MX23 yet, |
934 | + * still we don't know if it could happen there as well. |
935 | + */ |
936 | + ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this)); |
937 | if (ret) |
938 | goto err_out; |
939 | |
940 | diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c |
941 | index ee5da92..aba4f67 100644 |
942 | --- a/drivers/net/ethernet/realtek/8139cp.c |
943 | +++ b/drivers/net/ethernet/realtek/8139cp.c |
944 | @@ -563,6 +563,7 @@ rx_next: |
945 | if (cpr16(IntrStatus) & cp_rx_intr_mask) |
946 | goto rx_status_loop; |
947 | |
948 | + napi_gro_flush(napi); |
949 | spin_lock_irqsave(&cp->lock, flags); |
950 | __napi_complete(napi); |
951 | cpw16_f(IntrMask, cp_intr_mask); |
952 | diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c |
953 | index 749c2a1..1932029 100644 |
954 | --- a/drivers/pcmcia/ds.c |
955 | +++ b/drivers/pcmcia/ds.c |
956 | @@ -1269,10 +1269,8 @@ static int pcmcia_bus_add(struct pcmcia_socket *skt) |
957 | |
958 | static int pcmcia_bus_early_resume(struct pcmcia_socket *skt) |
959 | { |
960 | - if (!verify_cis_cache(skt)) { |
961 | - pcmcia_put_socket(skt); |
962 | + if (!verify_cis_cache(skt)) |
963 | return 0; |
964 | - } |
965 | |
966 | dev_dbg(&skt->dev, "cis mismatch - different card\n"); |
967 | |
968 | diff --git a/drivers/staging/asus_oled/asus_oled.c b/drivers/staging/asus_oled/asus_oled.c |
969 | index 7bb7da7..63bafbb 100644 |
970 | --- a/drivers/staging/asus_oled/asus_oled.c |
971 | +++ b/drivers/staging/asus_oled/asus_oled.c |
972 | @@ -355,7 +355,14 @@ static void send_data(struct asus_oled_dev *odev) |
973 | |
974 | static int append_values(struct asus_oled_dev *odev, uint8_t val, size_t count) |
975 | { |
976 | - while (count-- > 0 && val) { |
977 | + odev->last_val = val; |
978 | + |
979 | + if (val == 0) { |
980 | + odev->buf_offs += count; |
981 | + return 0; |
982 | + } |
983 | + |
984 | + while (count-- > 0) { |
985 | size_t x = odev->buf_offs % odev->width; |
986 | size_t y = odev->buf_offs / odev->width; |
987 | size_t i; |
988 | @@ -406,7 +413,6 @@ static int append_values(struct asus_oled_dev *odev, uint8_t val, size_t count) |
989 | ; |
990 | } |
991 | |
992 | - odev->last_val = val; |
993 | odev->buf_offs++; |
994 | } |
995 | |
996 | @@ -805,10 +811,9 @@ error: |
997 | |
998 | static void __exit asus_oled_exit(void) |
999 | { |
1000 | + usb_deregister(&oled_driver); |
1001 | class_remove_file(oled_class, &class_attr_version.attr); |
1002 | class_destroy(oled_class); |
1003 | - |
1004 | - usb_deregister(&oled_driver); |
1005 | } |
1006 | |
1007 | module_init(asus_oled_init); |
1008 | diff --git a/drivers/staging/rtl8712/drv_types.h b/drivers/staging/rtl8712/drv_types.h |
1009 | index 9b5d771..ed85b44 100644 |
1010 | --- a/drivers/staging/rtl8712/drv_types.h |
1011 | +++ b/drivers/staging/rtl8712/drv_types.h |
1012 | @@ -37,6 +37,8 @@ struct _adapter; |
1013 | #include "wlan_bssdef.h" |
1014 | #include "rtl8712_spec.h" |
1015 | #include "rtl8712_hal.h" |
1016 | +#include <linux/mutex.h> |
1017 | +#include <linux/completion.h> |
1018 | |
1019 | enum _NIC_VERSION { |
1020 | RTL8711_NIC, |
1021 | @@ -168,6 +170,7 @@ struct _adapter { |
1022 | s32 bSurpriseRemoved; |
1023 | u32 IsrContent; |
1024 | u32 ImrContent; |
1025 | + bool fw_found; |
1026 | u8 EepromAddressSize; |
1027 | u8 hw_init_completed; |
1028 | struct task_struct *cmdThread; |
1029 | @@ -184,6 +187,10 @@ struct _adapter { |
1030 | _workitem wkFilterRxFF0; |
1031 | u8 blnEnableRxFF0Filter; |
1032 | spinlock_t lockRxFF0Filter; |
1033 | + const struct firmware *fw; |
1034 | + struct usb_interface *pusb_intf; |
1035 | + struct mutex mutex_start; |
1036 | + struct completion rtl8712_fw_ready; |
1037 | }; |
1038 | |
1039 | static inline u8 *myid(struct eeprom_priv *peepriv) |
1040 | diff --git a/drivers/staging/rtl8712/hal_init.c b/drivers/staging/rtl8712/hal_init.c |
1041 | index d0029aa..cc893c0 100644 |
1042 | --- a/drivers/staging/rtl8712/hal_init.c |
1043 | +++ b/drivers/staging/rtl8712/hal_init.c |
1044 | @@ -42,29 +42,56 @@ |
1045 | #define FWBUFF_ALIGN_SZ 512 |
1046 | #define MAX_DUMP_FWSZ 49152 /*default = 49152 (48k)*/ |
1047 | |
1048 | -static u32 rtl871x_open_fw(struct _adapter *padapter, void **pphfwfile_hdl, |
1049 | - const u8 **ppmappedfw) |
1050 | +static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context) |
1051 | { |
1052 | + struct _adapter *padapter = context; |
1053 | + |
1054 | + complete(&padapter->rtl8712_fw_ready); |
1055 | + if (!firmware) { |
1056 | + struct usb_device *udev = padapter->dvobjpriv.pusbdev; |
1057 | + struct usb_interface *pusb_intf = padapter->pusb_intf; |
1058 | + printk(KERN_ERR "r8712u: Firmware request failed\n"); |
1059 | + padapter->fw_found = false; |
1060 | + usb_put_dev(udev); |
1061 | + usb_set_intfdata(pusb_intf, NULL); |
1062 | + return; |
1063 | + } |
1064 | + padapter->fw = firmware; |
1065 | + padapter->fw_found = true; |
1066 | + /* firmware available - start netdev */ |
1067 | + register_netdev(padapter->pnetdev); |
1068 | +} |
1069 | + |
1070 | +static const char firmware_file[] = "rtlwifi/rtl8712u.bin"; |
1071 | + |
1072 | +int rtl871x_load_fw(struct _adapter *padapter) |
1073 | +{ |
1074 | + struct device *dev = &padapter->dvobjpriv.pusbdev->dev; |
1075 | int rc; |
1076 | - const char firmware_file[] = "rtlwifi/rtl8712u.bin"; |
1077 | - const struct firmware **praw = (const struct firmware **) |
1078 | - (pphfwfile_hdl); |
1079 | - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *) |
1080 | - (&padapter->dvobjpriv); |
1081 | - struct usb_device *pusbdev = pdvobjpriv->pusbdev; |
1082 | |
1083 | + init_completion(&padapter->rtl8712_fw_ready); |
1084 | printk(KERN_INFO "r8712u: Loading firmware from \"%s\"\n", |
1085 | firmware_file); |
1086 | - rc = request_firmware(praw, firmware_file, &pusbdev->dev); |
1087 | - if (rc < 0) { |
1088 | - printk(KERN_ERR "r8712u: Unable to load firmware\n"); |
1089 | - printk(KERN_ERR "r8712u: Install latest linux-firmware\n"); |
1090 | + rc = request_firmware_nowait(THIS_MODULE, 1, firmware_file, dev, |
1091 | + GFP_KERNEL, padapter, rtl871x_load_fw_cb); |
1092 | + if (rc) |
1093 | + printk(KERN_ERR "r8712u: Firmware request error %d\n", rc); |
1094 | + return rc; |
1095 | +} |
1096 | +MODULE_FIRMWARE("rtlwifi/rtl8712u.bin"); |
1097 | + |
1098 | +static u32 rtl871x_open_fw(struct _adapter *padapter, const u8 **ppmappedfw) |
1099 | +{ |
1100 | + const struct firmware **praw = &padapter->fw; |
1101 | + |
1102 | + if (padapter->fw->size > 200000) { |
1103 | + printk(KERN_ERR "r8172u: Badfw->size of %d\n", |
1104 | + (int)padapter->fw->size); |
1105 | return 0; |
1106 | } |
1107 | *ppmappedfw = (u8 *)((*praw)->data); |
1108 | return (*praw)->size; |
1109 | } |
1110 | -MODULE_FIRMWARE("rtlwifi/rtl8712u.bin"); |
1111 | |
1112 | static void fill_fwpriv(struct _adapter *padapter, struct fw_priv *pfwpriv) |
1113 | { |
1114 | @@ -142,18 +169,17 @@ static u8 rtl8712_dl_fw(struct _adapter *padapter) |
1115 | uint dump_imem_sz, imem_sz, dump_emem_sz, emem_sz; /* max = 49152; */ |
1116 | struct fw_hdr fwhdr; |
1117 | u32 ulfilelength; /* FW file size */ |
1118 | - void *phfwfile_hdl = NULL; |
1119 | const u8 *pmappedfw = NULL; |
1120 | u8 *ptmpchar = NULL, *ppayload, *ptr; |
1121 | struct tx_desc *ptx_desc; |
1122 | u32 txdscp_sz = sizeof(struct tx_desc); |
1123 | u8 ret = _FAIL; |
1124 | |
1125 | - ulfilelength = rtl871x_open_fw(padapter, &phfwfile_hdl, &pmappedfw); |
1126 | + ulfilelength = rtl871x_open_fw(padapter, &pmappedfw); |
1127 | if (pmappedfw && (ulfilelength > 0)) { |
1128 | update_fwhdr(&fwhdr, pmappedfw); |
1129 | if (chk_fwhdr(&fwhdr, ulfilelength) == _FAIL) |
1130 | - goto firmware_rel; |
1131 | + return ret; |
1132 | fill_fwpriv(padapter, &fwhdr.fwpriv); |
1133 | /* firmware check ok */ |
1134 | maxlen = (fwhdr.img_IMEM_size > fwhdr.img_SRAM_size) ? |
1135 | @@ -161,7 +187,7 @@ static u8 rtl8712_dl_fw(struct _adapter *padapter) |
1136 | maxlen += txdscp_sz; |
1137 | ptmpchar = _malloc(maxlen + FWBUFF_ALIGN_SZ); |
1138 | if (ptmpchar == NULL) |
1139 | - goto firmware_rel; |
1140 | + return ret; |
1141 | |
1142 | ptx_desc = (struct tx_desc *)(ptmpchar + FWBUFF_ALIGN_SZ - |
1143 | ((addr_t)(ptmpchar) & (FWBUFF_ALIGN_SZ - 1))); |
1144 | @@ -297,8 +323,6 @@ static u8 rtl8712_dl_fw(struct _adapter *padapter) |
1145 | |
1146 | exit_fail: |
1147 | kfree(ptmpchar); |
1148 | -firmware_rel: |
1149 | - release_firmware((struct firmware *)phfwfile_hdl); |
1150 | return ret; |
1151 | } |
1152 | |
1153 | diff --git a/drivers/staging/rtl8712/os_intfs.c b/drivers/staging/rtl8712/os_intfs.c |
1154 | index 9a75c6d..98a3d68 100644 |
1155 | --- a/drivers/staging/rtl8712/os_intfs.c |
1156 | +++ b/drivers/staging/rtl8712/os_intfs.c |
1157 | @@ -31,6 +31,7 @@ |
1158 | #include <linux/module.h> |
1159 | #include <linux/init.h> |
1160 | #include <linux/kthread.h> |
1161 | +#include <linux/firmware.h> |
1162 | #include "osdep_service.h" |
1163 | #include "drv_types.h" |
1164 | #include "xmit_osdep.h" |
1165 | @@ -264,12 +265,12 @@ static void start_drv_timers(struct _adapter *padapter) |
1166 | void r8712_stop_drv_timers(struct _adapter *padapter) |
1167 | { |
1168 | _cancel_timer_ex(&padapter->mlmepriv.assoc_timer); |
1169 | - _cancel_timer_ex(&padapter->mlmepriv.sitesurveyctrl. |
1170 | - sitesurvey_ctrl_timer); |
1171 | _cancel_timer_ex(&padapter->securitypriv.tkip_timer); |
1172 | _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer); |
1173 | _cancel_timer_ex(&padapter->mlmepriv.dhcp_timer); |
1174 | _cancel_timer_ex(&padapter->mlmepriv.wdg_timer); |
1175 | + _cancel_timer_ex(&padapter->mlmepriv.sitesurveyctrl. |
1176 | + sitesurvey_ctrl_timer); |
1177 | } |
1178 | |
1179 | static u8 init_default_value(struct _adapter *padapter) |
1180 | @@ -347,7 +348,8 @@ u8 r8712_free_drv_sw(struct _adapter *padapter) |
1181 | r8712_free_mlme_priv(&padapter->mlmepriv); |
1182 | r8712_free_io_queue(padapter); |
1183 | _free_xmit_priv(&padapter->xmitpriv); |
1184 | - _r8712_free_sta_priv(&padapter->stapriv); |
1185 | + if (padapter->fw_found) |
1186 | + _r8712_free_sta_priv(&padapter->stapriv); |
1187 | _r8712_free_recv_priv(&padapter->recvpriv); |
1188 | mp871xdeinit(padapter); |
1189 | if (pnetdev) |
1190 | @@ -388,6 +390,7 @@ static int netdev_open(struct net_device *pnetdev) |
1191 | { |
1192 | struct _adapter *padapter = (struct _adapter *)netdev_priv(pnetdev); |
1193 | |
1194 | + mutex_lock(&padapter->mutex_start); |
1195 | if (padapter->bup == false) { |
1196 | padapter->bDriverStopped = false; |
1197 | padapter->bSurpriseRemoved = false; |
1198 | @@ -435,11 +438,13 @@ static int netdev_open(struct net_device *pnetdev) |
1199 | /* start driver mlme relation timer */ |
1200 | start_drv_timers(padapter); |
1201 | padapter->ledpriv.LedControlHandler(padapter, LED_CTL_NO_LINK); |
1202 | + mutex_unlock(&padapter->mutex_start); |
1203 | return 0; |
1204 | netdev_open_error: |
1205 | padapter->bup = false; |
1206 | netif_carrier_off(pnetdev); |
1207 | netif_stop_queue(pnetdev); |
1208 | + mutex_unlock(&padapter->mutex_start); |
1209 | return -1; |
1210 | } |
1211 | |
1212 | @@ -473,6 +478,9 @@ static int netdev_close(struct net_device *pnetdev) |
1213 | r8712_free_network_queue(padapter); |
1214 | /* The interface is no longer Up: */ |
1215 | padapter->bup = false; |
1216 | + release_firmware(padapter->fw); |
1217 | + /* never exit with a firmware callback pending */ |
1218 | + wait_for_completion(&padapter->rtl8712_fw_ready); |
1219 | return 0; |
1220 | } |
1221 | |
1222 | diff --git a/drivers/staging/rtl8712/rtl8712_hal.h b/drivers/staging/rtl8712/rtl8712_hal.h |
1223 | index 665e718..d19865a 100644 |
1224 | --- a/drivers/staging/rtl8712/rtl8712_hal.h |
1225 | +++ b/drivers/staging/rtl8712/rtl8712_hal.h |
1226 | @@ -145,5 +145,6 @@ struct hal_priv { |
1227 | }; |
1228 | |
1229 | uint rtl8712_hal_init(struct _adapter *padapter); |
1230 | +int rtl871x_load_fw(struct _adapter *padapter); |
1231 | |
1232 | #endif |
1233 | diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c |
1234 | index 5385da2..9bade18 100644 |
1235 | --- a/drivers/staging/rtl8712/usb_intf.c |
1236 | +++ b/drivers/staging/rtl8712/usb_intf.c |
1237 | @@ -89,6 +89,7 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = { |
1238 | {USB_DEVICE(0x0DF6, 0x0045)}, |
1239 | {USB_DEVICE(0x0DF6, 0x0059)}, /* 11n mode disable */ |
1240 | {USB_DEVICE(0x0DF6, 0x004B)}, |
1241 | + {USB_DEVICE(0x0DF6, 0x005B)}, |
1242 | {USB_DEVICE(0x0DF6, 0x005D)}, |
1243 | {USB_DEVICE(0x0DF6, 0x0063)}, |
1244 | /* Sweex */ |
1245 | @@ -389,6 +390,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf, |
1246 | pdvobjpriv = &padapter->dvobjpriv; |
1247 | pdvobjpriv->padapter = padapter; |
1248 | padapter->dvobjpriv.pusbdev = udev; |
1249 | + padapter->pusb_intf = pusb_intf; |
1250 | usb_set_intfdata(pusb_intf, pnetdev); |
1251 | SET_NETDEV_DEV(pnetdev, &pusb_intf->dev); |
1252 | /* step 2. */ |
1253 | @@ -595,10 +597,11 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf, |
1254 | "%pM\n", mac); |
1255 | memcpy(pnetdev->dev_addr, mac, ETH_ALEN); |
1256 | } |
1257 | - /* step 6. Tell the network stack we exist */ |
1258 | - if (register_netdev(pnetdev) != 0) |
1259 | + /* step 6. Load the firmware asynchronously */ |
1260 | + if (rtl871x_load_fw(padapter)) |
1261 | goto error; |
1262 | spin_lock_init(&padapter->lockRxFF0Filter); |
1263 | + mutex_init(&padapter->mutex_start); |
1264 | return 0; |
1265 | error: |
1266 | usb_put_dev(udev); |
1267 | @@ -629,7 +632,8 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf) |
1268 | flush_scheduled_work(); |
1269 | udelay(1); |
1270 | /*Stop driver mlme relation timer */ |
1271 | - r8712_stop_drv_timers(padapter); |
1272 | + if (padapter->fw_found) |
1273 | + r8712_stop_drv_timers(padapter); |
1274 | r871x_dev_unload(padapter); |
1275 | r8712_free_drv_sw(padapter); |
1276 | } |
1277 | diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c |
1278 | index 56c1f9c..f5e469d 100644 |
1279 | --- a/drivers/staging/zcache/zcache-main.c |
1280 | +++ b/drivers/staging/zcache/zcache-main.c |
1281 | @@ -358,8 +358,8 @@ static struct zbud_hdr *zbud_create(uint16_t client_id, uint16_t pool_id, |
1282 | if (unlikely(zbpg == NULL)) |
1283 | goto out; |
1284 | /* ok, have a page, now compress the data before taking locks */ |
1285 | - spin_lock(&zbpg->lock); |
1286 | spin_lock(&zbud_budlists_spinlock); |
1287 | + spin_lock(&zbpg->lock); |
1288 | list_add_tail(&zbpg->bud_list, &zbud_unbuddied[nchunks].list); |
1289 | zbud_unbuddied[nchunks].count++; |
1290 | zh = &zbpg->buddy[0]; |
1291 | @@ -389,12 +389,11 @@ init_zh: |
1292 | zh->oid = *oid; |
1293 | zh->pool_id = pool_id; |
1294 | zh->client_id = client_id; |
1295 | - /* can wait to copy the data until the list locks are dropped */ |
1296 | - spin_unlock(&zbud_budlists_spinlock); |
1297 | - |
1298 | to = zbud_data(zh, size); |
1299 | memcpy(to, cdata, size); |
1300 | spin_unlock(&zbpg->lock); |
1301 | + spin_unlock(&zbud_budlists_spinlock); |
1302 | + |
1303 | zbud_cumul_chunk_counts[nchunks]++; |
1304 | atomic_inc(&zcache_zbud_curr_zpages); |
1305 | zcache_zbud_cumul_zpages++; |
1306 | @@ -1782,9 +1781,9 @@ static int zcache_frontswap_poolid = -1; |
1307 | * Swizzling increases objects per swaptype, increasing tmem concurrency |
1308 | * for heavy swaploads. Later, larger nr_cpus -> larger SWIZ_BITS |
1309 | * Setting SWIZ_BITS to 27 basically reconstructs the swap entry from |
1310 | - * frontswap_get_page() |
1311 | + * frontswap_get_page(), but has side-effects. Hence using 8. |
1312 | */ |
1313 | -#define SWIZ_BITS 27 |
1314 | +#define SWIZ_BITS 8 |
1315 | #define SWIZ_MASK ((1 << SWIZ_BITS) - 1) |
1316 | #define _oswiz(_type, _ind) ((_type << SWIZ_BITS) | (_ind & SWIZ_MASK)) |
1317 | #define iswiz(_ind) (_ind >> SWIZ_BITS) |
1318 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
1319 | index 8599545..0c1d5c73 100644 |
1320 | --- a/drivers/target/iscsi/iscsi_target.c |
1321 | +++ b/drivers/target/iscsi/iscsi_target.c |
1322 | @@ -1062,7 +1062,7 @@ attach_cmd: |
1323 | if (ret < 0) |
1324 | return iscsit_add_reject_from_cmd( |
1325 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
1326 | - 1, 1, buf, cmd); |
1327 | + 1, 0, buf, cmd); |
1328 | /* |
1329 | * Check the CmdSN against ExpCmdSN/MaxCmdSN here if |
1330 | * the Immediate Bit is not set, and no Immediate |
1331 | @@ -3165,6 +3165,30 @@ static int iscsit_send_task_mgt_rsp( |
1332 | return 0; |
1333 | } |
1334 | |
1335 | +static bool iscsit_check_inaddr_any(struct iscsi_np *np) |
1336 | +{ |
1337 | + bool ret = false; |
1338 | + |
1339 | + if (np->np_sockaddr.ss_family == AF_INET6) { |
1340 | + const struct sockaddr_in6 sin6 = { |
1341 | + .sin6_addr = IN6ADDR_ANY_INIT }; |
1342 | + struct sockaddr_in6 *sock_in6 = |
1343 | + (struct sockaddr_in6 *)&np->np_sockaddr; |
1344 | + |
1345 | + if (!memcmp(sock_in6->sin6_addr.s6_addr, |
1346 | + sin6.sin6_addr.s6_addr, 16)) |
1347 | + ret = true; |
1348 | + } else { |
1349 | + struct sockaddr_in * sock_in = |
1350 | + (struct sockaddr_in *)&np->np_sockaddr; |
1351 | + |
1352 | + if (sock_in->sin_addr.s_addr == INADDR_ANY) |
1353 | + ret = true; |
1354 | + } |
1355 | + |
1356 | + return ret; |
1357 | +} |
1358 | + |
1359 | static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd) |
1360 | { |
1361 | char *payload = NULL; |
1362 | @@ -3214,12 +3238,17 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd) |
1363 | spin_lock(&tpg->tpg_np_lock); |
1364 | list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, |
1365 | tpg_np_list) { |
1366 | + struct iscsi_np *np = tpg_np->tpg_np; |
1367 | + bool inaddr_any = iscsit_check_inaddr_any(np); |
1368 | + |
1369 | len = sprintf(buf, "TargetAddress=" |
1370 | "%s%s%s:%hu,%hu", |
1371 | - (tpg_np->tpg_np->np_sockaddr.ss_family == AF_INET6) ? |
1372 | - "[" : "", tpg_np->tpg_np->np_ip, |
1373 | - (tpg_np->tpg_np->np_sockaddr.ss_family == AF_INET6) ? |
1374 | - "]" : "", tpg_np->tpg_np->np_port, |
1375 | + (np->np_sockaddr.ss_family == AF_INET6) ? |
1376 | + "[" : "", (inaddr_any == false) ? |
1377 | + np->np_ip : conn->local_ip, |
1378 | + (np->np_sockaddr.ss_family == AF_INET6) ? |
1379 | + "]" : "", (inaddr_any == false) ? |
1380 | + np->np_port : conn->local_port, |
1381 | tpg->tpgt); |
1382 | len += 1; |
1383 | |
1384 | diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h |
1385 | index f1a02da..7da2d6a 100644 |
1386 | --- a/drivers/target/iscsi/iscsi_target_core.h |
1387 | +++ b/drivers/target/iscsi/iscsi_target_core.h |
1388 | @@ -508,6 +508,7 @@ struct iscsi_conn { |
1389 | u16 cid; |
1390 | /* Remote TCP Port */ |
1391 | u16 login_port; |
1392 | + u16 local_port; |
1393 | int net_size; |
1394 | u32 auth_id; |
1395 | #define CONNFLAG_SCTP_STRUCT_FILE 0x01 |
1396 | @@ -527,6 +528,7 @@ struct iscsi_conn { |
1397 | unsigned char bad_hdr[ISCSI_HDR_LEN]; |
1398 | #define IPV6_ADDRESS_SPACE 48 |
1399 | unsigned char login_ip[IPV6_ADDRESS_SPACE]; |
1400 | + unsigned char local_ip[IPV6_ADDRESS_SPACE]; |
1401 | int conn_usage_count; |
1402 | int conn_waiting_on_uc; |
1403 | atomic_t check_immediate_queue; |
1404 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c |
1405 | index d734bde..bd2adec 100644 |
1406 | --- a/drivers/target/iscsi/iscsi_target_login.c |
1407 | +++ b/drivers/target/iscsi/iscsi_target_login.c |
1408 | @@ -616,8 +616,8 @@ static int iscsi_post_login_handler( |
1409 | } |
1410 | |
1411 | pr_debug("iSCSI Login successful on CID: %hu from %s to" |
1412 | - " %s:%hu,%hu\n", conn->cid, conn->login_ip, np->np_ip, |
1413 | - np->np_port, tpg->tpgt); |
1414 | + " %s:%hu,%hu\n", conn->cid, conn->login_ip, |
1415 | + conn->local_ip, conn->local_port, tpg->tpgt); |
1416 | |
1417 | list_add_tail(&conn->conn_list, &sess->sess_conn_list); |
1418 | atomic_inc(&sess->nconn); |
1419 | @@ -659,7 +659,8 @@ static int iscsi_post_login_handler( |
1420 | sess->session_state = TARG_SESS_STATE_LOGGED_IN; |
1421 | |
1422 | pr_debug("iSCSI Login successful on CID: %hu from %s to %s:%hu,%hu\n", |
1423 | - conn->cid, conn->login_ip, np->np_ip, np->np_port, tpg->tpgt); |
1424 | + conn->cid, conn->login_ip, conn->local_ip, conn->local_port, |
1425 | + tpg->tpgt); |
1426 | |
1427 | spin_lock_bh(&sess->conn_lock); |
1428 | list_add_tail(&conn->conn_list, &sess->sess_conn_list); |
1429 | @@ -1019,6 +1020,18 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) |
1430 | snprintf(conn->login_ip, sizeof(conn->login_ip), "%pI6c", |
1431 | &sock_in6.sin6_addr.in6_u); |
1432 | conn->login_port = ntohs(sock_in6.sin6_port); |
1433 | + |
1434 | + if (conn->sock->ops->getname(conn->sock, |
1435 | + (struct sockaddr *)&sock_in6, &err, 0) < 0) { |
1436 | + pr_err("sock_ops->getname() failed.\n"); |
1437 | + iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, |
1438 | + ISCSI_LOGIN_STATUS_TARGET_ERROR); |
1439 | + goto new_sess_out; |
1440 | + } |
1441 | + snprintf(conn->local_ip, sizeof(conn->local_ip), "%pI6c", |
1442 | + &sock_in6.sin6_addr.in6_u); |
1443 | + conn->local_port = ntohs(sock_in6.sin6_port); |
1444 | + |
1445 | } else { |
1446 | memset(&sock_in, 0, sizeof(struct sockaddr_in)); |
1447 | |
1448 | @@ -1031,6 +1044,16 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) |
1449 | } |
1450 | sprintf(conn->login_ip, "%pI4", &sock_in.sin_addr.s_addr); |
1451 | conn->login_port = ntohs(sock_in.sin_port); |
1452 | + |
1453 | + if (conn->sock->ops->getname(conn->sock, |
1454 | + (struct sockaddr *)&sock_in, &err, 0) < 0) { |
1455 | + pr_err("sock_ops->getname() failed.\n"); |
1456 | + iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, |
1457 | + ISCSI_LOGIN_STATUS_TARGET_ERROR); |
1458 | + goto new_sess_out; |
1459 | + } |
1460 | + sprintf(conn->local_ip, "%pI4", &sock_in.sin_addr.s_addr); |
1461 | + conn->local_port = ntohs(sock_in.sin_port); |
1462 | } |
1463 | |
1464 | conn->network_transport = np->np_network_transport; |
1465 | @@ -1038,7 +1061,7 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) |
1466 | pr_debug("Received iSCSI login request from %s on %s Network" |
1467 | " Portal %s:%hu\n", conn->login_ip, |
1468 | (conn->network_transport == ISCSI_TCP) ? "TCP" : "SCTP", |
1469 | - np->np_ip, np->np_port); |
1470 | + conn->local_ip, conn->local_port); |
1471 | |
1472 | pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n"); |
1473 | conn->conn_state = TARG_CONN_STATE_IN_LOGIN; |
1474 | diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c |
1475 | index 02348f7..99f2af3 100644 |
1476 | --- a/drivers/target/iscsi/iscsi_target_util.c |
1477 | +++ b/drivers/target/iscsi/iscsi_target_util.c |
1478 | @@ -851,6 +851,17 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd) |
1479 | case ISCSI_OP_SCSI_TMFUNC: |
1480 | transport_generic_free_cmd(&cmd->se_cmd, 1); |
1481 | break; |
1482 | + case ISCSI_OP_REJECT: |
1483 | + /* |
1484 | + * Handle special case for REJECT when iscsi_add_reject*() has |
1485 | + * overwritten the original iscsi_opcode assignment, and the |
1486 | + * associated cmd->se_cmd needs to be released. |
1487 | + */ |
1488 | + if (cmd->se_cmd.se_tfo != NULL) { |
1489 | + transport_generic_free_cmd(&cmd->se_cmd, 1); |
1490 | + break; |
1491 | + } |
1492 | + /* Fall-through */ |
1493 | default: |
1494 | iscsit_release_cmd(cmd); |
1495 | break; |
1496 | diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c |
1497 | index 2e8c1be..251e48f 100644 |
1498 | --- a/drivers/target/target_core_cdb.c |
1499 | +++ b/drivers/target/target_core_cdb.c |
1500 | @@ -701,6 +701,13 @@ int target_emulate_inquiry(struct se_task *task) |
1501 | int p, ret; |
1502 | |
1503 | if (!(cdb[1] & 0x1)) { |
1504 | + if (cdb[2]) { |
1505 | + pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n", |
1506 | + cdb[2]); |
1507 | + cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; |
1508 | + return -EINVAL; |
1509 | + } |
1510 | + |
1511 | ret = target_emulate_inquiry_std(cmd); |
1512 | goto out; |
1513 | } |
1514 | @@ -732,7 +739,7 @@ int target_emulate_inquiry(struct se_task *task) |
1515 | } |
1516 | |
1517 | pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]); |
1518 | - cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; |
1519 | + cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; |
1520 | ret = -EINVAL; |
1521 | |
1522 | out_unmap: |
1523 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c |
1524 | index 95dee70..9119d92 100644 |
1525 | --- a/drivers/target/target_core_pr.c |
1526 | +++ b/drivers/target/target_core_pr.c |
1527 | @@ -481,6 +481,7 @@ static int core_scsi3_pr_seq_non_holder( |
1528 | case READ_MEDIA_SERIAL_NUMBER: |
1529 | case REPORT_LUNS: |
1530 | case REQUEST_SENSE: |
1531 | + case PERSISTENT_RESERVE_IN: |
1532 | ret = 0; /*/ Allowed CDBs */ |
1533 | break; |
1534 | default: |
1535 | @@ -3138,7 +3139,7 @@ static int core_scsi3_pro_preempt( |
1536 | if (!calling_it_nexus) |
1537 | core_scsi3_ua_allocate(pr_reg_nacl, |
1538 | pr_res_mapped_lun, 0x2A, |
1539 | - ASCQ_2AH_RESERVATIONS_PREEMPTED); |
1540 | + ASCQ_2AH_REGISTRATIONS_PREEMPTED); |
1541 | } |
1542 | spin_unlock(&pr_tmpl->registration_lock); |
1543 | /* |
1544 | @@ -3251,7 +3252,7 @@ static int core_scsi3_pro_preempt( |
1545 | * additional sense code set to REGISTRATIONS PREEMPTED; |
1546 | */ |
1547 | core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun, 0x2A, |
1548 | - ASCQ_2AH_RESERVATIONS_PREEMPTED); |
1549 | + ASCQ_2AH_REGISTRATIONS_PREEMPTED); |
1550 | } |
1551 | spin_unlock(&pr_tmpl->registration_lock); |
1552 | /* |
1553 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
1554 | index e87d0eb..861628e 100644 |
1555 | --- a/drivers/target/target_core_transport.c |
1556 | +++ b/drivers/target/target_core_transport.c |
1557 | @@ -3701,6 +3701,11 @@ transport_allocate_control_task(struct se_cmd *cmd) |
1558 | struct se_task *task; |
1559 | unsigned long flags; |
1560 | |
1561 | + /* Workaround for handling zero-length control CDBs */ |
1562 | + if ((cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) && |
1563 | + !cmd->data_length) |
1564 | + return 0; |
1565 | + |
1566 | task = transport_generic_get_task(cmd, cmd->data_direction); |
1567 | if (!task) |
1568 | return -ENOMEM; |
1569 | @@ -3772,6 +3777,14 @@ int transport_generic_new_cmd(struct se_cmd *cmd) |
1570 | else if (!task_cdbs && (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB)) { |
1571 | cmd->t_state = TRANSPORT_COMPLETE; |
1572 | atomic_set(&cmd->t_transport_active, 1); |
1573 | + |
1574 | + if (cmd->t_task_cdb[0] == REQUEST_SENSE) { |
1575 | + u8 ua_asc = 0, ua_ascq = 0; |
1576 | + |
1577 | + core_scsi3_ua_clear_for_request_sense(cmd, |
1578 | + &ua_asc, &ua_ascq); |
1579 | + } |
1580 | + |
1581 | INIT_WORK(&cmd->work, target_complete_ok_work); |
1582 | queue_work(target_completion_wq, &cmd->work); |
1583 | return 0; |
1584 | @@ -4403,8 +4416,8 @@ int transport_send_check_condition_and_sense( |
1585 | /* CURRENT ERROR */ |
1586 | buffer[offset] = 0x70; |
1587 | buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; |
1588 | - /* ABORTED COMMAND */ |
1589 | - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; |
1590 | + /* ILLEGAL REQUEST */ |
1591 | + buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; |
1592 | /* INVALID FIELD IN CDB */ |
1593 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x24; |
1594 | break; |
1595 | @@ -4412,8 +4425,8 @@ int transport_send_check_condition_and_sense( |
1596 | /* CURRENT ERROR */ |
1597 | buffer[offset] = 0x70; |
1598 | buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; |
1599 | - /* ABORTED COMMAND */ |
1600 | - buffer[offset+SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; |
1601 | + /* ILLEGAL REQUEST */ |
1602 | + buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; |
1603 | /* INVALID FIELD IN PARAMETER LIST */ |
1604 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x26; |
1605 | break; |
1606 | diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c |
1607 | index 5e096f4..65447c5 100644 |
1608 | --- a/drivers/tty/vt/vt_ioctl.c |
1609 | +++ b/drivers/tty/vt/vt_ioctl.c |
1610 | @@ -1463,7 +1463,6 @@ compat_kdfontop_ioctl(struct compat_console_font_op __user *fontop, |
1611 | if (!perm && op->op != KD_FONT_OP_GET) |
1612 | return -EPERM; |
1613 | op->data = compat_ptr(((struct compat_console_font_op *)op)->data); |
1614 | - op->flags |= KD_FONT_FLAG_OLD; |
1615 | i = con_font_op(vc, op); |
1616 | if (i) |
1617 | return i; |
1618 | diff --git a/drivers/usb/gadget/f_loopback.c b/drivers/usb/gadget/f_loopback.c |
1619 | index 6d87f28..2c0cd82 100644 |
1620 | --- a/drivers/usb/gadget/f_loopback.c |
1621 | +++ b/drivers/usb/gadget/f_loopback.c |
1622 | @@ -418,7 +418,7 @@ int __init loopback_add(struct usb_composite_dev *cdev, bool autoresume) |
1623 | |
1624 | /* support autoresume for remote wakeup testing */ |
1625 | if (autoresume) |
1626 | - sourcesink_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; |
1627 | + loopback_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; |
1628 | |
1629 | /* support OTG systems */ |
1630 | if (gadget_is_otg(cdev->gadget)) { |
1631 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c |
1632 | index caf8742..ac53a66 100644 |
1633 | --- a/drivers/usb/host/pci-quirks.c |
1634 | +++ b/drivers/usb/host/pci-quirks.c |
1635 | @@ -867,6 +867,12 @@ hc_init: |
1636 | |
1637 | static void __devinit quirk_usb_early_handoff(struct pci_dev *pdev) |
1638 | { |
1639 | + /* Skip Netlogic mips SoC's internal PCI USB controller. |
1640 | + * This device does not need/support EHCI/OHCI handoff |
1641 | + */ |
1642 | + if (pdev->vendor == 0x184e) /* vendor Netlogic */ |
1643 | + return; |
1644 | + |
1645 | if (pdev->class == PCI_CLASS_SERIAL_USB_UHCI) |
1646 | quirk_usb_handoff_uhci(pdev); |
1647 | else if (pdev->class == PCI_CLASS_SERIAL_USB_OHCI) |
1648 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1649 | index 058b92c..f030471 100644 |
1650 | --- a/drivers/usb/serial/ftdi_sio.c |
1651 | +++ b/drivers/usb/serial/ftdi_sio.c |
1652 | @@ -839,6 +839,7 @@ static struct usb_device_id id_table_combined [] = { |
1653 | { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) }, |
1654 | { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) }, |
1655 | { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) }, |
1656 | + { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) }, |
1657 | { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, |
1658 | { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), |
1659 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1660 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
1661 | index 76d4f31..4eb7715 100644 |
1662 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
1663 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
1664 | @@ -1187,3 +1187,10 @@ |
1665 | */ |
1666 | /* ZigBee controller */ |
1667 | #define FTDI_RF_R106 0x8A28 |
1668 | + |
1669 | +/* |
1670 | + * Product: HCP HIT GPRS modem |
1671 | + * Manufacturer: HCP d.o.o. |
1672 | + * ATI command output: Cinterion MC55i |
1673 | + */ |
1674 | +#define FTDI_CINTERION_MC55I_PID 0xA951 |
1675 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1676 | index 2a9ed6e..338d082 100644 |
1677 | --- a/drivers/usb/serial/option.c |
1678 | +++ b/drivers/usb/serial/option.c |
1679 | @@ -855,6 +855,18 @@ static const struct usb_device_id option_ids[] = { |
1680 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0083, 0xff, 0xff, 0xff) }, |
1681 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0086, 0xff, 0xff, 0xff) }, |
1682 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0087, 0xff, 0xff, 0xff) }, |
1683 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0088, 0xff, 0xff, 0xff) }, |
1684 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0089, 0xff, 0xff, 0xff) }, |
1685 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0090, 0xff, 0xff, 0xff) }, |
1686 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0091, 0xff, 0xff, 0xff) }, |
1687 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0092, 0xff, 0xff, 0xff) }, |
1688 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0093, 0xff, 0xff, 0xff) }, |
1689 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, |
1690 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0095, 0xff, 0xff, 0xff) }, |
1691 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0096, 0xff, 0xff, 0xff) }, |
1692 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0097, 0xff, 0xff, 0xff) }, |
1693 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0098, 0xff, 0xff, 0xff) }, |
1694 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0099, 0xff, 0xff, 0xff) }, |
1695 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff), |
1696 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1697 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0105, 0xff, 0xff, 0xff) }, |
1698 | @@ -883,7 +895,6 @@ static const struct usb_device_id option_ids[] = { |
1699 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0151, 0xff, 0xff, 0xff) }, |
1700 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, |
1701 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, |
1702 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0154, 0xff, 0xff, 0xff) }, |
1703 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, |
1704 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, |
1705 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, |
1706 | @@ -892,6 +903,12 @@ static const struct usb_device_id option_ids[] = { |
1707 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0160, 0xff, 0xff, 0xff) }, |
1708 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, |
1709 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, |
1710 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0164, 0xff, 0xff, 0xff) }, |
1711 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
1712 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) }, |
1713 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, |
1714 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) }, |
1715 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) }, |
1716 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, |
1717 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, |
1718 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, |
1719 | @@ -1066,6 +1083,116 @@ static const struct usb_device_id option_ids[] = { |
1720 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
1721 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
1722 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
1723 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff) }, |
1724 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff) }, |
1725 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1403, 0xff, 0xff, 0xff) }, |
1726 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1404, 0xff, 0xff, 0xff) }, |
1727 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1405, 0xff, 0xff, 0xff) }, |
1728 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1406, 0xff, 0xff, 0xff) }, |
1729 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1407, 0xff, 0xff, 0xff) }, |
1730 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1408, 0xff, 0xff, 0xff) }, |
1731 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1409, 0xff, 0xff, 0xff) }, |
1732 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1410, 0xff, 0xff, 0xff) }, |
1733 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1411, 0xff, 0xff, 0xff) }, |
1734 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1412, 0xff, 0xff, 0xff) }, |
1735 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1413, 0xff, 0xff, 0xff) }, |
1736 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1414, 0xff, 0xff, 0xff) }, |
1737 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1415, 0xff, 0xff, 0xff) }, |
1738 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1416, 0xff, 0xff, 0xff) }, |
1739 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1417, 0xff, 0xff, 0xff) }, |
1740 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1418, 0xff, 0xff, 0xff) }, |
1741 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1419, 0xff, 0xff, 0xff) }, |
1742 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1420, 0xff, 0xff, 0xff) }, |
1743 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1421, 0xff, 0xff, 0xff) }, |
1744 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1422, 0xff, 0xff, 0xff) }, |
1745 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1423, 0xff, 0xff, 0xff) }, |
1746 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1424, 0xff, 0xff, 0xff) }, |
1747 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1425, 0xff, 0xff, 0xff) }, |
1748 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff) }, |
1749 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1427, 0xff, 0xff, 0xff) }, |
1750 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1428, 0xff, 0xff, 0xff) }, |
1751 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1429, 0xff, 0xff, 0xff) }, |
1752 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1430, 0xff, 0xff, 0xff) }, |
1753 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1431, 0xff, 0xff, 0xff) }, |
1754 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1432, 0xff, 0xff, 0xff) }, |
1755 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1433, 0xff, 0xff, 0xff) }, |
1756 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1434, 0xff, 0xff, 0xff) }, |
1757 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1435, 0xff, 0xff, 0xff) }, |
1758 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1436, 0xff, 0xff, 0xff) }, |
1759 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1437, 0xff, 0xff, 0xff) }, |
1760 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1438, 0xff, 0xff, 0xff) }, |
1761 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1439, 0xff, 0xff, 0xff) }, |
1762 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1440, 0xff, 0xff, 0xff) }, |
1763 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1441, 0xff, 0xff, 0xff) }, |
1764 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1442, 0xff, 0xff, 0xff) }, |
1765 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1443, 0xff, 0xff, 0xff) }, |
1766 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1444, 0xff, 0xff, 0xff) }, |
1767 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1445, 0xff, 0xff, 0xff) }, |
1768 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1446, 0xff, 0xff, 0xff) }, |
1769 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1447, 0xff, 0xff, 0xff) }, |
1770 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1448, 0xff, 0xff, 0xff) }, |
1771 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1449, 0xff, 0xff, 0xff) }, |
1772 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1450, 0xff, 0xff, 0xff) }, |
1773 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1451, 0xff, 0xff, 0xff) }, |
1774 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1452, 0xff, 0xff, 0xff) }, |
1775 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1453, 0xff, 0xff, 0xff) }, |
1776 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1454, 0xff, 0xff, 0xff) }, |
1777 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1455, 0xff, 0xff, 0xff) }, |
1778 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1456, 0xff, 0xff, 0xff) }, |
1779 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1457, 0xff, 0xff, 0xff) }, |
1780 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1458, 0xff, 0xff, 0xff) }, |
1781 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1459, 0xff, 0xff, 0xff) }, |
1782 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1460, 0xff, 0xff, 0xff) }, |
1783 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1461, 0xff, 0xff, 0xff) }, |
1784 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1462, 0xff, 0xff, 0xff) }, |
1785 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1463, 0xff, 0xff, 0xff) }, |
1786 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1464, 0xff, 0xff, 0xff) }, |
1787 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1465, 0xff, 0xff, 0xff) }, |
1788 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1466, 0xff, 0xff, 0xff) }, |
1789 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1467, 0xff, 0xff, 0xff) }, |
1790 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1468, 0xff, 0xff, 0xff) }, |
1791 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1469, 0xff, 0xff, 0xff) }, |
1792 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1470, 0xff, 0xff, 0xff) }, |
1793 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1471, 0xff, 0xff, 0xff) }, |
1794 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1472, 0xff, 0xff, 0xff) }, |
1795 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1473, 0xff, 0xff, 0xff) }, |
1796 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1474, 0xff, 0xff, 0xff) }, |
1797 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1475, 0xff, 0xff, 0xff) }, |
1798 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1476, 0xff, 0xff, 0xff) }, |
1799 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1477, 0xff, 0xff, 0xff) }, |
1800 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1478, 0xff, 0xff, 0xff) }, |
1801 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1479, 0xff, 0xff, 0xff) }, |
1802 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1480, 0xff, 0xff, 0xff) }, |
1803 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1481, 0xff, 0xff, 0xff) }, |
1804 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1482, 0xff, 0xff, 0xff) }, |
1805 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1483, 0xff, 0xff, 0xff) }, |
1806 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1484, 0xff, 0xff, 0xff) }, |
1807 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1485, 0xff, 0xff, 0xff) }, |
1808 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1486, 0xff, 0xff, 0xff) }, |
1809 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1487, 0xff, 0xff, 0xff) }, |
1810 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1488, 0xff, 0xff, 0xff) }, |
1811 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1489, 0xff, 0xff, 0xff) }, |
1812 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1490, 0xff, 0xff, 0xff) }, |
1813 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1491, 0xff, 0xff, 0xff) }, |
1814 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1492, 0xff, 0xff, 0xff) }, |
1815 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1493, 0xff, 0xff, 0xff) }, |
1816 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1494, 0xff, 0xff, 0xff) }, |
1817 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1495, 0xff, 0xff, 0xff) }, |
1818 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1496, 0xff, 0xff, 0xff) }, |
1819 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1497, 0xff, 0xff, 0xff) }, |
1820 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1498, 0xff, 0xff, 0xff) }, |
1821 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1499, 0xff, 0xff, 0xff) }, |
1822 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1500, 0xff, 0xff, 0xff) }, |
1823 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1501, 0xff, 0xff, 0xff) }, |
1824 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1502, 0xff, 0xff, 0xff) }, |
1825 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1503, 0xff, 0xff, 0xff) }, |
1826 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1504, 0xff, 0xff, 0xff) }, |
1827 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1505, 0xff, 0xff, 0xff) }, |
1828 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1506, 0xff, 0xff, 0xff) }, |
1829 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1507, 0xff, 0xff, 0xff) }, |
1830 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1508, 0xff, 0xff, 0xff) }, |
1831 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1509, 0xff, 0xff, 0xff) }, |
1832 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1510, 0xff, 0xff, 0xff) }, |
1833 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */ |
1834 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) }, |
1835 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) }, |
1836 | diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c |
1837 | index 63409c1..e919c70 100644 |
1838 | --- a/drivers/video/atmel_lcdfb.c |
1839 | +++ b/drivers/video/atmel_lcdfb.c |
1840 | @@ -1089,7 +1089,7 @@ static int atmel_lcdfb_suspend(struct platform_device *pdev, pm_message_t mesg) |
1841 | */ |
1842 | lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL); |
1843 | |
1844 | - sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL); |
1845 | + sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_CTR); |
1846 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, 0); |
1847 | if (sinfo->atmel_lcdfb_power_control) |
1848 | sinfo->atmel_lcdfb_power_control(0); |
1849 | diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c |
1850 | index 4ec3ee9..2504809 100644 |
1851 | --- a/fs/cifs/sess.c |
1852 | +++ b/fs/cifs/sess.c |
1853 | @@ -246,16 +246,15 @@ static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses, |
1854 | /* copy user */ |
1855 | /* BB what about null user mounts - check that we do this BB */ |
1856 | /* copy user */ |
1857 | - if (ses->user_name != NULL) |
1858 | + if (ses->user_name != NULL) { |
1859 | strncpy(bcc_ptr, ses->user_name, MAX_USERNAME_SIZE); |
1860 | + bcc_ptr += strnlen(ses->user_name, MAX_USERNAME_SIZE); |
1861 | + } |
1862 | /* else null user mount */ |
1863 | - |
1864 | - bcc_ptr += strnlen(ses->user_name, MAX_USERNAME_SIZE); |
1865 | *bcc_ptr = 0; |
1866 | bcc_ptr++; /* account for null termination */ |
1867 | |
1868 | /* copy domain */ |
1869 | - |
1870 | if (ses->domainName != NULL) { |
1871 | strncpy(bcc_ptr, ses->domainName, 256); |
1872 | bcc_ptr += strnlen(ses->domainName, 256); |
1873 | diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c |
1874 | index 54eb14c..608c1c3 100644 |
1875 | --- a/fs/ecryptfs/read_write.c |
1876 | +++ b/fs/ecryptfs/read_write.c |
1877 | @@ -130,7 +130,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, |
1878 | pgoff_t ecryptfs_page_idx = (pos >> PAGE_CACHE_SHIFT); |
1879 | size_t start_offset_in_page = (pos & ~PAGE_CACHE_MASK); |
1880 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); |
1881 | - size_t total_remaining_bytes = ((offset + size) - pos); |
1882 | + loff_t total_remaining_bytes = ((offset + size) - pos); |
1883 | |
1884 | if (fatal_signal_pending(current)) { |
1885 | rc = -EINTR; |
1886 | @@ -141,7 +141,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, |
1887 | num_bytes = total_remaining_bytes; |
1888 | if (pos < offset) { |
1889 | /* remaining zeros to write, up to destination offset */ |
1890 | - size_t total_remaining_zeros = (offset - pos); |
1891 | + loff_t total_remaining_zeros = (offset - pos); |
1892 | |
1893 | if (num_bytes > total_remaining_zeros) |
1894 | num_bytes = total_remaining_zeros; |
1895 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
1896 | index 1fc1dca..1ace83d 100644 |
1897 | --- a/fs/proc/base.c |
1898 | +++ b/fs/proc/base.c |
1899 | @@ -775,6 +775,13 @@ static int mem_open(struct inode* inode, struct file* file) |
1900 | if (IS_ERR(mm)) |
1901 | return PTR_ERR(mm); |
1902 | |
1903 | + if (mm) { |
1904 | + /* ensure this mm_struct can't be freed */ |
1905 | + atomic_inc(&mm->mm_count); |
1906 | + /* but do not pin its memory */ |
1907 | + mmput(mm); |
1908 | + } |
1909 | + |
1910 | /* OK to pass negative loff_t, we can catch out-of-range */ |
1911 | file->f_mode |= FMODE_UNSIGNED_OFFSET; |
1912 | file->private_data = mm; |
1913 | @@ -782,57 +789,13 @@ static int mem_open(struct inode* inode, struct file* file) |
1914 | return 0; |
1915 | } |
1916 | |
1917 | -static ssize_t mem_read(struct file * file, char __user * buf, |
1918 | - size_t count, loff_t *ppos) |
1919 | +static ssize_t mem_rw(struct file *file, char __user *buf, |
1920 | + size_t count, loff_t *ppos, int write) |
1921 | { |
1922 | - int ret; |
1923 | - char *page; |
1924 | - unsigned long src = *ppos; |
1925 | struct mm_struct *mm = file->private_data; |
1926 | - |
1927 | - if (!mm) |
1928 | - return 0; |
1929 | - |
1930 | - page = (char *)__get_free_page(GFP_TEMPORARY); |
1931 | - if (!page) |
1932 | - return -ENOMEM; |
1933 | - |
1934 | - ret = 0; |
1935 | - |
1936 | - while (count > 0) { |
1937 | - int this_len, retval; |
1938 | - |
1939 | - this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; |
1940 | - retval = access_remote_vm(mm, src, page, this_len, 0); |
1941 | - if (!retval) { |
1942 | - if (!ret) |
1943 | - ret = -EIO; |
1944 | - break; |
1945 | - } |
1946 | - |
1947 | - if (copy_to_user(buf, page, retval)) { |
1948 | - ret = -EFAULT; |
1949 | - break; |
1950 | - } |
1951 | - |
1952 | - ret += retval; |
1953 | - src += retval; |
1954 | - buf += retval; |
1955 | - count -= retval; |
1956 | - } |
1957 | - *ppos = src; |
1958 | - |
1959 | - free_page((unsigned long) page); |
1960 | - return ret; |
1961 | -} |
1962 | - |
1963 | -static ssize_t mem_write(struct file * file, const char __user *buf, |
1964 | - size_t count, loff_t *ppos) |
1965 | -{ |
1966 | - int copied; |
1967 | + unsigned long addr = *ppos; |
1968 | + ssize_t copied; |
1969 | char *page; |
1970 | - unsigned long dst = *ppos; |
1971 | - struct mm_struct *mm = file->private_data; |
1972 | |
1973 | if (!mm) |
1974 | return 0; |
1975 | @@ -842,31 +805,54 @@ static ssize_t mem_write(struct file * file, const char __user *buf, |
1976 | return -ENOMEM; |
1977 | |
1978 | copied = 0; |
1979 | + if (!atomic_inc_not_zero(&mm->mm_users)) |
1980 | + goto free; |
1981 | + |
1982 | while (count > 0) { |
1983 | - int this_len, retval; |
1984 | + int this_len = min_t(int, count, PAGE_SIZE); |
1985 | |
1986 | - this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; |
1987 | - if (copy_from_user(page, buf, this_len)) { |
1988 | + if (write && copy_from_user(page, buf, this_len)) { |
1989 | copied = -EFAULT; |
1990 | break; |
1991 | } |
1992 | - retval = access_remote_vm(mm, dst, page, this_len, 1); |
1993 | - if (!retval) { |
1994 | + |
1995 | + this_len = access_remote_vm(mm, addr, page, this_len, write); |
1996 | + if (!this_len) { |
1997 | if (!copied) |
1998 | copied = -EIO; |
1999 | break; |
2000 | } |
2001 | - copied += retval; |
2002 | - buf += retval; |
2003 | - dst += retval; |
2004 | - count -= retval; |
2005 | + |
2006 | + if (!write && copy_to_user(buf, page, this_len)) { |
2007 | + copied = -EFAULT; |
2008 | + break; |
2009 | + } |
2010 | + |
2011 | + buf += this_len; |
2012 | + addr += this_len; |
2013 | + copied += this_len; |
2014 | + count -= this_len; |
2015 | } |
2016 | - *ppos = dst; |
2017 | + *ppos = addr; |
2018 | |
2019 | + mmput(mm); |
2020 | +free: |
2021 | free_page((unsigned long) page); |
2022 | return copied; |
2023 | } |
2024 | |
2025 | +static ssize_t mem_read(struct file *file, char __user *buf, |
2026 | + size_t count, loff_t *ppos) |
2027 | +{ |
2028 | + return mem_rw(file, buf, count, ppos, 0); |
2029 | +} |
2030 | + |
2031 | +static ssize_t mem_write(struct file *file, const char __user *buf, |
2032 | + size_t count, loff_t *ppos) |
2033 | +{ |
2034 | + return mem_rw(file, (char __user*)buf, count, ppos, 1); |
2035 | +} |
2036 | + |
2037 | loff_t mem_lseek(struct file *file, loff_t offset, int orig) |
2038 | { |
2039 | switch (orig) { |
2040 | @@ -886,8 +872,8 @@ loff_t mem_lseek(struct file *file, loff_t offset, int orig) |
2041 | static int mem_release(struct inode *inode, struct file *file) |
2042 | { |
2043 | struct mm_struct *mm = file->private_data; |
2044 | - |
2045 | - mmput(mm); |
2046 | + if (mm) |
2047 | + mmdrop(mm); |
2048 | return 0; |
2049 | } |
2050 | |
2051 | diff --git a/fs/udf/super.c b/fs/udf/super.c |
2052 | index e185253..87cb24a 100644 |
2053 | --- a/fs/udf/super.c |
2054 | +++ b/fs/udf/super.c |
2055 | @@ -1799,6 +1799,12 @@ static void udf_close_lvid(struct super_block *sb) |
2056 | le16_to_cpu(lvid->descTag.descCRCLength))); |
2057 | |
2058 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); |
2059 | + /* |
2060 | + * We set buffer uptodate unconditionally here to avoid spurious |
2061 | + * warnings from mark_buffer_dirty() when previous EIO has marked |
2062 | + * the buffer as !uptodate |
2063 | + */ |
2064 | + set_buffer_uptodate(bh); |
2065 | mark_buffer_dirty(bh); |
2066 | sbi->s_lvid_dirty = 0; |
2067 | mutex_unlock(&sbi->s_alloc_mutex); |
2068 | diff --git a/include/linux/freezer.h b/include/linux/freezer.h |
2069 | index a5386e3..b5d6b6a 100644 |
2070 | --- a/include/linux/freezer.h |
2071 | +++ b/include/linux/freezer.h |
2072 | @@ -51,6 +51,7 @@ extern void refrigerator(void); |
2073 | extern int freeze_processes(void); |
2074 | extern int freeze_kernel_threads(void); |
2075 | extern void thaw_processes(void); |
2076 | +extern void thaw_kernel_threads(void); |
2077 | |
2078 | static inline int try_to_freeze(void) |
2079 | { |
2080 | @@ -185,6 +186,7 @@ static inline void refrigerator(void) {} |
2081 | static inline int freeze_processes(void) { return -ENOSYS; } |
2082 | static inline int freeze_kernel_threads(void) { return -ENOSYS; } |
2083 | static inline void thaw_processes(void) {} |
2084 | +static inline void thaw_kernel_threads(void) {} |
2085 | |
2086 | static inline int try_to_freeze(void) { return 0; } |
2087 | |
2088 | diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h |
2089 | index 83b0ea3..8a0ede4 100644 |
2090 | --- a/include/linux/pm_qos.h |
2091 | +++ b/include/linux/pm_qos.h |
2092 | @@ -107,7 +107,19 @@ static inline void pm_qos_remove_request(struct pm_qos_request *req) |
2093 | { return; } |
2094 | |
2095 | static inline int pm_qos_request(int pm_qos_class) |
2096 | - { return 0; } |
2097 | +{ |
2098 | + switch (pm_qos_class) { |
2099 | + case PM_QOS_CPU_DMA_LATENCY: |
2100 | + return PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; |
2101 | + case PM_QOS_NETWORK_LATENCY: |
2102 | + return PM_QOS_NETWORK_LAT_DEFAULT_VALUE; |
2103 | + case PM_QOS_NETWORK_THROUGHPUT: |
2104 | + return PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE; |
2105 | + default: |
2106 | + return PM_QOS_DEFAULT_VALUE; |
2107 | + } |
2108 | +} |
2109 | + |
2110 | static inline int pm_qos_add_notifier(int pm_qos_class, |
2111 | struct notifier_block *notifier) |
2112 | { return 0; } |
2113 | diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h |
2114 | index 61b2905..3b6f628 100644 |
2115 | --- a/include/linux/usb/ch9.h |
2116 | +++ b/include/linux/usb/ch9.h |
2117 | @@ -589,7 +589,7 @@ static inline int usb_endpoint_is_isoc_out( |
2118 | */ |
2119 | static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) |
2120 | { |
2121 | - return le16_to_cpu(epd->wMaxPacketSize); |
2122 | + return __le16_to_cpu(epd->wMaxPacketSize); |
2123 | } |
2124 | |
2125 | /*-------------------------------------------------------------------------*/ |
2126 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c |
2127 | index 52fd049..faa39d1 100644 |
2128 | --- a/kernel/kprobes.c |
2129 | +++ b/kernel/kprobes.c |
2130 | @@ -1673,8 +1673,12 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p, |
2131 | ri->rp = rp; |
2132 | ri->task = current; |
2133 | |
2134 | - if (rp->entry_handler && rp->entry_handler(ri, regs)) |
2135 | + if (rp->entry_handler && rp->entry_handler(ri, regs)) { |
2136 | + raw_spin_lock_irqsave(&rp->lock, flags); |
2137 | + hlist_add_head(&ri->hlist, &rp->free_instances); |
2138 | + raw_spin_unlock_irqrestore(&rp->lock, flags); |
2139 | return 0; |
2140 | + } |
2141 | |
2142 | arch_prepare_kretprobe(ri, regs); |
2143 | |
2144 | diff --git a/kernel/panic.c b/kernel/panic.c |
2145 | index b2659360..3458469 100644 |
2146 | --- a/kernel/panic.c |
2147 | +++ b/kernel/panic.c |
2148 | @@ -237,11 +237,20 @@ void add_taint(unsigned flag) |
2149 | * Can't trust the integrity of the kernel anymore. |
2150 | * We don't call directly debug_locks_off() because the issue |
2151 | * is not necessarily serious enough to set oops_in_progress to 1 |
2152 | - * Also we want to keep up lockdep for staging development and |
2153 | - * post-warning case. |
2154 | + * Also we want to keep up lockdep for staging/out-of-tree |
2155 | + * development and post-warning case. |
2156 | */ |
2157 | - if (flag != TAINT_CRAP && flag != TAINT_WARN && __debug_locks_off()) |
2158 | - printk(KERN_WARNING "Disabling lock debugging due to kernel taint\n"); |
2159 | + switch (flag) { |
2160 | + case TAINT_CRAP: |
2161 | + case TAINT_OOT_MODULE: |
2162 | + case TAINT_WARN: |
2163 | + case TAINT_FIRMWARE_WORKAROUND: |
2164 | + break; |
2165 | + |
2166 | + default: |
2167 | + if (__debug_locks_off()) |
2168 | + printk(KERN_WARNING "Disabling lock debugging due to kernel taint\n"); |
2169 | + } |
2170 | |
2171 | set_bit(flag, &tainted_mask); |
2172 | } |
2173 | diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c |
2174 | index a6b0503..624538a 100644 |
2175 | --- a/kernel/power/hibernate.c |
2176 | +++ b/kernel/power/hibernate.c |
2177 | @@ -55,7 +55,7 @@ enum { |
2178 | |
2179 | static int hibernation_mode = HIBERNATION_SHUTDOWN; |
2180 | |
2181 | -static bool freezer_test_done; |
2182 | +bool freezer_test_done; |
2183 | |
2184 | static const struct platform_hibernation_ops *hibernation_ops; |
2185 | |
2186 | diff --git a/kernel/power/power.h b/kernel/power/power.h |
2187 | index 23a2db1..0c4defe 100644 |
2188 | --- a/kernel/power/power.h |
2189 | +++ b/kernel/power/power.h |
2190 | @@ -50,6 +50,8 @@ static inline char *check_image_kernel(struct swsusp_info *info) |
2191 | #define SPARE_PAGES ((1024 * 1024) >> PAGE_SHIFT) |
2192 | |
2193 | /* kernel/power/hibernate.c */ |
2194 | +extern bool freezer_test_done; |
2195 | + |
2196 | extern int hibernation_snapshot(int platform_mode); |
2197 | extern int hibernation_restore(int platform_mode); |
2198 | extern int hibernation_platform_enter(void); |
2199 | diff --git a/kernel/power/process.c b/kernel/power/process.c |
2200 | index addbbe5..3d4b954 100644 |
2201 | --- a/kernel/power/process.c |
2202 | +++ b/kernel/power/process.c |
2203 | @@ -203,3 +203,12 @@ void thaw_processes(void) |
2204 | printk("done.\n"); |
2205 | } |
2206 | |
2207 | +void thaw_kernel_threads(void) |
2208 | +{ |
2209 | + printk("Restarting kernel threads ... "); |
2210 | + thaw_workqueues(); |
2211 | + thaw_tasks(true); |
2212 | + schedule(); |
2213 | + printk("done.\n"); |
2214 | +} |
2215 | + |
2216 | diff --git a/kernel/power/user.c b/kernel/power/user.c |
2217 | index 6d8f535..f08d227 100644 |
2218 | --- a/kernel/power/user.c |
2219 | +++ b/kernel/power/user.c |
2220 | @@ -283,10 +283,17 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, |
2221 | } |
2222 | pm_restore_gfp_mask(); |
2223 | error = hibernation_snapshot(data->platform_support); |
2224 | - if (!error) |
2225 | + if (error) { |
2226 | + thaw_kernel_threads(); |
2227 | + } else { |
2228 | error = put_user(in_suspend, (int __user *)arg); |
2229 | - if (!error) |
2230 | - data->ready = 1; |
2231 | + if (!error && !freezer_test_done) |
2232 | + data->ready = 1; |
2233 | + if (freezer_test_done) { |
2234 | + freezer_test_done = false; |
2235 | + thaw_kernel_threads(); |
2236 | + } |
2237 | + } |
2238 | break; |
2239 | |
2240 | case SNAPSHOT_ATOMIC_RESTORE: |
2241 | @@ -303,6 +310,15 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, |
2242 | swsusp_free(); |
2243 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); |
2244 | data->ready = 0; |
2245 | + /* |
2246 | + * It is necessary to thaw kernel threads here, because |
2247 | + * SNAPSHOT_CREATE_IMAGE may be invoked directly after |
2248 | + * SNAPSHOT_FREE. In that case, if kernel threads were not |
2249 | + * thawed, the preallocation of memory carried out by |
2250 | + * hibernation_snapshot() might run into problems (i.e. it |
2251 | + * might fail or even deadlock). |
2252 | + */ |
2253 | + thaw_kernel_threads(); |
2254 | break; |
2255 | |
2256 | case SNAPSHOT_SET_IMAGE_SIZE: |
2257 | diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c |
2258 | index 583a136..78fcacf 100644 |
2259 | --- a/kernel/sched_rt.c |
2260 | +++ b/kernel/sched_rt.c |
2261 | @@ -1388,6 +1388,11 @@ static int push_rt_task(struct rq *rq) |
2262 | if (!next_task) |
2263 | return 0; |
2264 | |
2265 | +#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW |
2266 | + if (unlikely(task_running(rq, next_task))) |
2267 | + return 0; |
2268 | +#endif |
2269 | + |
2270 | retry: |
2271 | if (unlikely(next_task == rq->curr)) { |
2272 | WARN_ON(1); |
2273 | diff --git a/mm/compaction.c b/mm/compaction.c |
2274 | index 899d956..8fb8a40 100644 |
2275 | --- a/mm/compaction.c |
2276 | +++ b/mm/compaction.c |
2277 | @@ -313,12 +313,34 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, |
2278 | } else if (!locked) |
2279 | spin_lock_irq(&zone->lru_lock); |
2280 | |
2281 | + /* |
2282 | + * migrate_pfn does not necessarily start aligned to a |
2283 | + * pageblock. Ensure that pfn_valid is called when moving |
2284 | + * into a new MAX_ORDER_NR_PAGES range in case of large |
2285 | + * memory holes within the zone |
2286 | + */ |
2287 | + if ((low_pfn & (MAX_ORDER_NR_PAGES - 1)) == 0) { |
2288 | + if (!pfn_valid(low_pfn)) { |
2289 | + low_pfn += MAX_ORDER_NR_PAGES - 1; |
2290 | + continue; |
2291 | + } |
2292 | + } |
2293 | + |
2294 | if (!pfn_valid_within(low_pfn)) |
2295 | continue; |
2296 | nr_scanned++; |
2297 | |
2298 | - /* Get the page and skip if free */ |
2299 | + /* |
2300 | + * Get the page and ensure the page is within the same zone. |
2301 | + * See the comment in isolate_freepages about overlapping |
2302 | + * nodes. It is deliberate that the new zone lock is not taken |
2303 | + * as memory compaction should not move pages between nodes. |
2304 | + */ |
2305 | page = pfn_to_page(low_pfn); |
2306 | + if (page_zone(page) != zone) |
2307 | + continue; |
2308 | + |
2309 | + /* Skip if free */ |
2310 | if (PageBuddy(page)) |
2311 | continue; |
2312 | |
2313 | diff --git a/mm/filemap.c b/mm/filemap.c |
2314 | index 90286a4..03c5b0e 100644 |
2315 | --- a/mm/filemap.c |
2316 | +++ b/mm/filemap.c |
2317 | @@ -1400,15 +1400,12 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, |
2318 | unsigned long seg = 0; |
2319 | size_t count; |
2320 | loff_t *ppos = &iocb->ki_pos; |
2321 | - struct blk_plug plug; |
2322 | |
2323 | count = 0; |
2324 | retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE); |
2325 | if (retval) |
2326 | return retval; |
2327 | |
2328 | - blk_start_plug(&plug); |
2329 | - |
2330 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ |
2331 | if (filp->f_flags & O_DIRECT) { |
2332 | loff_t size; |
2333 | @@ -1424,8 +1421,12 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, |
2334 | retval = filemap_write_and_wait_range(mapping, pos, |
2335 | pos + iov_length(iov, nr_segs) - 1); |
2336 | if (!retval) { |
2337 | + struct blk_plug plug; |
2338 | + |
2339 | + blk_start_plug(&plug); |
2340 | retval = mapping->a_ops->direct_IO(READ, iocb, |
2341 | iov, pos, nr_segs); |
2342 | + blk_finish_plug(&plug); |
2343 | } |
2344 | if (retval > 0) { |
2345 | *ppos = pos + retval; |
2346 | @@ -1481,7 +1482,6 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, |
2347 | break; |
2348 | } |
2349 | out: |
2350 | - blk_finish_plug(&plug); |
2351 | return retval; |
2352 | } |
2353 | EXPORT_SYMBOL(generic_file_aio_read); |
2354 | diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c |
2355 | index f91b2f6..a4eb311 100644 |
2356 | --- a/mm/filemap_xip.c |
2357 | +++ b/mm/filemap_xip.c |
2358 | @@ -263,7 +263,12 @@ found: |
2359 | xip_pfn); |
2360 | if (err == -ENOMEM) |
2361 | return VM_FAULT_OOM; |
2362 | - BUG_ON(err); |
2363 | + /* |
2364 | + * err == -EBUSY is fine, we've raced against another thread |
2365 | + * that faulted-in the same page |
2366 | + */ |
2367 | + if (err != -EBUSY) |
2368 | + BUG_ON(err); |
2369 | return VM_FAULT_NOPAGE; |
2370 | } else { |
2371 | int err, ret = VM_FAULT_OOM; |
2372 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
2373 | index 36b3d98..33141f5 100644 |
2374 | --- a/mm/huge_memory.c |
2375 | +++ b/mm/huge_memory.c |
2376 | @@ -2064,7 +2064,7 @@ static void collect_mm_slot(struct mm_slot *mm_slot) |
2377 | { |
2378 | struct mm_struct *mm = mm_slot->mm; |
2379 | |
2380 | - VM_BUG_ON(!spin_is_locked(&khugepaged_mm_lock)); |
2381 | + VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&khugepaged_mm_lock)); |
2382 | |
2383 | if (khugepaged_test_exit(mm)) { |
2384 | /* free mm_slot */ |
2385 | @@ -2094,7 +2094,7 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, |
2386 | int progress = 0; |
2387 | |
2388 | VM_BUG_ON(!pages); |
2389 | - VM_BUG_ON(!spin_is_locked(&khugepaged_mm_lock)); |
2390 | + VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&khugepaged_mm_lock)); |
2391 | |
2392 | if (khugepaged_scan.mm_slot) |
2393 | mm_slot = khugepaged_scan.mm_slot; |
2394 | diff --git a/mm/swap.c b/mm/swap.c |
2395 | index a91caf7..55b266d 100644 |
2396 | --- a/mm/swap.c |
2397 | +++ b/mm/swap.c |
2398 | @@ -667,7 +667,7 @@ void lru_add_page_tail(struct zone* zone, |
2399 | VM_BUG_ON(!PageHead(page)); |
2400 | VM_BUG_ON(PageCompound(page_tail)); |
2401 | VM_BUG_ON(PageLRU(page_tail)); |
2402 | - VM_BUG_ON(!spin_is_locked(&zone->lru_lock)); |
2403 | + VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&zone->lru_lock)); |
2404 | |
2405 | SetPageLRU(page_tail); |
2406 | |
2407 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
2408 | index 4562e9d..05c8768 100644 |
2409 | --- a/sound/pci/hda/hda_codec.c |
2410 | +++ b/sound/pci/hda/hda_codec.c |
2411 | @@ -1446,7 +1446,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, |
2412 | for (i = 0; i < c->cvt_setups.used; i++) { |
2413 | p = snd_array_elem(&c->cvt_setups, i); |
2414 | if (!p->active && p->stream_tag == stream_tag && |
2415 | - get_wcaps_type(get_wcaps(codec, p->nid)) == type) |
2416 | + get_wcaps_type(get_wcaps(c, p->nid)) == type) |
2417 | p->dirty = 1; |
2418 | } |
2419 | } |
2420 | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c |
2421 | index 5b0a9bb..ec0518e 100644 |
2422 | --- a/sound/pci/hda/patch_cirrus.c |
2423 | +++ b/sound/pci/hda/patch_cirrus.c |
2424 | @@ -976,8 +976,10 @@ static void cs_automic(struct hda_codec *codec) |
2425 | /* specific to CS421x, single ADC */ |
2426 | if (spec->vendor_nid == CS421X_VENDOR_NID) { |
2427 | if (present) { |
2428 | - spec->last_input = spec->cur_input; |
2429 | - spec->cur_input = spec->automic_idx; |
2430 | + if (spec->cur_input != spec->automic_idx) { |
2431 | + spec->last_input = spec->cur_input; |
2432 | + spec->cur_input = spec->automic_idx; |
2433 | + } |
2434 | } else { |
2435 | spec->cur_input = spec->last_input; |
2436 | } |
2437 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2438 | index 5f03c40..34e5fcc 100644 |
2439 | --- a/sound/pci/hda/patch_realtek.c |
2440 | +++ b/sound/pci/hda/patch_realtek.c |
2441 | @@ -176,6 +176,7 @@ struct alc_spec { |
2442 | unsigned int detect_lo:1; /* Line-out detection enabled */ |
2443 | unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */ |
2444 | unsigned int automute_lo_possible:1; /* there are line outs and HP */ |
2445 | + unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */ |
2446 | |
2447 | /* other flags */ |
2448 | unsigned int no_analog :1; /* digital I/O only */ |
2449 | @@ -519,13 +520,24 @@ static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins, |
2450 | |
2451 | for (i = 0; i < num_pins; i++) { |
2452 | hda_nid_t nid = pins[i]; |
2453 | + unsigned int val; |
2454 | if (!nid) |
2455 | break; |
2456 | switch (spec->automute_mode) { |
2457 | case ALC_AUTOMUTE_PIN: |
2458 | + /* don't reset VREF value in case it's controlling |
2459 | + * the amp (see alc861_fixup_asus_amp_vref_0f()) |
2460 | + */ |
2461 | + if (spec->keep_vref_in_automute) { |
2462 | + val = snd_hda_codec_read(codec, nid, 0, |
2463 | + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); |
2464 | + val &= ~PIN_HP; |
2465 | + } else |
2466 | + val = 0; |
2467 | + val |= pin_bits; |
2468 | snd_hda_codec_write(codec, nid, 0, |
2469 | AC_VERB_SET_PIN_WIDGET_CONTROL, |
2470 | - pin_bits); |
2471 | + val); |
2472 | break; |
2473 | case ALC_AUTOMUTE_AMP: |
2474 | snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, |
2475 | @@ -5011,7 +5023,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
2476 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
2477 | ALC269_FIXUP_AMIC), |
2478 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), |
2479 | - SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269_FIXUP_AMIC), |
2480 | SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC), |
2481 | SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC), |
2482 | SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC), |
2483 | @@ -5226,6 +5237,25 @@ enum { |
2484 | PINFIX_ASUS_A6RP, |
2485 | }; |
2486 | |
2487 | +/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */ |
2488 | +static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec, |
2489 | + const struct alc_fixup *fix, int action) |
2490 | +{ |
2491 | + struct alc_spec *spec = codec->spec; |
2492 | + unsigned int val; |
2493 | + |
2494 | + if (action != ALC_FIXUP_ACT_INIT) |
2495 | + return; |
2496 | + val = snd_hda_codec_read(codec, 0x0f, 0, |
2497 | + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); |
2498 | + if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))) |
2499 | + val |= AC_PINCTL_IN_EN; |
2500 | + val |= AC_PINCTL_VREF_50; |
2501 | + snd_hda_codec_write(codec, 0x0f, 0, |
2502 | + AC_VERB_SET_PIN_WIDGET_CONTROL, val); |
2503 | + spec->keep_vref_in_automute = 1; |
2504 | +} |
2505 | + |
2506 | static const struct alc_fixup alc861_fixups[] = { |
2507 | [PINFIX_FSC_AMILO_PI1505] = { |
2508 | .type = ALC_FIXUP_PINS, |
2509 | @@ -5236,17 +5266,13 @@ static const struct alc_fixup alc861_fixups[] = { |
2510 | } |
2511 | }, |
2512 | [PINFIX_ASUS_A6RP] = { |
2513 | - .type = ALC_FIXUP_VERBS, |
2514 | - .v.verbs = (const struct hda_verb[]) { |
2515 | - /* node 0x0f VREF seems controlling the master output */ |
2516 | - { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, |
2517 | - { } |
2518 | - }, |
2519 | + .type = ALC_FIXUP_FUNC, |
2520 | + .v.func = alc861_fixup_asus_amp_vref_0f, |
2521 | }, |
2522 | }; |
2523 | |
2524 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { |
2525 | - SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", PINFIX_ASUS_A6RP), |
2526 | + SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", PINFIX_ASUS_A6RP), |
2527 | SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), |
2528 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), |
2529 | {} |
2530 | diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c |
2531 | index 8d69e59..a0a3f50 100644 |
2532 | --- a/sound/pci/hda/patch_via.c |
2533 | +++ b/sound/pci/hda/patch_via.c |
2534 | @@ -198,6 +198,9 @@ struct via_spec { |
2535 | unsigned int no_pin_power_ctl; |
2536 | enum VIA_HDA_CODEC codec_type; |
2537 | |
2538 | + /* analog low-power control */ |
2539 | + bool alc_mode; |
2540 | + |
2541 | /* smart51 setup */ |
2542 | unsigned int smart51_nums; |
2543 | hda_nid_t smart51_pins[2]; |
2544 | @@ -748,6 +751,7 @@ static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol, |
2545 | return 0; |
2546 | spec->no_pin_power_ctl = val; |
2547 | set_widgets_power_state(codec); |
2548 | + analog_low_current_mode(codec); |
2549 | return 1; |
2550 | } |
2551 | |
2552 | @@ -1035,13 +1039,19 @@ static bool is_aa_path_mute(struct hda_codec *codec) |
2553 | } |
2554 | |
2555 | /* enter/exit analog low-current mode */ |
2556 | -static void analog_low_current_mode(struct hda_codec *codec) |
2557 | +static void __analog_low_current_mode(struct hda_codec *codec, bool force) |
2558 | { |
2559 | struct via_spec *spec = codec->spec; |
2560 | bool enable; |
2561 | unsigned int verb, parm; |
2562 | |
2563 | - enable = is_aa_path_mute(codec) && (spec->opened_streams != 0); |
2564 | + if (spec->no_pin_power_ctl) |
2565 | + enable = false; |
2566 | + else |
2567 | + enable = is_aa_path_mute(codec) && !spec->opened_streams; |
2568 | + if (enable == spec->alc_mode && !force) |
2569 | + return; |
2570 | + spec->alc_mode = enable; |
2571 | |
2572 | /* decide low current mode's verb & parameter */ |
2573 | switch (spec->codec_type) { |
2574 | @@ -1073,6 +1083,11 @@ static void analog_low_current_mode(struct hda_codec *codec) |
2575 | snd_hda_codec_write(codec, codec->afg, 0, verb, parm); |
2576 | } |
2577 | |
2578 | +static void analog_low_current_mode(struct hda_codec *codec) |
2579 | +{ |
2580 | + return __analog_low_current_mode(codec, false); |
2581 | +} |
2582 | + |
2583 | /* |
2584 | * generic initialization of ADC, input mixers and output mixers |
2585 | */ |
2586 | @@ -1445,6 +1460,7 @@ static int via_build_controls(struct hda_codec *codec) |
2587 | struct snd_kcontrol *kctl; |
2588 | int err, i; |
2589 | |
2590 | + spec->no_pin_power_ctl = 1; |
2591 | if (spec->set_widgets_power_state) |
2592 | if (!via_clone_control(spec, &via_pin_power_ctl_enum)) |
2593 | return -ENOMEM; |
2594 | @@ -1498,10 +1514,6 @@ static int via_build_controls(struct hda_codec *codec) |
2595 | return err; |
2596 | } |
2597 | |
2598 | - /* init power states */ |
2599 | - set_widgets_power_state(codec); |
2600 | - analog_low_current_mode(codec); |
2601 | - |
2602 | via_free_kctls(codec); /* no longer needed */ |
2603 | return 0; |
2604 | } |
2605 | @@ -2771,6 +2783,10 @@ static int via_init(struct hda_codec *codec) |
2606 | for (i = 0; i < spec->num_iverbs; i++) |
2607 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
2608 | |
2609 | + /* init power states */ |
2610 | + set_widgets_power_state(codec); |
2611 | + __analog_low_current_mode(codec, true); |
2612 | + |
2613 | via_auto_init_multi_out(codec); |
2614 | via_auto_init_hp_out(codec); |
2615 | via_auto_init_speaker_out(codec); |
2616 | diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c |
2617 | index 26c7e8b..c0dbb52 100644 |
2618 | --- a/sound/pci/oxygen/oxygen_mixer.c |
2619 | +++ b/sound/pci/oxygen/oxygen_mixer.c |
2620 | @@ -618,9 +618,12 @@ static int ac97_volume_get(struct snd_kcontrol *ctl, |
2621 | mutex_lock(&chip->mutex); |
2622 | reg = oxygen_read_ac97(chip, codec, index); |
2623 | mutex_unlock(&chip->mutex); |
2624 | - value->value.integer.value[0] = 31 - (reg & 0x1f); |
2625 | - if (stereo) |
2626 | - value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f); |
2627 | + if (!stereo) { |
2628 | + value->value.integer.value[0] = 31 - (reg & 0x1f); |
2629 | + } else { |
2630 | + value->value.integer.value[0] = 31 - ((reg >> 8) & 0x1f); |
2631 | + value->value.integer.value[1] = 31 - (reg & 0x1f); |
2632 | + } |
2633 | return 0; |
2634 | } |
2635 | |
2636 | @@ -636,14 +639,14 @@ static int ac97_volume_put(struct snd_kcontrol *ctl, |
2637 | |
2638 | mutex_lock(&chip->mutex); |
2639 | oldreg = oxygen_read_ac97(chip, codec, index); |
2640 | - newreg = oldreg; |
2641 | - newreg = (newreg & ~0x1f) | |
2642 | - (31 - (value->value.integer.value[0] & 0x1f)); |
2643 | - if (stereo) |
2644 | - newreg = (newreg & ~0x1f00) | |
2645 | - ((31 - (value->value.integer.value[1] & 0x1f)) << 8); |
2646 | - else |
2647 | - newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8); |
2648 | + if (!stereo) { |
2649 | + newreg = oldreg & ~0x1f; |
2650 | + newreg |= 31 - (value->value.integer.value[0] & 0x1f); |
2651 | + } else { |
2652 | + newreg = oldreg & ~0x1f1f; |
2653 | + newreg |= (31 - (value->value.integer.value[0] & 0x1f)) << 8; |
2654 | + newreg |= 31 - (value->value.integer.value[1] & 0x1f); |
2655 | + } |
2656 | change = newreg != oldreg; |
2657 | if (change) |
2658 | oxygen_write_ac97(chip, codec, index, newreg); |
2659 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c |
2660 | index 53edd9a..d795294 100644 |
2661 | --- a/sound/soc/codecs/wm8962.c |
2662 | +++ b/sound/soc/codecs/wm8962.c |
2663 | @@ -3172,13 +3172,13 @@ static int wm8962_hw_params(struct snd_pcm_substream *substream, |
2664 | case SNDRV_PCM_FORMAT_S16_LE: |
2665 | break; |
2666 | case SNDRV_PCM_FORMAT_S20_3LE: |
2667 | - aif0 |= 0x40; |
2668 | + aif0 |= 0x4; |
2669 | break; |
2670 | case SNDRV_PCM_FORMAT_S24_LE: |
2671 | - aif0 |= 0x80; |
2672 | + aif0 |= 0x8; |
2673 | break; |
2674 | case SNDRV_PCM_FORMAT_S32_LE: |
2675 | - aif0 |= 0xc0; |
2676 | + aif0 |= 0xc; |
2677 | break; |
2678 | default: |
2679 | return -EINVAL; |
2680 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
2681 | index d0c545b..6e502af 100644 |
2682 | --- a/sound/soc/codecs/wm8994.c |
2683 | +++ b/sound/soc/codecs/wm8994.c |
2684 | @@ -729,6 +729,8 @@ static void vmid_reference(struct snd_soc_codec *codec) |
2685 | { |
2686 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
2687 | |
2688 | + pm_runtime_get_sync(codec->dev); |
2689 | + |
2690 | wm8994->vmid_refcount++; |
2691 | |
2692 | dev_dbg(codec->dev, "Referencing VMID, refcount is now %d\n", |
2693 | @@ -742,7 +744,7 @@ static void vmid_reference(struct snd_soc_codec *codec) |
2694 | WM8994_VMID_RAMP_MASK, |
2695 | WM8994_STARTUP_BIAS_ENA | |
2696 | WM8994_VMID_BUF_ENA | |
2697 | - (0x11 << WM8994_VMID_RAMP_SHIFT)); |
2698 | + (0x3 << WM8994_VMID_RAMP_SHIFT)); |
2699 | |
2700 | /* Main bias enable, VMID=2x40k */ |
2701 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, |
2702 | @@ -796,6 +798,8 @@ static void vmid_dereference(struct snd_soc_codec *codec) |
2703 | WM8994_VMID_BUF_ENA | |
2704 | WM8994_VMID_RAMP_MASK, 0); |
2705 | } |
2706 | + |
2707 | + pm_runtime_put(codec->dev); |
2708 | } |
2709 | |
2710 | static int vmid_event(struct snd_soc_dapm_widget *w, |
2711 | diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c |
2712 | index 48e61e9..3642e06 100644 |
2713 | --- a/sound/soc/codecs/wm_hubs.c |
2714 | +++ b/sound/soc/codecs/wm_hubs.c |
2715 | @@ -587,14 +587,14 @@ SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER1, 0, 1, 0), |
2716 | }; |
2717 | |
2718 | static const struct snd_kcontrol_new line2_mix[] = { |
2719 | -SOC_DAPM_SINGLE("IN2R Switch", WM8993_LINE_MIXER2, 2, 1, 0), |
2720 | -SOC_DAPM_SINGLE("IN2L Switch", WM8993_LINE_MIXER2, 1, 1, 0), |
2721 | +SOC_DAPM_SINGLE("IN1L Switch", WM8993_LINE_MIXER2, 2, 1, 0), |
2722 | +SOC_DAPM_SINGLE("IN1R Switch", WM8993_LINE_MIXER2, 1, 1, 0), |
2723 | SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0), |
2724 | }; |
2725 | |
2726 | static const struct snd_kcontrol_new line2n_mix[] = { |
2727 | -SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 6, 1, 0), |
2728 | -SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 5, 1, 0), |
2729 | +SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 5, 1, 0), |
2730 | +SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 6, 1, 0), |
2731 | }; |
2732 | |
2733 | static const struct snd_kcontrol_new line2p_mix[] = { |
2734 | @@ -614,6 +614,8 @@ SND_SOC_DAPM_INPUT("IN2RP:VXRP"), |
2735 | SND_SOC_DAPM_MICBIAS("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0), |
2736 | SND_SOC_DAPM_MICBIAS("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0), |
2737 | |
2738 | +SND_SOC_DAPM_SUPPLY("LINEOUT_VMID_BUF", WM8993_ANTIPOP1, 7, 0, NULL, 0), |
2739 | + |
2740 | SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0, |
2741 | in1l_pga, ARRAY_SIZE(in1l_pga)), |
2742 | SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0, |
2743 | @@ -832,9 +834,11 @@ static const struct snd_soc_dapm_route lineout1_diff_routes[] = { |
2744 | }; |
2745 | |
2746 | static const struct snd_soc_dapm_route lineout1_se_routes[] = { |
2747 | + { "LINEOUT1N Mixer", NULL, "LINEOUT_VMID_BUF" }, |
2748 | { "LINEOUT1N Mixer", "Left Output Switch", "Left Output PGA" }, |
2749 | { "LINEOUT1N Mixer", "Right Output Switch", "Right Output PGA" }, |
2750 | |
2751 | + { "LINEOUT1P Mixer", NULL, "LINEOUT_VMID_BUF" }, |
2752 | { "LINEOUT1P Mixer", "Left Output Switch", "Left Output PGA" }, |
2753 | |
2754 | { "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" }, |
2755 | @@ -842,8 +846,8 @@ static const struct snd_soc_dapm_route lineout1_se_routes[] = { |
2756 | }; |
2757 | |
2758 | static const struct snd_soc_dapm_route lineout2_diff_routes[] = { |
2759 | - { "LINEOUT2 Mixer", "IN2L Switch", "IN2L PGA" }, |
2760 | - { "LINEOUT2 Mixer", "IN2R Switch", "IN2R PGA" }, |
2761 | + { "LINEOUT2 Mixer", "IN1L Switch", "IN1L PGA" }, |
2762 | + { "LINEOUT2 Mixer", "IN1R Switch", "IN1R PGA" }, |
2763 | { "LINEOUT2 Mixer", "Output Switch", "Right Output PGA" }, |
2764 | |
2765 | { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" }, |
2766 | @@ -851,9 +855,11 @@ static const struct snd_soc_dapm_route lineout2_diff_routes[] = { |
2767 | }; |
2768 | |
2769 | static const struct snd_soc_dapm_route lineout2_se_routes[] = { |
2770 | + { "LINEOUT2N Mixer", NULL, "LINEOUT_VMID_BUF" }, |
2771 | { "LINEOUT2N Mixer", "Left Output Switch", "Left Output PGA" }, |
2772 | { "LINEOUT2N Mixer", "Right Output Switch", "Right Output PGA" }, |
2773 | |
2774 | + { "LINEOUT2P Mixer", NULL, "LINEOUT_VMID_BUF" }, |
2775 | { "LINEOUT2P Mixer", "Right Output Switch", "Right Output PGA" }, |
2776 | |
2777 | { "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" }, |