diff --git a/debian/changelog b/debian/changelog index 21a884e7a..2088371a2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,51 @@ -linux (3.2.39-3) UNRELEASED; urgency=low +linux (3.2.40-1) UNRELEASED; urgency=low + + * New upstream stable update: + http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.40 + - ext4: return ENOMEM if sb_getblk() fails + - ext4: fix possible use-after-free with AIO + - s390/kvm: Fix store status for ACRS/FPRS + - staging: comedi: disallow COMEDI_DEVCONFIG on non-board minors + - ext4: fix race in ext4_mb_add_n_trim() + - UBIFS: fix double free of ubifs_orphan objects + - hrtimer: Prevent hrtimer_enqueue_reprogram race + - nfsd: Fix memleak + - x86: Do not leak kernel page mapping locations + - USB: usb-storage: unusual_devs update for Super TOP SATA bridge + - posix-cpu-timers: Fix nanosleep task_struct leak + - NFSv4.1: Don't decode skipped layoutgets + - cgroup: fix exit() vs rmdir() race + - cpuset: fix cpuset_print_task_mems_allowed() vs rename() race + - ext4: fix xattr block allocation/release with bigalloc + - mm: fix pageblock bitmap allocation + - target: Add missing mapped_lun bounds checking during make_mappedlun + setup + - b43: Increase number of RX DMA slots + - posix-timer: Don't call idr_find() with out-of-range ID + - fs: Fix possible use-after-free with AIO + - powerpc/kexec: Disable hard IRQ before kexec + - mmu_notifier_unregister NULL Pointer deref and multiple ->release() + callouts + - tmpfs: fix use-after-free of mempolicy object (CVE-2013-1767) + - ocfs2: fix possible use-after-free with AIO + - ocfs2: fix ocfs2_init_security_and_acl() to initialize acl correctly + - ocfs2: ac->ac_allow_chain_relink=0 won't disable group relink + - idr: fix a subtle bug in idr_get_next() + - idr: make idr_get_next() good for rcu_read_lock() + - idr: fix top layer handling + - sysctl: fix null checking in bin_dn_node_address() + - nbd: fsync and kill block device on shutdown + - s390/timer: avoid overflow when programming clock comparator + (regression in 3.2.38) + - xen-pciback: rate limit error messages from xen_pcibk_enable_msi{,x}() + (CVE-2013-0231) + - xen-netback: correctly return errors from netbk_count_requests() + - xen-netback: cancel the credit timer when taking the vif down + - ipv6: use a stronger hash for tcp + - staging: comedi: ni_labpc: correct differential channel sequence for + AI commands + - staging: comedi: ni_labpc: set up command4 register *after* command3 + - vhost: fix length for cross region descriptor (CVE-2013-0311) [ Aurelien Jarno] * [mips,mipsel] Disable VGA_CONSOLE and ignore the corresponding ABI @@ -11,7 +58,6 @@ linux (3.2.39-3) UNRELEASED; urgency=low [ Ben Hutchings ] * [x86] ata_piix: reenable MS Virtual PC guests (fixes regression in 3.2.19-1) - * vhost: fix length for cross region descriptor (CVE-2013-0311) * test-patches: Clean up all previous test patches, whether or not they were applied * test-patches: Add --fuzz option to allow testing patches that have fuzz diff --git a/debian/config/defines b/debian/config/defines index f6d7ea1c4..528016f7f 100644 --- a/debian/config/defines +++ b/debian/config/defines @@ -39,6 +39,8 @@ ignore-changes: vring_* # No-one should depend on staging from OOT module:drivers/staging/* +# Private to this family of drivers + module:drivers/net/wireless/rtlwifi/* [base] arches: diff --git a/debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch b/debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch deleted file mode 100644 index 8acbfc7be..000000000 --- a/debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Josh Boyer -Date: Thu, 14 Feb 2013 09:39:09 -0500 -Subject: USB: usb-storage: unusual_devs update for Super TOP SATA bridge - -commit 18e03310b5caa6d11c1a8c61b982c37047693fba upstream. - -The current entry in unusual_cypress.h for the Super TOP SATA bridge devices -seems to be causing corruption on newer revisions of this device. This has -been reported in Arch Linux and Fedora. The original patch was tested on -devices with bcdDevice of 1.60, whereas the newer devices report bcdDevice -as 2.20. Limit the UNUSUAL_DEV entry to devices less than 2.20. - -This fixes https://bugzilla.redhat.com/show_bug.cgi?id=909591 - -The Arch Forum post on this is here: - https://bbs.archlinux.org/viewtopic.php?id=152011 - -Reported-by: Carsten S. -Tested-by: Carsten S. -Signed-off-by: Josh Boyer -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/storage/unusual_cypress.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/usb/storage/unusual_cypress.h b/drivers/usb/storage/unusual_cypress.h -index 2c85530..65a6a75 100644 ---- a/drivers/usb/storage/unusual_cypress.h -+++ b/drivers/usb/storage/unusual_cypress.h -@@ -31,7 +31,7 @@ UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999, - "Cypress ISD-300LP", - USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0), - --UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x9999, -+UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x0219, - "Super Top", - "USB 2.0 SATA BRIDGE", - USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0), diff --git a/debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch b/debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch deleted file mode 100644 index 856b4c323..000000000 --- a/debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch +++ /dev/null @@ -1,133 +0,0 @@ -From: Kees Cook -Date: Thu, 6 Dec 2012 17:00:21 +1100 -Subject: [2/2] exec: use -ELOOP for max recursion depth - -commit d740269867021faf4ce38a449353d2b986c34a67 upstream. - -To avoid an explosion of request_module calls on a chain of abusive -scripts, fail maximum recursion with -ELOOP instead of -ENOEXEC. As soon -as maximum recursion depth is hit, the error will fail all the way back -up the chain, aborting immediately. - -This also has the side-effect of stopping the user's shell from attempting -to reexecute the top-level file as a shell script. As seen in the -dash source: - - if (cmd != path_bshell && errno == ENOEXEC) { - *argv-- = cmd; - *argv = cmd = path_bshell; - goto repeat; - } - -The above logic was designed for running scripts automatically that lacked -the "#!" header, not to re-try failed recursion. On a legitimate -ENOEXEC, -things continue to behave as the shell expects. - -Additionally, when tracking recursion, the binfmt handlers should not be -involved. The recursion being tracked is the depth of calls through -search_binary_handler(), so that function should be exclusively responsible -for tracking the depth. - -Signed-off-by: Kees Cook -Cc: halfdog -Cc: P J P -Cc: Alexander Viro -Signed-off-by: Andrew Morton -[bwh: Backported to 3.2: adjust context] ---- - fs/binfmt_em86.c | 1 - - fs/binfmt_misc.c | 6 ------ - fs/binfmt_script.c | 4 +--- - fs/exec.c | 10 +++++----- - include/linux/binfmts.h | 2 -- - 5 files changed, 6 insertions(+), 17 deletions(-) - ---- a/fs/binfmt_em86.c -+++ b/fs/binfmt_em86.c -@@ -42,7 +42,6 @@ static int load_em86(struct linux_binprm - return -ENOEXEC; - } - -- bprm->recursion_depth++; /* Well, the bang-shell is implicit... */ - allow_write_access(bprm->file); - fput(bprm->file); - bprm->file = NULL; ---- a/fs/binfmt_misc.c -+++ b/fs/binfmt_misc.c -@@ -116,10 +116,6 @@ static int load_misc_binary(struct linux - if (!enabled) - goto _ret; - -- retval = -ENOEXEC; -- if (bprm->recursion_depth > BINPRM_MAX_RECURSION) -- goto _ret; -- - /* to keep locking time low, we copy the interpreter string */ - read_lock(&entries_lock); - fmt = check_file(bprm); -@@ -199,8 +195,6 @@ static int load_misc_binary(struct linux - if (retval < 0) - goto _error; - -- bprm->recursion_depth++; -- - retval = search_binary_handler (bprm, regs); - if (retval < 0) - goto _error; ---- a/fs/binfmt_script.c -+++ b/fs/binfmt_script.c -@@ -22,15 +22,13 @@ static int load_script(struct linux_binp - char interp[BINPRM_BUF_SIZE]; - int retval; - -- if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || -- (bprm->recursion_depth > BINPRM_MAX_RECURSION)) -+ if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!')) - return -ENOEXEC; - /* - * This section does the #! interpretation. - * Sorta complicated, but hopefully it will work. -TYT - */ - -- bprm->recursion_depth++; - allow_write_access(bprm->file); - fput(bprm->file); - bprm->file = NULL; ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -1384,6 +1384,10 @@ int search_binary_handler(struct linux_b - struct linux_binfmt *fmt; - pid_t old_pid; - -+ /* This allows 4 levels of binfmt rewrites before failing hard. */ -+ if (depth > 5) -+ return -ELOOP; -+ - retval = security_bprm_check(bprm); - if (retval) - return retval; -@@ -1407,12 +1411,8 @@ int search_binary_handler(struct linux_b - if (!try_module_get(fmt->module)) - continue; - read_unlock(&binfmt_lock); -+ bprm->recursion_depth = depth + 1; - retval = fn(bprm, regs); -- /* -- * Restore the depth counter to its starting value -- * in this call, so we don't have to rely on every -- * load_binary function to restore it on return. -- */ - bprm->recursion_depth = depth; - if (retval >= 0) { - if (depth == 0) ---- a/include/linux/binfmts.h -+++ b/include/linux/binfmts.h -@@ -67,8 +67,6 @@ struct linux_binprm { - #define BINPRM_FLAGS_EXECFD_BIT 1 - #define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT) - --#define BINPRM_MAX_RECURSION 4 -- - /* Function parameter for binfmt->coredump */ - struct coredump_params { - long signr; diff --git a/debian/patches/bugfix/all/ext4-fix-hole-punch-failure-when-depth-is-greater-th.patch b/debian/patches/bugfix/all/ext4-fix-hole-punch-failure-when-depth-is-greater-th.patch deleted file mode 100644 index 2004badd0..000000000 --- a/debian/patches/bugfix/all/ext4-fix-hole-punch-failure-when-depth-is-greater-th.patch +++ /dev/null @@ -1,120 +0,0 @@ -From: Ashish Sangwan -Date: Sun, 22 Jul 2012 22:49:08 -0400 -Subject: [PATCH 2/3] ext4: fix hole punch failure when depth is greater than 0 - -commit 968dee77220768a5f52cf8b21d0bdb73486febef upstream. - -Whether to continue removing extents or not is decided by the return -value of function ext4_ext_more_to_rm() which checks 2 conditions: -a) if there are no more indexes to process. -b) if the number of entries are decreased in the header of "depth -1". - -In case of hole punch, if the last block to be removed is not part of -the last extent index than this index will not be deleted, hence the -number of valid entries in the extent header of "depth - 1" will -remain as it is and ext4_ext_more_to_rm will return 0 although the -required blocks are not yet removed. - -This patch fixes the above mentioned problem as instead of removing -the extents from the end of file, it starts removing the blocks from -the particular extent from which removing blocks is actually required -and continue backward until done. - -Signed-off-by: Ashish Sangwan -Signed-off-by: Namjae Jeon -Reviewed-by: Lukas Czerner -Signed-off-by: Greg Kroah-Hartman ---- - fs/ext4/extents.c | 46 +++++++++++++++++++++++++++++----------------- - 1 file changed, 29 insertions(+), 17 deletions(-) - ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -2518,10 +2518,10 @@ static int ext4_ext_remove_space(struct - { - struct super_block *sb = inode->i_sb; - int depth = ext_depth(inode); -- struct ext4_ext_path *path; -+ struct ext4_ext_path *path = NULL; - ext4_fsblk_t partial_cluster = 0; - handle_t *handle; -- int i, err; -+ int i = 0, err; - - ext_debug("truncate since %u to %u\n", start, end); - -@@ -2554,8 +2554,12 @@ again: - } - depth = ext_depth(inode); - ex = path[depth].p_ext; -- if (!ex) -+ if (!ex) { -+ ext4_ext_drop_refs(path); -+ kfree(path); -+ path = NULL; - goto cont; -+ } - - ee_block = le32_to_cpu(ex->ee_block); - -@@ -2585,8 +2589,6 @@ again: - if (err < 0) - goto out; - } -- ext4_ext_drop_refs(path); -- kfree(path); - } - cont: - -@@ -2595,19 +2597,27 @@ cont: - * after i_size and walking into the tree depth-wise. - */ - depth = ext_depth(inode); -- path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_NOFS); -- if (path == NULL) { -- ext4_journal_stop(handle); -- return -ENOMEM; -- } -- path[0].p_depth = depth; -- path[0].p_hdr = ext_inode_hdr(inode); -- -- if (ext4_ext_check(inode, path[0].p_hdr, depth)) { -- err = -EIO; -- goto out; -+ if (path) { -+ int k = i = depth; -+ while (--k > 0) -+ path[k].p_block = -+ le16_to_cpu(path[k].p_hdr->eh_entries)+1; -+ } else { -+ path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), -+ GFP_NOFS); -+ if (path == NULL) { -+ ext4_journal_stop(handle); -+ return -ENOMEM; -+ } -+ path[0].p_depth = depth; -+ path[0].p_hdr = ext_inode_hdr(inode); -+ -+ if (ext4_ext_check(inode, path[0].p_hdr, depth)) { -+ err = -EIO; -+ goto out; -+ } - } -- i = err = 0; -+ err = 0; - - while (i >= 0 && err == 0) { - if (i == depth) { -@@ -2721,8 +2731,10 @@ cont: - out: - ext4_ext_drop_refs(path); - kfree(path); -- if (err == -EAGAIN) -+ if (err == -EAGAIN) { -+ path = NULL; - goto again; -+ } - ext4_journal_stop(handle); - - return err; diff --git a/debian/patches/bugfix/all/ext4-fix-kernel-BUG-on-large-scale-rm-rf-commands.patch b/debian/patches/bugfix/all/ext4-fix-kernel-BUG-on-large-scale-rm-rf-commands.patch deleted file mode 100644 index a841544eb..000000000 --- a/debian/patches/bugfix/all/ext4-fix-kernel-BUG-on-large-scale-rm-rf-commands.patch +++ /dev/null @@ -1,63 +0,0 @@ -From: Theodore Ts'o -Date: Fri, 17 Aug 2012 08:54:52 -0400 -Subject: [PATCH 3/3] ext4: fix kernel BUG on large-scale rm -rf commands -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -commit 89a4e48f8479f8145eca9698f39fe188c982212f upstream. - -Commit 968dee7722: "ext4: fix hole punch failure when depth is greater -than 0" introduced a regression in v3.5.1/v3.6-rc1 which caused kernel -crashes when users ran run "rm -rf" on large directory hierarchy on -ext4 filesystems on RAID devices: - - BUG: unable to handle kernel NULL pointer dereference at 0000000000000028 - - Process rm (pid: 18229, threadinfo ffff8801276bc000, task ffff880123631710) - Call Trace: - [] ? __ext4_handle_dirty_metadata+0x83/0x110 - [] ext4_ext_truncate+0x193/0x1d0 - [] ? ext4_mark_inode_dirty+0x7f/0x1f0 - [] ext4_truncate+0xf5/0x100 - [] ext4_evict_inode+0x461/0x490 - [] evict+0xa2/0x1a0 - [] iput+0x103/0x1f0 - [] do_unlinkat+0x154/0x1c0 - [] ? sys_newfstatat+0x2a/0x40 - [] sys_unlinkat+0x1b/0x50 - [] system_call_fastpath+0x16/0x1b - Code: 8b 4d 20 0f b7 41 02 48 8d 04 40 48 8d 04 81 49 89 45 18 0f b7 49 02 48 83 c1 01 49 89 4d 00 e9 ae f8 ff ff 0f 1f 00 49 8b 45 28 <48> 8b 40 28 49 89 45 20 e9 85 f8 ff ff 0f 1f 80 00 00 00 - - RIP [] ext4_ext_remove_space+0xa34/0xdf0 - -This could be reproduced as follows: - -The problem in commit 968dee7722 was that caused the variable 'i' to -be left uninitialized if the truncate required more space than was -available in the journal. This resulted in the function -ext4_ext_truncate_extend_restart() returning -EAGAIN, which caused -ext4_ext_remove_space() to restart the truncate operation after -starting a new jbd2 handle. - -Reported-by: Maciej Żenczykowski -Reported-by: Marti Raudsepp -Tested-by: Fengguang Wu -Signed-off-by: "Theodore Ts'o" -Cc: stable@vger.kernel.org ---- - fs/ext4/extents.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c -index 2b8b3c9..9169e11 100644 ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -2594,6 +2594,7 @@ cont: - } - path[0].p_depth = depth; - path[0].p_hdr = ext_inode_hdr(inode); -+ i = 0; - - if (ext4_ext_check(inode, path[0].p_hdr, depth)) { - err = -EIO; diff --git a/debian/patches/bugfix/all/ext4-rewrite-punch-hole-to-use-ext4_ext_remove_space.patch b/debian/patches/bugfix/all/ext4-rewrite-punch-hole-to-use-ext4_ext_remove_space.patch deleted file mode 100644 index 7c47655f4..000000000 --- a/debian/patches/bugfix/all/ext4-rewrite-punch-hole-to-use-ext4_ext_remove_space.patch +++ /dev/null @@ -1,349 +0,0 @@ -From: Lukas Czerner -Date: Mon, 19 Mar 2012 23:03:19 -0400 -Subject: [PATCH 1/3] ext4: rewrite punch hole to use ext4_ext_remove_space() - -commit 5f95d21fb6f2aaa52830e5b7fb405f6c71d3ab85 upstream. - -This commit rewrites ext4 punch hole implementation to use -ext4_ext_remove_space() instead of its home gown way of doing this via -ext4_ext_map_blocks(). There are several reasons for changing this. - -Firstly it is quite non obvious that punching hole needs to -ext4_ext_map_blocks() to punch a hole, especially given that this -function should map blocks, not unmap it. It also required a lot of new -code in ext4_ext_map_blocks(). - -Secondly the design of it is not very effective. The reason is that we -are trying to punch out blocks in ext4_ext_punch_hole() in opposite -direction than in ext4_ext_rm_leaf() which causes the ext4_ext_rm_leaf() -to iterate through the whole tree from the end to the start to find the -requested extent for every extent we are going to punch out. - -And finally the current implementation does not use the existing code, -but bring a lot of new code, which is IMO unnecessary since there -already is some infrastructure we can use. Specifically -ext4_ext_remove_space(). - -This commit changes ext4_ext_remove_space() to accept 'end' parameter so -we can not only truncate to the end of file, but also remove the space -in the middle of the file (punch a hole). Moreover, because the last -block to punch out, might be in the middle of the extent, we have to -split the extent at 'end + 1' so ext4_ext_rm_leaf() can easily either -remove the whole fist part of split extent, or change its size. - -ext4_ext_remove_space() is then used to actually remove the space -(extents) from within the hole, instead of ext4_ext_map_blocks(). - -Note that this also fix the issue with punch hole, where we would forget -to remove empty index blocks from the extent tree, resulting in double -free block error and file system corruption. This is simply because we -now use different code path, where this problem does not exist. - -This has been tested with fsx running for several days and xfstests, -plus xfstest #251 with '-o discard' run on the loop image (which -converts discard requestes into punch hole to the backing file). All of -it on 1K and 4K file system block size. - -Signed-off-by: Lukas Czerner -Signed-off-by: "Theodore Ts'o" -[bwh: Backported to 3.2.y: move EXT4_EXT_DATA_VALID{1,2} along with the - other extent splitting flags] ---- - fs/ext4/extents.c | 170 ++++++++++++++++++++++++++++-------------------------- - 1 file changed, 88 insertions(+), 82 deletions(-) - ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -45,6 +45,17 @@ - - #include - -+/* -+ * used by extent splitting. -+ */ -+#define EXT4_EXT_MAY_ZEROOUT 0x1 /* safe to zeroout if split fails \ -+ due to ENOSPC */ -+#define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */ -+#define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */ -+ -+#define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */ -+#define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */ -+ - static int ext4_split_extent(handle_t *handle, - struct inode *inode, - struct ext4_ext_path *path, -@@ -52,6 +63,13 @@ static int ext4_split_extent(handle_t *h - int split_flag, - int flags); - -+static int ext4_split_extent_at(handle_t *handle, -+ struct inode *inode, -+ struct ext4_ext_path *path, -+ ext4_lblk_t split, -+ int split_flag, -+ int flags); -+ - static int ext4_ext_truncate_extend_restart(handle_t *handle, - struct inode *inode, - int needed) -@@ -2321,7 +2339,7 @@ ext4_ext_rm_leaf(handle_t *handle, struc - struct ext4_extent *ex; - - /* the header must be checked already in ext4_ext_remove_space() */ -- ext_debug("truncate since %u in leaf\n", start); -+ ext_debug("truncate since %u in leaf to %u\n", start, end); - if (!path[depth].p_hdr) - path[depth].p_hdr = ext_block_hdr(path[depth].p_bh); - eh = path[depth].p_hdr; -@@ -2356,7 +2374,7 @@ ext4_ext_rm_leaf(handle_t *handle, struc - ext_debug(" border %u:%u\n", a, b); - - /* If this extent is beyond the end of the hole, skip it */ -- if (end <= ex_ee_block) { -+ if (end < ex_ee_block) { - ex--; - ex_ee_block = le32_to_cpu(ex->ee_block); - ex_ee_len = ext4_ext_get_actual_len(ex); -@@ -2495,7 +2513,8 @@ ext4_ext_more_to_rm(struct ext4_ext_path - return 1; - } - --static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start) -+static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, -+ ext4_lblk_t end) - { - struct super_block *sb = inode->i_sb; - int depth = ext_depth(inode); -@@ -2504,7 +2523,7 @@ static int ext4_ext_remove_space(struct - handle_t *handle; - int i, err; - -- ext_debug("truncate since %u\n", start); -+ ext_debug("truncate since %u to %u\n", start, end); - - /* probably first extent we're gonna free will be last in block */ - handle = ext4_journal_start(inode, depth + 1); -@@ -2517,6 +2536,61 @@ again: - trace_ext4_ext_remove_space(inode, start, depth); - - /* -+ * Check if we are removing extents inside the extent tree. If that -+ * is the case, we are going to punch a hole inside the extent tree -+ * so we have to check whether we need to split the extent covering -+ * the last block to remove so we can easily remove the part of it -+ * in ext4_ext_rm_leaf(). -+ */ -+ if (end < EXT_MAX_BLOCKS - 1) { -+ struct ext4_extent *ex; -+ ext4_lblk_t ee_block; -+ -+ /* find extent for this block */ -+ path = ext4_ext_find_extent(inode, end, NULL); -+ if (IS_ERR(path)) { -+ ext4_journal_stop(handle); -+ return PTR_ERR(path); -+ } -+ depth = ext_depth(inode); -+ ex = path[depth].p_ext; -+ if (!ex) -+ goto cont; -+ -+ ee_block = le32_to_cpu(ex->ee_block); -+ -+ /* -+ * See if the last block is inside the extent, if so split -+ * the extent at 'end' block so we can easily remove the -+ * tail of the first part of the split extent in -+ * ext4_ext_rm_leaf(). -+ */ -+ if (end >= ee_block && -+ end < ee_block + ext4_ext_get_actual_len(ex) - 1) { -+ int split_flag = 0; -+ -+ if (ext4_ext_is_uninitialized(ex)) -+ split_flag = EXT4_EXT_MARK_UNINIT1 | -+ EXT4_EXT_MARK_UNINIT2; -+ -+ /* -+ * Split the extent in two so that 'end' is the last -+ * block in the first new extent -+ */ -+ err = ext4_split_extent_at(handle, inode, path, -+ end + 1, split_flag, -+ EXT4_GET_BLOCKS_PRE_IO | -+ EXT4_GET_BLOCKS_PUNCH_OUT_EXT); -+ -+ if (err < 0) -+ goto out; -+ } -+ ext4_ext_drop_refs(path); -+ kfree(path); -+ } -+cont: -+ -+ /* - * We start scanning from right side, freeing all the blocks - * after i_size and walking into the tree depth-wise. - */ -@@ -2528,6 +2602,7 @@ again: - } - path[0].p_depth = depth; - path[0].p_hdr = ext_inode_hdr(inode); -+ - if (ext4_ext_check(inode, path[0].p_hdr, depth)) { - err = -EIO; - goto out; -@@ -2539,7 +2614,7 @@ again: - /* this is leaf block */ - err = ext4_ext_rm_leaf(handle, inode, path, - &partial_cluster, start, -- EXT_MAX_BLOCKS - 1); -+ end); - /* root level has p_bh == NULL, brelse() eats this */ - brelse(path[i].p_bh); - path[i].p_bh = NULL; -@@ -2722,17 +2797,6 @@ static int ext4_ext_zeroout(struct inode - } - - /* -- * used by extent splitting. -- */ --#define EXT4_EXT_MAY_ZEROOUT 0x1 /* safe to zeroout if split fails \ -- due to ENOSPC */ --#define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */ --#define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */ -- --#define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */ --#define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */ -- --/* - * ext4_split_extent_at() splits an extent at given block. - * - * @handle: the journal handle -@@ -4274,7 +4338,7 @@ void ext4_ext_truncate(struct inode *ino - - last_block = (inode->i_size + sb->s_blocksize - 1) - >> EXT4_BLOCK_SIZE_BITS(sb); -- err = ext4_ext_remove_space(inode, last_block); -+ err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1); - - /* In a multi-transaction truncate, we only make the final - * transaction synchronous. -@@ -4751,14 +4815,12 @@ int ext4_ext_punch_hole(struct file *fil - { - struct inode *inode = file->f_path.dentry->d_inode; - struct super_block *sb = inode->i_sb; -- struct ext4_ext_cache cache_ex; -- ext4_lblk_t first_block, last_block, num_blocks, iblock, max_blocks; -+ ext4_lblk_t first_block, stop_block; - struct address_space *mapping = inode->i_mapping; -- struct ext4_map_blocks map; - handle_t *handle; - loff_t first_page, last_page, page_len; - loff_t first_page_offset, last_page_offset; -- int ret, credits, blocks_released, err = 0; -+ int credits, err = 0; - - /* No need to punch hole beyond i_size */ - if (offset >= inode->i_size) -@@ -4774,10 +4836,6 @@ int ext4_ext_punch_hole(struct file *fil - offset; - } - -- first_block = (offset + sb->s_blocksize - 1) >> -- EXT4_BLOCK_SIZE_BITS(sb); -- last_block = (offset + length) >> EXT4_BLOCK_SIZE_BITS(sb); -- - first_page = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - last_page = (offset + length) >> PAGE_CACHE_SHIFT; - -@@ -4856,7 +4914,6 @@ int ext4_ext_punch_hole(struct file *fil - } - } - -- - /* - * If i_size is contained in the last page, we need to - * unmap and zero the partial page after i_size -@@ -4876,73 +4933,22 @@ int ext4_ext_punch_hole(struct file *fil - } - } - -+ first_block = (offset + sb->s_blocksize - 1) >> -+ EXT4_BLOCK_SIZE_BITS(sb); -+ stop_block = (offset + length) >> EXT4_BLOCK_SIZE_BITS(sb); -+ - /* If there are no blocks to remove, return now */ -- if (first_block >= last_block) -+ if (first_block >= stop_block) - goto out; - - down_write(&EXT4_I(inode)->i_data_sem); - ext4_ext_invalidate_cache(inode); - ext4_discard_preallocations(inode); - -- /* -- * Loop over all the blocks and identify blocks -- * that need to be punched out -- */ -- iblock = first_block; -- blocks_released = 0; -- while (iblock < last_block) { -- max_blocks = last_block - iblock; -- num_blocks = 1; -- memset(&map, 0, sizeof(map)); -- map.m_lblk = iblock; -- map.m_len = max_blocks; -- ret = ext4_ext_map_blocks(handle, inode, &map, -- EXT4_GET_BLOCKS_PUNCH_OUT_EXT); -- -- if (ret > 0) { -- blocks_released += ret; -- num_blocks = ret; -- } else if (ret == 0) { -- /* -- * If map blocks could not find the block, -- * then it is in a hole. If the hole was -- * not already cached, then map blocks should -- * put it in the cache. So we can get the hole -- * out of the cache -- */ -- memset(&cache_ex, 0, sizeof(cache_ex)); -- if ((ext4_ext_check_cache(inode, iblock, &cache_ex)) && -- !cache_ex.ec_start) { -- -- /* The hole is cached */ -- num_blocks = cache_ex.ec_block + -- cache_ex.ec_len - iblock; -- -- } else { -- /* The block could not be identified */ -- err = -EIO; -- break; -- } -- } else { -- /* Map blocks error */ -- err = ret; -- break; -- } -+ err = ext4_ext_remove_space(inode, first_block, stop_block - 1); - -- if (num_blocks == 0) { -- /* This condition should never happen */ -- ext_debug("Block lookup failed"); -- err = -EIO; -- break; -- } -- -- iblock += num_blocks; -- } -- -- if (blocks_released > 0) { -- ext4_ext_invalidate_cache(inode); -- ext4_discard_preallocations(inode); -- } -+ ext4_ext_invalidate_cache(inode); -+ ext4_discard_preallocations(inode); - - if (IS_SYNC(inode)) - ext4_handle_sync(handle); diff --git a/debian/patches/bugfix/all/fs-cachefiles-add-support-for-large-files-in-filesys.patch b/debian/patches/bugfix/all/fs-cachefiles-add-support-for-large-files-in-filesys.patch deleted file mode 100644 index e3535d00a..000000000 --- a/debian/patches/bugfix/all/fs-cachefiles-add-support-for-large-files-in-filesys.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: Justin Lecher -Date: Mon, 30 Jul 2012 14:42:53 -0700 -Subject: fs: cachefiles: add support for large files in filesystem caching - -commit 98c350cda2c14a343d34ea01a3d9c24fea5ec66d upstream. - -Support the caching of large files. - -Addresses https://bugzilla.kernel.org/show_bug.cgi?id=31182 - -Signed-off-by: Justin Lecher -Signed-off-by: Suresh Jayaraman -Tested-by: Suresh Jayaraman -Acked-by: David Howells -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds -[bwh: Backported to 3.2: - - Adjust context - - dentry_open() takes dentry and vfsmount pointers, not a path pointer] ---- ---- a/fs/cachefiles/rdwr.c -+++ b/fs/cachefiles/rdwr.c -@@ -918,7 +918,7 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page) - * own time */ - dget(object->backer); - mntget(cache->mnt); -- file = dentry_open(object->backer, cache->mnt, O_RDWR, -+ file = dentry_open(object->backer, cache->mnt, O_RDWR | O_LARGEFILE, - cache->cache_cred); - if (IS_ERR(file)) { - ret = PTR_ERR(file); diff --git a/debian/patches/bugfix/all/kmod-introduce-call_modprobe-helper.patch b/debian/patches/bugfix/all/kmod-introduce-call_modprobe-helper.patch deleted file mode 100644 index 5d16d8755..000000000 --- a/debian/patches/bugfix/all/kmod-introduce-call_modprobe-helper.patch +++ /dev/null @@ -1,69 +0,0 @@ -From: Oleg Nesterov -Date: Fri, 23 Mar 2012 15:02:49 -0700 -Subject: [4/5] kmod: introduce call_modprobe() helper - -commit 3e63a93b987685f02421e18b2aa452d20553a88b upstream. - -No functional changes. Move the call_usermodehelper code from -__request_module() into the new simple helper, call_modprobe(). - -Signed-off-by: Oleg Nesterov -Cc: Tetsuo Handa -Cc: Rusty Russell -Cc: Tejun Heo -Cc: David Rientjes -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds ---- - kernel/kmod.c | 24 ++++++++++++++++-------- - 1 file changed, 16 insertions(+), 8 deletions(-) - -diff --git a/kernel/kmod.c b/kernel/kmod.c -index 685b246..56a29e8 100644 ---- a/kernel/kmod.c -+++ b/kernel/kmod.c -@@ -60,6 +60,21 @@ static DECLARE_RWSEM(umhelper_sem); - */ - char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe"; - -+static int call_modprobe(char *module_name, int wait) -+{ -+ static char *envp[] = { -+ "HOME=/", -+ "TERM=linux", -+ "PATH=/sbin:/usr/sbin:/bin:/usr/bin", -+ NULL -+ }; -+ -+ char *argv[] = { modprobe_path, "-q", "--", module_name, NULL }; -+ -+ return call_usermodehelper_fns(modprobe_path, argv, envp, -+ wait, NULL, NULL, NULL); -+} -+ - /** - * __request_module - try to load a kernel module - * @wait: wait (or not) for the operation to complete -@@ -81,11 +96,6 @@ int __request_module(bool wait, const char *fmt, ...) - char module_name[MODULE_NAME_LEN]; - unsigned int max_modprobes; - int ret; -- char *argv[] = { modprobe_path, "-q", "--", module_name, NULL }; -- static char *envp[] = { "HOME=/", -- "TERM=linux", -- "PATH=/sbin:/usr/sbin:/bin:/usr/bin", -- NULL }; - static atomic_t kmod_concurrent = ATOMIC_INIT(0); - #define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */ - static int kmod_loop_msg; -@@ -128,9 +138,7 @@ int __request_module(bool wait, const char *fmt, ...) - - trace_module_request(module_name, wait, _RET_IP_); - -- ret = call_usermodehelper_fns(modprobe_path, argv, envp, -- wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC, -- NULL, NULL, NULL); -+ ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); - - atomic_dec(&kmod_concurrent); - return ret; diff --git a/debian/patches/bugfix/all/kmod-make-__request_module-killable.patch b/debian/patches/bugfix/all/kmod-make-__request_module-killable.patch deleted file mode 100644 index dc87e7979..000000000 --- a/debian/patches/bugfix/all/kmod-make-__request_module-killable.patch +++ /dev/null @@ -1,78 +0,0 @@ -From: Oleg Nesterov -Date: Fri, 23 Mar 2012 15:02:50 -0700 -Subject: [5/5] kmod: make __request_module() killable - -commit 1cc684ab75123efe7ff446eb821d44375ba8fa30 upstream. - -As Tetsuo Handa pointed out, request_module() can stress the system -while the oom-killed caller sleeps in TASK_UNINTERRUPTIBLE. - -The task T uses "almost all" memory, then it does something which -triggers request_module(). Say, it can simply call sys_socket(). This -in turn needs more memory and leads to OOM. oom-killer correctly -chooses T and kills it, but this can't help because it sleeps in -TASK_UNINTERRUPTIBLE and after that oom-killer becomes "disabled" by the -TIF_MEMDIE task T. - -Make __request_module() killable. The only necessary change is that -call_modprobe() should kmalloc argv and module_name, they can't live in -the stack if we use UMH_KILLABLE. This memory is freed via -call_usermodehelper_freeinfo()->cleanup. - -Reported-by: Tetsuo Handa -Signed-off-by: Oleg Nesterov -Cc: Rusty Russell -Cc: Tejun Heo -Cc: David Rientjes -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds ---- - kernel/kmod.c | 26 ++++++++++++++++++++++++-- - 1 file changed, 24 insertions(+), 2 deletions(-) - -diff --git a/kernel/kmod.c b/kernel/kmod.c -index 56a29e8..957a7aa 100644 ---- a/kernel/kmod.c -+++ b/kernel/kmod.c -@@ -60,6 +60,12 @@ static DECLARE_RWSEM(umhelper_sem); - */ - char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe"; - -+static void free_modprobe_argv(struct subprocess_info *info) -+{ -+ kfree(info->argv[3]); /* check call_modprobe() */ -+ kfree(info->argv); -+} -+ - static int call_modprobe(char *module_name, int wait) - { - static char *envp[] = { -@@ -69,10 +75,26 @@ static int call_modprobe(char *module_name, int wait) - NULL - }; - -- char *argv[] = { modprobe_path, "-q", "--", module_name, NULL }; -+ char **argv = kmalloc(sizeof(char *[5]), GFP_KERNEL); -+ if (!argv) -+ goto out; -+ -+ module_name = kstrdup(module_name, GFP_KERNEL); -+ if (!module_name) -+ goto free_argv; -+ -+ argv[0] = modprobe_path; -+ argv[1] = "-q"; -+ argv[2] = "--"; -+ argv[3] = module_name; /* check free_modprobe_argv() */ -+ argv[4] = NULL; - - return call_usermodehelper_fns(modprobe_path, argv, envp, -- wait, NULL, NULL, NULL); -+ wait | UMH_KILLABLE, NULL, free_modprobe_argv, NULL); -+free_argv: -+ kfree(argv); -+out: -+ return -ENOMEM; - } - - /** diff --git a/debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch b/debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch deleted file mode 100644 index 7f0b8a134..000000000 --- a/debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch +++ /dev/null @@ -1,80 +0,0 @@ -From: Linus Torvalds -Date: Mon, 18 Feb 2013 09:58:02 -0800 -Subject: mm: fix pageblock bitmap allocation - -commit 7c45512df987c5619db041b5c9b80d281e26d3db upstream. - -Commit c060f943d092 ("mm: use aligned zone start for pfn_to_bitidx -calculation") fixed out calculation of the index into the pageblock -bitmap when a !SPARSEMEM zome was not aligned to pageblock_nr_pages. - -However, the _allocation_ of that bitmap had never taken this alignment -requirement into accout, so depending on the exact size and alignment of -the zone, the use of that index could then access past the allocation, -resulting in some very subtle memory corruption. - -This was reported (and bisected) by Ingo Molnar: one of his random -config builds would hang with certain very specific kernel command line -options. - -In the meantime, commit c060f943d092 has been marked for stable, so this -fix needs to be back-ported to the stable kernels that backported the -commit to use the right alignment. - -Bisected-and-tested-by: Ingo Molnar -Acked-by: Mel Gorman -Signed-off-by: Linus Torvalds ---- - mm/page_alloc.c | 15 +++++++++------ - 1 file changed, 9 insertions(+), 6 deletions(-) - -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 9673d96..6a83cd3 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -4420,10 +4420,11 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat, - * round what is now in bits to nearest long in bits, then return it in - * bytes. - */ --static unsigned long __init usemap_size(unsigned long zonesize) -+static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned long zonesize) - { - unsigned long usemapsize; - -+ zonesize += zone_start_pfn & (pageblock_nr_pages-1); - usemapsize = roundup(zonesize, pageblock_nr_pages); - usemapsize = usemapsize >> pageblock_order; - usemapsize *= NR_PAGEBLOCK_BITS; -@@ -4433,17 +4434,19 @@ static unsigned long __init usemap_size(unsigned long zonesize) - } - - static void __init setup_usemap(struct pglist_data *pgdat, -- struct zone *zone, unsigned long zonesize) -+ struct zone *zone, -+ unsigned long zone_start_pfn, -+ unsigned long zonesize) - { -- unsigned long usemapsize = usemap_size(zonesize); -+ unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize); - zone->pageblock_flags = NULL; - if (usemapsize) - zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat, - usemapsize); - } - #else --static inline void setup_usemap(struct pglist_data *pgdat, -- struct zone *zone, unsigned long zonesize) {} -+static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone, -+ unsigned long zone_start_pfn, unsigned long zonesize) {} - #endif /* CONFIG_SPARSEMEM */ - - #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE -@@ -4594,7 +4597,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat, - continue; - - set_pageblock_order(); -- setup_usemap(pgdat, zone, size); -+ setup_usemap(pgdat, zone, zone_start_pfn, size); - ret = init_currently_empty_zone(zone, zone_start_pfn, - size, MEMMAP_EARLY); - BUG_ON(ret); diff --git a/debian/patches/bugfix/all/speakup-lower-default-software-speech-rate.patch b/debian/patches/bugfix/all/speakup-lower-default-software-speech-rate.patch deleted file mode 100644 index 014ee3daf..000000000 --- a/debian/patches/bugfix/all/speakup-lower-default-software-speech-rate.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Samuel Thibault -Date: Sun, 26 Aug 2012 23:35:17 +0200 -Subject: speakup: lower default software speech rate - -commit cfd757010691eae4e17acc246f74e7622c3a2f05 upstream. - -Speech synthesis beginners need a low speech rate, and trained people -want a high speech rate. A medium speech rate is thus actually not a -good default for neither. Since trained people will typically know how -to change the rate, better default for a low speech rate, which -beginners can grasp and learn how to increase it afterwards - -This was agreed with users on the speakup mailing list. - -Signed-off-by: Samuel Thibault -Signed-off-by: Greg Kroah-Hartman ---- - drivers/staging/speakup/speakup_soft.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c -index 42cdafe..2a67610 100644 ---- a/drivers/staging/speakup/speakup_soft.c -+++ b/drivers/staging/speakup/speakup_soft.c -@@ -46,7 +46,7 @@ static int misc_registered; - static struct var_t vars[] = { - { CAPS_START, .u.s = {"\x01+3p" } }, - { CAPS_STOP, .u.s = {"\x01-3p" } }, -- { RATE, .u.n = {"\x01%ds", 5, 0, 9, 0, 0, NULL } }, -+ { RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } }, - { PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } }, - { VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } }, - { TONE, .u.n = {"\x01%dx", 1, 0, 2, 0, 0, NULL } }, diff --git a/debian/patches/bugfix/all/usb-Add-USB_QUIRK_RESET_RESUME-for-all-Logitech-UVC-.patch b/debian/patches/bugfix/all/usb-Add-USB_QUIRK_RESET_RESUME-for-all-Logitech-UVC-.patch deleted file mode 100644 index b6a629b0a..000000000 --- a/debian/patches/bugfix/all/usb-Add-USB_QUIRK_RESET_RESUME-for-all-Logitech-UVC-.patch +++ /dev/null @@ -1,98 +0,0 @@ -From: Laurent Pinchart -Date: Thu, 19 Jul 2012 12:39:14 +0200 -Subject: usb: Add USB_QUIRK_RESET_RESUME for all Logitech UVC webcams - -commit e387ef5c47ddeaeaa3cbdc54424cdb7a28dae2c0 upstream. - -Most Logitech UVC webcams (both early models that don't advertise UVC -compatibility and newer UVC-advertised devices) require the RESET_RESUME -quirk. Instead of listing each and every model, match the devices based -on the UVC interface information. - -Signed-off-by: Laurent Pinchart -Acked-by: Alan Stern -Signed-off-by: Greg Kroah-Hartman -[bwh: Adjust context to apply after 3.2.38] ---- - drivers/usb/core/quirks.c | 58 +++++++++++++-------------------------------- - 1 file changed, 16 insertions(+), 42 deletions(-) - ---- a/drivers/usb/core/quirks.c -+++ b/drivers/usb/core/quirks.c -@@ -46,53 +46,23 @@ static const struct usb_device_id usb_qu - /* Microsoft LifeCam-VX700 v2.0 */ - { USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME }, - -- /* Logitech Webcam C200 */ -- { USB_DEVICE(0x046d, 0x0802), .driver_info = USB_QUIRK_RESET_RESUME }, -+ /* Logitech Quickcam Fusion */ -+ { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME }, - -- /* Logitech Webcam C250 */ -- { USB_DEVICE(0x046d, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME }, -+ /* Logitech Quickcam Orbit MP */ -+ { USB_DEVICE(0x046d, 0x08c2), .driver_info = USB_QUIRK_RESET_RESUME }, - -- /* Logitech Webcam C300 */ -- { USB_DEVICE(0x046d, 0x0805), .driver_info = USB_QUIRK_RESET_RESUME }, -+ /* Logitech Quickcam Pro for Notebook */ -+ { USB_DEVICE(0x046d, 0x08c3), .driver_info = USB_QUIRK_RESET_RESUME }, - -- /* Logitech Webcam B/C500 */ -- { USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME }, -+ /* Logitech Quickcam Pro 5000 */ -+ { USB_DEVICE(0x046d, 0x08c5), .driver_info = USB_QUIRK_RESET_RESUME }, - -- /* Logitech Webcam C600 */ -- { USB_DEVICE(0x046d, 0x0808), .driver_info = USB_QUIRK_RESET_RESUME }, -+ /* Logitech Quickcam OEM Dell Notebook */ -+ { USB_DEVICE(0x046d, 0x08c6), .driver_info = USB_QUIRK_RESET_RESUME }, - -- /* Logitech Webcam Pro 9000 */ -- { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C905 */ -- { USB_DEVICE(0x046d, 0x080a), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C210 */ -- { USB_DEVICE(0x046d, 0x0819), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C260 */ -- { USB_DEVICE(0x046d, 0x081a), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C310 */ -- { USB_DEVICE(0x046d, 0x081b), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C910 */ -- { USB_DEVICE(0x046d, 0x0821), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C160 */ -- { USB_DEVICE(0x046d, 0x0824), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Webcam C270 */ -- { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Quickcam Pro 9000 */ -- { USB_DEVICE(0x046d, 0x0990), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Quickcam E3500 */ -- { USB_DEVICE(0x046d, 0x09a4), .driver_info = USB_QUIRK_RESET_RESUME }, -- -- /* Logitech Quickcam Vision Pro */ -- { USB_DEVICE(0x046d, 0x09a6), .driver_info = USB_QUIRK_RESET_RESUME }, -+ /* Logitech Quickcam OEM Cisco VT Camera II */ -+ { USB_DEVICE(0x046d, 0x08c7), .driver_info = USB_QUIRK_RESET_RESUME }, - - /* Logitech Harmony 700-series */ - { USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT }, -@@ -169,6 +139,10 @@ static const struct usb_device_id usb_qu - }; - - static const struct usb_device_id usb_interface_quirk_list[] = { -+ /* Logitech UVC Cameras */ -+ { USB_VENDOR_AND_INTERFACE_INFO(0x046d, USB_CLASS_VIDEO, 1, 0), -+ .driver_info = USB_QUIRK_RESET_RESUME }, -+ - { } /* terminating entry must be last */ - }; - diff --git a/debian/patches/bugfix/all/usb-Add-quirk-detection-based-on-interface-informati.patch b/debian/patches/bugfix/all/usb-Add-quirk-detection-based-on-interface-informati.patch deleted file mode 100644 index c40b51554..000000000 --- a/debian/patches/bugfix/all/usb-Add-quirk-detection-based-on-interface-informati.patch +++ /dev/null @@ -1,250 +0,0 @@ -From: Laurent Pinchart -Date: Thu, 19 Jul 2012 12:39:13 +0200 -Subject: usb: Add quirk detection based on interface information - -commit 80da2e0df5af700518611b7d1cc4fc9945bcaf95 upstream. - -When a whole class of devices (possibly from a specific vendor, or -across multiple vendors) require a quirk, explictly listing all devices -in the class make the quirks table unnecessarily large. Fix this by -allowing matching devices based on interface information. - -Signed-off-by: Laurent Pinchart -Acked-by: Alan Stern -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/core/driver.c | 38 ++++++++++-------- - drivers/usb/core/hub.c | 10 +++-- - drivers/usb/core/quirks.c | 93 +++++++++++++++++++++++++++++++++++---------- - drivers/usb/core/usb.h | 4 ++ - 4 files changed, 106 insertions(+), 39 deletions(-) - ---- a/drivers/usb/core/driver.c -+++ b/drivers/usb/core/driver.c -@@ -541,22 +541,10 @@ int usb_match_device(struct usb_device * - } - - /* returns 0 if no match, 1 if match */ --int usb_match_one_id(struct usb_interface *interface, -- const struct usb_device_id *id) -+int usb_match_one_id_intf(struct usb_device *dev, -+ struct usb_host_interface *intf, -+ const struct usb_device_id *id) - { -- struct usb_host_interface *intf; -- struct usb_device *dev; -- -- /* proc_connectinfo in devio.c may call us with id == NULL. */ -- if (id == NULL) -- return 0; -- -- intf = interface->cur_altsetting; -- dev = interface_to_usbdev(interface); -- -- if (!usb_match_device(dev, id)) -- return 0; -- - /* The interface class, subclass, and protocol should never be - * checked for a match if the device class is Vendor Specific, - * unless the match record specifies the Vendor ID. */ -@@ -581,6 +569,26 @@ int usb_match_one_id(struct usb_interfac - - return 1; - } -+ -+/* returns 0 if no match, 1 if match */ -+int usb_match_one_id(struct usb_interface *interface, -+ const struct usb_device_id *id) -+{ -+ struct usb_host_interface *intf; -+ struct usb_device *dev; -+ -+ /* proc_connectinfo in devio.c may call us with id == NULL. */ -+ if (id == NULL) -+ return 0; -+ -+ intf = interface->cur_altsetting; -+ dev = interface_to_usbdev(interface); -+ -+ if (!usb_match_device(dev, id)) -+ return 0; -+ -+ return usb_match_one_id_intf(dev, intf, id); -+} - EXPORT_SYMBOL_GPL(usb_match_one_id); - - /** ---- a/drivers/usb/core/hub.c -+++ b/drivers/usb/core/hub.c -@@ -1821,7 +1821,7 @@ static int usb_enumerate_device(struct u - if (err < 0) { - dev_err(&udev->dev, "can't read configurations, error %d\n", - err); -- goto fail; -+ return err; - } - } - if (udev->wusb == 1 && udev->authorized == 0) { -@@ -1837,8 +1837,12 @@ static int usb_enumerate_device(struct u - udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); - } - err = usb_enumerate_device_otg(udev); --fail: -- return err; -+ if (err < 0) -+ return err; -+ -+ usb_detect_interface_quirks(udev); -+ -+ return 0; - } - - ---- a/drivers/usb/core/quirks.c -+++ b/drivers/usb/core/quirks.c -@@ -15,17 +15,22 @@ - #include - #include "usb.h" - --/* List of quirky USB devices. Please keep this list ordered by: -+/* Lists of quirky USB devices, split in device quirks and interface quirks. -+ * Device quirks are applied at the very beginning of the enumeration process, -+ * right after reading the device descriptor. They can thus only match on device -+ * information. -+ * -+ * Interface quirks are applied after reading all the configuration descriptors. -+ * They can match on both device and interface information. -+ * -+ * Note that the DELAY_INIT and HONOR_BNUMINTERFACES quirks do not make sense as -+ * interface quirks, as they only influence the enumeration process which is run -+ * before processing the interface quirks. -+ * -+ * Please keep the lists ordered by: - * 1) Vendor ID - * 2) Product ID - * 3) Class ID -- * -- * as we want specific devices to be overridden first, and only after that, any -- * class specific quirks. -- * -- * Right now the logic aborts if it finds a valid device in the table, we might -- * want to change that in the future if it turns out that a whole class of -- * devices is broken... - */ - static const struct usb_device_id usb_quirk_list[] = { - /* CBM - Flash disk */ -@@ -156,16 +161,53 @@ static const struct usb_device_id usb_qu - { } /* terminating entry must be last */ - }; - --static const struct usb_device_id *find_id(struct usb_device *udev) -+static const struct usb_device_id usb_interface_quirk_list[] = { -+ { } /* terminating entry must be last */ -+}; -+ -+static bool usb_match_any_interface(struct usb_device *udev, -+ const struct usb_device_id *id) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < udev->descriptor.bNumConfigurations; ++i) { -+ struct usb_host_config *cfg = &udev->config[i]; -+ unsigned int j; -+ -+ for (j = 0; j < cfg->desc.bNumInterfaces; ++j) { -+ struct usb_interface_cache *cache; -+ struct usb_host_interface *intf; -+ -+ cache = cfg->intf_cache[j]; -+ if (cache->num_altsetting == 0) -+ continue; -+ -+ intf = &cache->altsetting[0]; -+ if (usb_match_one_id_intf(udev, intf, id)) -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+static u32 __usb_detect_quirks(struct usb_device *udev, -+ const struct usb_device_id *id) - { -- const struct usb_device_id *id = usb_quirk_list; -+ u32 quirks = 0; - -- for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass || -- id->driver_info; id++) { -- if (usb_match_device(udev, id)) -- return id; -+ for (; id->match_flags; id++) { -+ if (!usb_match_device(udev, id)) -+ continue; -+ -+ if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_INFO) && -+ !usb_match_any_interface(udev, id)) -+ continue; -+ -+ quirks |= (u32)(id->driver_info); - } -- return NULL; -+ -+ return quirks; - } - - /* -@@ -173,14 +215,10 @@ static const struct usb_device_id *find_ - */ - void usb_detect_quirks(struct usb_device *udev) - { -- const struct usb_device_id *id = usb_quirk_list; -- -- id = find_id(udev); -- if (id) -- udev->quirks = (u32)(id->driver_info); -+ udev->quirks = __usb_detect_quirks(udev, usb_quirk_list); - if (udev->quirks) - dev_dbg(&udev->dev, "USB quirks for this device: %x\n", -- udev->quirks); -+ udev->quirks); - - /* For the present, all devices default to USB-PERSIST enabled */ - #if 0 /* was: #ifdef CONFIG_PM */ -@@ -197,3 +235,16 @@ void usb_detect_quirks(struct usb_device - udev->persist_enabled = 1; - #endif /* CONFIG_PM */ - } -+ -+void usb_detect_interface_quirks(struct usb_device *udev) -+{ -+ u32 quirks; -+ -+ quirks = __usb_detect_quirks(udev, usb_interface_quirk_list); -+ if (quirks == 0) -+ return; -+ -+ dev_dbg(&udev->dev, "USB interface quirks for this device: %x\n", -+ quirks); -+ udev->quirks |= quirks; -+} ---- a/drivers/usb/core/usb.h -+++ b/drivers/usb/core/usb.h -@@ -24,6 +24,7 @@ extern void usb_disable_device(struct us - extern int usb_deauthorize_device(struct usb_device *); - extern int usb_authorize_device(struct usb_device *); - extern void usb_detect_quirks(struct usb_device *udev); -+extern void usb_detect_interface_quirks(struct usb_device *udev); - extern int usb_remove_device(struct usb_device *udev); - - extern int usb_get_device_descriptor(struct usb_device *dev, -@@ -35,6 +36,9 @@ extern int usb_set_configuration(struct - extern int usb_choose_configuration(struct usb_device *udev); - - extern void usb_kick_khubd(struct usb_device *dev); -+extern int usb_match_one_id_intf(struct usb_device *dev, -+ struct usb_host_interface *intf, -+ const struct usb_device_id *id); - extern int usb_match_device(struct usb_device *dev, - const struct usb_device_id *id); - extern void usb_forced_unbind_intf(struct usb_interface *intf); diff --git a/debian/patches/bugfix/all/usermodehelper-____call_usermodehelper-doesnt-need-do_exit.patch b/debian/patches/bugfix/all/usermodehelper-____call_usermodehelper-doesnt-need-do_exit.patch deleted file mode 100644 index 80eaa712f..000000000 --- a/debian/patches/bugfix/all/usermodehelper-____call_usermodehelper-doesnt-need-do_exit.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Oleg Nesterov -Date: Fri, 23 Mar 2012 15:02:49 -0700 -Subject: [3/5] usermodehelper: ____call_usermodehelper() doesn't need - do_exit() - -commit 5b9bd473e3b8a8c6c4ae99be475e6e9b27568555 upstream. - -Minor cleanup. ____call_usermodehelper() can simply return, no need to -call do_exit() explicitely. - -Signed-off-by: Oleg Nesterov -Cc: Tetsuo Handa -Cc: Rusty Russell -Cc: Tejun Heo -Cc: David Rientjes -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds ---- - kernel/kmod.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/kmod.c b/kernel/kmod.c -index 8341de9..685b246 100644 ---- a/kernel/kmod.c -+++ b/kernel/kmod.c -@@ -188,7 +188,7 @@ static int ____call_usermodehelper(void *data) - /* Exec failed? */ - fail: - sub_info->retval = retval; -- do_exit(0); -+ return 0; - } - - void call_usermodehelper_freeinfo(struct subprocess_info *info) diff --git a/debian/patches/bugfix/all/usermodehelper-implement-UMH_KILLABLE.patch b/debian/patches/bugfix/all/usermodehelper-implement-UMH_KILLABLE.patch deleted file mode 100644 index 90592c514..000000000 --- a/debian/patches/bugfix/all/usermodehelper-implement-UMH_KILLABLE.patch +++ /dev/null @@ -1,105 +0,0 @@ -From: Oleg Nesterov -Date: Fri, 23 Mar 2012 15:02:47 -0700 -Subject: [2/5] usermodehelper: implement UMH_KILLABLE - -commit d0bd587a80960d7ba7e0c8396e154028c9045c54 upstream. - -Implement UMH_KILLABLE, should be used along with UMH_WAIT_EXEC/PROC. -The caller must ensure that subprocess_info->path/etc can not go away -until call_usermodehelper_freeinfo(). - -call_usermodehelper_exec(UMH_KILLABLE) does -wait_for_completion_killable. If it fails, it uses -xchg(&sub_info->complete, NULL) to serialize with umh_complete() which -does the same xhcg() to access sub_info->complete. - -If call_usermodehelper_exec wins, it can safely return. umh_complete() -should get NULL and call call_usermodehelper_freeinfo(). - -Otherwise we know that umh_complete() was already called, in this case -call_usermodehelper_exec() falls back to wait_for_completion() which -should succeed "very soon". - -Note: UMH_NO_WAIT == -1 but it obviously should not be used with -UMH_KILLABLE. We delay the neccessary cleanup to simplify the back -porting. - -Signed-off-by: Oleg Nesterov -Cc: Tetsuo Handa -Cc: Rusty Russell -Cc: Tejun Heo -Cc: David Rientjes -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds ---- - include/linux/kmod.h | 2 ++ - kernel/kmod.c | 27 +++++++++++++++++++++++++-- - 2 files changed, 27 insertions(+), 2 deletions(-) - -diff --git a/include/linux/kmod.h b/include/linux/kmod.h -index 722f477..1b598585 100644 ---- a/include/linux/kmod.h -+++ b/include/linux/kmod.h -@@ -54,6 +54,8 @@ enum umh_wait { - UMH_WAIT_PROC = 1, /* wait for the process to complete */ - }; - -+#define UMH_KILLABLE 4 /* wait for EXEC/PROC killable */ -+ - struct subprocess_info { - struct work_struct work; - struct completion *complete; -diff --git a/kernel/kmod.c b/kernel/kmod.c -index 8ea2594..f92f917 100644 ---- a/kernel/kmod.c -+++ b/kernel/kmod.c -@@ -201,7 +201,15 @@ EXPORT_SYMBOL(call_usermodehelper_freeinfo); - - static void umh_complete(struct subprocess_info *sub_info) - { -- complete(sub_info->complete); -+ struct completion *comp = xchg(&sub_info->complete, NULL); -+ /* -+ * See call_usermodehelper_exec(). If xchg() returns NULL -+ * we own sub_info, the UMH_KILLABLE caller has gone away. -+ */ -+ if (comp) -+ complete(comp); -+ else -+ call_usermodehelper_freeinfo(sub_info); - } - - /* Keventd can't block, but this (a child) can. */ -@@ -252,6 +260,9 @@ static void __call_usermodehelper(struct work_struct *work) - enum umh_wait wait = sub_info->wait; - pid_t pid; - -+ if (wait != UMH_NO_WAIT) -+ wait &= ~UMH_KILLABLE; -+ - /* CLONE_VFORK: wait until the usermode helper has execve'd - * successfully We need the data structures to stay around - * until that is done. */ -@@ -461,9 +472,21 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, - queue_work(khelper_wq, &sub_info->work); - if (wait == UMH_NO_WAIT) /* task has freed sub_info */ - goto unlock; -+ -+ if (wait & UMH_KILLABLE) { -+ retval = wait_for_completion_killable(&done); -+ if (!retval) -+ goto wait_done; -+ -+ /* umh_complete() will see NULL and free sub_info */ -+ if (xchg(&sub_info->complete, NULL)) -+ goto unlock; -+ /* fallthrough, umh_complete() was already called */ -+ } -+ - wait_for_completion(&done); -+wait_done: - retval = sub_info->retval; -- - out: - call_usermodehelper_freeinfo(sub_info); - unlock: diff --git a/debian/patches/bugfix/all/usermodehelper-introduce-umh_complete.patch b/debian/patches/bugfix/all/usermodehelper-introduce-umh_complete.patch deleted file mode 100644 index 18007e191..000000000 --- a/debian/patches/bugfix/all/usermodehelper-introduce-umh_complete.patch +++ /dev/null @@ -1,54 +0,0 @@ -From: Oleg Nesterov -Date: Fri, 23 Mar 2012 15:02:47 -0700 -Subject: [1/5] usermodehelper: introduce umh_complete(sub_info) - -commit b3449922502f5a161ee2b5022a33aec8472fbf18 upstream. - -Preparation. Add the new trivial helper, umh_complete(). Currently it -simply does complete(sub_info->complete). - -Signed-off-by: Oleg Nesterov -Cc: Tetsuo Handa -Cc: Rusty Russell -Cc: Tejun Heo -Cc: David Rientjes -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds ---- - kernel/kmod.c | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/kernel/kmod.c b/kernel/kmod.c -index a0a8854..8ea2594 100644 ---- a/kernel/kmod.c -+++ b/kernel/kmod.c -@@ -199,6 +199,11 @@ void call_usermodehelper_freeinfo(struct subprocess_info *info) - } - EXPORT_SYMBOL(call_usermodehelper_freeinfo); - -+static void umh_complete(struct subprocess_info *sub_info) -+{ -+ complete(sub_info->complete); -+} -+ - /* Keventd can't block, but this (a child) can. */ - static int wait_for_helper(void *data) - { -@@ -235,7 +240,7 @@ static int wait_for_helper(void *data) - sub_info->retval = ret; - } - -- complete(sub_info->complete); -+ umh_complete(sub_info); - return 0; - } - -@@ -269,7 +274,7 @@ static void __call_usermodehelper(struct work_struct *work) - case UMH_WAIT_EXEC: - if (pid < 0) - sub_info->retval = pid; -- complete(sub_info->complete); -+ umh_complete(sub_info); - } - } - diff --git a/debian/patches/bugfix/all/vhost-fix-length-for-cross-region-descriptor.patch b/debian/patches/bugfix/all/vhost-fix-length-for-cross-region-descriptor.patch deleted file mode 100644 index da4bad637..000000000 --- a/debian/patches/bugfix/all/vhost-fix-length-for-cross-region-descriptor.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: "Michael S. Tsirkin" -Date: Mon, 26 Nov 2012 05:57:27 +0000 -Subject: vhost: fix length for cross region descriptor - -commit bd97120fc3d1a11f3124c7c9ba1d91f51829eb85 upstream. - -If a single descriptor crosses a region, the -second chunk length should be decremented -by size translated so far, instead it includes -the full descriptor length. - -Signed-off-by: Michael S. Tsirkin -Acked-by: Jason Wang -Signed-off-by: David S. Miller ---- - drivers/vhost/vhost.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c -index 99ac2cb..dedaf81 100644 ---- a/drivers/vhost/vhost.c -+++ b/drivers/vhost/vhost.c -@@ -1076,7 +1076,7 @@ static int translate_desc(struct vhost_dev *dev, u64 addr, u32 len, - } - _iov = iov + ret; - size = reg->memory_size - addr + reg->guest_phys_addr; -- _iov->iov_len = min((u64)len, size); -+ _iov->iov_len = min((u64)len - s, size); - _iov->iov_base = (void __user *)(unsigned long) - (reg->userspace_addr + addr - reg->guest_phys_addr); - s += size; diff --git a/debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch b/debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch deleted file mode 100644 index 95822de42..000000000 --- a/debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch +++ /dev/null @@ -1,65 +0,0 @@ -From: Ben Hutchings -Date: Fri, 9 Nov 2012 02:43:00 +0000 -Subject: asus-laptop: Do not call HWRS on init - -commit cb7da022450cdaaebd33078b6b32fb7dd2aaf6db upstream. - -Since commit 8871e99f89b7 ('asus-laptop: HRWS/HWRS typo'), module -initialisation is very slow on the Asus UL30A. The HWRS method takes -about 12 seconds to run, and subsequent initialisation also seems to -be delayed. Since we don't really need the result, don't bother -calling it on init. Those who are curious can still get the result -through the 'infos' device attribute. - -Update the comment about HWRS in show_infos(). - -Reported-by: ryan -References: http://bugs.debian.org/692436 -Signed-off-by: Ben Hutchings ---- - drivers/platform/x86/asus-laptop.c | 17 ++++------------- - 1 file changed, 4 insertions(+), 13 deletions(-) - -diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c -index 4b568df..a961156 100644 ---- a/drivers/platform/x86/asus-laptop.c -+++ b/drivers/platform/x86/asus-laptop.c -@@ -860,8 +860,10 @@ static ssize_t show_infos(struct device *dev, - /* - * The HWRS method return informations about the hardware. - * 0x80 bit is for WLAN, 0x100 for Bluetooth. -+ * 0x40 for WWAN, 0x10 for WIMAX. - * The significance of others is yet to be found. -- * If we don't find the method, we assume the device are present. -+ * We don't currently use this for device detection, and it -+ * takes several seconds to run on some systems. - */ - rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp); - if (!ACPI_FAILURE(rv)) -@@ -1682,7 +1684,7 @@ static int asus_laptop_get_info(struct asus_laptop *asus) - { - struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; - union acpi_object *model = NULL; -- unsigned long long bsts_result, hwrs_result; -+ unsigned long long bsts_result; - char *string = NULL; - acpi_status status; - -@@ -1744,17 +1746,6 @@ static int asus_laptop_get_info(struct asus_laptop *asus) - if (*string) - pr_notice(" %s model detected\n", string); - -- /* -- * The HWRS method return informations about the hardware. -- * 0x80 bit is for WLAN, 0x100 for Bluetooth, -- * 0x40 for WWAN, 0x10 for WIMAX. -- * The significance of others is yet to be found. -- */ -- status = -- acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result); -- if (!ACPI_FAILURE(status)) -- pr_notice(" HWRS returned %x", (int)hwrs_result); -- - if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL)) - asus->have_rsts = true; - diff --git a/debian/patches/bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch b/debian/patches/bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch deleted file mode 100644 index d1fdebbb6..000000000 --- a/debian/patches/bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch +++ /dev/null @@ -1,65 +0,0 @@ -From: Satoru Takeuchi -Date: Thu, 14 Feb 2013 09:12:52 +0900 -Subject: efi: Clear EFI_RUNTIME_SERVICES rather than EFI_BOOT by "noefi" boot - parameter - -commit 1de63d60cd5b0d33a812efa455d5933bf1564a51 upstream. - -There was a serious problem in samsung-laptop that its platform driver is -designed to run under BIOS and running under EFI can cause the machine to -become bricked or can cause Machine Check Exceptions. - - Discussion about this problem: - https://bugs.launchpad.net/ubuntu-cdimage/+bug/1040557 - https://bugzilla.kernel.org/show_bug.cgi?id=47121 - - The patches to fix this problem: - efi: Make 'efi_enabled' a function to query EFI facilities - 83e68189745ad931c2afd45d8ee3303929233e7f - - samsung-laptop: Disable on EFI hardware - e0094244e41c4d0c7ad69920681972fc45d8ce34 - -Unfortunately this problem comes back again if users specify "noefi" option. -This parameter clears EFI_BOOT and that driver continues to run even if running -under EFI. Refer to the document, this parameter should clear -EFI_RUNTIME_SERVICES instead. - -Documentation/kernel-parameters.txt: -=============================================================================== -... - noefi [X86] Disable EFI runtime services support. -... -=============================================================================== - -Documentation/x86/x86_64/uefi.txt: -=============================================================================== -... -- If some or all EFI runtime services don't work, you can try following - kernel command line parameters to turn off some or all EFI runtime - services. - noefi turn off all EFI runtime services -... -=============================================================================== - -Signed-off-by: Satoru Takeuchi -Link: http://lkml.kernel.org/r/511C2C04.2070108@jp.fujitsu.com -Cc: Matt Fleming -Signed-off-by: H. Peter Anvin ---- - arch/x86/platform/efi/efi.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c -index 77cf009..928bf83 100644 ---- a/arch/x86/platform/efi/efi.c -+++ b/arch/x86/platform/efi/efi.c -@@ -87,7 +87,7 @@ EXPORT_SYMBOL(efi_enabled); - - static int __init setup_noefi(char *arg) - { -- clear_bit(EFI_BOOT, &x86_efi_facility); -+ clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); - return 0; - } - early_param("noefi", setup_noefi); diff --git a/debian/patches/bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch b/debian/patches/bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch deleted file mode 100644 index 0c90432d7..000000000 --- a/debian/patches/bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch +++ /dev/null @@ -1,105 +0,0 @@ -From: Matt Fleming -Date: Wed, 20 Feb 2013 20:36:12 +0000 -Subject: x86, efi: Make "noefi" really disable EFI runtime serivces - -commit fb834c7acc5e140cf4f9e86da93a66de8c0514da upstream. - -commit 1de63d60cd5b ("efi: Clear EFI_RUNTIME_SERVICES rather than -EFI_BOOT by "noefi" boot parameter") attempted to make "noefi" true to -its documentation and disable EFI runtime services to prevent the -bricking bug described in commit e0094244e41c ("samsung-laptop: -Disable on EFI hardware"). However, it's not possible to clear -EFI_RUNTIME_SERVICES from an early param function because -EFI_RUNTIME_SERVICES is set in efi_init() *after* parse_early_param(). - -This resulted in "noefi" effectively becoming a no-op and no longer -providing users with a way to disable EFI, which is bad for those -users that have buggy machines. - -Reported-by: Walt Nelson Jr -Cc: Satoru Takeuchi -Signed-off-by: Matt Fleming -Link: http://lkml.kernel.org/r/1361392572-25657-1-git-send-email-matt@console-pimps.org -Signed-off-by: H. Peter Anvin -[bwh: Backported to 3.2: efi_runtime_init() is not a separate function, - so put a whole set of statements in an if (!disable_runtime) block] ---- ---- a/arch/x86/platform/efi/efi.c -+++ b/arch/x86/platform/efi/efi.c -@@ -83,9 +83,10 @@ int efi_enabled(int facility) - } - EXPORT_SYMBOL(efi_enabled); - -+static bool disable_runtime = false; - static int __init setup_noefi(char *arg) - { -- clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); -+ disable_runtime = true; - return 0; - } - early_param("noefi", setup_noefi); -@@ -549,35 +550,37 @@ void __init efi_init(void) - - set_bit(EFI_CONFIG_TABLES, &x86_efi_facility); - -- /* -- * Check out the runtime services table. We need to map -- * the runtime services table so that we can grab the physical -- * address of several of the EFI runtime functions, needed to -- * set the firmware into virtual mode. -- */ -- runtime = early_ioremap((unsigned long)efi.systab->runtime, -- sizeof(efi_runtime_services_t)); -- if (runtime != NULL) { -- /* -- * We will only need *early* access to the following -- * two EFI runtime services before set_virtual_address_map -- * is invoked. -- */ -- efi_phys.get_time = (efi_get_time_t *)runtime->get_time; -- efi_phys.set_virtual_address_map = -- (efi_set_virtual_address_map_t *) -- runtime->set_virtual_address_map; -+ if (!disable_runtime) { - /* -- * Make efi_get_time can be called before entering -- * virtual mode. -+ * Check out the runtime services table. We need to map -+ * the runtime services table so that we can grab the physical -+ * address of several of the EFI runtime functions, needed to -+ * set the firmware into virtual mode. - */ -- efi.get_time = phys_efi_get_time; -- -- set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); -- } else -- printk(KERN_ERR "Could not map the EFI runtime service " -- "table!\n"); -- early_iounmap(runtime, sizeof(efi_runtime_services_t)); -+ runtime = early_ioremap((unsigned long)efi.systab->runtime, -+ sizeof(efi_runtime_services_t)); -+ if (runtime != NULL) { -+ /* -+ * We will only need *early* access to the following -+ * two EFI runtime services before set_virtual_address_map -+ * is invoked. -+ */ -+ efi_phys.get_time = (efi_get_time_t *)runtime->get_time; -+ efi_phys.set_virtual_address_map = -+ (efi_set_virtual_address_map_t *) -+ runtime->set_virtual_address_map; -+ /* -+ * Make efi_get_time can be called before entering -+ * virtual mode. -+ */ -+ efi.get_time = phys_efi_get_time; -+ -+ set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); -+ } else -+ printk(KERN_ERR "Could not map the EFI runtime service " -+ "table!\n"); -+ early_iounmap(runtime, sizeof(efi_runtime_services_t)); -+ } - - /* Map the EFI memory map */ - memmap.map = early_ioremap((unsigned long)memmap.phys_map, diff --git a/debian/patches/debian/pps-avoid-abi-change-in-3.2.40.patch b/debian/patches/debian/pps-avoid-abi-change-in-3.2.40.patch new file mode 100644 index 000000000..2bcfa11b3 --- /dev/null +++ b/debian/patches/debian/pps-avoid-abi-change-in-3.2.40.patch @@ -0,0 +1,27 @@ +From: Ben Hutchings +Subject: pps: avoid ABI change in 3.2.40 +Date: Wed, 06 Mar 2013 14:15:34 +0000 + +Move the new member pps_device::lookup_cookie to the end of the +structure and hide it from genksyms. This structure is always +allocated by pps_register_source(). + +--- +--- a/include/linux/pps_kernel.h ++++ b/include/linux/pps_kernel.h +@@ -69,11 +69,14 @@ struct pps_device { + wait_queue_head_t queue; /* PPS event queue */ + + unsigned int id; /* PPS source unique ID */ +- void const *lookup_cookie; /* pps_lookup_dev only */ + struct cdev cdev; + struct device *dev; + struct fasync_struct *async_queue; /* fasync method */ + spinlock_t lock; ++ ++#ifndef __GENKSYMS__ ++ void const *lookup_cookie; /* pps_lookup_dev only */ ++#endif + }; + + /* diff --git a/debian/patches/features/all/drm/drm-3.4.patch b/debian/patches/features/all/drm/drm-3.4.patch index e8affe5a8..c044c7b1b 100644 --- a/debian/patches/features/all/drm/drm-3.4.patch +++ b/debian/patches/features/all/drm/drm-3.4.patch @@ -2237,20 +2237,10 @@ index 40c187c..6116e3b 100644 atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]); ++file_priv->ioctl_count; diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c -index bb95d59..9d9835a 100644 +index 9080eb7..9d9835a 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c -@@ -87,9 +87,6 @@ static struct edid_quirk { - int product_id; - u32 quirks; - } edid_quirk_list[] = { -- /* ASUS VW222S */ -- { "ACI", 0x22a2, EDID_QUIRK_FORCE_REDUCED_BLANKING }, -- - /* Acer AL1706 */ - { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, - /* Acer F51 */ -@@ -157,8 +154,7 @@ EXPORT_SYMBOL(drm_edid_header_is_valid); +@@ -154,8 +154,7 @@ EXPORT_SYMBOL(drm_edid_header_is_valid); * Sanity check the EDID block (base or extension). Return 0 if the block * doesn't check out, or 1 if it's valid. */ @@ -2260,7 +2250,7 @@ index bb95d59..9d9835a 100644 { int i; u8 csum = 0; -@@ -211,6 +207,7 @@ bad: +@@ -208,6 +207,7 @@ bad: } return 0; } @@ -2268,7 +2258,7 @@ index bb95d59..9d9835a 100644 /** * drm_edid_is_valid - sanity check EDID data -@@ -234,7 +231,6 @@ bool drm_edid_is_valid(struct edid *edid) +@@ -231,7 +231,6 @@ bool drm_edid_is_valid(struct edid *edid) } EXPORT_SYMBOL(drm_edid_is_valid); @@ -2276,7 +2266,7 @@ index bb95d59..9d9835a 100644 #define DDC_SEGMENT_ADDR 0x30 /** * Get EDID information via I2C. -@@ -521,25 +517,10 @@ static void +@@ -518,25 +517,10 @@ static void cea_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure) { int i, n = 0; @@ -2304,7 +2294,7 @@ index bb95d59..9d9835a 100644 for (i = 0; i < n; i++) cb((struct detailed_timing *)(det_base + 18 * i), closure); } -@@ -773,7 +754,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, +@@ -770,7 +754,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, */ mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { @@ -2313,7 +2303,7 @@ index bb95d59..9d9835a 100644 mode = drm_gtf_mode_complex(dev, hsize, vsize, vrefresh_rate, 0, 0, drm_gtf2_m(edid), -@@ -1341,6 +1322,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, +@@ -1338,6 +1322,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, #define HDMI_IDENTIFIER 0x000C03 #define AUDIO_BLOCK 0x01 @@ -2321,7 +2311,7 @@ index bb95d59..9d9835a 100644 #define VENDOR_BLOCK 0x03 #define SPEAKER_BLOCK 0x04 #define EDID_BASIC_AUDIO (1 << 6) -@@ -1371,6 +1353,47 @@ u8 *drm_find_cea_extension(struct edid *edid) +@@ -1368,6 +1353,47 @@ u8 *drm_find_cea_extension(struct edid *edid) } EXPORT_SYMBOL(drm_find_cea_extension); @@ -2369,7 +2359,7 @@ index bb95d59..9d9835a 100644 static void parse_hdmi_vsdb(struct drm_connector *connector, uint8_t *db) { -@@ -1454,26 +1477,29 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) +@@ -1451,26 +1477,29 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) eld[18] = edid->prod_code[0]; eld[19] = edid->prod_code[1]; @@ -2418,10 +2408,13 @@ index bb95d59..9d9835a 100644 eld[5] |= sad_count << 4; eld[2] = (20 + mnl + sad_count * 3 + 3) / 4; -@@ -1744,6 +1770,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) +@@ -1740,8 +1769,8 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) + num_modes += add_cvt_modes(connector, edid); num_modes += add_standard_modes(connector, edid); num_modes += add_established_modes(connector, edid); - num_modes += add_inferred_modes(connector, edid); +- if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) +- num_modes += add_inferred_modes(connector, edid); ++ num_modes += add_inferred_modes(connector, edid); + num_modes += add_cea_modes(connector, edid); if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) @@ -4317,7 +4310,7 @@ index 0f9ef9b..5a7bd51 100644 diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c -index 445003f..37c9a52 100644 +index 471f453..37c9a52 100644 --- a/drivers/gpu/drm/drm_usb.c +++ b/drivers/gpu/drm/drm_usb.c @@ -1,8 +1,7 @@ @@ -4330,6 +4323,15 @@ index 445003f..37c9a52 100644 int drm_get_usb_dev(struct usb_interface *interface, const struct usb_device_id *id, struct drm_driver *driver) +@@ -19,7 +18,7 @@ int drm_get_usb_dev(struct usb_interface *interface, + + usbdev = interface_to_usbdev(interface); + dev->usbdev = usbdev; +- dev->dev = &interface->dev; ++ dev->dev = &usbdev->dev; + + mutex_lock(&drm_global_mutex); + @@ -115,4 +114,7 @@ void drm_usb_exit(struct drm_driver *driver, usb_deregister(udriver); } @@ -42875,7 +42877,7 @@ index 0ae6a7c..ce7fc77 100644 dvo_ch7xxx.o \ dvo_ch7017.o \ diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c -index 10fe480..e6162a1 100644 +index 5620192..e6162a1 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -30,7 +30,6 @@ @@ -43063,7 +43065,7 @@ index 10fe480..e6162a1 100644 seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, error->time.tv_usec); -- seq_printf(m, "Kernel: " UTS_RELEASE); +- seq_printf(m, "Kernel: " UTS_RELEASE "\n"); seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); seq_printf(m, "EIR: 0x%08x\n", error->eir); seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er); @@ -47730,7 +47732,7 @@ index fee0ad0..342ffb7 100644 drm_encoder_helper_add(&crt->base.base, &intel_crt_helper_funcs); diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 7817429..3c9b9c5 100644 +index 2303c2b..3c9b9c5 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -75,7 +75,7 @@ struct intel_limit { @@ -47768,6 +47770,17 @@ index 7817429..3c9b9c5 100644 static inline u32 /* units of 100MHz */ intel_fdi_link_freq(struct drm_device *dev) +@@ -138,8 +142,8 @@ static const intel_limit_t intel_limits_i9xx_sdvo = { + .vco = { .min = 1400000, .max = 2800000 }, + .n = { .min = 1, .max = 6 }, + .m = { .min = 70, .max = 120 }, +- .m1 = { .min = 8, .max = 18 }, +- .m2 = { .min = 3, .max = 7 }, ++ .m1 = { .min = 10, .max = 22 }, ++ .m2 = { .min = 5, .max = 9 }, + .p = { .min = 5, .max = 80 }, + .p1 = { .min = 1, .max = 8 }, + .p2 = { .dot_limit = 200000, @@ -534,7 +538,8 @@ static bool intel_PLL_is_valid(struct drm_device *dev, static bool @@ -48066,7 +48079,29 @@ index 7817429..3c9b9c5 100644 intel_fdi_normal_train(crtc); -@@ -3331,10 +3392,12 @@ static void intel_crtc_disable(struct drm_crtc *crtc) +@@ -3242,7 +3303,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc) + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int pipe = intel_crtc->pipe; + int plane = intel_crtc->plane; +- u32 pctl; + + if (!intel_crtc->active) + return; +@@ -3258,13 +3318,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc) + + intel_disable_plane(dev_priv, plane, pipe); + intel_disable_pipe(dev_priv, pipe); +- +- /* Disable pannel fitter if it is on this pipe. */ +- pctl = I915_READ(PFIT_CONTROL); +- if ((pctl & PFIT_ENABLE) && +- ((pctl & PFIT_PIPE_MASK) >> PFIT_PIPE_SHIFT) == pipe) +- I915_WRITE(PFIT_CONTROL, 0); +- + intel_disable_pll(dev_priv, pipe); + + intel_crtc->active = false; +@@ -3339,10 +3392,12 @@ static void intel_crtc_disable(struct drm_crtc *crtc) struct drm_device *dev = crtc->dev; crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); @@ -48080,7 +48115,7 @@ index 7817429..3c9b9c5 100644 mutex_unlock(&dev->struct_mutex); } } -@@ -3408,10 +3471,10 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc, +@@ -3416,10 +3471,10 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc, return false; } @@ -48095,7 +48130,7 @@ index 7817429..3c9b9c5 100644 drm_mode_set_crtcinfo(adjusted_mode, 0); return true; -@@ -4527,10 +4590,11 @@ static void ironlake_update_wm(struct drm_device *dev) +@@ -4535,10 +4590,11 @@ static void ironlake_update_wm(struct drm_device *dev) */ } @@ -48108,7 +48143,7 @@ index 7817429..3c9b9c5 100644 int fbc_wm, plane_wm, cursor_wm; unsigned int enabled; -@@ -4539,8 +4603,10 @@ static void sandybridge_update_wm(struct drm_device *dev) +@@ -4547,8 +4603,10 @@ static void sandybridge_update_wm(struct drm_device *dev) &sandybridge_display_wm_info, latency, &sandybridge_cursor_wm_info, latency, &plane_wm, &cursor_wm)) { @@ -48121,7 +48156,7 @@ index 7817429..3c9b9c5 100644 DRM_DEBUG_KMS("FIFO watermarks For pipe A -" " plane %d, " "cursor: %d\n", plane_wm, cursor_wm); -@@ -4551,8 +4617,10 @@ static void sandybridge_update_wm(struct drm_device *dev) +@@ -4559,8 +4617,10 @@ static void sandybridge_update_wm(struct drm_device *dev) &sandybridge_display_wm_info, latency, &sandybridge_cursor_wm_info, latency, &plane_wm, &cursor_wm)) { @@ -48134,7 +48169,7 @@ index 7817429..3c9b9c5 100644 DRM_DEBUG_KMS("FIFO watermarks For pipe B -" " plane %d, cursor: %d\n", plane_wm, cursor_wm); -@@ -4565,8 +4633,10 @@ static void sandybridge_update_wm(struct drm_device *dev) +@@ -4573,8 +4633,10 @@ static void sandybridge_update_wm(struct drm_device *dev) &sandybridge_display_wm_info, latency, &sandybridge_cursor_wm_info, latency, &plane_wm, &cursor_wm)) { @@ -48147,7 +48182,7 @@ index 7817429..3c9b9c5 100644 DRM_DEBUG_KMS("FIFO watermarks For pipe C -" " plane %d, cursor: %d\n", plane_wm, cursor_wm); -@@ -4587,7 +4657,8 @@ static void sandybridge_update_wm(struct drm_device *dev) +@@ -4595,7 +4657,8 @@ static void sandybridge_update_wm(struct drm_device *dev) I915_WRITE(WM2_LP_ILK, 0); I915_WRITE(WM1_LP_ILK, 0); @@ -48157,7 +48192,7 @@ index 7817429..3c9b9c5 100644 return; enabled = ffs(enabled) - 1; -@@ -4637,6 +4708,161 @@ static void sandybridge_update_wm(struct drm_device *dev) +@@ -4645,6 +4708,161 @@ static void sandybridge_update_wm(struct drm_device *dev) cursor_wm); } @@ -48319,7 +48354,7 @@ index 7817429..3c9b9c5 100644 /** * intel_update_watermarks - update FIFO watermark values based on current modes * -@@ -4677,6 +4903,16 @@ static void intel_update_watermarks(struct drm_device *dev) +@@ -4685,6 +4903,16 @@ static void intel_update_watermarks(struct drm_device *dev) dev_priv->display.update_wm(dev); } @@ -48336,7 +48371,7 @@ index 7817429..3c9b9c5 100644 static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) { if (i915_panel_use_ssc >= 0) -@@ -4824,6 +5060,82 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, +@@ -4832,6 +5060,82 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, return display_bpc != bpc; } @@ -48419,7 +48454,7 @@ index 7817429..3c9b9c5 100644 static int i9xx_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode, -@@ -4837,7 +5149,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -4845,7 +5149,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, int plane = intel_crtc->plane; int refclk, num_connectors = 0; intel_clock_t clock, reduced_clock; @@ -48428,7 +48463,7 @@ index 7817429..3c9b9c5 100644 bool ok, has_reduced_clock = false, is_sdvo = false, is_dvo = false; bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; struct drm_mode_config *mode_config = &dev->mode_config; -@@ -4878,15 +5190,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -4886,15 +5190,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, num_connectors++; } @@ -48445,7 +48480,7 @@ index 7817429..3c9b9c5 100644 /* * Returns a set of divisors for the desired target clock with the given -@@ -4894,7 +5198,8 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -4902,7 +5198,8 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2. */ limit = intel_limit(crtc, refclk); @@ -48455,7 +48490,7 @@ index 7817429..3c9b9c5 100644 if (!ok) { DRM_ERROR("Couldn't find PLL settings for mode!\n"); return -EINVAL; -@@ -4904,53 +5209,24 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -4912,53 +5209,24 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, intel_crtc_update_cursor(crtc, true); if (is_lvds && dev_priv->lvds_downclock_avail) { @@ -48521,7 +48556,7 @@ index 7817429..3c9b9c5 100644 dpll = DPLL_VGA_MODE_DIS; -@@ -5024,8 +5300,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -5032,8 +5300,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, /* Set up the display plane register */ dspcntr = DISPPLANE_GAMMA_ENABLE; @@ -48530,7 +48565,7 @@ index 7817429..3c9b9c5 100644 if (pipe == 0) dspcntr &= ~DISPPLANE_SEL_PIPE_MASK; else -@@ -5060,7 +5334,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -5068,7 +5334,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); drm_mode_debug_printmodeline(mode); @@ -48538,7 +48573,7 @@ index 7817429..3c9b9c5 100644 I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE); POSTING_READ(DPLL(pipe)); -@@ -5147,33 +5420,32 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, +@@ -5155,33 +5420,32 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, I915_WRITE(DPLL(pipe), dpll); } @@ -48587,7 +48622,7 @@ index 7817429..3c9b9c5 100644 I915_WRITE(HTOTAL(pipe), (adjusted_mode->crtc_hdisplay - 1) | -@@ -5290,7 +5562,8 @@ void ironlake_init_pch_refclk(struct drm_device *dev) +@@ -5298,7 +5562,8 @@ void ironlake_init_pch_refclk(struct drm_device *dev) if (intel_panel_use_ssc(dev_priv) && can_ssc) { DRM_DEBUG_KMS("Using SSC on panel\n"); temp |= DREF_SSC1_ENABLE; @@ -48597,7 +48632,7 @@ index 7817429..3c9b9c5 100644 /* Get SSC going before enabling the outputs */ I915_WRITE(PCH_DREF_CONTROL, temp); -@@ -5439,7 +5712,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, +@@ -5447,7 +5712,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2. */ limit = intel_limit(crtc, refclk); @@ -48607,7 +48642,7 @@ index 7817429..3c9b9c5 100644 if (!ok) { DRM_ERROR("Couldn't find PLL settings for mode!\n"); return -EINVAL; -@@ -5449,21 +5723,17 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, +@@ -5457,21 +5723,17 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, intel_crtc_update_cursor(crtc, true); if (is_lvds && dev_priv->lvds_downclock_avail) { @@ -48636,7 +48671,7 @@ index 7817429..3c9b9c5 100644 } /* SDVO TV has fixed PLL values depend on its clock range, this mirrors vbios setting. */ -@@ -5758,17 +6028,19 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, +@@ -5766,17 +6028,19 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, } } @@ -48663,7 +48698,7 @@ index 7817429..3c9b9c5 100644 I915_WRITE(HTOTAL(pipe), (adjusted_mode->crtc_hdisplay - 1) | -@@ -5811,12 +6083,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, +@@ -5819,12 +6083,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, intel_wait_for_vblank(dev, pipe); @@ -48676,7 +48711,7 @@ index 7817429..3c9b9c5 100644 I915_WRITE(DSPCNTR(plane), dspcntr); POSTING_READ(DSPCNTR(plane)); -@@ -5843,14 +6109,45 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, +@@ -5851,14 +6109,45 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, ret = dev_priv->display.crtc_mode_set(crtc, mode, adjusted_mode, x, y, old_fb); @@ -48724,7 +48759,7 @@ index 7817429..3c9b9c5 100644 static void g4x_write_eld(struct drm_connector *connector, struct drm_crtc *crtc) { -@@ -5867,6 +6164,12 @@ static void g4x_write_eld(struct drm_connector *connector, +@@ -5875,6 +6164,12 @@ static void g4x_write_eld(struct drm_connector *connector, else eldv = G4X_ELDV_DEVCTG; @@ -48737,7 +48772,7 @@ index 7817429..3c9b9c5 100644 i = I915_READ(G4X_AUD_CNTL_ST); i &= ~(eldv | G4X_ELD_ADDR); len = (i >> 9) & 0x1f; /* ELD buffer size */ -@@ -5894,22 +6197,26 @@ static void ironlake_write_eld(struct drm_connector *connector, +@@ -5902,22 +6197,26 @@ static void ironlake_write_eld(struct drm_connector *connector, uint32_t i; int len; int hdmiw_hdmiedid; @@ -48770,7 +48805,7 @@ index 7817429..3c9b9c5 100644 DRM_DEBUG_DRIVER("ELD on pipe %c\n", pipe_name(i)); -@@ -5918,14 +6225,27 @@ static void ironlake_write_eld(struct drm_connector *connector, +@@ -5926,14 +6225,27 @@ static void ironlake_write_eld(struct drm_connector *connector, if (!i) { DRM_DEBUG_DRIVER("Audio directed to unknown port\n"); /* operate blindly on all ports */ @@ -48802,7 +48837,7 @@ index 7817429..3c9b9c5 100644 i = I915_READ(aud_cntrl_st2); i &= ~eldv; I915_WRITE(aud_cntrl_st2, i); -@@ -5933,13 +6253,8 @@ static void ironlake_write_eld(struct drm_connector *connector, +@@ -5941,13 +6253,8 @@ static void ironlake_write_eld(struct drm_connector *connector, if (!eld[0]) return; @@ -48817,7 +48852,7 @@ index 7817429..3c9b9c5 100644 I915_WRITE(aud_cntl_st, i); len = min_t(uint8_t, eld[2], 21); /* 84 bytes of hw ELD buffer */ -@@ -6319,7 +6634,7 @@ static struct drm_display_mode load_detect_mode = { +@@ -6327,7 +6634,7 @@ static struct drm_display_mode load_detect_mode = { static struct drm_framebuffer * intel_framebuffer_create(struct drm_device *dev, @@ -48826,7 +48861,7 @@ index 7817429..3c9b9c5 100644 struct drm_i915_gem_object *obj) { struct intel_framebuffer *intel_fb; -@@ -6361,7 +6676,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev, +@@ -6369,7 +6676,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev, int depth, int bpp) { struct drm_i915_gem_object *obj; @@ -48835,7 +48870,7 @@ index 7817429..3c9b9c5 100644 obj = i915_gem_alloc_object(dev, intel_framebuffer_size_for_mode(mode, bpp)); -@@ -6370,9 +6685,9 @@ intel_framebuffer_create_for_mode(struct drm_device *dev, +@@ -6378,9 +6685,9 @@ intel_framebuffer_create_for_mode(struct drm_device *dev, mode_cmd.width = mode->hdisplay; mode_cmd.height = mode->vdisplay; @@ -48848,7 +48883,7 @@ index 7817429..3c9b9c5 100644 return intel_framebuffer_create(dev, &mode_cmd, obj); } -@@ -6393,11 +6708,11 @@ mode_fits_in_fbdev(struct drm_device *dev, +@@ -6401,11 +6708,11 @@ mode_fits_in_fbdev(struct drm_device *dev, return NULL; fb = &dev_priv->fbdev->ifb.base; @@ -48863,7 +48898,7 @@ index 7817429..3c9b9c5 100644 return NULL; return fb; -@@ -6729,9 +7044,7 @@ static void intel_increase_pllclock(struct drm_crtc *crtc) +@@ -6737,9 +7044,7 @@ static void intel_increase_pllclock(struct drm_crtc *crtc) if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) { DRM_DEBUG_DRIVER("upclocking LVDS\n"); @@ -48874,7 +48909,7 @@ index 7817429..3c9b9c5 100644 dpll &= ~DISPLAY_RATE_SELECT_FPA1; I915_WRITE(dpll_reg, dpll); -@@ -6740,9 +7053,6 @@ static void intel_increase_pllclock(struct drm_crtc *crtc) +@@ -6748,9 +7053,6 @@ static void intel_increase_pllclock(struct drm_crtc *crtc) dpll = I915_READ(dpll_reg); if (dpll & DISPLAY_RATE_SELECT_FPA1) DRM_DEBUG_DRIVER("failed to upclock LVDS!\n"); @@ -48884,7 +48919,7 @@ index 7817429..3c9b9c5 100644 } /* Schedule downclock */ -@@ -6755,9 +7065,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) +@@ -6763,9 +7065,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) struct drm_device *dev = crtc->dev; drm_i915_private_t *dev_priv = dev->dev_private; struct intel_crtc *intel_crtc = to_intel_crtc(crtc); @@ -48894,7 +48929,7 @@ index 7817429..3c9b9c5 100644 if (HAS_PCH_SPLIT(dev)) return; -@@ -6770,23 +7077,22 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) +@@ -6778,23 +7077,22 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) * the manual case. */ if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { @@ -48924,7 +48959,7 @@ index 7817429..3c9b9c5 100644 } /** -@@ -6899,7 +7205,7 @@ static void intel_unpin_work_fn(struct work_struct *__work) +@@ -6907,7 +7205,7 @@ static void intel_unpin_work_fn(struct work_struct *__work) container_of(__work, struct intel_unpin_work, work); mutex_lock(&work->dev->struct_mutex); @@ -48933,7 +48968,7 @@ index 7817429..3c9b9c5 100644 drm_gem_object_unreference(&work->pending_flip_obj->base); drm_gem_object_unreference(&work->old_fb_obj->base); -@@ -6927,18 +7233,11 @@ static void do_intel_finish_page_flip(struct drm_device *dev, +@@ -6935,18 +7233,11 @@ static void do_intel_finish_page_flip(struct drm_device *dev, spin_lock_irqsave(&dev->event_lock, flags); work = intel_crtc->unpin_work; @@ -48953,7 +48988,7 @@ index 7817429..3c9b9c5 100644 intel_crtc->unpin_work = NULL; if (work->event) { -@@ -7010,25 +7309,16 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) +@@ -7018,25 +7309,16 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]); unsigned long flags; @@ -48985,7 +49020,7 @@ index 7817429..3c9b9c5 100644 static int intel_gen2_queue_flip(struct drm_device *dev, struct drm_crtc *crtc, struct drm_framebuffer *fb, -@@ -7045,7 +7335,7 @@ static int intel_gen2_queue_flip(struct drm_device *dev, +@@ -7053,7 +7335,7 @@ static int intel_gen2_queue_flip(struct drm_device *dev, goto err; /* Offset into the new buffer for cases of shared fbs between CRTCs */ @@ -48994,7 +49029,7 @@ index 7817429..3c9b9c5 100644 ret = BEGIN_LP_RING(6); if (ret) -@@ -7062,16 +7352,14 @@ static int intel_gen2_queue_flip(struct drm_device *dev, +@@ -7070,16 +7352,14 @@ static int intel_gen2_queue_flip(struct drm_device *dev, OUT_RING(MI_NOOP); OUT_RING(MI_DISPLAY_FLIP | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); @@ -49014,7 +49049,7 @@ index 7817429..3c9b9c5 100644 err: return ret; } -@@ -7092,7 +7380,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev, +@@ -7100,7 +7380,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev, goto err; /* Offset into the new buffer for cases of shared fbs between CRTCs */ @@ -49023,7 +49058,7 @@ index 7817429..3c9b9c5 100644 ret = BEGIN_LP_RING(6); if (ret) -@@ -7106,16 +7394,15 @@ static int intel_gen3_queue_flip(struct drm_device *dev, +@@ -7114,16 +7394,15 @@ static int intel_gen3_queue_flip(struct drm_device *dev, OUT_RING(MI_NOOP); OUT_RING(MI_DISPLAY_FLIP_I915 | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); @@ -49042,7 +49077,7 @@ index 7817429..3c9b9c5 100644 err: return ret; } -@@ -7144,7 +7431,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev, +@@ -7152,7 +7431,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev, */ OUT_RING(MI_DISPLAY_FLIP | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); @@ -49051,7 +49086,7 @@ index 7817429..3c9b9c5 100644 OUT_RING(obj->gtt_offset | obj->tiling_mode); /* XXX Enabling the panel-fitter across page-flip is so far -@@ -7154,13 +7441,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev, +@@ -7162,13 +7441,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev, pf = 0; pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; OUT_RING(pf | pipesrc); @@ -49066,7 +49101,7 @@ index 7817429..3c9b9c5 100644 err: return ret; } -@@ -7185,19 +7470,23 @@ static int intel_gen6_queue_flip(struct drm_device *dev, +@@ -7193,19 +7470,23 @@ static int intel_gen6_queue_flip(struct drm_device *dev, OUT_RING(MI_DISPLAY_FLIP | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); @@ -49095,7 +49130,7 @@ index 7817429..3c9b9c5 100644 err: return ret; } -@@ -7244,16 +7533,14 @@ static int intel_gen7_queue_flip(struct drm_device *dev, +@@ -7252,16 +7533,14 @@ static int intel_gen7_queue_flip(struct drm_device *dev, goto err_unpin; intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit); @@ -49114,7 +49149,7 @@ index 7817429..3c9b9c5 100644 err: return ret; } -@@ -7551,10 +7838,9 @@ static void intel_setup_outputs(struct drm_device *dev) +@@ -7559,10 +7838,9 @@ static void intel_setup_outputs(struct drm_device *dev) struct drm_i915_private *dev_priv = dev->dev_private; struct intel_encoder *encoder; bool dpd_is_edp = false; @@ -49127,7 +49162,7 @@ index 7817429..3c9b9c5 100644 if (!has_lvds && !HAS_PCH_SPLIT(dev)) { /* disable the panel fitter on everything but LVDS */ I915_WRITE(PFIT_CONTROL, 0); -@@ -7683,7 +7969,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = { +@@ -7691,7 +7969,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = { int intel_framebuffer_init(struct drm_device *dev, struct intel_framebuffer *intel_fb, @@ -49136,7 +49171,7 @@ index 7817429..3c9b9c5 100644 struct drm_i915_gem_object *obj) { int ret; -@@ -7691,21 +7977,27 @@ int intel_framebuffer_init(struct drm_device *dev, +@@ -7699,21 +7977,27 @@ int intel_framebuffer_init(struct drm_device *dev, if (obj->tiling_mode == I915_TILING_Y) return -EINVAL; @@ -49174,7 +49209,7 @@ index 7817429..3c9b9c5 100644 return -EINVAL; } -@@ -7723,11 +8015,12 @@ int intel_framebuffer_init(struct drm_device *dev, +@@ -7731,11 +8015,12 @@ int intel_framebuffer_init(struct drm_device *dev, static struct drm_framebuffer * intel_user_framebuffer_create(struct drm_device *dev, struct drm_file *filp, @@ -49189,7 +49224,7 @@ index 7817429..3c9b9c5 100644 if (&obj->base == NULL) return ERR_PTR(-ENOENT); -@@ -7996,7 +8289,7 @@ void intel_init_emon(struct drm_device *dev) +@@ -8004,7 +8289,7 @@ void intel_init_emon(struct drm_device *dev) dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); } @@ -49198,7 +49233,7 @@ index 7817429..3c9b9c5 100644 { /* * Respect the kernel parameter if it is set -@@ -8014,11 +8307,11 @@ static bool intel_enable_rc6(struct drm_device *dev) +@@ -8022,11 +8307,11 @@ static bool intel_enable_rc6(struct drm_device *dev) * Disable rc6 on Sandybridge */ if (INTEL_INFO(dev)->gen == 6) { @@ -49214,7 +49249,7 @@ index 7817429..3c9b9c5 100644 } void gen6_enable_rps(struct drm_i915_private *dev_priv) -@@ -8026,7 +8319,9 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) +@@ -8034,7 +8319,9 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); u32 pcu_mbox, rc6_mask = 0; @@ -49224,7 +49259,7 @@ index 7817429..3c9b9c5 100644 int i; /* Here begins a magic sequence of register writes to enable -@@ -8037,6 +8332,13 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) +@@ -8045,6 +8332,13 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) */ I915_WRITE(GEN6_RC_STATE, 0); mutex_lock(&dev_priv->dev->struct_mutex); @@ -49238,7 +49273,7 @@ index 7817429..3c9b9c5 100644 gen6_gt_force_wake_get(dev_priv); /* disable the counters and set deterministic thresholds */ -@@ -8057,9 +8359,20 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) +@@ -8065,9 +8359,20 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ @@ -49262,7 +49297,7 @@ index 7817429..3c9b9c5 100644 I915_WRITE(GEN6_RC_CONTROL, rc6_mask | -@@ -8287,6 +8600,10 @@ static void gen6_init_clock_gating(struct drm_device *dev) +@@ -8295,6 +8600,10 @@ static void gen6_init_clock_gating(struct drm_device *dev) I915_WRITE(WM2_LP_ILK, 0); I915_WRITE(WM1_LP_ILK, 0); @@ -49273,7 +49308,7 @@ index 7817429..3c9b9c5 100644 /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock * gating disable must be set. Failure to set it results in * flickering pixels due to Z write ordering failures after -@@ -8365,6 +8682,10 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) +@@ -8373,6 +8682,10 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); @@ -49284,7 +49319,7 @@ index 7817429..3c9b9c5 100644 /* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */ I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); -@@ -8675,9 +8996,15 @@ static void intel_init_display(struct drm_device *dev) +@@ -8683,9 +8996,15 @@ static void intel_init_display(struct drm_device *dev) if (IS_IVYBRIDGE(dev)) { u32 ecobus; @@ -49301,7 +49336,7 @@ index 7817429..3c9b9c5 100644 __gen6_gt_force_wake_mt_put(dev_priv); mutex_unlock(&dev->struct_mutex); -@@ -8709,6 +9036,7 @@ static void intel_init_display(struct drm_device *dev) +@@ -8717,6 +9036,7 @@ static void intel_init_display(struct drm_device *dev) } else if (IS_GEN6(dev)) { if (SNB_READ_WM0_LATENCY()) { dev_priv->display.update_wm = sandybridge_update_wm; @@ -49309,7 +49344,7 @@ index 7817429..3c9b9c5 100644 } else { DRM_DEBUG_KMS("Failed to read display plane latency. " "Disable CxSR\n"); -@@ -8722,6 +9050,7 @@ static void intel_init_display(struct drm_device *dev) +@@ -8730,6 +9050,7 @@ static void intel_init_display(struct drm_device *dev) dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train; if (SNB_READ_WM0_LATENCY()) { dev_priv->display.update_wm = sandybridge_update_wm; @@ -49317,7 +49352,7 @@ index 7817429..3c9b9c5 100644 } else { DRM_DEBUG_KMS("Failed to read display plane latency. " "Disable CxSR\n"); -@@ -8834,8 +9163,6 @@ struct intel_quirk { +@@ -8842,8 +9163,6 @@ struct intel_quirk { }; struct intel_quirk intel_quirks[] = { @@ -49326,7 +49361,7 @@ index 7817429..3c9b9c5 100644 /* HP Mini needs pipe A force quirk (LP: #322104) */ { 0x27ae, 0x103c, 0x361a, quirk_pipea_force }, -@@ -8902,33 +9229,19 @@ static void i915_disable_vga(struct drm_device *dev) +@@ -8910,33 +9229,19 @@ static void i915_disable_vga(struct drm_device *dev) POSTING_READ(vga_reg); } @@ -49364,7 +49399,7 @@ index 7817429..3c9b9c5 100644 dev->mode_config.funcs = (void *)&intel_mode_funcs; intel_init_quirks(dev); -@@ -8952,6 +9265,9 @@ void intel_modeset_init(struct drm_device *dev) +@@ -8960,6 +9265,9 @@ void intel_modeset_init(struct drm_device *dev) for (i = 0; i < dev_priv->num_pipe; i++) { intel_crtc_init(dev, i); @@ -72957,7 +72992,7 @@ index 7b4eeb7..19a0114 100644 #include diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c -index 0977849..c62132c 100644 +index 60d13fe..c62132c 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -50,6 +50,39 @@ static const u32 crtc_offsets[6] = @@ -73048,16 +73083,7 @@ index 0977849..c62132c 100644 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL); if ((blackout & BLACKOUT_MODE_MASK) != 1) { -@@ -1137,6 +1183,8 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav - blackout &= ~BLACKOUT_MODE_MASK; - WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1); - } -+ /* wait for the MC to settle */ -+ udelay(100); - } - - void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) -@@ -1166,10 +1214,20 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s +@@ -1168,10 +1214,20 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN); for (i = 0; i < rdev->num_crtc; i++) { @@ -73082,7 +73108,7 @@ index 0977849..c62132c 100644 /* wait for the next frame */ frame_count = radeon_get_vblank_counter(rdev, i); for (j = 0; j < rdev->usec_timeout; j++) { -@@ -1229,7 +1287,10 @@ void evergreen_mc_program(struct radeon_device *rdev) +@@ -1231,7 +1287,10 @@ void evergreen_mc_program(struct radeon_device *rdev) rdev->mc.vram_end >> 12); } WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12); @@ -73094,7 +73120,7 @@ index 0977849..c62132c 100644 tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF; tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24; tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20; -@@ -1264,18 +1325,20 @@ void evergreen_mc_program(struct radeon_device *rdev) +@@ -1266,18 +1325,20 @@ void evergreen_mc_program(struct radeon_device *rdev) */ void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) { @@ -73121,7 +73147,7 @@ index 0977849..c62132c 100644 } -@@ -1313,71 +1376,73 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev) +@@ -1315,71 +1376,73 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev) static int evergreen_cp_start(struct radeon_device *rdev) { @@ -73226,7 +73252,7 @@ index 0977849..c62132c 100644 u32 tmp; u32 rb_bufsz; int r; -@@ -1395,13 +1460,14 @@ int evergreen_cp_resume(struct radeon_device *rdev) +@@ -1397,13 +1460,14 @@ int evergreen_cp_resume(struct radeon_device *rdev) RREG32(GRBM_SOFT_RESET); /* Set ring buffer size */ @@ -73243,7 +73269,7 @@ index 0977849..c62132c 100644 /* Set the write pointer delay */ WREG32(CP_RB_WPTR_DELAY, 0); -@@ -1409,8 +1475,8 @@ int evergreen_cp_resume(struct radeon_device *rdev) +@@ -1411,8 +1475,8 @@ int evergreen_cp_resume(struct radeon_device *rdev) /* Initialize the ring buffer's read and write pointers */ WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); WREG32(CP_RB_RPTR_WR, 0); @@ -73254,7 +73280,7 @@ index 0977849..c62132c 100644 /* set the wb address wether it's enabled or not */ WREG32(CP_RB_RPTR_ADDR, -@@ -1428,16 +1494,16 @@ int evergreen_cp_resume(struct radeon_device *rdev) +@@ -1430,16 +1494,16 @@ int evergreen_cp_resume(struct radeon_device *rdev) mdelay(1); WREG32(CP_RB_CNTL, tmp); @@ -73276,7 +73302,7 @@ index 0977849..c62132c 100644 return r; } return 0; -@@ -1730,7 +1796,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) +@@ -1732,7 +1796,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) case CHIP_SUMO: rdev->config.evergreen.num_ses = 1; rdev->config.evergreen.max_pipes = 4; @@ -73285,7 +73311,7 @@ index 0977849..c62132c 100644 if (rdev->pdev->device == 0x9648) rdev->config.evergreen.max_simds = 3; else if ((rdev->pdev->device == 0x9647) || -@@ -1819,7 +1885,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) +@@ -1821,7 +1885,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) break; case CHIP_CAICOS: rdev->config.evergreen.num_ses = 1; @@ -73294,7 +73320,7 @@ index 0977849..c62132c 100644 rdev->config.evergreen.max_tile_pipes = 2; rdev->config.evergreen.max_simds = 2; rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; -@@ -1868,7 +1934,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) +@@ -1870,7 +1934,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) mc_shared_chmap = RREG32(MC_SHARED_CHMAP); @@ -73305,7 +73331,7 @@ index 0977849..c62132c 100644 mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG); else mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); -@@ -2272,7 +2340,9 @@ int evergreen_mc_init(struct radeon_device *rdev) +@@ -2274,7 +2340,9 @@ int evergreen_mc_init(struct radeon_device *rdev) /* Get VRAM informations */ rdev->mc.vram_is_ddr = true; @@ -73316,7 +73342,7 @@ index 0977849..c62132c 100644 tmp = RREG32(FUS_MC_ARB_RAMCFG); else tmp = RREG32(MC_ARB_RAMCFG); -@@ -2304,12 +2374,14 @@ int evergreen_mc_init(struct radeon_device *rdev) +@@ -2306,12 +2374,14 @@ int evergreen_mc_init(struct radeon_device *rdev) rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); /* Setup GPU memory space */ @@ -73333,7 +73359,7 @@ index 0977849..c62132c 100644 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; } -@@ -2320,7 +2392,7 @@ int evergreen_mc_init(struct radeon_device *rdev) +@@ -2322,7 +2392,7 @@ int evergreen_mc_init(struct radeon_device *rdev) return 0; } @@ -73342,7 +73368,7 @@ index 0977849..c62132c 100644 { u32 srbm_status; u32 grbm_status; -@@ -2333,19 +2405,19 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev) +@@ -2335,19 +2405,19 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev) grbm_status_se0 = RREG32(GRBM_STATUS_SE0); grbm_status_se1 = RREG32(GRBM_STATUS_SE1); if (!(grbm_status & GUI_ACTIVE)) { @@ -73369,7 +73395,7 @@ index 0977849..c62132c 100644 } static int evergreen_gpu_soft_reset(struct radeon_device *rdev) -@@ -2437,7 +2509,13 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) +@@ -2439,7 +2509,13 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) { u32 tmp; @@ -73384,7 +73410,7 @@ index 0977849..c62132c 100644 WREG32(GRBM_INT_CNTL, 0); WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); -@@ -2461,7 +2539,9 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) +@@ -2463,7 +2539,9 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); } @@ -73395,7 +73421,7 @@ index 0977849..c62132c 100644 WREG32(DACB_AUTODETECT_INT_CONTROL, 0); tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY; -@@ -2482,6 +2562,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) +@@ -2484,6 +2562,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) int evergreen_irq_set(struct radeon_device *rdev) { u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE; @@ -73403,7 +73429,7 @@ index 0977849..c62132c 100644 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; u32 grbm_int_cntl = 0; -@@ -2506,11 +2587,28 @@ int evergreen_irq_set(struct radeon_device *rdev) +@@ -2508,11 +2587,28 @@ int evergreen_irq_set(struct radeon_device *rdev) hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; @@ -73436,7 +73462,7 @@ index 0977849..c62132c 100644 if (rdev->irq.crtc_vblank_int[0] || rdev->irq.pflip[0]) { DRM_DEBUG("evergreen_irq_set: vblank 0\n"); -@@ -2570,7 +2668,12 @@ int evergreen_irq_set(struct radeon_device *rdev) +@@ -2572,7 +2668,12 @@ int evergreen_irq_set(struct radeon_device *rdev) grbm_int_cntl |= GUI_IDLE_INT_ENABLE; } @@ -73450,7 +73476,7 @@ index 0977849..c62132c 100644 WREG32(GRBM_INT_CNTL, grbm_int_cntl); WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); -@@ -2985,11 +3088,24 @@ restart_ih: +@@ -2987,11 +3088,24 @@ restart_ih: case 177: /* CP_INT in IB1 */ case 178: /* CP_INT in IB2 */ DRM_DEBUG("IH: CP int: 0x%08x\n", src_data); @@ -73477,7 +73503,7 @@ index 0977849..c62132c 100644 break; case 233: /* GUI IDLE */ DRM_DEBUG("IH: GUI idle\n"); -@@ -3019,6 +3135,7 @@ restart_ih: +@@ -3021,6 +3135,7 @@ restart_ih: static int evergreen_startup(struct radeon_device *rdev) { @@ -73485,7 +73511,7 @@ index 0977849..c62132c 100644 int r; /* enable pcie gen2 link */ -@@ -3064,7 +3181,7 @@ static int evergreen_startup(struct radeon_device *rdev) +@@ -3066,7 +3181,7 @@ static int evergreen_startup(struct radeon_device *rdev) r = evergreen_blit_init(rdev); if (r) { r600_blit_fini(rdev); @@ -73494,7 +73520,7 @@ index 0977849..c62132c 100644 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); } -@@ -3073,6 +3190,12 @@ static int evergreen_startup(struct radeon_device *rdev) +@@ -3075,6 +3190,12 @@ static int evergreen_startup(struct radeon_device *rdev) if (r) return r; @@ -73507,7 +73533,7 @@ index 0977849..c62132c 100644 /* Enable IRQ */ r = r600_irq_init(rdev); if (r) { -@@ -3082,7 +3205,9 @@ static int evergreen_startup(struct radeon_device *rdev) +@@ -3084,7 +3205,9 @@ static int evergreen_startup(struct radeon_device *rdev) } evergreen_irq_set(rdev); @@ -73518,7 +73544,7 @@ index 0977849..c62132c 100644 if (r) return r; r = evergreen_cp_load_microcode(rdev); -@@ -3092,6 +3217,23 @@ static int evergreen_startup(struct radeon_device *rdev) +@@ -3094,6 +3217,23 @@ static int evergreen_startup(struct radeon_device *rdev) if (r) return r; @@ -73542,7 +73568,7 @@ index 0977849..c62132c 100644 return 0; } -@@ -3111,15 +3253,11 @@ int evergreen_resume(struct radeon_device *rdev) +@@ -3113,15 +3253,11 @@ int evergreen_resume(struct radeon_device *rdev) /* post card */ atom_asic_init(rdev->mode_info.atom_context); @@ -73560,7 +73586,7 @@ index 0977849..c62132c 100644 return r; } -@@ -3129,13 +3267,17 @@ int evergreen_resume(struct radeon_device *rdev) +@@ -3131,13 +3267,17 @@ int evergreen_resume(struct radeon_device *rdev) int evergreen_suspend(struct radeon_device *rdev) { @@ -73580,7 +73606,7 @@ index 0977849..c62132c 100644 return 0; } -@@ -3210,8 +3352,8 @@ int evergreen_init(struct radeon_device *rdev) +@@ -3212,8 +3352,8 @@ int evergreen_init(struct radeon_device *rdev) if (r) return r; @@ -73591,7 +73617,7 @@ index 0977849..c62132c 100644 rdev->ih.ring_obj = NULL; r600_ih_ring_init(rdev, 64 * 1024); -@@ -3220,29 +3362,24 @@ int evergreen_init(struct radeon_device *rdev) +@@ -3222,29 +3362,24 @@ int evergreen_init(struct radeon_device *rdev) if (r) return r; @@ -73628,7 +73654,7 @@ index 0977849..c62132c 100644 /* Don't start up if the MC ucode is missing on BTC parts. * The default clocks and voltages before the MC ucode -@@ -3260,15 +3397,17 @@ int evergreen_init(struct radeon_device *rdev) +@@ -3262,15 +3397,17 @@ int evergreen_init(struct radeon_device *rdev) void evergreen_fini(struct radeon_device *rdev) { @@ -76068,7 +76094,7 @@ index cd4590a..2cbd369 100644 + return ret; +} diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h b/drivers/gpu/drm/radeon/evergreen_reg.h -index e022776..34a0e85 100644 +index e022776b..34a0e85 100644 --- a/drivers/gpu/drm/radeon/evergreen_reg.h +++ b/drivers/gpu/drm/radeon/evergreen_reg.h @@ -35,6 +35,14 @@ diff --git a/debian/patches/series b/debian/patches/series index a6162dbb7..bf1beec8c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -395,17 +395,13 @@ features/all/bql/skge-add-byte-queue-limit-support.patch bugfix/all/PCI-PM-Runtime-make-PCI-traces-quieter.patch features/all/USB-add-USB_VENDOR_AND_INTERFACE_INFO-macro.patch -bugfix/all/usb-Add-quirk-detection-based-on-interface-informati.patch -bugfix/all/usb-Add-USB_QUIRK_RESET_RESUME-for-all-Logitech-UVC-.patch bugfix/alpha/alpha-use-large-data-model.diff features/arm/ahci-Add-JMicron-362-device-IDs.patch -bugfix/all/speakup-lower-default-software-speech-rate.patch debian/perf-hide-abi-change-in-3.2.30.patch debian/iwlwifi-do-not-request-unreleased-firmware.patch debian/hid-avoid-ABI-change-in-3.2.31.patch debian/xfrm-avoid-ABI-change-in-3.2.31.patch debian/fs-writeback-avoid-ABI-change-in-3.2.32.patch -bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch features/all/xen/microcode.patch debian/ALSA-avoid-ABI-change-in-3.2.34.patch @@ -420,12 +416,6 @@ features/all/xen/microcode-typo.patch bugfix/all/firmware_class-log-every-success-and-failure.patch bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch -bugfix/all/usermodehelper-introduce-umh_complete.patch -bugfix/all/usermodehelper-implement-UMH_KILLABLE.patch -bugfix/all/usermodehelper-____call_usermodehelper-doesnt-need-do_exit.patch -bugfix/all/kmod-introduce-call_modprobe-helper.patch -bugfix/all/kmod-make-__request_module-killable.patch -bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch debian/audit-increase-AUDIT_NAMES.patch features/all/asix-Adds-support-for-Lenovo-10-100-USB-dongle.patch @@ -449,10 +439,6 @@ features/all/iguanair/0009-media-rc-do-not-wake-up-rc-thread-unless-there-is-so. features/all/iguanair/0010-media-iguanair-do-not-modify-transmit-buffer.patch features/all/iguanair/0011-media-iguanair-cannot-send-data-from-the-stack.patch features/all/rt2800-add-chipset-revision-RT5390R-support.patch -bugfix/all/fs-cachefiles-add-support-for-large-files-in-filesys.patch -bugfix/all/ext4-rewrite-punch-hole-to-use-ext4_ext_remove_space.patch -bugfix/all/ext4-fix-hole-punch-failure-when-depth-is-greater-th.patch -bugfix/all/ext4-fix-kernel-BUG-on-large-scale-rm-rf-commands.patch bugfix/all/md-protect-against-crash-upon-fsync-on-ro-array.patch debian/net-avoid-ABI-break-in-3.2.37.patch @@ -625,10 +611,6 @@ features/all/line6/0104-staging-line6-drop-dump-requests-from-variax-startup.pat features/all/line6/0105-staging-line6-drop-dump-requests-from-pod-startup.patch features/all/line6/0106-staging-line6-drop-unused-dumprequest-code.patch bugfix/all/mm-Try-harder-to-allocate-vmemmap-blocks.patch -bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch -bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch -bugfix/all/mm-fix-pageblock-bitmap-allocation.patch -bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch debian/x86-efi-avoid-abi-change-in-3.2.38.patch -bugfix/all/vhost-fix-length-for-cross-region-descriptor.patch features/x86/efi-stub/0019-x86-efi-Fix-processor-specific-memcpy-build-error.patch +debian/pps-avoid-abi-change-in-3.2.40.patch