Magellan Linux

Annotation of /trunk/kernel26-alx/patches-3.10/0139-3.10.40-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2672 - (hide annotations) (download)
Tue Jul 21 16:46:35 2015 UTC (8 years, 9 months ago) by niro
File size: 73030 byte(s)
-3.10.84-alx-r1
1 niro 2672 diff --git a/Makefile b/Makefile
2     index 1e07514be6f8..b2285cababb0 100644
3     --- a/Makefile
4     +++ b/Makefile
5     @@ -1,6 +1,6 @@
6     VERSION = 3
7     PATCHLEVEL = 10
8     -SUBLEVEL = 39
9     +SUBLEVEL = 40
10     EXTRAVERSION =
11     NAME = TOSSUG Baby Fish
12    
13     diff --git a/arch/arc/include/asm/irqflags.h b/arch/arc/include/asm/irqflags.h
14     index eac071668201..c29d56587bf0 100644
15     --- a/arch/arc/include/asm/irqflags.h
16     +++ b/arch/arc/include/asm/irqflags.h
17     @@ -137,13 +137,6 @@ static inline void arch_unmask_irq(unsigned int irq)
18     flag \scratch
19     .endm
20    
21     -.macro IRQ_DISABLE_SAVE scratch, save
22     - lr \scratch, [status32]
23     - mov \save, \scratch /* Make a copy */
24     - bic \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
25     - flag \scratch
26     -.endm
27     -
28     .macro IRQ_ENABLE scratch
29     lr \scratch, [status32]
30     or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
31     diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
32     index 6dbe359c760d..6f3cd0fb4b54 100644
33     --- a/arch/arc/kernel/entry.S
34     +++ b/arch/arc/kernel/entry.S
35     @@ -589,11 +589,7 @@ ARC_ENTRY ret_from_exception
36     ; Pre-{IRQ,Trap,Exception} K/U mode from pt_regs->status32
37     ld r8, [sp, PT_status32] ; returning to User/Kernel Mode
38    
39     -#ifdef CONFIG_PREEMPT
40     bbit0 r8, STATUS_U_BIT, resume_kernel_mode
41     -#else
42     - bbit0 r8, STATUS_U_BIT, restore_regs
43     -#endif
44    
45     ; Before returning to User mode check-for-and-complete any pending work
46     ; such as rescheduling/signal-delivery etc.
47     @@ -653,10 +649,15 @@ resume_user_mode_begin:
48     b resume_user_mode_begin ; unconditionally back to U mode ret chks
49     ; for single exit point from this block
50    
51     -#ifdef CONFIG_PREEMPT
52     -
53     resume_kernel_mode:
54    
55     + ; Disable Interrupts from this point on
56     + ; CONFIG_PREEMPT: This is a must for preempt_schedule_irq()
57     + ; !CONFIG_PREEMPT: To ensure restore_regs is intr safe
58     + IRQ_DISABLE r9
59     +
60     +#ifdef CONFIG_PREEMPT
61     +
62     ; Can't preempt if preemption disabled
63     GET_CURR_THR_INFO_FROM_SP r10
64     ld r8, [r10, THREAD_INFO_PREEMPT_COUNT]
65     @@ -666,8 +667,6 @@ resume_kernel_mode:
66     ld r9, [r10, THREAD_INFO_FLAGS]
67     bbit0 r9, TIF_NEED_RESCHED, restore_regs
68    
69     - IRQ_DISABLE r9
70     -
71     ; Invoke PREEMPTION
72     bl preempt_schedule_irq
73    
74     @@ -680,12 +679,11 @@ resume_kernel_mode:
75     ;
76     ; Restore the saved sys context (common exit-path for EXCPN/IRQ/Trap)
77     ; IRQ shd definitely not happen between now and rtie
78     +; All 2 entry points to here already disable interrupts
79    
80     restore_regs :
81    
82     - ; Disable Interrupts while restoring reg-file back
83     - ; XXX can this be optimised out
84     - IRQ_DISABLE_SAVE r9, r10 ;@r10 has prisitine (pre-disable) copy
85     + lr r10, [status32]
86    
87     #ifdef CONFIG_ARC_CURR_IN_REG
88     ; Restore User R25
89     diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c
90     index f0ef2f7d4ad7..5ef506c6f492 100644
91     --- a/arch/arm/mm/mmap.c
92     +++ b/arch/arm/mm/mmap.c
93     @@ -204,13 +204,11 @@ int valid_phys_addr_range(phys_addr_t addr, size_t size)
94     }
95    
96     /*
97     - * We don't use supersection mappings for mmap() on /dev/mem, which
98     - * means that we can't map the memory area above the 4G barrier into
99     - * userspace.
100     + * Do not allow /dev/mem mappings beyond the supported physical range.
101     */
102     int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
103     {
104     - return !(pfn + (size >> PAGE_SHIFT) > 0x00100000);
105     + return (pfn + (size >> PAGE_SHIFT)) <= (1 + (PHYS_MASK >> PAGE_SHIFT));
106     }
107    
108     #ifdef CONFIG_STRICT_DEVMEM
109     diff --git a/arch/mips/kvm/kvm_mips_emul.c b/arch/mips/kvm/kvm_mips_emul.c
110     index 4b6274b47f33..e75ef8219caf 100644
111     --- a/arch/mips/kvm/kvm_mips_emul.c
112     +++ b/arch/mips/kvm/kvm_mips_emul.c
113     @@ -1571,17 +1571,17 @@ kvm_mips_handle_ri(unsigned long cause, uint32_t *opc,
114     arch->gprs[rt] = kvm_read_c0_guest_userlocal(cop0);
115     #else
116     /* UserLocal not implemented */
117     - er = kvm_mips_emulate_ri_exc(cause, opc, run, vcpu);
118     + er = EMULATE_FAIL;
119     #endif
120     break;
121    
122     default:
123     - printk("RDHWR not supported\n");
124     + kvm_debug("RDHWR %#x not supported @ %p\n", rd, opc);
125     er = EMULATE_FAIL;
126     break;
127     }
128     } else {
129     - printk("Emulate RI not supported @ %p: %#x\n", opc, inst);
130     + kvm_debug("Emulate RI not supported @ %p: %#x\n", opc, inst);
131     er = EMULATE_FAIL;
132     }
133    
134     @@ -1590,6 +1590,7 @@ kvm_mips_handle_ri(unsigned long cause, uint32_t *opc,
135     */
136     if (er == EMULATE_FAIL) {
137     vcpu->arch.pc = curr_pc;
138     + er = kvm_mips_emulate_ri_exc(cause, opc, run, vcpu);
139     }
140     return er;
141     }
142     diff --git a/arch/mips/power/hibernate.S b/arch/mips/power/hibernate.S
143     index 7e0277a1048f..32a7c828f073 100644
144     --- a/arch/mips/power/hibernate.S
145     +++ b/arch/mips/power/hibernate.S
146     @@ -43,6 +43,7 @@ LEAF(swsusp_arch_resume)
147     bne t1, t3, 1b
148     PTR_L t0, PBE_NEXT(t0)
149     bnez t0, 0b
150     + jal local_flush_tlb_all /* Avoid TLB mismatch after kernel resume */
151     PTR_LA t0, saved_regs
152     PTR_L ra, PT_R31(t0)
153     PTR_L sp, PT_R29(t0)
154     diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h
155     index 84fdf6857c31..ef22898daa93 100644
156     --- a/arch/powerpc/include/asm/compat.h
157     +++ b/arch/powerpc/include/asm/compat.h
158     @@ -8,7 +8,11 @@
159     #include <linux/sched.h>
160    
161     #define COMPAT_USER_HZ 100
162     +#ifdef __BIG_ENDIAN__
163     #define COMPAT_UTS_MACHINE "ppc\0\0"
164     +#else
165     +#define COMPAT_UTS_MACHINE "ppcle\0\0"
166     +#endif
167    
168     typedef u32 compat_size_t;
169     typedef s32 compat_ssize_t;
170     diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
171     index e1fb161252ef..795f67792ea9 100644
172     --- a/arch/powerpc/include/asm/reg.h
173     +++ b/arch/powerpc/include/asm/reg.h
174     @@ -208,6 +208,7 @@
175     #define SPRN_ACOP 0x1F /* Available Coprocessor Register */
176     #define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */
177     #define SPRN_TEXASR 0x82 /* Transaction EXception & Summary */
178     +#define TEXASR_FS __MASK(63-36) /* Transaction Failure Summary */
179     #define SPRN_TEXASRU 0x83 /* '' '' '' Upper 32 */
180     #define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */
181     #define SPRN_CTRLF 0x088
182     diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
183     index 7baa27b7abbe..1e1c995ddacc 100644
184     --- a/arch/powerpc/kernel/process.c
185     +++ b/arch/powerpc/kernel/process.c
186     @@ -523,6 +523,31 @@ out_and_saveregs:
187     tm_save_sprs(thr);
188     }
189    
190     +extern void __tm_recheckpoint(struct thread_struct *thread,
191     + unsigned long orig_msr);
192     +
193     +void tm_recheckpoint(struct thread_struct *thread,
194     + unsigned long orig_msr)
195     +{
196     + unsigned long flags;
197     +
198     + /* We really can't be interrupted here as the TEXASR registers can't
199     + * change and later in the trecheckpoint code, we have a userspace R1.
200     + * So let's hard disable over this region.
201     + */
202     + local_irq_save(flags);
203     + hard_irq_disable();
204     +
205     + /* The TM SPRs are restored here, so that TEXASR.FS can be set
206     + * before the trecheckpoint and no explosion occurs.
207     + */
208     + tm_restore_sprs(thread);
209     +
210     + __tm_recheckpoint(thread, orig_msr);
211     +
212     + local_irq_restore(flags);
213     +}
214     +
215     static inline void tm_recheckpoint_new_task(struct task_struct *new)
216     {
217     unsigned long msr;
218     @@ -541,13 +566,10 @@ static inline void tm_recheckpoint_new_task(struct task_struct *new)
219     if (!new->thread.regs)
220     return;
221    
222     - /* The TM SPRs are restored here, so that TEXASR.FS can be set
223     - * before the trecheckpoint and no explosion occurs.
224     - */
225     - tm_restore_sprs(&new->thread);
226     -
227     - if (!MSR_TM_ACTIVE(new->thread.regs->msr))
228     + if (!MSR_TM_ACTIVE(new->thread.regs->msr)){
229     + tm_restore_sprs(&new->thread);
230     return;
231     + }
232     msr = new->thread.tm_orig_msr;
233     /* Recheckpoint to restore original checkpointed register state. */
234     TM_DEBUG("*** tm_recheckpoint of pid %d "
235     diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
236     index 7e9dff80e1dc..81f929f026f2 100644
237     --- a/arch/powerpc/kernel/signal_32.c
238     +++ b/arch/powerpc/kernel/signal_32.c
239     @@ -863,6 +863,8 @@ static long restore_tm_user_regs(struct pt_regs *regs,
240     * transactional versions should be loaded.
241     */
242     tm_enable();
243     + /* Make sure the transaction is marked as failed */
244     + current->thread.tm_texasr |= TEXASR_FS;
245     /* This loads the checkpointed FP/VEC state, if used */
246     tm_recheckpoint(&current->thread, msr);
247     /* Get the top half of the MSR */
248     diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
249     index 35c20a1fb365..74d9615a6bb6 100644
250     --- a/arch/powerpc/kernel/signal_64.c
251     +++ b/arch/powerpc/kernel/signal_64.c
252     @@ -513,6 +513,8 @@ static long restore_tm_sigcontexts(struct pt_regs *regs,
253     }
254     #endif
255     tm_enable();
256     + /* Make sure the transaction is marked as failed */
257     + current->thread.tm_texasr |= TEXASR_FS;
258     /* This loads the checkpointed FP/VEC state, if used */
259     tm_recheckpoint(&current->thread, msr);
260    
261     diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
262     index f2abb219a17b..1e43ed404b95 100644
263     --- a/arch/powerpc/kernel/tm.S
264     +++ b/arch/powerpc/kernel/tm.S
265     @@ -296,7 +296,7 @@ dont_backup_fp:
266     * Call with IRQs off, stacks get all out of sync for
267     * some periods in here!
268     */
269     -_GLOBAL(tm_recheckpoint)
270     +_GLOBAL(__tm_recheckpoint)
271     mfcr r5
272     mflr r0
273     std r5, 8(r1)
274     diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
275     index 1919db6c0607..3bc6b7e43b24 100644
276     --- a/arch/s390/net/bpf_jit_comp.c
277     +++ b/arch/s390/net/bpf_jit_comp.c
278     @@ -243,7 +243,6 @@ static void bpf_jit_noleaks(struct bpf_jit *jit, struct sock_filter *filter)
279     case BPF_S_LD_W_IND:
280     case BPF_S_LD_H_IND:
281     case BPF_S_LD_B_IND:
282     - case BPF_S_LDX_B_MSH:
283     case BPF_S_LD_IMM:
284     case BPF_S_LD_MEM:
285     case BPF_S_MISC_TXA:
286     diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
287     index 8b8cbe9bcb92..9cf616b5210b 100644
288     --- a/drivers/ata/libata-core.c
289     +++ b/drivers/ata/libata-core.c
290     @@ -4765,21 +4765,26 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
291     static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
292     {
293     struct ata_queued_cmd *qc = NULL;
294     - unsigned int i;
295     + unsigned int i, tag;
296    
297     /* no command while frozen */
298     if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
299     return NULL;
300    
301     - /* the last tag is reserved for internal command. */
302     - for (i = 0; i < ATA_MAX_QUEUE - 1; i++)
303     - if (!test_and_set_bit(i, &ap->qc_allocated)) {
304     - qc = __ata_qc_from_tag(ap, i);
305     + for (i = 0; i < ATA_MAX_QUEUE; i++) {
306     + tag = (i + ap->last_tag + 1) % ATA_MAX_QUEUE;
307     +
308     + /* the last tag is reserved for internal command. */
309     + if (tag == ATA_TAG_INTERNAL)
310     + continue;
311     +
312     + if (!test_and_set_bit(tag, &ap->qc_allocated)) {
313     + qc = __ata_qc_from_tag(ap, tag);
314     + qc->tag = tag;
315     + ap->last_tag = tag;
316     break;
317     }
318     -
319     - if (qc)
320     - qc->tag = i;
321     + }
322    
323     return qc;
324     }
325     diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
326     index 04ceb7e2fadd..eb3575b3fbf0 100644
327     --- a/drivers/block/floppy.c
328     +++ b/drivers/block/floppy.c
329     @@ -3053,7 +3053,10 @@ static int raw_cmd_copyout(int cmd, void __user *param,
330     int ret;
331    
332     while (ptr) {
333     - ret = copy_to_user(param, ptr, sizeof(*ptr));
334     + struct floppy_raw_cmd cmd = *ptr;
335     + cmd.next = NULL;
336     + cmd.kernel_data = NULL;
337     + ret = copy_to_user(param, &cmd, sizeof(cmd));
338     if (ret)
339     return -EFAULT;
340     param += sizeof(struct floppy_raw_cmd);
341     @@ -3107,10 +3110,11 @@ loop:
342     return -ENOMEM;
343     *rcmd = ptr;
344     ret = copy_from_user(ptr, param, sizeof(*ptr));
345     - if (ret)
346     - return -EFAULT;
347     ptr->next = NULL;
348     ptr->buffer_length = 0;
349     + ptr->kernel_data = NULL;
350     + if (ret)
351     + return -EFAULT;
352     param += sizeof(struct floppy_raw_cmd);
353     if (ptr->cmd_count > 33)
354     /* the command may now also take up the space
355     @@ -3126,7 +3130,6 @@ loop:
356     for (i = 0; i < 16; i++)
357     ptr->reply[i] = 0;
358     ptr->resultcode = 0;
359     - ptr->kernel_data = NULL;
360    
361     if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
362     if (ptr->length <= 0)
363     diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c
364     index f8e6af20dfbf..d599fc42ae8b 100644
365     --- a/drivers/gpio/gpio-mxs.c
366     +++ b/drivers/gpio/gpio-mxs.c
367     @@ -214,7 +214,8 @@ static void __init mxs_gpio_init_gc(struct mxs_gpio_port *port, int irq_base)
368     ct->regs.ack = PINCTRL_IRQSTAT(port) + MXS_CLR;
369     ct->regs.mask = PINCTRL_IRQEN(port);
370    
371     - irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0);
372     + irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK,
373     + IRQ_NOREQUEST, 0);
374     }
375    
376     static int mxs_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
377     diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c
378     index 8ecb601152ef..64bfc235021a 100644
379     --- a/drivers/gpu/drm/cirrus/cirrus_drv.c
380     +++ b/drivers/gpu/drm/cirrus/cirrus_drv.c
381     @@ -11,6 +11,7 @@
382     #include <linux/module.h>
383     #include <linux/console.h>
384     #include <drm/drmP.h>
385     +#include <drm/drm_crtc_helper.h>
386    
387     #include "cirrus_drv.h"
388    
389     @@ -75,6 +76,41 @@ static void cirrus_pci_remove(struct pci_dev *pdev)
390     drm_put_dev(dev);
391     }
392    
393     +static int cirrus_pm_suspend(struct device *dev)
394     +{
395     + struct pci_dev *pdev = to_pci_dev(dev);
396     + struct drm_device *drm_dev = pci_get_drvdata(pdev);
397     + struct cirrus_device *cdev = drm_dev->dev_private;
398     +
399     + drm_kms_helper_poll_disable(drm_dev);
400     +
401     + if (cdev->mode_info.gfbdev) {
402     + console_lock();
403     + fb_set_suspend(cdev->mode_info.gfbdev->helper.fbdev, 1);
404     + console_unlock();
405     + }
406     +
407     + return 0;
408     +}
409     +
410     +static int cirrus_pm_resume(struct device *dev)
411     +{
412     + struct pci_dev *pdev = to_pci_dev(dev);
413     + struct drm_device *drm_dev = pci_get_drvdata(pdev);
414     + struct cirrus_device *cdev = drm_dev->dev_private;
415     +
416     + drm_helper_resume_force_mode(drm_dev);
417     +
418     + if (cdev->mode_info.gfbdev) {
419     + console_lock();
420     + fb_set_suspend(cdev->mode_info.gfbdev->helper.fbdev, 0);
421     + console_unlock();
422     + }
423     +
424     + drm_kms_helper_poll_enable(drm_dev);
425     + return 0;
426     +}
427     +
428     static const struct file_operations cirrus_driver_fops = {
429     .owner = THIS_MODULE,
430     .open = drm_open,
431     @@ -105,11 +141,17 @@ static struct drm_driver driver = {
432     .dumb_destroy = cirrus_dumb_destroy,
433     };
434    
435     +static const struct dev_pm_ops cirrus_pm_ops = {
436     + SET_SYSTEM_SLEEP_PM_OPS(cirrus_pm_suspend,
437     + cirrus_pm_resume)
438     +};
439     +
440     static struct pci_driver cirrus_pci_driver = {
441     .name = DRIVER_NAME,
442     .id_table = pciidlist,
443     .probe = cirrus_pci_probe,
444     .remove = cirrus_pci_remove,
445     + .driver.pm = &cirrus_pm_ops,
446     };
447    
448     static int __init cirrus_init(void)
449     diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c
450     index 379a47ea99f6..b86f68d8b726 100644
451     --- a/drivers/gpu/drm/cirrus/cirrus_mode.c
452     +++ b/drivers/gpu/drm/cirrus/cirrus_mode.c
453     @@ -308,6 +308,9 @@ static int cirrus_crtc_mode_set(struct drm_crtc *crtc,
454    
455     WREG_HDR(hdr);
456     cirrus_crtc_do_set_base(crtc, old_fb, x, y, 0);
457     +
458     + /* Unblank (needed on S3 resume, vgabios doesn't do it then) */
459     + outb(0x20, 0x3c0);
460     return 0;
461     }
462    
463     diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
464     index 58b4a53715cd..4a809969c5ac 100644
465     --- a/drivers/gpu/drm/i915/intel_crt.c
466     +++ b/drivers/gpu/drm/i915/intel_crt.c
467     @@ -717,6 +717,14 @@ static const struct dmi_system_id intel_no_crt[] = {
468     DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"),
469     },
470     },
471     + {
472     + .callback = intel_no_crt_dmi_callback,
473     + .ident = "DELL XPS 8700",
474     + .matches = {
475     + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
476     + DMI_MATCH(DMI_PRODUCT_NAME, "XPS 8700"),
477     + },
478     + },
479     { }
480     };
481    
482     diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
483     index 588a5eca63d8..ce6c603a3cc9 100644
484     --- a/drivers/infiniband/ulp/isert/ib_isert.c
485     +++ b/drivers/infiniband/ulp/isert/ib_isert.c
486     @@ -1201,7 +1201,7 @@ isert_unmap_cmd(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn)
487     }
488    
489     static void
490     -isert_put_cmd(struct isert_cmd *isert_cmd)
491     +isert_put_cmd(struct isert_cmd *isert_cmd, bool comp_err)
492     {
493     struct iscsi_cmd *cmd = &isert_cmd->iscsi_cmd;
494     struct isert_conn *isert_conn = isert_cmd->conn;
495     @@ -1216,8 +1216,21 @@ isert_put_cmd(struct isert_cmd *isert_cmd)
496     list_del_init(&cmd->i_conn_node);
497     spin_unlock_bh(&conn->cmd_lock);
498    
499     - if (cmd->data_direction == DMA_TO_DEVICE)
500     + if (cmd->data_direction == DMA_TO_DEVICE) {
501     iscsit_stop_dataout_timer(cmd);
502     + /*
503     + * Check for special case during comp_err where
504     + * WRITE_PENDING has been handed off from core,
505     + * but requires an extra target_put_sess_cmd()
506     + * before transport_generic_free_cmd() below.
507     + */
508     + if (comp_err &&
509     + cmd->se_cmd.t_state == TRANSPORT_WRITE_PENDING) {
510     + struct se_cmd *se_cmd = &cmd->se_cmd;
511     +
512     + target_put_sess_cmd(se_cmd->se_sess, se_cmd);
513     + }
514     + }
515    
516     isert_unmap_cmd(isert_cmd, isert_conn);
517     transport_generic_free_cmd(&cmd->se_cmd, 0);
518     @@ -1271,7 +1284,7 @@ isert_unmap_tx_desc(struct iser_tx_desc *tx_desc, struct ib_device *ib_dev)
519    
520     static void
521     isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd,
522     - struct ib_device *ib_dev)
523     + struct ib_device *ib_dev, bool comp_err)
524     {
525     if (isert_cmd->sense_buf_dma != 0) {
526     pr_debug("Calling ib_dma_unmap_single for isert_cmd->sense_buf_dma\n");
527     @@ -1281,7 +1294,7 @@ isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd,
528     }
529    
530     isert_unmap_tx_desc(tx_desc, ib_dev);
531     - isert_put_cmd(isert_cmd);
532     + isert_put_cmd(isert_cmd, comp_err);
533     }
534    
535     static void
536     @@ -1336,14 +1349,14 @@ isert_do_control_comp(struct work_struct *work)
537     iscsit_tmr_post_handler(cmd, cmd->conn);
538    
539     cmd->i_state = ISTATE_SENT_STATUS;
540     - isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev);
541     + isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false);
542     break;
543     case ISTATE_SEND_REJECT:
544     pr_debug("Got isert_do_control_comp ISTATE_SEND_REJECT: >>>\n");
545     atomic_dec(&isert_conn->post_send_buf_count);
546    
547     cmd->i_state = ISTATE_SENT_STATUS;
548     - isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev);
549     + isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false);
550     break;
551     case ISTATE_SEND_LOGOUTRSP:
552     pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n");
553     @@ -1382,7 +1395,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc,
554     atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count);
555    
556     cmd->i_state = ISTATE_SENT_STATUS;
557     - isert_completion_put(tx_desc, isert_cmd, ib_dev);
558     + isert_completion_put(tx_desc, isert_cmd, ib_dev, false);
559     }
560    
561     static void
562     @@ -1436,7 +1449,7 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn
563     if (!isert_cmd)
564     isert_unmap_tx_desc(tx_desc, ib_dev);
565     else
566     - isert_completion_put(tx_desc, isert_cmd, ib_dev);
567     + isert_completion_put(tx_desc, isert_cmd, ib_dev, true);
568     }
569    
570     static void
571     diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
572     index c69c81608f43..d60c9b7ad1b8 100644
573     --- a/drivers/input/mouse/synaptics.c
574     +++ b/drivers/input/mouse/synaptics.c
575     @@ -1515,6 +1515,22 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = {
576     .driver_data = (int []){1232, 5710, 1156, 4696},
577     },
578     {
579     + /* Lenovo ThinkPad Edge E431 */
580     + .matches = {
581     + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
582     + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Edge E431"),
583     + },
584     + .driver_data = (int []){1024, 5022, 2508, 4832},
585     + },
586     + {
587     + /* Lenovo ThinkPad T431s */
588     + .matches = {
589     + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
590     + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T431"),
591     + },
592     + .driver_data = (int []){1024, 5112, 2024, 4832},
593     + },
594     + {
595     /* Lenovo ThinkPad T440s */
596     .matches = {
597     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
598     @@ -1523,6 +1539,14 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = {
599     .driver_data = (int []){1024, 5112, 2024, 4832},
600     },
601     {
602     + /* Lenovo ThinkPad L440 */
603     + .matches = {
604     + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
605     + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L440"),
606     + },
607     + .driver_data = (int []){1024, 5112, 2024, 4832},
608     + },
609     + {
610     /* Lenovo ThinkPad T540p */
611     .matches = {
612     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
613     @@ -1530,6 +1554,32 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = {
614     },
615     .driver_data = (int []){1024, 5056, 2058, 4832},
616     },
617     + {
618     + /* Lenovo ThinkPad L540 */
619     + .matches = {
620     + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
621     + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L540"),
622     + },
623     + .driver_data = (int []){1024, 5112, 2024, 4832},
624     + },
625     + {
626     + /* Lenovo Yoga S1 */
627     + .matches = {
628     + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
629     + DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
630     + "ThinkPad S1 Yoga"),
631     + },
632     + .driver_data = (int []){1232, 5710, 1156, 4696},
633     + },
634     + {
635     + /* Lenovo ThinkPad X1 Carbon Haswell (3rd generation) */
636     + .matches = {
637     + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
638     + DMI_MATCH(DMI_PRODUCT_VERSION,
639     + "ThinkPad X1 Carbon 2nd"),
640     + },
641     + .driver_data = (int []){1024, 5112, 2024, 4832},
642     + },
643     #endif
644     { }
645     };
646     diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c
647     index 1af7255bbffb..a33e07f4222e 100644
648     --- a/drivers/md/dm-cache-metadata.c
649     +++ b/drivers/md/dm-cache-metadata.c
650     @@ -511,8 +511,9 @@ static int __begin_transaction_flags(struct dm_cache_metadata *cmd,
651     disk_super = dm_block_data(sblock);
652     update_flags(disk_super, mutator);
653     read_superblock_fields(cmd, disk_super);
654     + dm_bm_unlock(sblock);
655    
656     - return dm_bm_flush_and_unlock(cmd->bm, sblock);
657     + return dm_bm_flush(cmd->bm);
658     }
659    
660     static int __begin_transaction(struct dm_cache_metadata *cmd)
661     diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
662     index 901aac27e522..7d0ac0a6e724 100644
663     --- a/drivers/md/dm-thin.c
664     +++ b/drivers/md/dm-thin.c
665     @@ -1322,9 +1322,9 @@ static void process_deferred_bios(struct pool *pool)
666     */
667     if (ensure_next_mapping(pool)) {
668     spin_lock_irqsave(&pool->lock, flags);
669     + bio_list_add(&pool->deferred_bios, bio);
670     bio_list_merge(&pool->deferred_bios, &bios);
671     spin_unlock_irqrestore(&pool->lock, flags);
672     -
673     break;
674     }
675    
676     diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c
677     index 81b513890e2b..6372d0bea532 100644
678     --- a/drivers/md/persistent-data/dm-block-manager.c
679     +++ b/drivers/md/persistent-data/dm-block-manager.c
680     @@ -595,25 +595,14 @@ int dm_bm_unlock(struct dm_block *b)
681     }
682     EXPORT_SYMBOL_GPL(dm_bm_unlock);
683    
684     -int dm_bm_flush_and_unlock(struct dm_block_manager *bm,
685     - struct dm_block *superblock)
686     +int dm_bm_flush(struct dm_block_manager *bm)
687     {
688     - int r;
689     -
690     if (bm->read_only)
691     return -EPERM;
692    
693     - r = dm_bufio_write_dirty_buffers(bm->bufio);
694     - if (unlikely(r)) {
695     - dm_bm_unlock(superblock);
696     - return r;
697     - }
698     -
699     - dm_bm_unlock(superblock);
700     -
701     return dm_bufio_write_dirty_buffers(bm->bufio);
702     }
703     -EXPORT_SYMBOL_GPL(dm_bm_flush_and_unlock);
704     +EXPORT_SYMBOL_GPL(dm_bm_flush);
705    
706     void dm_bm_set_read_only(struct dm_block_manager *bm)
707     {
708     diff --git a/drivers/md/persistent-data/dm-block-manager.h b/drivers/md/persistent-data/dm-block-manager.h
709     index be5bff61be28..f74c0462e5e4 100644
710     --- a/drivers/md/persistent-data/dm-block-manager.h
711     +++ b/drivers/md/persistent-data/dm-block-manager.h
712     @@ -105,8 +105,7 @@ int dm_bm_unlock(struct dm_block *b);
713     *
714     * This method always blocks.
715     */
716     -int dm_bm_flush_and_unlock(struct dm_block_manager *bm,
717     - struct dm_block *superblock);
718     +int dm_bm_flush(struct dm_block_manager *bm);
719    
720     /*
721     * Switches the bm to a read only mode. Once read-only mode
722     diff --git a/drivers/md/persistent-data/dm-transaction-manager.c b/drivers/md/persistent-data/dm-transaction-manager.c
723     index 81da1a26042e..3bc30a0ae3d6 100644
724     --- a/drivers/md/persistent-data/dm-transaction-manager.c
725     +++ b/drivers/md/persistent-data/dm-transaction-manager.c
726     @@ -154,7 +154,7 @@ int dm_tm_pre_commit(struct dm_transaction_manager *tm)
727     if (r < 0)
728     return r;
729    
730     - return 0;
731     + return dm_bm_flush(tm->bm);
732     }
733     EXPORT_SYMBOL_GPL(dm_tm_pre_commit);
734    
735     @@ -164,8 +164,9 @@ int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *root)
736     return -EWOULDBLOCK;
737    
738     wipe_shadow_table(tm);
739     + dm_bm_unlock(root);
740    
741     - return dm_bm_flush_and_unlock(tm->bm, root);
742     + return dm_bm_flush(tm->bm);
743     }
744     EXPORT_SYMBOL_GPL(dm_tm_commit);
745    
746     diff --git a/drivers/md/persistent-data/dm-transaction-manager.h b/drivers/md/persistent-data/dm-transaction-manager.h
747     index b5b139076ca5..2772ed2a781a 100644
748     --- a/drivers/md/persistent-data/dm-transaction-manager.h
749     +++ b/drivers/md/persistent-data/dm-transaction-manager.h
750     @@ -38,18 +38,17 @@ struct dm_transaction_manager *dm_tm_create_non_blocking_clone(struct dm_transac
751     /*
752     * We use a 2-phase commit here.
753     *
754     - * i) In the first phase the block manager is told to start flushing, and
755     - * the changes to the space map are written to disk. You should interrogate
756     - * your particular space map to get detail of its root node etc. to be
757     - * included in your superblock.
758     + * i) Make all changes for the transaction *except* for the superblock.
759     + * Then call dm_tm_pre_commit() to flush them to disk.
760     *
761     - * ii) @root will be committed last. You shouldn't use more than the
762     - * first 512 bytes of @root if you wish the transaction to survive a power
763     - * failure. You *must* have a write lock held on @root for both stage (i)
764     - * and (ii). The commit will drop the write lock.
765     + * ii) Lock your superblock. Update. Then call dm_tm_commit() which will
766     + * unlock the superblock and flush it. No other blocks should be updated
767     + * during this period. Care should be taken to never unlock a partially
768     + * updated superblock; perform any operations that could fail *before* you
769     + * take the superblock lock.
770     */
771     int dm_tm_pre_commit(struct dm_transaction_manager *tm);
772     -int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *root);
773     +int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *superblock);
774    
775     /*
776     * These methods are the only way to get hold of a writeable block.
777     diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
778     index 2d23d2929438..cc69e415df35 100644
779     --- a/drivers/mtd/nand/atmel_nand.c
780     +++ b/drivers/mtd/nand/atmel_nand.c
781     @@ -1096,6 +1096,7 @@ static int __init atmel_pmecc_nand_init_params(struct platform_device *pdev,
782     goto err_pmecc_data_alloc;
783     }
784    
785     + nand_chip->options |= NAND_NO_SUBPAGE_WRITE;
786     nand_chip->ecc.read_page = atmel_nand_pmecc_read_page;
787     nand_chip->ecc.write_page = atmel_nand_pmecc_write_page;
788    
789     diff --git a/drivers/mtd/nand/nuc900_nand.c b/drivers/mtd/nand/nuc900_nand.c
790     index cd6be2ed53a8..14203f3bb0cd 100644
791     --- a/drivers/mtd/nand/nuc900_nand.c
792     +++ b/drivers/mtd/nand/nuc900_nand.c
793     @@ -225,7 +225,7 @@ static void nuc900_nand_enable(struct nuc900_nand *nand)
794     val = __raw_readl(nand->reg + REG_FMICSR);
795    
796     if (!(val & NAND_EN))
797     - __raw_writel(val | NAND_EN, REG_FMICSR);
798     + __raw_writel(val | NAND_EN, nand->reg + REG_FMICSR);
799    
800     val = __raw_readl(nand->reg + REG_SMCSR);
801    
802     diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c
803     index f9d5615c5727..4b55cd45287b 100644
804     --- a/drivers/mtd/sm_ftl.c
805     +++ b/drivers/mtd/sm_ftl.c
806     @@ -59,15 +59,12 @@ struct attribute_group *sm_create_sysfs_attributes(struct sm_ftl *ftl)
807     struct attribute_group *attr_group;
808     struct attribute **attributes;
809     struct sm_sysfs_attribute *vendor_attribute;
810     + char *vendor;
811    
812     - int vendor_len = strnlen(ftl->cis_buffer + SM_CIS_VENDOR_OFFSET,
813     - SM_SMALL_PAGE - SM_CIS_VENDOR_OFFSET);
814     -
815     - char *vendor = kmalloc(vendor_len, GFP_KERNEL);
816     + vendor = kstrndup(ftl->cis_buffer + SM_CIS_VENDOR_OFFSET,
817     + SM_SMALL_PAGE - SM_CIS_VENDOR_OFFSET, GFP_KERNEL);
818     if (!vendor)
819     goto error1;
820     - memcpy(vendor, ftl->cis_buffer + SM_CIS_VENDOR_OFFSET, vendor_len);
821     - vendor[vendor_len] = 0;
822    
823     /* Initialize sysfs attributes */
824     vendor_attribute =
825     @@ -78,7 +75,7 @@ struct attribute_group *sm_create_sysfs_attributes(struct sm_ftl *ftl)
826     sysfs_attr_init(&vendor_attribute->dev_attr.attr);
827    
828     vendor_attribute->data = vendor;
829     - vendor_attribute->len = vendor_len;
830     + vendor_attribute->len = strlen(vendor);
831     vendor_attribute->dev_attr.attr.name = "vendor";
832     vendor_attribute->dev_attr.attr.mode = S_IRUGO;
833     vendor_attribute->dev_attr.show = sm_attr_show;
834     diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
835     index 7c970d3ae358..80ecca3e1465 100644
836     --- a/drivers/net/wireless/b43/phy_n.c
837     +++ b/drivers/net/wireless/b43/phy_n.c
838     @@ -5175,22 +5175,22 @@ static void b43_nphy_channel_setup(struct b43_wldev *dev,
839     int ch = new_channel->hw_value;
840    
841     u16 old_band_5ghz;
842     - u32 tmp32;
843     + u16 tmp16;
844    
845     old_band_5ghz =
846     b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ;
847     if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) {
848     - tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR);
849     - b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4);
850     + tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR);
851     + b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4);
852     b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000);
853     - b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32);
854     + b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16);
855     b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ);
856     } else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) {
857     b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ);
858     - tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR);
859     - b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4);
860     + tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR);
861     + b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4);
862     b43_phy_mask(dev, B43_PHY_B_BBCFG, 0x3FFF);
863     - b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32);
864     + b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16);
865     }
866    
867     b43_chantab_phy_upload(dev, e);
868     diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c
869     index a8afc7bee545..c2b8e49d00d3 100644
870     --- a/drivers/net/wireless/iwlwifi/dvm/main.c
871     +++ b/drivers/net/wireless/iwlwifi/dvm/main.c
872     @@ -252,13 +252,17 @@ static void iwl_bg_bt_runtime_config(struct work_struct *work)
873     struct iwl_priv *priv =
874     container_of(work, struct iwl_priv, bt_runtime_config);
875    
876     + mutex_lock(&priv->mutex);
877     if (test_bit(STATUS_EXIT_PENDING, &priv->status))
878     - return;
879     + goto out;
880    
881     /* dont send host command if rf-kill is on */
882     if (!iwl_is_ready_rf(priv))
883     - return;
884     + goto out;
885     +
886     iwlagn_send_advance_bt_config(priv);
887     +out:
888     + mutex_unlock(&priv->mutex);
889     }
890    
891     static void iwl_bg_bt_full_concurrency(struct work_struct *work)
892     diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
893     index e06971be7df7..f923d8c9a296 100644
894     --- a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
895     +++ b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
896     @@ -1025,9 +1025,20 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
897     bool rtstatus = true;
898     int err = 0;
899     u8 tmp_u1b, u1byte;
900     + unsigned long flags;
901    
902     RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Rtl8188EE hw init\n");
903     rtlpriv->rtlhal.being_init_adapter = true;
904     + /* As this function can take a very long time (up to 350 ms)
905     + * and can be called with irqs disabled, reenable the irqs
906     + * to let the other devices continue being serviced.
907     + *
908     + * It is safe doing so since our own interrupts will only be enabled
909     + * in a subsequent step.
910     + */
911     + local_save_flags(flags);
912     + local_irq_enable();
913     +
914     rtlpriv->intf_ops->disable_aspm(hw);
915    
916     tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR+1);
917     @@ -1043,7 +1054,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
918     if (rtstatus != true) {
919     RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
920     err = 1;
921     - return err;
922     + goto exit;
923     }
924    
925     err = rtl88e_download_fw(hw, false);
926     @@ -1051,8 +1062,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
927     RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
928     "Failed to download FW. Init HW without FW now..\n");
929     err = 1;
930     - rtlhal->fw_ready = false;
931     - return err;
932     + goto exit;
933     } else {
934     rtlhal->fw_ready = true;
935     }
936     @@ -1135,10 +1145,12 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
937     }
938     rtl_write_byte(rtlpriv, REG_NAV_CTRL+2, ((30000+127)/128));
939     rtl88e_dm_init(hw);
940     +exit:
941     + local_irq_restore(flags);
942     rtlpriv->rtlhal.being_init_adapter = false;
943     RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "end of Rtl8188EE hw init %x\n",
944     err);
945     - return 0;
946     + return err;
947     }
948    
949     static enum version_8188e _rtl88ee_read_chip_version(struct ieee80211_hw *hw)
950     diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
951     index a8871d66d56a..ea4d014a2884 100644
952     --- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
953     +++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
954     @@ -293,7 +293,7 @@ static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
955     u8 *psaddr;
956     __le16 fc;
957     u16 type, ufc;
958     - bool match_bssid, packet_toself, packet_beacon, addr;
959     + bool match_bssid, packet_toself, packet_beacon = false, addr;
960    
961     tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
962    
963     diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
964     index 189ba124a8c6..324aa581938e 100644
965     --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
966     +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
967     @@ -985,6 +985,17 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
968     struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
969     int err = 0;
970     static bool iqk_initialized;
971     + unsigned long flags;
972     +
973     + /* As this function can take a very long time (up to 350 ms)
974     + * and can be called with irqs disabled, reenable the irqs
975     + * to let the other devices continue being serviced.
976     + *
977     + * It is safe doing so since our own interrupts will only be enabled
978     + * in a subsequent step.
979     + */
980     + local_save_flags(flags);
981     + local_irq_enable();
982    
983     rtlhal->hw_type = HARDWARE_TYPE_RTL8192CU;
984     err = _rtl92cu_init_mac(hw);
985     @@ -997,7 +1008,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
986     RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
987     "Failed to download FW. Init HW without FW now..\n");
988     err = 1;
989     - return err;
990     + goto exit;
991     }
992     rtlhal->last_hmeboxnum = 0; /* h2c */
993     _rtl92cu_phy_param_tab_init(hw);
994     @@ -1034,6 +1045,8 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
995     _InitPABias(hw);
996     _update_mac_setting(hw);
997     rtl92c_dm_init(hw);
998     +exit:
999     + local_irq_restore(flags);
1000     return err;
1001     }
1002    
1003     diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
1004     index 4f461786a7eb..c471400fe8f0 100644
1005     --- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
1006     +++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
1007     @@ -955,7 +955,7 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1008     struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1009     struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1010     u8 tmp_byte = 0;
1011     -
1012     + unsigned long flags;
1013     bool rtstatus = true;
1014     u8 tmp_u1b;
1015     int err = false;
1016     @@ -967,6 +967,16 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1017    
1018     rtlpci->being_init_adapter = true;
1019    
1020     + /* As this function can take a very long time (up to 350 ms)
1021     + * and can be called with irqs disabled, reenable the irqs
1022     + * to let the other devices continue being serviced.
1023     + *
1024     + * It is safe doing so since our own interrupts will only be enabled
1025     + * in a subsequent step.
1026     + */
1027     + local_save_flags(flags);
1028     + local_irq_enable();
1029     +
1030     rtlpriv->intf_ops->disable_aspm(hw);
1031    
1032     /* 1. MAC Initialize */
1033     @@ -984,7 +994,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1034     RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1035     "Failed to download FW. Init HW without FW now... "
1036     "Please copy FW into /lib/firmware/rtlwifi\n");
1037     - return 1;
1038     + err = 1;
1039     + goto exit;
1040     }
1041    
1042     /* After FW download, we have to reset MAC register */
1043     @@ -997,7 +1008,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1044     /* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */
1045     if (!rtl92s_phy_mac_config(hw)) {
1046     RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "MAC Config failed\n");
1047     - return rtstatus;
1048     + err = rtstatus;
1049     + goto exit;
1050     }
1051    
1052     /* because last function modify RCR, so we update
1053     @@ -1016,7 +1028,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1054     /* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */
1055     if (!rtl92s_phy_bb_config(hw)) {
1056     RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "BB Config failed\n");
1057     - return rtstatus;
1058     + err = rtstatus;
1059     + goto exit;
1060     }
1061    
1062     /* 5. Initiailze RF RAIO_A.txt RF RAIO_B.txt */
1063     @@ -1033,7 +1046,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1064    
1065     if (!rtl92s_phy_rf_config(hw)) {
1066     RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "RF Config failed\n");
1067     - return rtstatus;
1068     + err = rtstatus;
1069     + goto exit;
1070     }
1071    
1072     /* After read predefined TXT, we must set BB/MAC/RF
1073     @@ -1122,8 +1136,9 @@ int rtl92se_hw_init(struct ieee80211_hw *hw)
1074    
1075     rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_ON);
1076     rtl92s_dm_init(hw);
1077     +exit:
1078     + local_irq_restore(flags);
1079     rtlpci->being_init_adapter = false;
1080     -
1081     return err;
1082     }
1083    
1084     diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
1085     index 7d0f2e20f1a2..c240b7591cf0 100644
1086     --- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
1087     +++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
1088     @@ -49,6 +49,12 @@ static u8 _rtl92se_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 skb_queue)
1089     if (ieee80211_is_nullfunc(fc))
1090     return QSLT_HIGH;
1091    
1092     + /* Kernel commit 1bf4bbb4024dcdab changed EAPOL packets to use
1093     + * queue V0 at priority 7; however, the RTL8192SE appears to have
1094     + * that queue at priority 6
1095     + */
1096     + if (skb->priority == 7)
1097     + return QSLT_VO;
1098     return skb->priority;
1099     }
1100    
1101     diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
1102     index c333dfd116b8..99f6bc5fa986 100644
1103     --- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
1104     +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
1105     @@ -880,14 +880,25 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
1106     bool rtstatus = true;
1107     int err;
1108     u8 tmp_u1b;
1109     + unsigned long flags;
1110    
1111     rtlpriv->rtlhal.being_init_adapter = true;
1112     + /* As this function can take a very long time (up to 350 ms)
1113     + * and can be called with irqs disabled, reenable the irqs
1114     + * to let the other devices continue being serviced.
1115     + *
1116     + * It is safe doing so since our own interrupts will only be enabled
1117     + * in a subsequent step.
1118     + */
1119     + local_save_flags(flags);
1120     + local_irq_enable();
1121     +
1122     rtlpriv->intf_ops->disable_aspm(hw);
1123     rtstatus = _rtl8712e_init_mac(hw);
1124     if (rtstatus != true) {
1125     RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1126     err = 1;
1127     - return err;
1128     + goto exit;
1129     }
1130    
1131     err = rtl8723ae_download_fw(hw);
1132     @@ -895,8 +906,7 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
1133     RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1134     "Failed to download FW. Init HW without FW now..\n");
1135     err = 1;
1136     - rtlhal->fw_ready = false;
1137     - return err;
1138     + goto exit;
1139     } else {
1140     rtlhal->fw_ready = true;
1141     }
1142     @@ -971,6 +981,8 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
1143     RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n");
1144     }
1145     rtl8723ae_dm_init(hw);
1146     +exit:
1147     + local_irq_restore(flags);
1148     rtlpriv->rtlhal.being_init_adapter = false;
1149     return err;
1150     }
1151     diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
1152     index 8ea7d9b2c671..815e290a1afb 100644
1153     --- a/drivers/s390/cio/chsc.c
1154     +++ b/drivers/s390/cio/chsc.c
1155     @@ -500,18 +500,27 @@ static void chsc_process_sei_nt0(struct chsc_sei_nt0_area *sei_area)
1156    
1157     static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm)
1158     {
1159     - do {
1160     + static int ntsm_unsupported;
1161     +
1162     + while (true) {
1163     memset(sei, 0, sizeof(*sei));
1164     sei->request.length = 0x0010;
1165     sei->request.code = 0x000e;
1166     - sei->ntsm = ntsm;
1167     + if (!ntsm_unsupported)
1168     + sei->ntsm = ntsm;
1169    
1170     if (chsc(sei))
1171     break;
1172    
1173     if (sei->response.code != 0x0001) {
1174     - CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n",
1175     - sei->response.code);
1176     + CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n",
1177     + sei->response.code, sei->ntsm);
1178     +
1179     + if (sei->response.code == 3 && sei->ntsm) {
1180     + /* Fallback for old firmware. */
1181     + ntsm_unsupported = 1;
1182     + continue;
1183     + }
1184     break;
1185     }
1186    
1187     @@ -527,7 +536,10 @@ static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm)
1188     CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt);
1189     break;
1190     }
1191     - } while (sei->u.nt0_area.flags & 0x80);
1192     +
1193     + if (!(sei->u.nt0_area.flags & 0x80))
1194     + break;
1195     + }
1196     }
1197    
1198     /*
1199     diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
1200     index 8dbe500c935d..fe76185cd79a 100644
1201     --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
1202     +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
1203     @@ -8174,7 +8174,6 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state)
1204    
1205     mpt2sas_base_free_resources(ioc);
1206     pci_save_state(pdev);
1207     - pci_disable_device(pdev);
1208     pci_set_power_state(pdev, device_state);
1209     return 0;
1210     }
1211     diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
1212     index b26f1a5cc0ec..95a5d73e675c 100644
1213     --- a/drivers/scsi/virtio_scsi.c
1214     +++ b/drivers/scsi/virtio_scsi.c
1215     @@ -751,8 +751,12 @@ static void __virtscsi_set_affinity(struct virtio_scsi *vscsi, bool affinity)
1216    
1217     vscsi->affinity_hint_set = true;
1218     } else {
1219     - for (i = 0; i < vscsi->num_queues; i++)
1220     + for (i = 0; i < vscsi->num_queues; i++) {
1221     + if (!vscsi->req_vqs[i].vq)
1222     + continue;
1223     +
1224     virtqueue_set_affinity(vscsi->req_vqs[i].vq, -1);
1225     + }
1226    
1227     vscsi->affinity_hint_set = false;
1228     }
1229     diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
1230     index a2a2645b296c..f179033eaa3e 100644
1231     --- a/drivers/tty/hvc/hvc_console.c
1232     +++ b/drivers/tty/hvc/hvc_console.c
1233     @@ -190,7 +190,7 @@ static struct tty_driver *hvc_console_device(struct console *c, int *index)
1234     return hvc_driver;
1235     }
1236    
1237     -static int __init hvc_console_setup(struct console *co, char *options)
1238     +static int hvc_console_setup(struct console *co, char *options)
1239     {
1240     if (co->index < 0 || co->index >= MAX_NR_HVC_CONSOLES)
1241     return -ENODEV;
1242     diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
1243     index 6c7fe90ad72d..6cfe4019abc6 100644
1244     --- a/drivers/tty/n_tty.c
1245     +++ b/drivers/tty/n_tty.c
1246     @@ -2066,8 +2066,12 @@ static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
1247     if (tty->ops->flush_chars)
1248     tty->ops->flush_chars(tty);
1249     } else {
1250     + struct n_tty_data *ldata = tty->disc_data;
1251     +
1252     while (nr > 0) {
1253     + mutex_lock(&ldata->output_lock);
1254     c = tty->ops->write(tty, b, nr);
1255     + mutex_unlock(&ldata->output_lock);
1256     if (c < 0) {
1257     retval = c;
1258     goto break_out;
1259     diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
1260     index d28d7afc128a..b167665b7de2 100644
1261     --- a/drivers/tty/serial/8250/8250_core.c
1262     +++ b/drivers/tty/serial/8250/8250_core.c
1263     @@ -555,7 +555,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
1264     */
1265     if ((p->port.type == PORT_XR17V35X) ||
1266     (p->port.type == PORT_XR17D15X)) {
1267     - serial_out(p, UART_EXAR_SLEEP, 0xff);
1268     + serial_out(p, UART_EXAR_SLEEP, sleep ? 0xff : 0);
1269     return;
1270     }
1271    
1272     diff --git a/drivers/video/aty/mach64_accel.c b/drivers/video/aty/mach64_accel.c
1273     index e45833ce975b..182bd680141f 100644
1274     --- a/drivers/video/aty/mach64_accel.c
1275     +++ b/drivers/video/aty/mach64_accel.c
1276     @@ -4,6 +4,7 @@
1277     */
1278    
1279     #include <linux/delay.h>
1280     +#include <asm/unaligned.h>
1281     #include <linux/fb.h>
1282     #include <video/mach64.h>
1283     #include "atyfb.h"
1284     @@ -419,7 +420,7 @@ void atyfb_imageblit(struct fb_info *info, const struct fb_image *image)
1285     u32 *pbitmap, dwords = (src_bytes + 3) / 4;
1286     for (pbitmap = (u32*)(image->data); dwords; dwords--, pbitmap++) {
1287     wait_for_fifo(1, par);
1288     - aty_st_le32(HOST_DATA0, le32_to_cpup(pbitmap), par);
1289     + aty_st_le32(HOST_DATA0, get_unaligned_le32(pbitmap), par);
1290     }
1291     }
1292    
1293     diff --git a/drivers/video/aty/mach64_cursor.c b/drivers/video/aty/mach64_cursor.c
1294     index 95ec042ddbf8..0fe02e22d9a4 100644
1295     --- a/drivers/video/aty/mach64_cursor.c
1296     +++ b/drivers/video/aty/mach64_cursor.c
1297     @@ -5,6 +5,7 @@
1298     #include <linux/fb.h>
1299     #include <linux/init.h>
1300     #include <linux/string.h>
1301     +#include "../fb_draw.h"
1302    
1303     #include <asm/io.h>
1304    
1305     @@ -157,24 +158,33 @@ static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
1306    
1307     for (i = 0; i < height; i++) {
1308     for (j = 0; j < width; j++) {
1309     + u16 l = 0xaaaa;
1310     b = *src++;
1311     m = *msk++;
1312     switch (cursor->rop) {
1313     case ROP_XOR:
1314     // Upper 4 bits of mask data
1315     - fb_writeb(cursor_bits_lookup[(b ^ m) >> 4], dst++);
1316     + l = cursor_bits_lookup[(b ^ m) >> 4] |
1317     // Lower 4 bits of mask
1318     - fb_writeb(cursor_bits_lookup[(b ^ m) & 0x0f],
1319     - dst++);
1320     + (cursor_bits_lookup[(b ^ m) & 0x0f] << 8);
1321     break;
1322     case ROP_COPY:
1323     // Upper 4 bits of mask data
1324     - fb_writeb(cursor_bits_lookup[(b & m) >> 4], dst++);
1325     + l = cursor_bits_lookup[(b & m) >> 4] |
1326     // Lower 4 bits of mask
1327     - fb_writeb(cursor_bits_lookup[(b & m) & 0x0f],
1328     - dst++);
1329     + (cursor_bits_lookup[(b & m) & 0x0f] << 8);
1330     break;
1331     }
1332     + /*
1333     + * If cursor size is not a multiple of 8 characters
1334     + * we must pad it with transparent pattern (0xaaaa).
1335     + */
1336     + if ((j + 1) * 8 > cursor->image.width) {
1337     + l = comp(l, 0xaaaa,
1338     + (1 << ((cursor->image.width & 7) * 2)) - 1);
1339     + }
1340     + fb_writeb(l & 0xff, dst++);
1341     + fb_writeb(l >> 8, dst++);
1342     }
1343     dst += offset;
1344     }
1345     diff --git a/drivers/video/cfbcopyarea.c b/drivers/video/cfbcopyarea.c
1346     index bb5a96b1645d..bcb57235fcc7 100644
1347     --- a/drivers/video/cfbcopyarea.c
1348     +++ b/drivers/video/cfbcopyarea.c
1349     @@ -43,13 +43,22 @@
1350     */
1351    
1352     static void
1353     -bitcpy(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1354     - const unsigned long __iomem *src, int src_idx, int bits,
1355     +bitcpy(struct fb_info *p, unsigned long __iomem *dst, unsigned dst_idx,
1356     + const unsigned long __iomem *src, unsigned src_idx, int bits,
1357     unsigned n, u32 bswapmask)
1358     {
1359     unsigned long first, last;
1360     int const shift = dst_idx-src_idx;
1361     - int left, right;
1362     +
1363     +#if 0
1364     + /*
1365     + * If you suspect bug in this function, compare it with this simple
1366     + * memmove implementation.
1367     + */
1368     + fb_memmove((char *)dst + ((dst_idx & (bits - 1))) / 8,
1369     + (char *)src + ((src_idx & (bits - 1))) / 8, n / 8);
1370     + return;
1371     +#endif
1372    
1373     first = fb_shifted_pixels_mask_long(p, dst_idx, bswapmask);
1374     last = ~fb_shifted_pixels_mask_long(p, (dst_idx+n) % bits, bswapmask);
1375     @@ -98,9 +107,8 @@ bitcpy(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1376     unsigned long d0, d1;
1377     int m;
1378    
1379     - right = shift & (bits - 1);
1380     - left = -shift & (bits - 1);
1381     - bswapmask &= shift;
1382     + int const left = shift & (bits - 1);
1383     + int const right = -shift & (bits - 1);
1384    
1385     if (dst_idx+n <= bits) {
1386     // Single destination word
1387     @@ -110,15 +118,15 @@ bitcpy(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1388     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1389     if (shift > 0) {
1390     // Single source word
1391     - d0 >>= right;
1392     + d0 <<= left;
1393     } else if (src_idx+n <= bits) {
1394     // Single source word
1395     - d0 <<= left;
1396     + d0 >>= right;
1397     } else {
1398     // 2 source words
1399     d1 = FB_READL(src + 1);
1400     d1 = fb_rev_pixels_in_long(d1, bswapmask);
1401     - d0 = d0<<left | d1>>right;
1402     + d0 = d0 >> right | d1 << left;
1403     }
1404     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1405     FB_WRITEL(comp(d0, FB_READL(dst), first), dst);
1406     @@ -135,60 +143,59 @@ bitcpy(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1407     if (shift > 0) {
1408     // Single source word
1409     d1 = d0;
1410     - d0 >>= right;
1411     - dst++;
1412     + d0 <<= left;
1413     n -= bits - dst_idx;
1414     } else {
1415     // 2 source words
1416     d1 = FB_READL(src++);
1417     d1 = fb_rev_pixels_in_long(d1, bswapmask);
1418    
1419     - d0 = d0<<left | d1>>right;
1420     - dst++;
1421     + d0 = d0 >> right | d1 << left;
1422     n -= bits - dst_idx;
1423     }
1424     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1425     FB_WRITEL(comp(d0, FB_READL(dst), first), dst);
1426     d0 = d1;
1427     + dst++;
1428    
1429     // Main chunk
1430     m = n % bits;
1431     n /= bits;
1432     while ((n >= 4) && !bswapmask) {
1433     d1 = FB_READL(src++);
1434     - FB_WRITEL(d0 << left | d1 >> right, dst++);
1435     + FB_WRITEL(d0 >> right | d1 << left, dst++);
1436     d0 = d1;
1437     d1 = FB_READL(src++);
1438     - FB_WRITEL(d0 << left | d1 >> right, dst++);
1439     + FB_WRITEL(d0 >> right | d1 << left, dst++);
1440     d0 = d1;
1441     d1 = FB_READL(src++);
1442     - FB_WRITEL(d0 << left | d1 >> right, dst++);
1443     + FB_WRITEL(d0 >> right | d1 << left, dst++);
1444     d0 = d1;
1445     d1 = FB_READL(src++);
1446     - FB_WRITEL(d0 << left | d1 >> right, dst++);
1447     + FB_WRITEL(d0 >> right | d1 << left, dst++);
1448     d0 = d1;
1449     n -= 4;
1450     }
1451     while (n--) {
1452     d1 = FB_READL(src++);
1453     d1 = fb_rev_pixels_in_long(d1, bswapmask);
1454     - d0 = d0 << left | d1 >> right;
1455     + d0 = d0 >> right | d1 << left;
1456     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1457     FB_WRITEL(d0, dst++);
1458     d0 = d1;
1459     }
1460    
1461     // Trailing bits
1462     - if (last) {
1463     - if (m <= right) {
1464     + if (m) {
1465     + if (m <= bits - right) {
1466     // Single source word
1467     - d0 <<= left;
1468     + d0 >>= right;
1469     } else {
1470     // 2 source words
1471     d1 = FB_READL(src);
1472     d1 = fb_rev_pixels_in_long(d1,
1473     bswapmask);
1474     - d0 = d0<<left | d1>>right;
1475     + d0 = d0 >> right | d1 << left;
1476     }
1477     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1478     FB_WRITEL(comp(d0, FB_READL(dst), last), dst);
1479     @@ -202,43 +209,46 @@ bitcpy(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1480     */
1481    
1482     static void
1483     -bitcpy_rev(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1484     - const unsigned long __iomem *src, int src_idx, int bits,
1485     +bitcpy_rev(struct fb_info *p, unsigned long __iomem *dst, unsigned dst_idx,
1486     + const unsigned long __iomem *src, unsigned src_idx, int bits,
1487     unsigned n, u32 bswapmask)
1488     {
1489     unsigned long first, last;
1490     int shift;
1491    
1492     - dst += (n-1)/bits;
1493     - src += (n-1)/bits;
1494     - if ((n-1) % bits) {
1495     - dst_idx += (n-1) % bits;
1496     - dst += dst_idx >> (ffs(bits) - 1);
1497     - dst_idx &= bits - 1;
1498     - src_idx += (n-1) % bits;
1499     - src += src_idx >> (ffs(bits) - 1);
1500     - src_idx &= bits - 1;
1501     - }
1502     +#if 0
1503     + /*
1504     + * If you suspect bug in this function, compare it with this simple
1505     + * memmove implementation.
1506     + */
1507     + fb_memmove((char *)dst + ((dst_idx & (bits - 1))) / 8,
1508     + (char *)src + ((src_idx & (bits - 1))) / 8, n / 8);
1509     + return;
1510     +#endif
1511     +
1512     + dst += (dst_idx + n - 1) / bits;
1513     + src += (src_idx + n - 1) / bits;
1514     + dst_idx = (dst_idx + n - 1) % bits;
1515     + src_idx = (src_idx + n - 1) % bits;
1516    
1517     shift = dst_idx-src_idx;
1518    
1519     - first = fb_shifted_pixels_mask_long(p, bits - 1 - dst_idx, bswapmask);
1520     - last = ~fb_shifted_pixels_mask_long(p, bits - 1 - ((dst_idx-n) % bits),
1521     - bswapmask);
1522     + first = ~fb_shifted_pixels_mask_long(p, (dst_idx + 1) % bits, bswapmask);
1523     + last = fb_shifted_pixels_mask_long(p, (bits + dst_idx + 1 - n) % bits, bswapmask);
1524    
1525     if (!shift) {
1526     // Same alignment for source and dest
1527    
1528     if ((unsigned long)dst_idx+1 >= n) {
1529     // Single word
1530     - if (last)
1531     - first &= last;
1532     - FB_WRITEL( comp( FB_READL(src), FB_READL(dst), first), dst);
1533     + if (first)
1534     + last &= first;
1535     + FB_WRITEL( comp( FB_READL(src), FB_READL(dst), last), dst);
1536     } else {
1537     // Multiple destination words
1538    
1539     // Leading bits
1540     - if (first != ~0UL) {
1541     + if (first) {
1542     FB_WRITEL( comp( FB_READL(src), FB_READL(dst), first), dst);
1543     dst--;
1544     src--;
1545     @@ -262,7 +272,7 @@ bitcpy_rev(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1546     FB_WRITEL(FB_READL(src--), dst--);
1547    
1548     // Trailing bits
1549     - if (last)
1550     + if (last != -1UL)
1551     FB_WRITEL( comp( FB_READL(src), FB_READL(dst), last), dst);
1552     }
1553     } else {
1554     @@ -270,29 +280,28 @@ bitcpy_rev(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1555     unsigned long d0, d1;
1556     int m;
1557    
1558     - int const left = -shift & (bits-1);
1559     - int const right = shift & (bits-1);
1560     - bswapmask &= shift;
1561     + int const left = shift & (bits-1);
1562     + int const right = -shift & (bits-1);
1563    
1564     if ((unsigned long)dst_idx+1 >= n) {
1565     // Single destination word
1566     - if (last)
1567     - first &= last;
1568     + if (first)
1569     + last &= first;
1570     d0 = FB_READL(src);
1571     if (shift < 0) {
1572     // Single source word
1573     - d0 <<= left;
1574     + d0 >>= right;
1575     } else if (1+(unsigned long)src_idx >= n) {
1576     // Single source word
1577     - d0 >>= right;
1578     + d0 <<= left;
1579     } else {
1580     // 2 source words
1581     d1 = FB_READL(src - 1);
1582     d1 = fb_rev_pixels_in_long(d1, bswapmask);
1583     - d0 = d0>>right | d1<<left;
1584     + d0 = d0 << left | d1 >> right;
1585     }
1586     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1587     - FB_WRITEL(comp(d0, FB_READL(dst), first), dst);
1588     + FB_WRITEL(comp(d0, FB_READL(dst), last), dst);
1589     } else {
1590     // Multiple destination words
1591     /** We must always remember the last value read, because in case
1592     @@ -307,12 +316,12 @@ bitcpy_rev(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1593     if (shift < 0) {
1594     // Single source word
1595     d1 = d0;
1596     - d0 <<= left;
1597     + d0 >>= right;
1598     } else {
1599     // 2 source words
1600     d1 = FB_READL(src--);
1601     d1 = fb_rev_pixels_in_long(d1, bswapmask);
1602     - d0 = d0>>right | d1<<left;
1603     + d0 = d0 << left | d1 >> right;
1604     }
1605     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1606     FB_WRITEL(comp(d0, FB_READL(dst), first), dst);
1607     @@ -325,39 +334,39 @@ bitcpy_rev(struct fb_info *p, unsigned long __iomem *dst, int dst_idx,
1608     n /= bits;
1609     while ((n >= 4) && !bswapmask) {
1610     d1 = FB_READL(src--);
1611     - FB_WRITEL(d0 >> right | d1 << left, dst--);
1612     + FB_WRITEL(d0 << left | d1 >> right, dst--);
1613     d0 = d1;
1614     d1 = FB_READL(src--);
1615     - FB_WRITEL(d0 >> right | d1 << left, dst--);
1616     + FB_WRITEL(d0 << left | d1 >> right, dst--);
1617     d0 = d1;
1618     d1 = FB_READL(src--);
1619     - FB_WRITEL(d0 >> right | d1 << left, dst--);
1620     + FB_WRITEL(d0 << left | d1 >> right, dst--);
1621     d0 = d1;
1622     d1 = FB_READL(src--);
1623     - FB_WRITEL(d0 >> right | d1 << left, dst--);
1624     + FB_WRITEL(d0 << left | d1 >> right, dst--);
1625     d0 = d1;
1626     n -= 4;
1627     }
1628     while (n--) {
1629     d1 = FB_READL(src--);
1630     d1 = fb_rev_pixels_in_long(d1, bswapmask);
1631     - d0 = d0 >> right | d1 << left;
1632     + d0 = d0 << left | d1 >> right;
1633     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1634     FB_WRITEL(d0, dst--);
1635     d0 = d1;
1636     }
1637    
1638     // Trailing bits
1639     - if (last) {
1640     - if (m <= left) {
1641     + if (m) {
1642     + if (m <= bits - left) {
1643     // Single source word
1644     - d0 >>= right;
1645     + d0 <<= left;
1646     } else {
1647     // 2 source words
1648     d1 = FB_READL(src);
1649     d1 = fb_rev_pixels_in_long(d1,
1650     bswapmask);
1651     - d0 = d0>>right | d1<<left;
1652     + d0 = d0 << left | d1 >> right;
1653     }
1654     d0 = fb_rev_pixels_in_long(d0, bswapmask);
1655     FB_WRITEL(comp(d0, FB_READL(dst), last), dst);
1656     @@ -371,9 +380,9 @@ void cfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
1657     u32 dx = area->dx, dy = area->dy, sx = area->sx, sy = area->sy;
1658     u32 height = area->height, width = area->width;
1659     unsigned long const bits_per_line = p->fix.line_length*8u;
1660     - unsigned long __iomem *dst = NULL, *src = NULL;
1661     + unsigned long __iomem *base = NULL;
1662     int bits = BITS_PER_LONG, bytes = bits >> 3;
1663     - int dst_idx = 0, src_idx = 0, rev_copy = 0;
1664     + unsigned dst_idx = 0, src_idx = 0, rev_copy = 0;
1665     u32 bswapmask = fb_compute_bswapmask(p);
1666    
1667     if (p->state != FBINFO_STATE_RUNNING)
1668     @@ -389,7 +398,7 @@ void cfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
1669    
1670     // split the base of the framebuffer into a long-aligned address and the
1671     // index of the first bit
1672     - dst = src = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1));
1673     + base = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1));
1674     dst_idx = src_idx = 8*((unsigned long)p->screen_base & (bytes-1));
1675     // add offset of source and target area
1676     dst_idx += dy*bits_per_line + dx*p->var.bits_per_pixel;
1677     @@ -402,20 +411,14 @@ void cfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
1678     while (height--) {
1679     dst_idx -= bits_per_line;
1680     src_idx -= bits_per_line;
1681     - dst += dst_idx >> (ffs(bits) - 1);
1682     - dst_idx &= (bytes - 1);
1683     - src += src_idx >> (ffs(bits) - 1);
1684     - src_idx &= (bytes - 1);
1685     - bitcpy_rev(p, dst, dst_idx, src, src_idx, bits,
1686     + bitcpy_rev(p, base + (dst_idx / bits), dst_idx % bits,
1687     + base + (src_idx / bits), src_idx % bits, bits,
1688     width*p->var.bits_per_pixel, bswapmask);
1689     }
1690     } else {
1691     while (height--) {
1692     - dst += dst_idx >> (ffs(bits) - 1);
1693     - dst_idx &= (bytes - 1);
1694     - src += src_idx >> (ffs(bits) - 1);
1695     - src_idx &= (bytes - 1);
1696     - bitcpy(p, dst, dst_idx, src, src_idx, bits,
1697     + bitcpy(p, base + (dst_idx / bits), dst_idx % bits,
1698     + base + (src_idx / bits), src_idx % bits, bits,
1699     width*p->var.bits_per_pixel, bswapmask);
1700     dst_idx += bits_per_line;
1701     src_idx += bits_per_line;
1702     diff --git a/drivers/video/matrox/matroxfb_accel.c b/drivers/video/matrox/matroxfb_accel.c
1703     index 8335a6fe303e..0d5cb85d071a 100644
1704     --- a/drivers/video/matrox/matroxfb_accel.c
1705     +++ b/drivers/video/matrox/matroxfb_accel.c
1706     @@ -192,10 +192,18 @@ void matrox_cfbX_init(struct matrox_fb_info *minfo)
1707     minfo->accel.m_dwg_rect = M_DWG_TRAP | M_DWG_SOLID | M_DWG_ARZERO | M_DWG_SGNZERO | M_DWG_SHIFTZERO;
1708     if (isMilleniumII(minfo)) minfo->accel.m_dwg_rect |= M_DWG_TRANSC;
1709     minfo->accel.m_opmode = mopmode;
1710     + minfo->accel.m_access = maccess;
1711     + minfo->accel.m_pitch = mpitch;
1712     }
1713    
1714     EXPORT_SYMBOL(matrox_cfbX_init);
1715    
1716     +static void matrox_accel_restore_maccess(struct matrox_fb_info *minfo)
1717     +{
1718     + mga_outl(M_MACCESS, minfo->accel.m_access);
1719     + mga_outl(M_PITCH, minfo->accel.m_pitch);
1720     +}
1721     +
1722     static void matrox_accel_bmove(struct matrox_fb_info *minfo, int vxres, int sy,
1723     int sx, int dy, int dx, int height, int width)
1724     {
1725     @@ -207,7 +215,8 @@ static void matrox_accel_bmove(struct matrox_fb_info *minfo, int vxres, int sy,
1726     CRITBEGIN
1727    
1728     if ((dy < sy) || ((dy == sy) && (dx <= sx))) {
1729     - mga_fifo(2);
1730     + mga_fifo(4);
1731     + matrox_accel_restore_maccess(minfo);
1732     mga_outl(M_DWGCTL, M_DWG_BITBLT | M_DWG_SHIFTZERO | M_DWG_SGNZERO |
1733     M_DWG_BFCOL | M_DWG_REPLACE);
1734     mga_outl(M_AR5, vxres);
1735     @@ -215,7 +224,8 @@ static void matrox_accel_bmove(struct matrox_fb_info *minfo, int vxres, int sy,
1736     start = sy*vxres+sx+curr_ydstorg(minfo);
1737     end = start+width;
1738     } else {
1739     - mga_fifo(3);
1740     + mga_fifo(5);
1741     + matrox_accel_restore_maccess(minfo);
1742     mga_outl(M_DWGCTL, M_DWG_BITBLT | M_DWG_SHIFTZERO | M_DWG_BFCOL | M_DWG_REPLACE);
1743     mga_outl(M_SGN, 5);
1744     mga_outl(M_AR5, -vxres);
1745     @@ -224,7 +234,8 @@ static void matrox_accel_bmove(struct matrox_fb_info *minfo, int vxres, int sy,
1746     start = end+width;
1747     dy += height-1;
1748     }
1749     - mga_fifo(4);
1750     + mga_fifo(6);
1751     + matrox_accel_restore_maccess(minfo);
1752     mga_outl(M_AR0, end);
1753     mga_outl(M_AR3, start);
1754     mga_outl(M_FXBNDRY, ((dx+width)<<16) | dx);
1755     @@ -246,7 +257,8 @@ static void matrox_accel_bmove_lin(struct matrox_fb_info *minfo, int vxres,
1756     CRITBEGIN
1757    
1758     if ((dy < sy) || ((dy == sy) && (dx <= sx))) {
1759     - mga_fifo(2);
1760     + mga_fifo(4);
1761     + matrox_accel_restore_maccess(minfo);
1762     mga_outl(M_DWGCTL, M_DWG_BITBLT | M_DWG_SHIFTZERO | M_DWG_SGNZERO |
1763     M_DWG_BFCOL | M_DWG_REPLACE);
1764     mga_outl(M_AR5, vxres);
1765     @@ -254,7 +266,8 @@ static void matrox_accel_bmove_lin(struct matrox_fb_info *minfo, int vxres,
1766     start = sy*vxres+sx+curr_ydstorg(minfo);
1767     end = start+width;
1768     } else {
1769     - mga_fifo(3);
1770     + mga_fifo(5);
1771     + matrox_accel_restore_maccess(minfo);
1772     mga_outl(M_DWGCTL, M_DWG_BITBLT | M_DWG_SHIFTZERO | M_DWG_BFCOL | M_DWG_REPLACE);
1773     mga_outl(M_SGN, 5);
1774     mga_outl(M_AR5, -vxres);
1775     @@ -263,7 +276,8 @@ static void matrox_accel_bmove_lin(struct matrox_fb_info *minfo, int vxres,
1776     start = end+width;
1777     dy += height-1;
1778     }
1779     - mga_fifo(5);
1780     + mga_fifo(7);
1781     + matrox_accel_restore_maccess(minfo);
1782     mga_outl(M_AR0, end);
1783     mga_outl(M_AR3, start);
1784     mga_outl(M_FXBNDRY, ((dx+width)<<16) | dx);
1785     @@ -298,7 +312,8 @@ static void matroxfb_accel_clear(struct matrox_fb_info *minfo, u_int32_t color,
1786    
1787     CRITBEGIN
1788    
1789     - mga_fifo(5);
1790     + mga_fifo(7);
1791     + matrox_accel_restore_maccess(minfo);
1792     mga_outl(M_DWGCTL, minfo->accel.m_dwg_rect | M_DWG_REPLACE);
1793     mga_outl(M_FCOL, color);
1794     mga_outl(M_FXBNDRY, ((sx + width) << 16) | sx);
1795     @@ -341,7 +356,8 @@ static void matroxfb_cfb4_clear(struct matrox_fb_info *minfo, u_int32_t bgx,
1796     width >>= 1;
1797     sx >>= 1;
1798     if (width) {
1799     - mga_fifo(5);
1800     + mga_fifo(7);
1801     + matrox_accel_restore_maccess(minfo);
1802     mga_outl(M_DWGCTL, minfo->accel.m_dwg_rect | M_DWG_REPLACE2);
1803     mga_outl(M_FCOL, bgx);
1804     mga_outl(M_FXBNDRY, ((sx + width) << 16) | sx);
1805     @@ -415,7 +431,8 @@ static void matroxfb_1bpp_imageblit(struct matrox_fb_info *minfo, u_int32_t fgx,
1806    
1807     CRITBEGIN
1808    
1809     - mga_fifo(3);
1810     + mga_fifo(5);
1811     + matrox_accel_restore_maccess(minfo);
1812     if (easy)
1813     mga_outl(M_DWGCTL, M_DWG_ILOAD | M_DWG_SGNZERO | M_DWG_SHIFTZERO | M_DWG_BMONOWF | M_DWG_LINEAR | M_DWG_REPLACE);
1814     else
1815     @@ -425,7 +442,8 @@ static void matroxfb_1bpp_imageblit(struct matrox_fb_info *minfo, u_int32_t fgx,
1816     fxbndry = ((xx + width - 1) << 16) | xx;
1817     mmio = minfo->mmio.vbase;
1818    
1819     - mga_fifo(6);
1820     + mga_fifo(8);
1821     + matrox_accel_restore_maccess(minfo);
1822     mga_writel(mmio, M_FXBNDRY, fxbndry);
1823     mga_writel(mmio, M_AR0, ar0);
1824     mga_writel(mmio, M_AR3, 0);
1825     diff --git a/drivers/video/matrox/matroxfb_base.h b/drivers/video/matrox/matroxfb_base.h
1826     index 11ed57bb704e..556d96ce40bf 100644
1827     --- a/drivers/video/matrox/matroxfb_base.h
1828     +++ b/drivers/video/matrox/matroxfb_base.h
1829     @@ -307,6 +307,8 @@ struct matrox_accel_data {
1830     #endif
1831     u_int32_t m_dwg_rect;
1832     u_int32_t m_opmode;
1833     + u_int32_t m_access;
1834     + u_int32_t m_pitch;
1835     };
1836    
1837     struct v4l2_queryctrl;
1838     diff --git a/drivers/video/tgafb.c b/drivers/video/tgafb.c
1839     index c9c8e5a1fdee..ba77f753649c 100644
1840     --- a/drivers/video/tgafb.c
1841     +++ b/drivers/video/tgafb.c
1842     @@ -1142,222 +1142,57 @@ copyarea_line_32bpp(struct fb_info *info, u32 dy, u32 sy,
1843     __raw_writel(TGA_MODE_SBM_24BPP|TGA_MODE_SIMPLE, tga_regs+TGA_MODE_REG);
1844     }
1845    
1846     -/* The general case of forward copy in 8bpp mode. */
1847     +/* The (almost) general case of backward copy in 8bpp mode. */
1848     static inline void
1849     -copyarea_foreward_8bpp(struct fb_info *info, u32 dx, u32 dy, u32 sx, u32 sy,
1850     - u32 height, u32 width, u32 line_length)
1851     +copyarea_8bpp(struct fb_info *info, u32 dx, u32 dy, u32 sx, u32 sy,
1852     + u32 height, u32 width, u32 line_length,
1853     + const struct fb_copyarea *area)
1854     {
1855     struct tga_par *par = (struct tga_par *) info->par;
1856     - unsigned long i, copied, left;
1857     - unsigned long dpos, spos, dalign, salign, yincr;
1858     - u32 smask_first, dmask_first, dmask_last;
1859     - int pixel_shift, need_prime, need_second;
1860     - unsigned long n64, n32, xincr_first;
1861     + unsigned i, yincr;
1862     + int depos, sepos, backward, last_step, step;
1863     + u32 mask_last;
1864     + unsigned n32;
1865     void __iomem *tga_regs;
1866     void __iomem *tga_fb;
1867    
1868     - yincr = line_length;
1869     - if (dy > sy) {
1870     - dy += height - 1;
1871     - sy += height - 1;
1872     - yincr = -yincr;
1873     - }
1874     -
1875     - /* Compute the offsets and alignments in the frame buffer.
1876     - More than anything else, these control how we do copies. */
1877     - dpos = dy * line_length + dx;
1878     - spos = sy * line_length + sx;
1879     - dalign = dpos & 7;
1880     - salign = spos & 7;
1881     - dpos &= -8;
1882     - spos &= -8;
1883     -
1884     - /* Compute the value for the PIXELSHIFT register. This controls
1885     - both non-co-aligned source and destination and copy direction. */
1886     - if (dalign >= salign)
1887     - pixel_shift = dalign - salign;
1888     - else
1889     - pixel_shift = 8 - (salign - dalign);
1890     -
1891     - /* Figure out if we need an additional priming step for the
1892     - residue register. */
1893     - need_prime = (salign > dalign);
1894     - if (need_prime)
1895     - dpos -= 8;
1896     -
1897     - /* Begin by copying the leading unaligned destination. Copy enough
1898     - to make the next destination address 32-byte aligned. */
1899     - copied = 32 - (dalign + (dpos & 31));
1900     - if (copied == 32)
1901     - copied = 0;
1902     - xincr_first = (copied + 7) & -8;
1903     - smask_first = dmask_first = (1ul << copied) - 1;
1904     - smask_first <<= salign;
1905     - dmask_first <<= dalign + need_prime*8;
1906     - if (need_prime && copied > 24)
1907     - copied -= 8;
1908     - left = width - copied;
1909     -
1910     - /* Care for small copies. */
1911     - if (copied > width) {
1912     - u32 t;
1913     - t = (1ul << width) - 1;
1914     - t <<= dalign + need_prime*8;
1915     - dmask_first &= t;
1916     - left = 0;
1917     - }
1918     -
1919     - /* Attempt to use 64-byte copies. This is only possible if the
1920     - source and destination are co-aligned at 64 bytes. */
1921     - n64 = need_second = 0;
1922     - if ((dpos & 63) == (spos & 63)
1923     - && (height == 1 || line_length % 64 == 0)) {
1924     - /* We may need a 32-byte copy to ensure 64 byte alignment. */
1925     - need_second = (dpos + xincr_first) & 63;
1926     - if ((need_second & 32) != need_second)
1927     - printk(KERN_ERR "tgafb: need_second wrong\n");
1928     - if (left >= need_second + 64) {
1929     - left -= need_second;
1930     - n64 = left / 64;
1931     - left %= 64;
1932     - } else
1933     - need_second = 0;
1934     - }
1935     -
1936     - /* Copy trailing full 32-byte sections. This will be the main
1937     - loop if the 64 byte loop can't be used. */
1938     - n32 = left / 32;
1939     - left %= 32;
1940     -
1941     - /* Copy the trailing unaligned destination. */
1942     - dmask_last = (1ul << left) - 1;
1943     -
1944     - tga_regs = par->tga_regs_base;
1945     - tga_fb = par->tga_fb_base;
1946     -
1947     - /* Set up the MODE and PIXELSHIFT registers. */
1948     - __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_COPY, tga_regs+TGA_MODE_REG);
1949     - __raw_writel(pixel_shift, tga_regs+TGA_PIXELSHIFT_REG);
1950     - wmb();
1951     -
1952     - for (i = 0; i < height; ++i) {
1953     - unsigned long j;
1954     - void __iomem *sfb;
1955     - void __iomem *dfb;
1956     -
1957     - sfb = tga_fb + spos;
1958     - dfb = tga_fb + dpos;
1959     - if (dmask_first) {
1960     - __raw_writel(smask_first, sfb);
1961     - wmb();
1962     - __raw_writel(dmask_first, dfb);
1963     - wmb();
1964     - sfb += xincr_first;
1965     - dfb += xincr_first;
1966     - }
1967     -
1968     - if (need_second) {
1969     - __raw_writel(0xffffffff, sfb);
1970     - wmb();
1971     - __raw_writel(0xffffffff, dfb);
1972     - wmb();
1973     - sfb += 32;
1974     - dfb += 32;
1975     - }
1976     -
1977     - if (n64 && (((unsigned long)sfb | (unsigned long)dfb) & 63))
1978     - printk(KERN_ERR
1979     - "tgafb: misaligned copy64 (s:%p, d:%p)\n",
1980     - sfb, dfb);
1981     -
1982     - for (j = 0; j < n64; ++j) {
1983     - __raw_writel(sfb - tga_fb, tga_regs+TGA_COPY64_SRC);
1984     - wmb();
1985     - __raw_writel(dfb - tga_fb, tga_regs+TGA_COPY64_DST);
1986     - wmb();
1987     - sfb += 64;
1988     - dfb += 64;
1989     - }
1990     -
1991     - for (j = 0; j < n32; ++j) {
1992     - __raw_writel(0xffffffff, sfb);
1993     - wmb();
1994     - __raw_writel(0xffffffff, dfb);
1995     - wmb();
1996     - sfb += 32;
1997     - dfb += 32;
1998     - }
1999     -
2000     - if (dmask_last) {
2001     - __raw_writel(0xffffffff, sfb);
2002     - wmb();
2003     - __raw_writel(dmask_last, dfb);
2004     - wmb();
2005     - }
2006     -
2007     - spos += yincr;
2008     - dpos += yincr;
2009     + /* Do acceleration only if we are aligned on 8 pixels */
2010     + if ((dx | sx | width) & 7) {
2011     + cfb_copyarea(info, area);
2012     + return;
2013     }
2014    
2015     - /* Reset the MODE register to normal. */
2016     - __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_SIMPLE, tga_regs+TGA_MODE_REG);
2017     -}
2018     -
2019     -/* The (almost) general case of backward copy in 8bpp mode. */
2020     -static inline void
2021     -copyarea_backward_8bpp(struct fb_info *info, u32 dx, u32 dy, u32 sx, u32 sy,
2022     - u32 height, u32 width, u32 line_length,
2023     - const struct fb_copyarea *area)
2024     -{
2025     - struct tga_par *par = (struct tga_par *) info->par;
2026     - unsigned long i, left, yincr;
2027     - unsigned long depos, sepos, dealign, sealign;
2028     - u32 mask_first, mask_last;
2029     - unsigned long n32;
2030     - void __iomem *tga_regs;
2031     - void __iomem *tga_fb;
2032     -
2033     yincr = line_length;
2034     if (dy > sy) {
2035     dy += height - 1;
2036     sy += height - 1;
2037     yincr = -yincr;
2038     }
2039     + backward = dy == sy && dx > sx && dx < sx + width;
2040    
2041     /* Compute the offsets and alignments in the frame buffer.
2042     More than anything else, these control how we do copies. */
2043     - depos = dy * line_length + dx + width;
2044     - sepos = sy * line_length + sx + width;
2045     - dealign = depos & 7;
2046     - sealign = sepos & 7;
2047     -
2048     - /* ??? The documentation appears to be incorrect (or very
2049     - misleading) wrt how pixel shifting works in backward copy
2050     - mode, i.e. when PIXELSHIFT is negative. I give up for now.
2051     - Do handle the common case of co-aligned backward copies,
2052     - but frob everything else back on generic code. */
2053     - if (dealign != sealign) {
2054     - cfb_copyarea(info, area);
2055     - return;
2056     - }
2057     -
2058     - /* We begin the copy with the trailing pixels of the
2059     - unaligned destination. */
2060     - mask_first = (1ul << dealign) - 1;
2061     - left = width - dealign;
2062     -
2063     - /* Care for small copies. */
2064     - if (dealign > width) {
2065     - mask_first ^= (1ul << (dealign - width)) - 1;
2066     - left = 0;
2067     - }
2068     + depos = dy * line_length + dx;
2069     + sepos = sy * line_length + sx;
2070     + if (backward)
2071     + depos += width, sepos += width;
2072    
2073     /* Next copy full words at a time. */
2074     - n32 = left / 32;
2075     - left %= 32;
2076     + n32 = width / 32;
2077     + last_step = width % 32;
2078    
2079     /* Finally copy the unaligned head of the span. */
2080     - mask_last = -1 << (32 - left);
2081     + mask_last = (1ul << last_step) - 1;
2082     +
2083     + if (!backward) {
2084     + step = 32;
2085     + last_step = 32;
2086     + } else {
2087     + step = -32;
2088     + last_step = -last_step;
2089     + sepos -= 32;
2090     + depos -= 32;
2091     + }
2092    
2093     tga_regs = par->tga_regs_base;
2094     tga_fb = par->tga_fb_base;
2095     @@ -1374,25 +1209,33 @@ copyarea_backward_8bpp(struct fb_info *info, u32 dx, u32 dy, u32 sx, u32 sy,
2096    
2097     sfb = tga_fb + sepos;
2098     dfb = tga_fb + depos;
2099     - if (mask_first) {
2100     - __raw_writel(mask_first, sfb);
2101     - wmb();
2102     - __raw_writel(mask_first, dfb);
2103     - wmb();
2104     - }
2105    
2106     - for (j = 0; j < n32; ++j) {
2107     - sfb -= 32;
2108     - dfb -= 32;
2109     + for (j = 0; j < n32; j++) {
2110     + if (j < 2 && j + 1 < n32 && !backward &&
2111     + !(((unsigned long)sfb | (unsigned long)dfb) & 63)) {
2112     + do {
2113     + __raw_writel(sfb - tga_fb, tga_regs+TGA_COPY64_SRC);
2114     + wmb();
2115     + __raw_writel(dfb - tga_fb, tga_regs+TGA_COPY64_DST);
2116     + wmb();
2117     + sfb += 64;
2118     + dfb += 64;
2119     + j += 2;
2120     + } while (j + 1 < n32);
2121     + j--;
2122     + continue;
2123     + }
2124     __raw_writel(0xffffffff, sfb);
2125     wmb();
2126     __raw_writel(0xffffffff, dfb);
2127     wmb();
2128     + sfb += step;
2129     + dfb += step;
2130     }
2131    
2132     if (mask_last) {
2133     - sfb -= 32;
2134     - dfb -= 32;
2135     + sfb += last_step - step;
2136     + dfb += last_step - step;
2137     __raw_writel(mask_last, sfb);
2138     wmb();
2139     __raw_writel(mask_last, dfb);
2140     @@ -1453,14 +1296,9 @@ tgafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
2141     else if (bpp == 32)
2142     cfb_copyarea(info, area);
2143    
2144     - /* Detect overlapping source and destination that requires
2145     - a backward copy. */
2146     - else if (dy == sy && dx > sx && dx < sx + width)
2147     - copyarea_backward_8bpp(info, dx, dy, sx, sy, height,
2148     - width, line_length, area);
2149     else
2150     - copyarea_foreward_8bpp(info, dx, dy, sx, sy, height,
2151     - width, line_length);
2152     + copyarea_8bpp(info, dx, dy, sx, sy, height,
2153     + width, line_length, area);
2154     }
2155    
2156    
2157     diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
2158     index 71af7b5abe01..7d7add5ceba4 100644
2159     --- a/drivers/virtio/virtio_balloon.c
2160     +++ b/drivers/virtio/virtio_balloon.c
2161     @@ -311,6 +311,12 @@ static int balloon(void *_vballoon)
2162     else if (diff < 0)
2163     leak_balloon(vb, -diff);
2164     update_balloon_size(vb);
2165     +
2166     + /*
2167     + * For large balloon changes, we could spend a lot of time
2168     + * and always have work to do. Be nice if preempt disabled.
2169     + */
2170     + cond_resched();
2171     }
2172     return 0;
2173     }
2174     diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
2175     index a2aa97d45670..d56a9904e52a 100644
2176     --- a/fs/lockd/svc.c
2177     +++ b/fs/lockd/svc.c
2178     @@ -235,6 +235,7 @@ out_err:
2179     if (warned++ == 0)
2180     printk(KERN_WARNING
2181     "lockd_up: makesock failed, error=%d\n", err);
2182     + svc_shutdown_net(serv, net);
2183     return err;
2184     }
2185    
2186     diff --git a/fs/locks.c b/fs/locks.c
2187     index cb424a4fed71..0274c953b07d 100644
2188     --- a/fs/locks.c
2189     +++ b/fs/locks.c
2190     @@ -1243,11 +1243,10 @@ int __break_lease(struct inode *inode, unsigned int mode)
2191    
2192     restart:
2193     break_time = flock->fl_break_time;
2194     - if (break_time != 0) {
2195     + if (break_time != 0)
2196     break_time -= jiffies;
2197     - if (break_time == 0)
2198     - break_time++;
2199     - }
2200     + if (break_time == 0)
2201     + break_time++;
2202     locks_insert_block(flock, new_fl);
2203     unlock_flocks();
2204     error = wait_event_interruptible_timeout(new_fl->fl_wait,
2205     diff --git a/include/linux/libata.h b/include/linux/libata.h
2206     index f33619d8ac52..eec130af2dfa 100644
2207     --- a/include/linux/libata.h
2208     +++ b/include/linux/libata.h
2209     @@ -772,6 +772,7 @@ struct ata_port {
2210     unsigned long qc_allocated;
2211     unsigned int qc_active;
2212     int nr_active_links; /* #links with active qcs */
2213     + unsigned int last_tag; /* track next tag hw expects */
2214    
2215     struct ata_link link; /* host default link */
2216     struct ata_link *slave_link; /* see ata_slave_link_init() */
2217     diff --git a/net/mac80211/main.c b/net/mac80211/main.c
2218     index 8a7bfc47d577..6658c5809353 100644
2219     --- a/net/mac80211/main.c
2220     +++ b/net/mac80211/main.c
2221     @@ -157,6 +157,8 @@ static u32 ieee80211_hw_conf_chan(struct ieee80211_local *local)
2222     list_for_each_entry_rcu(sdata, &local->interfaces, list) {
2223     if (!rcu_access_pointer(sdata->vif.chanctx_conf))
2224     continue;
2225     + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
2226     + continue;
2227     power = min(power, sdata->vif.bss_conf.txpower);
2228     }
2229     rcu_read_unlock();
2230     diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
2231     index acd1f71adc03..11d3f227e11e 100644
2232     --- a/net/mac80211/offchannel.c
2233     +++ b/net/mac80211/offchannel.c
2234     @@ -355,6 +355,7 @@ void ieee80211_sw_roc_work(struct work_struct *work)
2235     struct ieee80211_roc_work *dep;
2236    
2237     /* start this ROC */
2238     + ieee80211_offchannel_stop_vifs(local);
2239    
2240     /* switch channel etc */
2241     ieee80211_recalc_idle(local);
2242     diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
2243     index 6d5791d735f3..d566cdba24ec 100644
2244     --- a/net/mac80211/tx.c
2245     +++ b/net/mac80211/tx.c
2246     @@ -2711,7 +2711,7 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw,
2247     cpu_to_le16(IEEE80211_FCTL_MOREDATA);
2248     }
2249    
2250     - if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
2251     + if (sdata->vif.type == NL80211_IFTYPE_AP)
2252     sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
2253     if (!ieee80211_tx_prepare(sdata, &tx, skb))
2254     break;
2255     diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
2256     index 2d682977ce82..39dc5bc742e0 100644
2257     --- a/virt/kvm/ioapic.c
2258     +++ b/virt/kvm/ioapic.c
2259     @@ -306,7 +306,7 @@ static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq, bool line_status)
2260     BUG_ON(ioapic->rtc_status.pending_eoi != 0);
2261     ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe,
2262     ioapic->rtc_status.dest_map);
2263     - ioapic->rtc_status.pending_eoi = ret;
2264     + ioapic->rtc_status.pending_eoi = (ret < 0 ? 0 : ret);
2265     } else
2266     ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, NULL);
2267