diff options
60 files changed, 356 insertions, 268 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 55d3e9b93338..296c02d39c29 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1838,7 +1838,7 @@ F: include/net/ax25.h | |||
| 1838 | F: net/ax25/ | 1838 | F: net/ax25/ |
| 1839 | 1839 | ||
| 1840 | AZ6007 DVB DRIVER | 1840 | AZ6007 DVB DRIVER |
| 1841 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 1841 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 1842 | L: linux-media@vger.kernel.org | 1842 | L: linux-media@vger.kernel.org |
| 1843 | W: http://linuxtv.org | 1843 | W: http://linuxtv.org |
| 1844 | T: git git://linuxtv.org/media_tree.git | 1844 | T: git git://linuxtv.org/media_tree.git |
| @@ -2208,7 +2208,7 @@ F: Documentation/filesystems/btrfs.txt | |||
| 2208 | F: fs/btrfs/ | 2208 | F: fs/btrfs/ |
| 2209 | 2209 | ||
| 2210 | BTTV VIDEO4LINUX DRIVER | 2210 | BTTV VIDEO4LINUX DRIVER |
| 2211 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 2211 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 2212 | L: linux-media@vger.kernel.org | 2212 | L: linux-media@vger.kernel.org |
| 2213 | W: http://linuxtv.org | 2213 | W: http://linuxtv.org |
| 2214 | T: git git://linuxtv.org/media_tree.git | 2214 | T: git git://linuxtv.org/media_tree.git |
| @@ -2729,7 +2729,7 @@ F: drivers/media/common/cx2341x* | |||
| 2729 | F: include/media/cx2341x* | 2729 | F: include/media/cx2341x* |
| 2730 | 2730 | ||
| 2731 | CX88 VIDEO4LINUX DRIVER | 2731 | CX88 VIDEO4LINUX DRIVER |
| 2732 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 2732 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 2733 | L: linux-media@vger.kernel.org | 2733 | L: linux-media@vger.kernel.org |
| 2734 | W: http://linuxtv.org | 2734 | W: http://linuxtv.org |
| 2735 | T: git git://linuxtv.org/media_tree.git | 2735 | T: git git://linuxtv.org/media_tree.git |
| @@ -3419,7 +3419,7 @@ F: fs/ecryptfs/ | |||
| 3419 | EDAC-CORE | 3419 | EDAC-CORE |
| 3420 | M: Doug Thompson <dougthompson@xmission.com> | 3420 | M: Doug Thompson <dougthompson@xmission.com> |
| 3421 | M: Borislav Petkov <bp@alien8.de> | 3421 | M: Borislav Petkov <bp@alien8.de> |
| 3422 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3422 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3423 | L: linux-edac@vger.kernel.org | 3423 | L: linux-edac@vger.kernel.org |
| 3424 | W: bluesmoke.sourceforge.net | 3424 | W: bluesmoke.sourceforge.net |
| 3425 | S: Supported | 3425 | S: Supported |
| @@ -3468,7 +3468,7 @@ S: Maintained | |||
| 3468 | F: drivers/edac/e7xxx_edac.c | 3468 | F: drivers/edac/e7xxx_edac.c |
| 3469 | 3469 | ||
| 3470 | EDAC-GHES | 3470 | EDAC-GHES |
| 3471 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3471 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3472 | L: linux-edac@vger.kernel.org | 3472 | L: linux-edac@vger.kernel.org |
| 3473 | W: bluesmoke.sourceforge.net | 3473 | W: bluesmoke.sourceforge.net |
| 3474 | S: Maintained | 3474 | S: Maintained |
| @@ -3496,21 +3496,21 @@ S: Maintained | |||
| 3496 | F: drivers/edac/i5000_edac.c | 3496 | F: drivers/edac/i5000_edac.c |
| 3497 | 3497 | ||
| 3498 | EDAC-I5400 | 3498 | EDAC-I5400 |
| 3499 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3499 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3500 | L: linux-edac@vger.kernel.org | 3500 | L: linux-edac@vger.kernel.org |
| 3501 | W: bluesmoke.sourceforge.net | 3501 | W: bluesmoke.sourceforge.net |
| 3502 | S: Maintained | 3502 | S: Maintained |
| 3503 | F: drivers/edac/i5400_edac.c | 3503 | F: drivers/edac/i5400_edac.c |
| 3504 | 3504 | ||
| 3505 | EDAC-I7300 | 3505 | EDAC-I7300 |
| 3506 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3506 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3507 | L: linux-edac@vger.kernel.org | 3507 | L: linux-edac@vger.kernel.org |
| 3508 | W: bluesmoke.sourceforge.net | 3508 | W: bluesmoke.sourceforge.net |
| 3509 | S: Maintained | 3509 | S: Maintained |
| 3510 | F: drivers/edac/i7300_edac.c | 3510 | F: drivers/edac/i7300_edac.c |
| 3511 | 3511 | ||
| 3512 | EDAC-I7CORE | 3512 | EDAC-I7CORE |
| 3513 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3513 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3514 | L: linux-edac@vger.kernel.org | 3514 | L: linux-edac@vger.kernel.org |
| 3515 | W: bluesmoke.sourceforge.net | 3515 | W: bluesmoke.sourceforge.net |
| 3516 | S: Maintained | 3516 | S: Maintained |
| @@ -3553,7 +3553,7 @@ S: Maintained | |||
| 3553 | F: drivers/edac/r82600_edac.c | 3553 | F: drivers/edac/r82600_edac.c |
| 3554 | 3554 | ||
| 3555 | EDAC-SBRIDGE | 3555 | EDAC-SBRIDGE |
| 3556 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3556 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3557 | L: linux-edac@vger.kernel.org | 3557 | L: linux-edac@vger.kernel.org |
| 3558 | W: bluesmoke.sourceforge.net | 3558 | W: bluesmoke.sourceforge.net |
| 3559 | S: Maintained | 3559 | S: Maintained |
| @@ -3613,7 +3613,7 @@ S: Maintained | |||
| 3613 | F: drivers/net/ethernet/ibm/ehea/ | 3613 | F: drivers/net/ethernet/ibm/ehea/ |
| 3614 | 3614 | ||
| 3615 | EM28XX VIDEO4LINUX DRIVER | 3615 | EM28XX VIDEO4LINUX DRIVER |
| 3616 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 3616 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 3617 | L: linux-media@vger.kernel.org | 3617 | L: linux-media@vger.kernel.org |
| 3618 | W: http://linuxtv.org | 3618 | W: http://linuxtv.org |
| 3619 | T: git git://linuxtv.org/media_tree.git | 3619 | T: git git://linuxtv.org/media_tree.git |
| @@ -5979,7 +5979,7 @@ S: Maintained | |||
| 5979 | F: drivers/media/radio/radio-maxiradio* | 5979 | F: drivers/media/radio/radio-maxiradio* |
| 5980 | 5980 | ||
| 5981 | MEDIA INPUT INFRASTRUCTURE (V4L/DVB) | 5981 | MEDIA INPUT INFRASTRUCTURE (V4L/DVB) |
| 5982 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 5982 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 5983 | P: LinuxTV.org Project | 5983 | P: LinuxTV.org Project |
| 5984 | L: linux-media@vger.kernel.org | 5984 | L: linux-media@vger.kernel.org |
| 5985 | W: http://linuxtv.org | 5985 | W: http://linuxtv.org |
| @@ -8030,7 +8030,7 @@ S: Odd Fixes | |||
| 8030 | F: drivers/media/i2c/saa6588* | 8030 | F: drivers/media/i2c/saa6588* |
| 8031 | 8031 | ||
| 8032 | SAA7134 VIDEO4LINUX DRIVER | 8032 | SAA7134 VIDEO4LINUX DRIVER |
| 8033 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 8033 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 8034 | L: linux-media@vger.kernel.org | 8034 | L: linux-media@vger.kernel.org |
| 8035 | W: http://linuxtv.org | 8035 | W: http://linuxtv.org |
| 8036 | T: git git://linuxtv.org/media_tree.git | 8036 | T: git git://linuxtv.org/media_tree.git |
| @@ -8488,7 +8488,7 @@ S: Maintained | |||
| 8488 | F: drivers/media/radio/si4713/radio-usb-si4713.c | 8488 | F: drivers/media/radio/si4713/radio-usb-si4713.c |
| 8489 | 8489 | ||
| 8490 | SIANO DVB DRIVER | 8490 | SIANO DVB DRIVER |
| 8491 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 8491 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 8492 | L: linux-media@vger.kernel.org | 8492 | L: linux-media@vger.kernel.org |
| 8493 | W: http://linuxtv.org | 8493 | W: http://linuxtv.org |
| 8494 | T: git git://linuxtv.org/media_tree.git | 8494 | T: git git://linuxtv.org/media_tree.git |
| @@ -8699,7 +8699,9 @@ S: Maintained | |||
| 8699 | F: drivers/leds/leds-net48xx.c | 8699 | F: drivers/leds/leds-net48xx.c |
| 8700 | 8700 | ||
| 8701 | SOFTLOGIC 6x10 MPEG CODEC | 8701 | SOFTLOGIC 6x10 MPEG CODEC |
| 8702 | M: Ismael Luceno <ismael.luceno@corp.bluecherry.net> | 8702 | M: Bluecherry Maintainers <maintainers@bluecherrydvr.com> |
| 8703 | M: Andrey Utkin <andrey.utkin@corp.bluecherry.net> | ||
| 8704 | M: Andrey Utkin <andrey.krieger.utkin@gmail.com> | ||
| 8703 | L: linux-media@vger.kernel.org | 8705 | L: linux-media@vger.kernel.org |
| 8704 | S: Supported | 8706 | S: Supported |
| 8705 | F: drivers/media/pci/solo6x10/ | 8707 | F: drivers/media/pci/solo6x10/ |
| @@ -9173,7 +9175,7 @@ S: Maintained | |||
| 9173 | F: drivers/media/i2c/tda9840* | 9175 | F: drivers/media/i2c/tda9840* |
| 9174 | 9176 | ||
| 9175 | TEA5761 TUNER DRIVER | 9177 | TEA5761 TUNER DRIVER |
| 9176 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 9178 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 9177 | L: linux-media@vger.kernel.org | 9179 | L: linux-media@vger.kernel.org |
| 9178 | W: http://linuxtv.org | 9180 | W: http://linuxtv.org |
| 9179 | T: git git://linuxtv.org/media_tree.git | 9181 | T: git git://linuxtv.org/media_tree.git |
| @@ -9181,7 +9183,7 @@ S: Odd fixes | |||
| 9181 | F: drivers/media/tuners/tea5761.* | 9183 | F: drivers/media/tuners/tea5761.* |
| 9182 | 9184 | ||
| 9183 | TEA5767 TUNER DRIVER | 9185 | TEA5767 TUNER DRIVER |
| 9184 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 9186 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 9185 | L: linux-media@vger.kernel.org | 9187 | L: linux-media@vger.kernel.org |
| 9186 | W: http://linuxtv.org | 9188 | W: http://linuxtv.org |
| 9187 | T: git git://linuxtv.org/media_tree.git | 9189 | T: git git://linuxtv.org/media_tree.git |
| @@ -9493,7 +9495,7 @@ F: include/linux/shmem_fs.h | |||
| 9493 | F: mm/shmem.c | 9495 | F: mm/shmem.c |
| 9494 | 9496 | ||
| 9495 | TM6000 VIDEO4LINUX DRIVER | 9497 | TM6000 VIDEO4LINUX DRIVER |
| 9496 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 9498 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 9497 | L: linux-media@vger.kernel.org | 9499 | L: linux-media@vger.kernel.org |
| 9498 | W: http://linuxtv.org | 9500 | W: http://linuxtv.org |
| 9499 | T: git git://linuxtv.org/media_tree.git | 9501 | T: git git://linuxtv.org/media_tree.git |
| @@ -10314,7 +10316,7 @@ S: Maintained | |||
| 10314 | F: arch/x86/kernel/cpu/mcheck/* | 10316 | F: arch/x86/kernel/cpu/mcheck/* |
| 10315 | 10317 | ||
| 10316 | XC2028/3028 TUNER DRIVER | 10318 | XC2028/3028 TUNER DRIVER |
| 10317 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | 10319 | M: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| 10318 | L: linux-media@vger.kernel.org | 10320 | L: linux-media@vger.kernel.org |
| 10319 | W: http://linuxtv.org | 10321 | W: http://linuxtv.org |
| 10320 | T: git git://linuxtv.org/media_tree.git | 10322 | T: git git://linuxtv.org/media_tree.git |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 18 | 2 | PATCHLEVEL = 18 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc7 | 4 | EXTRAVERSION = |
| 5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c index dd1c24ceda50..3f51cf4e8f02 100644 --- a/arch/s390/kernel/nmi.c +++ b/arch/s390/kernel/nmi.c | |||
| @@ -54,12 +54,8 @@ void s390_handle_mcck(void) | |||
| 54 | */ | 54 | */ |
| 55 | local_irq_save(flags); | 55 | local_irq_save(flags); |
| 56 | local_mcck_disable(); | 56 | local_mcck_disable(); |
| 57 | /* | 57 | mcck = *this_cpu_ptr(&cpu_mcck); |
| 58 | * Ummm... Does this make sense at all? Copying the percpu struct | 58 | memset(this_cpu_ptr(&cpu_mcck), 0, sizeof(mcck)); |
| 59 | * and then zapping it one statement later? | ||
| 60 | */ | ||
| 61 | memcpy(&mcck, this_cpu_ptr(&cpu_mcck), sizeof(mcck)); | ||
| 62 | memset(&mcck, 0, sizeof(struct mcck_struct)); | ||
| 63 | clear_cpu_flag(CIF_MCCK_PENDING); | 59 | clear_cpu_flag(CIF_MCCK_PENDING); |
| 64 | local_mcck_enable(); | 60 | local_mcck_enable(); |
| 65 | local_irq_restore(flags); | 61 | local_irq_restore(flags); |
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index be1e07d4b596..45abc363dd3e 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
| @@ -76,7 +76,7 @@ suffix-$(CONFIG_KERNEL_XZ) := xz | |||
| 76 | suffix-$(CONFIG_KERNEL_LZO) := lzo | 76 | suffix-$(CONFIG_KERNEL_LZO) := lzo |
| 77 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 | 77 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 |
| 78 | 78 | ||
| 79 | RUN_SIZE = $(shell objdump -h vmlinux | \ | 79 | RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ |
| 80 | perl $(srctree)/arch/x86/tools/calc_run_size.pl) | 80 | perl $(srctree)/arch/x86/tools/calc_run_size.pl) |
| 81 | quiet_cmd_mkpiggy = MKPIGGY $@ | 81 | quiet_cmd_mkpiggy = MKPIGGY $@ |
| 82 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) | 82 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) |
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index 2ce9051174e6..08fe6e8a726e 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c | |||
| @@ -465,6 +465,7 @@ static void mc_bp_resume(void) | |||
| 465 | 465 | ||
| 466 | if (uci->valid && uci->mc) | 466 | if (uci->valid && uci->mc) |
| 467 | microcode_ops->apply_microcode(cpu); | 467 | microcode_ops->apply_microcode(cpu); |
| 468 | #ifdef CONFIG_X86_64 | ||
| 468 | else if (!uci->mc) | 469 | else if (!uci->mc) |
| 469 | /* | 470 | /* |
| 470 | * We might resume and not have applied late microcode but still | 471 | * We might resume and not have applied late microcode but still |
| @@ -473,6 +474,7 @@ static void mc_bp_resume(void) | |||
| 473 | * applying patches early on the APs. | 474 | * applying patches early on the APs. |
| 474 | */ | 475 | */ |
| 475 | load_ucode_ap(); | 476 | load_ucode_ap(); |
| 477 | #endif | ||
| 476 | } | 478 | } |
| 477 | 479 | ||
| 478 | static struct syscore_ops mc_syscore_ops = { | 480 | static struct syscore_ops mc_syscore_ops = { |
diff --git a/block/bio-integrity.c b/block/bio-integrity.c index 0984232e429f..5cbd5d9ea61d 100644 --- a/block/bio-integrity.c +++ b/block/bio-integrity.c | |||
| @@ -216,9 +216,10 @@ static int bio_integrity_process(struct bio *bio, | |||
| 216 | { | 216 | { |
| 217 | struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); | 217 | struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev); |
| 218 | struct blk_integrity_iter iter; | 218 | struct blk_integrity_iter iter; |
| 219 | struct bio_vec *bv; | 219 | struct bvec_iter bviter; |
| 220 | struct bio_vec bv; | ||
| 220 | struct bio_integrity_payload *bip = bio_integrity(bio); | 221 | struct bio_integrity_payload *bip = bio_integrity(bio); |
| 221 | unsigned int i, ret = 0; | 222 | unsigned int ret = 0; |
| 222 | void *prot_buf = page_address(bip->bip_vec->bv_page) + | 223 | void *prot_buf = page_address(bip->bip_vec->bv_page) + |
| 223 | bip->bip_vec->bv_offset; | 224 | bip->bip_vec->bv_offset; |
| 224 | 225 | ||
| @@ -227,11 +228,11 @@ static int bio_integrity_process(struct bio *bio, | |||
| 227 | iter.seed = bip_get_seed(bip); | 228 | iter.seed = bip_get_seed(bip); |
| 228 | iter.prot_buf = prot_buf; | 229 | iter.prot_buf = prot_buf; |
| 229 | 230 | ||
| 230 | bio_for_each_segment_all(bv, bio, i) { | 231 | bio_for_each_segment(bv, bio, bviter) { |
| 231 | void *kaddr = kmap_atomic(bv->bv_page); | 232 | void *kaddr = kmap_atomic(bv.bv_page); |
| 232 | 233 | ||
| 233 | iter.data_buf = kaddr + bv->bv_offset; | 234 | iter.data_buf = kaddr + bv.bv_offset; |
| 234 | iter.data_size = bv->bv_len; | 235 | iter.data_size = bv.bv_len; |
| 235 | 236 | ||
| 236 | ret = proc_fn(&iter); | 237 | ret = proc_fn(&iter); |
| 237 | if (ret) { | 238 | if (ret) { |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 807a88a0f394..9d75ead2a1f9 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -1164,7 +1164,8 @@ static bool acpi_video_device_in_dod(struct acpi_video_device *device) | |||
| 1164 | return true; | 1164 | return true; |
| 1165 | 1165 | ||
| 1166 | for (i = 0; i < video->attached_count; i++) { | 1166 | for (i = 0; i < video->attached_count; i++) { |
| 1167 | if (video->attached_array[i].bind_info == device) | 1167 | if ((video->attached_array[i].value.int_val & 0xfff) == |
| 1168 | (device->device_id & 0xfff)) | ||
| 1168 | return true; | 1169 | return true; |
| 1169 | } | 1170 | } |
| 1170 | 1171 | ||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index e45f83789809..49f1e6890587 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -321,6 +321,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 321 | { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */ | 321 | { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */ |
| 322 | { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */ | 322 | { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */ |
| 323 | { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */ | 323 | { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */ |
| 324 | { PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */ | ||
| 325 | { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */ | ||
| 326 | { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */ | ||
| 324 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */ | 327 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */ |
| 325 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */ | 328 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */ |
| 326 | { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */ | 329 | { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */ |
| @@ -492,6 +495,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 492 | * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731 | 495 | * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731 |
| 493 | */ | 496 | */ |
| 494 | { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi }, | 497 | { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi }, |
| 498 | { PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi }, | ||
| 495 | 499 | ||
| 496 | /* Enmotus */ | 500 | /* Enmotus */ |
| 497 | { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, | 501 | { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, |
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 07bc7e4dbd04..65071591b143 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
| @@ -1488,7 +1488,7 @@ static int sata_fsl_probe(struct platform_device *ofdev) | |||
| 1488 | host_priv->csr_base = csr_base; | 1488 | host_priv->csr_base = csr_base; |
| 1489 | 1489 | ||
| 1490 | irq = irq_of_parse_and_map(ofdev->dev.of_node, 0); | 1490 | irq = irq_of_parse_and_map(ofdev->dev.of_node, 0); |
| 1491 | if (irq < 0) { | 1491 | if (!irq) { |
| 1492 | dev_err(&ofdev->dev, "invalid irq from platform\n"); | 1492 | dev_err(&ofdev->dev, "invalid irq from platform\n"); |
| 1493 | goto error_exit_with_cleanup; | 1493 | goto error_exit_with_cleanup; |
| 1494 | } | 1494 | } |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 6289babd03b0..63247c64b1e0 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -4565,7 +4565,6 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc) | |||
| 4565 | ironlake_fdi_disable(crtc); | 4565 | ironlake_fdi_disable(crtc); |
| 4566 | 4566 | ||
| 4567 | ironlake_disable_pch_transcoder(dev_priv, pipe); | 4567 | ironlake_disable_pch_transcoder(dev_priv, pipe); |
| 4568 | intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true); | ||
| 4569 | 4568 | ||
| 4570 | if (HAS_PCH_CPT(dev)) { | 4569 | if (HAS_PCH_CPT(dev)) { |
| 4571 | /* disable TRANS_DP_CTL */ | 4570 | /* disable TRANS_DP_CTL */ |
| @@ -4636,8 +4635,6 @@ static void haswell_crtc_disable(struct drm_crtc *crtc) | |||
| 4636 | 4635 | ||
| 4637 | if (intel_crtc->config.has_pch_encoder) { | 4636 | if (intel_crtc->config.has_pch_encoder) { |
| 4638 | lpt_disable_pch_transcoder(dev_priv); | 4637 | lpt_disable_pch_transcoder(dev_priv); |
| 4639 | intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A, | ||
| 4640 | true); | ||
| 4641 | intel_ddi_fdi_disable(crtc); | 4638 | intel_ddi_fdi_disable(crtc); |
| 4642 | } | 4639 | } |
| 4643 | 4640 | ||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index c03d457a5150..14654d628ca4 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -899,6 +899,17 @@ void intel_lvds_init(struct drm_device *dev) | |||
| 899 | int pipe; | 899 | int pipe; |
| 900 | u8 pin; | 900 | u8 pin; |
| 901 | 901 | ||
| 902 | /* | ||
| 903 | * Unlock registers and just leave them unlocked. Do this before | ||
| 904 | * checking quirk lists to avoid bogus WARNINGs. | ||
| 905 | */ | ||
| 906 | if (HAS_PCH_SPLIT(dev)) { | ||
| 907 | I915_WRITE(PCH_PP_CONTROL, | ||
| 908 | I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS); | ||
| 909 | } else { | ||
| 910 | I915_WRITE(PP_CONTROL, | ||
| 911 | I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS); | ||
| 912 | } | ||
| 902 | if (!intel_lvds_supported(dev)) | 913 | if (!intel_lvds_supported(dev)) |
| 903 | return; | 914 | return; |
| 904 | 915 | ||
| @@ -1097,17 +1108,6 @@ out: | |||
| 1097 | lvds_encoder->a3_power = I915_READ(lvds_encoder->reg) & | 1108 | lvds_encoder->a3_power = I915_READ(lvds_encoder->reg) & |
| 1098 | LVDS_A3_POWER_MASK; | 1109 | LVDS_A3_POWER_MASK; |
| 1099 | 1110 | ||
| 1100 | /* | ||
| 1101 | * Unlock registers and just | ||
| 1102 | * leave them unlocked | ||
| 1103 | */ | ||
| 1104 | if (HAS_PCH_SPLIT(dev)) { | ||
| 1105 | I915_WRITE(PCH_PP_CONTROL, | ||
| 1106 | I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS); | ||
| 1107 | } else { | ||
| 1108 | I915_WRITE(PP_CONTROL, | ||
| 1109 | I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS); | ||
| 1110 | } | ||
| 1111 | lvds_connector->lid_notifier.notifier_call = intel_lid_notify; | 1111 | lvds_connector->lid_notifier.notifier_call = intel_lid_notify; |
| 1112 | if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) { | 1112 | if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) { |
| 1113 | DRM_DEBUG_KMS("lid notifier registration failed\n"); | 1113 | DRM_DEBUG_KMS("lid notifier registration failed\n"); |
diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c index cd05677ad4b7..72a40f95d048 100644 --- a/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c | |||
| @@ -218,7 +218,6 @@ nvc0_identify(struct nouveau_device *device) | |||
| 218 | device->oclass[NVDEV_ENGINE_BSP ] = &nvc0_bsp_oclass; | 218 | device->oclass[NVDEV_ENGINE_BSP ] = &nvc0_bsp_oclass; |
| 219 | device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; | 219 | device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; |
| 220 | device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass; | 220 | device->oclass[NVDEV_ENGINE_COPY0 ] = &nvc0_copy0_oclass; |
| 221 | device->oclass[NVDEV_ENGINE_COPY1 ] = &nvc0_copy1_oclass; | ||
| 222 | device->oclass[NVDEV_ENGINE_DISP ] = nva3_disp_oclass; | 221 | device->oclass[NVDEV_ENGINE_DISP ] = nva3_disp_oclass; |
| 223 | device->oclass[NVDEV_ENGINE_PERFMON] = &nvc0_perfmon_oclass; | 222 | device->oclass[NVDEV_ENGINE_PERFMON] = &nvc0_perfmon_oclass; |
| 224 | break; | 223 | break; |
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c index 5ae6a43893b5..1931057f9962 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nv04.c | |||
| @@ -551,8 +551,8 @@ nv04_fifo_intr(struct nouveau_subdev *subdev) | |||
| 551 | } | 551 | } |
| 552 | 552 | ||
| 553 | if (status & 0x40000000) { | 553 | if (status & 0x40000000) { |
| 554 | nouveau_fifo_uevent(&priv->base); | ||
| 555 | nv_wr32(priv, 0x002100, 0x40000000); | 554 | nv_wr32(priv, 0x002100, 0x40000000); |
| 555 | nouveau_fifo_uevent(&priv->base); | ||
| 556 | status &= ~0x40000000; | 556 | status &= ~0x40000000; |
| 557 | } | 557 | } |
| 558 | } | 558 | } |
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c index 1fe1f8fbda0c..074d434c3077 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c | |||
| @@ -740,6 +740,8 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn) | |||
| 740 | u32 inte = nv_rd32(priv, 0x002628); | 740 | u32 inte = nv_rd32(priv, 0x002628); |
| 741 | u32 unkn; | 741 | u32 unkn; |
| 742 | 742 | ||
| 743 | nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr); | ||
| 744 | |||
| 743 | for (unkn = 0; unkn < 8; unkn++) { | 745 | for (unkn = 0; unkn < 8; unkn++) { |
| 744 | u32 ints = (intr >> (unkn * 0x04)) & inte; | 746 | u32 ints = (intr >> (unkn * 0x04)) & inte; |
| 745 | if (ints & 0x1) { | 747 | if (ints & 0x1) { |
| @@ -751,8 +753,6 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn) | |||
| 751 | nv_mask(priv, 0x002628, ints, 0); | 753 | nv_mask(priv, 0x002628, ints, 0); |
| 752 | } | 754 | } |
| 753 | } | 755 | } |
| 754 | |||
| 755 | nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr); | ||
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | static void | 758 | static void |
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c index fc9ef663f25a..6a8db7c80bd1 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c | |||
| @@ -982,8 +982,8 @@ nve0_fifo_intr(struct nouveau_subdev *subdev) | |||
| 982 | } | 982 | } |
| 983 | 983 | ||
| 984 | if (stat & 0x80000000) { | 984 | if (stat & 0x80000000) { |
| 985 | nve0_fifo_intr_engine(priv); | ||
| 986 | nv_wr32(priv, 0x002100, 0x80000000); | 985 | nv_wr32(priv, 0x002100, 0x80000000); |
| 986 | nve0_fifo_intr_engine(priv); | ||
| 987 | stat &= ~0x80000000; | 987 | stat &= ~0x80000000; |
| 988 | } | 988 | } |
| 989 | 989 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index afb93bb72f97..65910e3aed0c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c | |||
| @@ -664,7 +664,6 @@ nouveau_pmops_suspend(struct device *dev) | |||
| 664 | 664 | ||
| 665 | pci_save_state(pdev); | 665 | pci_save_state(pdev); |
| 666 | pci_disable_device(pdev); | 666 | pci_disable_device(pdev); |
| 667 | pci_ignore_hotplug(pdev); | ||
| 668 | pci_set_power_state(pdev, PCI_D3hot); | 667 | pci_set_power_state(pdev, PCI_D3hot); |
| 669 | return 0; | 668 | return 0; |
| 670 | } | 669 | } |
| @@ -732,6 +731,7 @@ nouveau_pmops_runtime_suspend(struct device *dev) | |||
| 732 | ret = nouveau_do_suspend(drm_dev, true); | 731 | ret = nouveau_do_suspend(drm_dev, true); |
| 733 | pci_save_state(pdev); | 732 | pci_save_state(pdev); |
| 734 | pci_disable_device(pdev); | 733 | pci_disable_device(pdev); |
| 734 | pci_ignore_hotplug(pdev); | ||
| 735 | pci_set_power_state(pdev, PCI_D3cold); | 735 | pci_set_power_state(pdev, PCI_D3cold); |
| 736 | drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; | 736 | drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; |
| 737 | return ret; | 737 | return ret; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index 515cd9aebb99..f32a434724e3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c | |||
| @@ -52,20 +52,24 @@ nouveau_fctx(struct nouveau_fence *fence) | |||
| 52 | return container_of(fence->base.lock, struct nouveau_fence_chan, lock); | 52 | return container_of(fence->base.lock, struct nouveau_fence_chan, lock); |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | static void | 55 | static int |
| 56 | nouveau_fence_signal(struct nouveau_fence *fence) | 56 | nouveau_fence_signal(struct nouveau_fence *fence) |
| 57 | { | 57 | { |
| 58 | int drop = 0; | ||
| 59 | |||
| 58 | fence_signal_locked(&fence->base); | 60 | fence_signal_locked(&fence->base); |
| 59 | list_del(&fence->head); | 61 | list_del(&fence->head); |
| 62 | rcu_assign_pointer(fence->channel, NULL); | ||
| 60 | 63 | ||
| 61 | if (test_bit(FENCE_FLAG_USER_BITS, &fence->base.flags)) { | 64 | if (test_bit(FENCE_FLAG_USER_BITS, &fence->base.flags)) { |
| 62 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); | 65 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); |
| 63 | 66 | ||
| 64 | if (!--fctx->notify_ref) | 67 | if (!--fctx->notify_ref) |
| 65 | nvif_notify_put(&fctx->notify); | 68 | drop = 1; |
| 66 | } | 69 | } |
| 67 | 70 | ||
| 68 | fence_put(&fence->base); | 71 | fence_put(&fence->base); |
| 72 | return drop; | ||
| 69 | } | 73 | } |
| 70 | 74 | ||
| 71 | static struct nouveau_fence * | 75 | static struct nouveau_fence * |
| @@ -88,16 +92,23 @@ nouveau_fence_context_del(struct nouveau_fence_chan *fctx) | |||
| 88 | { | 92 | { |
| 89 | struct nouveau_fence *fence; | 93 | struct nouveau_fence *fence; |
| 90 | 94 | ||
| 91 | nvif_notify_fini(&fctx->notify); | ||
| 92 | |||
| 93 | spin_lock_irq(&fctx->lock); | 95 | spin_lock_irq(&fctx->lock); |
| 94 | while (!list_empty(&fctx->pending)) { | 96 | while (!list_empty(&fctx->pending)) { |
| 95 | fence = list_entry(fctx->pending.next, typeof(*fence), head); | 97 | fence = list_entry(fctx->pending.next, typeof(*fence), head); |
| 96 | 98 | ||
| 97 | nouveau_fence_signal(fence); | 99 | if (nouveau_fence_signal(fence)) |
| 98 | fence->channel = NULL; | 100 | nvif_notify_put(&fctx->notify); |
| 99 | } | 101 | } |
| 100 | spin_unlock_irq(&fctx->lock); | 102 | spin_unlock_irq(&fctx->lock); |
| 103 | |||
| 104 | nvif_notify_fini(&fctx->notify); | ||
| 105 | fctx->dead = 1; | ||
| 106 | |||
| 107 | /* | ||
| 108 | * Ensure that all accesses to fence->channel complete before freeing | ||
| 109 | * the channel. | ||
| 110 | */ | ||
| 111 | synchronize_rcu(); | ||
| 101 | } | 112 | } |
| 102 | 113 | ||
| 103 | static void | 114 | static void |
| @@ -112,21 +123,23 @@ nouveau_fence_context_free(struct nouveau_fence_chan *fctx) | |||
| 112 | kref_put(&fctx->fence_ref, nouveau_fence_context_put); | 123 | kref_put(&fctx->fence_ref, nouveau_fence_context_put); |
| 113 | } | 124 | } |
| 114 | 125 | ||
| 115 | static void | 126 | static int |
| 116 | nouveau_fence_update(struct nouveau_channel *chan, struct nouveau_fence_chan *fctx) | 127 | nouveau_fence_update(struct nouveau_channel *chan, struct nouveau_fence_chan *fctx) |
| 117 | { | 128 | { |
| 118 | struct nouveau_fence *fence; | 129 | struct nouveau_fence *fence; |
| 119 | 130 | int drop = 0; | |
| 120 | u32 seq = fctx->read(chan); | 131 | u32 seq = fctx->read(chan); |
| 121 | 132 | ||
| 122 | while (!list_empty(&fctx->pending)) { | 133 | while (!list_empty(&fctx->pending)) { |
| 123 | fence = list_entry(fctx->pending.next, typeof(*fence), head); | 134 | fence = list_entry(fctx->pending.next, typeof(*fence), head); |
| 124 | 135 | ||
| 125 | if ((int)(seq - fence->base.seqno) < 0) | 136 | if ((int)(seq - fence->base.seqno) < 0) |
| 126 | return; | 137 | break; |
| 127 | 138 | ||
| 128 | nouveau_fence_signal(fence); | 139 | drop |= nouveau_fence_signal(fence); |
| 129 | } | 140 | } |
| 141 | |||
| 142 | return drop; | ||
| 130 | } | 143 | } |
| 131 | 144 | ||
| 132 | static int | 145 | static int |
| @@ -135,18 +148,21 @@ nouveau_fence_wait_uevent_handler(struct nvif_notify *notify) | |||
| 135 | struct nouveau_fence_chan *fctx = | 148 | struct nouveau_fence_chan *fctx = |
| 136 | container_of(notify, typeof(*fctx), notify); | 149 | container_of(notify, typeof(*fctx), notify); |
| 137 | unsigned long flags; | 150 | unsigned long flags; |
| 151 | int ret = NVIF_NOTIFY_KEEP; | ||
| 138 | 152 | ||
| 139 | spin_lock_irqsave(&fctx->lock, flags); | 153 | spin_lock_irqsave(&fctx->lock, flags); |
| 140 | if (!list_empty(&fctx->pending)) { | 154 | if (!list_empty(&fctx->pending)) { |
| 141 | struct nouveau_fence *fence; | 155 | struct nouveau_fence *fence; |
| 156 | struct nouveau_channel *chan; | ||
| 142 | 157 | ||
| 143 | fence = list_entry(fctx->pending.next, typeof(*fence), head); | 158 | fence = list_entry(fctx->pending.next, typeof(*fence), head); |
| 144 | nouveau_fence_update(fence->channel, fctx); | 159 | chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock)); |
| 160 | if (nouveau_fence_update(fence->channel, fctx)) | ||
| 161 | ret = NVIF_NOTIFY_DROP; | ||
| 145 | } | 162 | } |
| 146 | spin_unlock_irqrestore(&fctx->lock, flags); | 163 | spin_unlock_irqrestore(&fctx->lock, flags); |
| 147 | 164 | ||
| 148 | /* Always return keep here. NVIF refcount is handled with nouveau_fence_update */ | 165 | return ret; |
| 149 | return NVIF_NOTIFY_KEEP; | ||
| 150 | } | 166 | } |
| 151 | 167 | ||
| 152 | void | 168 | void |
| @@ -262,7 +278,10 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan) | |||
| 262 | if (!ret) { | 278 | if (!ret) { |
| 263 | fence_get(&fence->base); | 279 | fence_get(&fence->base); |
| 264 | spin_lock_irq(&fctx->lock); | 280 | spin_lock_irq(&fctx->lock); |
| 265 | nouveau_fence_update(chan, fctx); | 281 | |
| 282 | if (nouveau_fence_update(chan, fctx)) | ||
| 283 | nvif_notify_put(&fctx->notify); | ||
| 284 | |||
| 266 | list_add_tail(&fence->head, &fctx->pending); | 285 | list_add_tail(&fence->head, &fctx->pending); |
| 267 | spin_unlock_irq(&fctx->lock); | 286 | spin_unlock_irq(&fctx->lock); |
| 268 | } | 287 | } |
| @@ -276,13 +295,16 @@ nouveau_fence_done(struct nouveau_fence *fence) | |||
| 276 | if (fence->base.ops == &nouveau_fence_ops_legacy || | 295 | if (fence->base.ops == &nouveau_fence_ops_legacy || |
| 277 | fence->base.ops == &nouveau_fence_ops_uevent) { | 296 | fence->base.ops == &nouveau_fence_ops_uevent) { |
| 278 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); | 297 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); |
| 298 | struct nouveau_channel *chan; | ||
| 279 | unsigned long flags; | 299 | unsigned long flags; |
| 280 | 300 | ||
| 281 | if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags)) | 301 | if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags)) |
| 282 | return true; | 302 | return true; |
| 283 | 303 | ||
| 284 | spin_lock_irqsave(&fctx->lock, flags); | 304 | spin_lock_irqsave(&fctx->lock, flags); |
| 285 | nouveau_fence_update(fence->channel, fctx); | 305 | chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock)); |
| 306 | if (chan && nouveau_fence_update(chan, fctx)) | ||
| 307 | nvif_notify_put(&fctx->notify); | ||
| 286 | spin_unlock_irqrestore(&fctx->lock, flags); | 308 | spin_unlock_irqrestore(&fctx->lock, flags); |
| 287 | } | 309 | } |
| 288 | return fence_is_signaled(&fence->base); | 310 | return fence_is_signaled(&fence->base); |
| @@ -387,12 +409,18 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e | |||
| 387 | 409 | ||
| 388 | if (fence && (!exclusive || !fobj || !fobj->shared_count)) { | 410 | if (fence && (!exclusive || !fobj || !fobj->shared_count)) { |
| 389 | struct nouveau_channel *prev = NULL; | 411 | struct nouveau_channel *prev = NULL; |
| 412 | bool must_wait = true; | ||
| 390 | 413 | ||
| 391 | f = nouveau_local_fence(fence, chan->drm); | 414 | f = nouveau_local_fence(fence, chan->drm); |
| 392 | if (f) | 415 | if (f) { |
| 393 | prev = f->channel; | 416 | rcu_read_lock(); |
| 417 | prev = rcu_dereference(f->channel); | ||
| 418 | if (prev && (prev == chan || fctx->sync(f, prev, chan) == 0)) | ||
| 419 | must_wait = false; | ||
| 420 | rcu_read_unlock(); | ||
| 421 | } | ||
| 394 | 422 | ||
| 395 | if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan)))) | 423 | if (must_wait) |
| 396 | ret = fence_wait(fence, intr); | 424 | ret = fence_wait(fence, intr); |
| 397 | 425 | ||
| 398 | return ret; | 426 | return ret; |
| @@ -403,19 +431,22 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e | |||
| 403 | 431 | ||
| 404 | for (i = 0; i < fobj->shared_count && !ret; ++i) { | 432 | for (i = 0; i < fobj->shared_count && !ret; ++i) { |
| 405 | struct nouveau_channel *prev = NULL; | 433 | struct nouveau_channel *prev = NULL; |
| 434 | bool must_wait = true; | ||
| 406 | 435 | ||
| 407 | fence = rcu_dereference_protected(fobj->shared[i], | 436 | fence = rcu_dereference_protected(fobj->shared[i], |
| 408 | reservation_object_held(resv)); | 437 | reservation_object_held(resv)); |
| 409 | 438 | ||
| 410 | f = nouveau_local_fence(fence, chan->drm); | 439 | f = nouveau_local_fence(fence, chan->drm); |
| 411 | if (f) | 440 | if (f) { |
| 412 | prev = f->channel; | 441 | rcu_read_lock(); |
| 442 | prev = rcu_dereference(f->channel); | ||
| 443 | if (prev && (prev == chan || fctx->sync(f, prev, chan) == 0)) | ||
| 444 | must_wait = false; | ||
| 445 | rcu_read_unlock(); | ||
| 446 | } | ||
| 413 | 447 | ||
| 414 | if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan)))) | 448 | if (must_wait) |
| 415 | ret = fence_wait(fence, intr); | 449 | ret = fence_wait(fence, intr); |
| 416 | |||
| 417 | if (ret) | ||
| 418 | break; | ||
| 419 | } | 450 | } |
| 420 | 451 | ||
| 421 | return ret; | 452 | return ret; |
| @@ -463,7 +494,7 @@ static const char *nouveau_fence_get_timeline_name(struct fence *f) | |||
| 463 | struct nouveau_fence *fence = from_fence(f); | 494 | struct nouveau_fence *fence = from_fence(f); |
| 464 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); | 495 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); |
| 465 | 496 | ||
| 466 | return fence->channel ? fctx->name : "dead channel"; | 497 | return !fctx->dead ? fctx->name : "dead channel"; |
| 467 | } | 498 | } |
| 468 | 499 | ||
| 469 | /* | 500 | /* |
| @@ -476,9 +507,16 @@ static bool nouveau_fence_is_signaled(struct fence *f) | |||
| 476 | { | 507 | { |
| 477 | struct nouveau_fence *fence = from_fence(f); | 508 | struct nouveau_fence *fence = from_fence(f); |
| 478 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); | 509 | struct nouveau_fence_chan *fctx = nouveau_fctx(fence); |
| 479 | struct nouveau_channel *chan = fence->channel; | 510 | struct nouveau_channel *chan; |
| 511 | bool ret = false; | ||
| 512 | |||
| 513 | rcu_read_lock(); | ||
| 514 | chan = rcu_dereference(fence->channel); | ||
| 515 | if (chan) | ||
| 516 | ret = (int)(fctx->read(chan) - fence->base.seqno) >= 0; | ||
| 517 | rcu_read_unlock(); | ||
| 480 | 518 | ||
| 481 | return (int)(fctx->read(chan) - fence->base.seqno) >= 0; | 519 | return ret; |
| 482 | } | 520 | } |
| 483 | 521 | ||
| 484 | static bool nouveau_fence_no_signaling(struct fence *f) | 522 | static bool nouveau_fence_no_signaling(struct fence *f) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.h b/drivers/gpu/drm/nouveau/nouveau_fence.h index 943b0b17b1fc..96e461c6f68f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.h +++ b/drivers/gpu/drm/nouveau/nouveau_fence.h | |||
| @@ -14,7 +14,7 @@ struct nouveau_fence { | |||
| 14 | 14 | ||
| 15 | bool sysmem; | 15 | bool sysmem; |
| 16 | 16 | ||
| 17 | struct nouveau_channel *channel; | 17 | struct nouveau_channel __rcu *channel; |
| 18 | unsigned long timeout; | 18 | unsigned long timeout; |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| @@ -47,7 +47,7 @@ struct nouveau_fence_chan { | |||
| 47 | char name[32]; | 47 | char name[32]; |
| 48 | 48 | ||
| 49 | struct nvif_notify notify; | 49 | struct nvif_notify notify; |
| 50 | int notify_ref; | 50 | int notify_ref, dead; |
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| 53 | struct nouveau_fence_priv { | 53 | struct nouveau_fence_priv { |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 9648e28c4501..c830863bc98a 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -241,7 +241,6 @@ static int radeon_cs_sync_rings(struct radeon_cs_parser *p) | |||
| 241 | resv = reloc->robj->tbo.resv; | 241 | resv = reloc->robj->tbo.resv; |
| 242 | r = radeon_sync_resv(p->rdev, &p->ib.sync, resv, | 242 | r = radeon_sync_resv(p->rdev, &p->ib.sync, resv, |
| 243 | reloc->tv.shared); | 243 | reloc->tv.shared); |
| 244 | |||
| 245 | if (r) | 244 | if (r) |
| 246 | return r; | 245 | return r; |
| 247 | } | 246 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index f4dd26ae33e5..3cf9c1fa6475 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -800,6 +800,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc, | |||
| 800 | 800 | ||
| 801 | /* Get associated drm_crtc: */ | 801 | /* Get associated drm_crtc: */ |
| 802 | drmcrtc = &rdev->mode_info.crtcs[crtc]->base; | 802 | drmcrtc = &rdev->mode_info.crtcs[crtc]->base; |
| 803 | if (!drmcrtc) | ||
| 804 | return -EINVAL; | ||
| 803 | 805 | ||
| 804 | /* Helper routine in DRM core does all the work: */ | 806 | /* Helper routine in DRM core does all the work: */ |
| 805 | return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, | 807 | return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 0a8ef9ef1519..7d68223eb469 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -233,6 +233,13 @@ int radeon_bo_create(struct radeon_device *rdev, | |||
| 233 | if (!(rdev->flags & RADEON_IS_PCIE)) | 233 | if (!(rdev->flags & RADEON_IS_PCIE)) |
| 234 | bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC); | 234 | bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC); |
| 235 | 235 | ||
| 236 | #ifdef CONFIG_X86_32 | ||
| 237 | /* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit | ||
| 238 | * See https://bugs.freedesktop.org/show_bug.cgi?id=84627 | ||
| 239 | */ | ||
| 240 | bo->flags &= ~RADEON_GEM_GTT_WC; | ||
| 241 | #endif | ||
| 242 | |||
| 236 | radeon_ttm_placement_from_domain(bo, domain); | 243 | radeon_ttm_placement_from_domain(bo, domain); |
| 237 | /* Kernel allocation are uninterruptible */ | 244 | /* Kernel allocation are uninterruptible */ |
| 238 | down_read(&rdev->pm.mclk_lock); | 245 | down_read(&rdev->pm.mclk_lock); |
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index 63f3f03ecc9b..c604f4c3ac0d 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c | |||
| @@ -111,6 +111,8 @@ | |||
| 111 | #define CDNS_I2C_DIVA_MAX 4 | 111 | #define CDNS_I2C_DIVA_MAX 4 |
| 112 | #define CDNS_I2C_DIVB_MAX 64 | 112 | #define CDNS_I2C_DIVB_MAX 64 |
| 113 | 113 | ||
| 114 | #define CDNS_I2C_TIMEOUT_MAX 0xFF | ||
| 115 | |||
| 114 | #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset) | 116 | #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset) |
| 115 | #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset) | 117 | #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset) |
| 116 | 118 | ||
| @@ -852,6 +854,15 @@ static int cdns_i2c_probe(struct platform_device *pdev) | |||
| 852 | goto err_clk_dis; | 854 | goto err_clk_dis; |
| 853 | } | 855 | } |
| 854 | 856 | ||
| 857 | /* | ||
| 858 | * Cadence I2C controller has a bug wherein it generates | ||
| 859 | * invalid read transaction after HW timeout in master receiver mode. | ||
| 860 | * HW timeout is not used by this driver and the interrupt is disabled. | ||
| 861 | * But the feature itself cannot be disabled. Hence maximum value | ||
| 862 | * is written to this register to reduce the chances of error. | ||
| 863 | */ | ||
| 864 | cdns_i2c_writereg(CDNS_I2C_TIMEOUT_MAX, CDNS_I2C_TIME_OUT_OFFSET); | ||
| 865 | |||
| 855 | dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n", | 866 | dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n", |
| 856 | id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq); | 867 | id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq); |
| 857 | 868 | ||
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index d15b7c9b9219..01f0cd87a4a5 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c | |||
| @@ -407,11 +407,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) | |||
| 407 | if (dev->cmd_err & DAVINCI_I2C_STR_NACK) { | 407 | if (dev->cmd_err & DAVINCI_I2C_STR_NACK) { |
| 408 | if (msg->flags & I2C_M_IGNORE_NAK) | 408 | if (msg->flags & I2C_M_IGNORE_NAK) |
| 409 | return msg->len; | 409 | return msg->len; |
| 410 | if (stop) { | 410 | w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); |
| 411 | w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); | 411 | w |= DAVINCI_I2C_MDR_STP; |
| 412 | w |= DAVINCI_I2C_MDR_STP; | 412 | davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); |
| 413 | davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); | ||
| 414 | } | ||
| 415 | return -EREMOTEIO; | 413 | return -EREMOTEIO; |
| 416 | } | 414 | } |
| 417 | return -EIO; | 415 | return -EIO; |
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index edca99dbba23..23628b7bfb8d 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
| @@ -359,7 +359,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 359 | } | 359 | } |
| 360 | 360 | ||
| 361 | /* Configure Tx/Rx FIFO threshold levels */ | 361 | /* Configure Tx/Rx FIFO threshold levels */ |
| 362 | dw_writel(dev, dev->tx_fifo_depth - 1, DW_IC_TX_TL); | 362 | dw_writel(dev, dev->tx_fifo_depth / 2, DW_IC_TX_TL); |
| 363 | dw_writel(dev, 0, DW_IC_RX_TL); | 363 | dw_writel(dev, 0, DW_IC_RX_TL); |
| 364 | 364 | ||
| 365 | /* configure the i2c master */ | 365 | /* configure the i2c master */ |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 26942c159de1..277a2288d4a8 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -922,14 +922,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) | |||
| 922 | if (stat & OMAP_I2C_STAT_NACK) { | 922 | if (stat & OMAP_I2C_STAT_NACK) { |
| 923 | err |= OMAP_I2C_STAT_NACK; | 923 | err |= OMAP_I2C_STAT_NACK; |
| 924 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); | 924 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); |
| 925 | break; | ||
| 926 | } | 925 | } |
| 927 | 926 | ||
| 928 | if (stat & OMAP_I2C_STAT_AL) { | 927 | if (stat & OMAP_I2C_STAT_AL) { |
| 929 | dev_err(dev->dev, "Arbitration lost\n"); | 928 | dev_err(dev->dev, "Arbitration lost\n"); |
| 930 | err |= OMAP_I2C_STAT_AL; | 929 | err |= OMAP_I2C_STAT_AL; |
| 931 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL); | 930 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL); |
| 932 | break; | ||
| 933 | } | 931 | } |
| 934 | 932 | ||
| 935 | /* | 933 | /* |
| @@ -954,11 +952,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) | |||
| 954 | if (dev->fifo_size) | 952 | if (dev->fifo_size) |
| 955 | num_bytes = dev->buf_len; | 953 | num_bytes = dev->buf_len; |
| 956 | 954 | ||
| 957 | omap_i2c_receive_data(dev, num_bytes, true); | 955 | if (dev->errata & I2C_OMAP_ERRATA_I207) { |
| 958 | |||
| 959 | if (dev->errata & I2C_OMAP_ERRATA_I207) | ||
| 960 | i2c_omap_errata_i207(dev, stat); | 956 | i2c_omap_errata_i207(dev, stat); |
| 957 | num_bytes = (omap_i2c_read_reg(dev, | ||
| 958 | OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F; | ||
| 959 | } | ||
| 961 | 960 | ||
| 961 | omap_i2c_receive_data(dev, num_bytes, true); | ||
| 962 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); | 962 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); |
| 963 | continue; | 963 | continue; |
| 964 | } | 964 | } |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index bc203485716d..8afa28e4570e 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
| @@ -421,7 +421,7 @@ static int evdev_open(struct inode *inode, struct file *file) | |||
| 421 | 421 | ||
| 422 | err_free_client: | 422 | err_free_client: |
| 423 | evdev_detach_client(evdev, client); | 423 | evdev_detach_client(evdev, client); |
| 424 | kfree(client); | 424 | kvfree(client); |
| 425 | return error; | 425 | return error; |
| 426 | } | 426 | } |
| 427 | 427 | ||
diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c index 932ed9be9ff3..b10aaeda2bb4 100644 --- a/drivers/media/i2c/smiapp/smiapp-core.c +++ b/drivers/media/i2c/smiapp/smiapp-core.c | |||
| @@ -2190,7 +2190,7 @@ static int smiapp_set_selection(struct v4l2_subdev *subdev, | |||
| 2190 | ret = smiapp_set_compose(subdev, fh, sel); | 2190 | ret = smiapp_set_compose(subdev, fh, sel); |
| 2191 | break; | 2191 | break; |
| 2192 | default: | 2192 | default: |
| 2193 | BUG(); | 2193 | ret = -EINVAL; |
| 2194 | } | 2194 | } |
| 2195 | 2195 | ||
| 2196 | mutex_unlock(&sensor->mutex); | 2196 | mutex_unlock(&sensor->mutex); |
diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c index 331eddac7222..3bd386c371f7 100644 --- a/drivers/media/pci/cx23885/cx23885-core.c +++ b/drivers/media/pci/cx23885/cx23885-core.c | |||
| @@ -1078,7 +1078,7 @@ static __le32 *cx23885_risc_field(__le32 *rp, struct scatterlist *sglist, | |||
| 1078 | for (line = 0; line < lines; line++) { | 1078 | for (line = 0; line < lines; line++) { |
| 1079 | while (offset && offset >= sg_dma_len(sg)) { | 1079 | while (offset && offset >= sg_dma_len(sg)) { |
| 1080 | offset -= sg_dma_len(sg); | 1080 | offset -= sg_dma_len(sg); |
| 1081 | sg++; | 1081 | sg = sg_next(sg); |
| 1082 | } | 1082 | } |
| 1083 | 1083 | ||
| 1084 | if (lpi && line > 0 && !(line % lpi)) | 1084 | if (lpi && line > 0 && !(line % lpi)) |
| @@ -1101,14 +1101,14 @@ static __le32 *cx23885_risc_field(__le32 *rp, struct scatterlist *sglist, | |||
| 1101 | *(rp++) = cpu_to_le32(0); /* bits 63-32 */ | 1101 | *(rp++) = cpu_to_le32(0); /* bits 63-32 */ |
| 1102 | todo -= (sg_dma_len(sg)-offset); | 1102 | todo -= (sg_dma_len(sg)-offset); |
| 1103 | offset = 0; | 1103 | offset = 0; |
| 1104 | sg++; | 1104 | sg = sg_next(sg); |
| 1105 | while (todo > sg_dma_len(sg)) { | 1105 | while (todo > sg_dma_len(sg)) { |
| 1106 | *(rp++) = cpu_to_le32(RISC_WRITE| | 1106 | *(rp++) = cpu_to_le32(RISC_WRITE| |
| 1107 | sg_dma_len(sg)); | 1107 | sg_dma_len(sg)); |
| 1108 | *(rp++) = cpu_to_le32(sg_dma_address(sg)); | 1108 | *(rp++) = cpu_to_le32(sg_dma_address(sg)); |
| 1109 | *(rp++) = cpu_to_le32(0); /* bits 63-32 */ | 1109 | *(rp++) = cpu_to_le32(0); /* bits 63-32 */ |
| 1110 | todo -= sg_dma_len(sg); | 1110 | todo -= sg_dma_len(sg); |
| 1111 | sg++; | 1111 | sg = sg_next(sg); |
| 1112 | } | 1112 | } |
| 1113 | *(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo); | 1113 | *(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo); |
| 1114 | *(rp++) = cpu_to_le32(sg_dma_address(sg)); | 1114 | *(rp++) = cpu_to_le32(sg_dma_address(sg)); |
diff --git a/drivers/media/pci/solo6x10/solo6x10-core.c b/drivers/media/pci/solo6x10/solo6x10-core.c index 172583d736fe..8cbe6b49f4c2 100644 --- a/drivers/media/pci/solo6x10/solo6x10-core.c +++ b/drivers/media/pci/solo6x10/solo6x10-core.c | |||
| @@ -105,11 +105,8 @@ static irqreturn_t solo_isr(int irq, void *data) | |||
| 105 | if (!status) | 105 | if (!status) |
| 106 | return IRQ_NONE; | 106 | return IRQ_NONE; |
| 107 | 107 | ||
| 108 | if (status & ~solo_dev->irq_mask) { | 108 | /* Acknowledge all interrupts immediately */ |
| 109 | solo_reg_write(solo_dev, SOLO_IRQ_STAT, | 109 | solo_reg_write(solo_dev, SOLO_IRQ_STAT, status); |
| 110 | status & ~solo_dev->irq_mask); | ||
| 111 | status &= solo_dev->irq_mask; | ||
| 112 | } | ||
| 113 | 110 | ||
| 114 | if (status & SOLO_IRQ_PCI_ERR) | 111 | if (status & SOLO_IRQ_PCI_ERR) |
| 115 | solo_p2m_error_isr(solo_dev); | 112 | solo_p2m_error_isr(solo_dev); |
| @@ -132,9 +129,6 @@ static irqreturn_t solo_isr(int irq, void *data) | |||
| 132 | if (status & SOLO_IRQ_G723) | 129 | if (status & SOLO_IRQ_G723) |
| 133 | solo_g723_isr(solo_dev); | 130 | solo_g723_isr(solo_dev); |
| 134 | 131 | ||
| 135 | /* Clear all interrupts handled */ | ||
| 136 | solo_reg_write(solo_dev, SOLO_IRQ_STAT, status); | ||
| 137 | |||
| 138 | return IRQ_HANDLED; | 132 | return IRQ_HANDLED; |
| 139 | } | 133 | } |
| 140 | 134 | ||
diff --git a/drivers/media/rc/ir-rc6-decoder.c b/drivers/media/rc/ir-rc6-decoder.c index f1f098e22f7e..d16bc67af732 100644 --- a/drivers/media/rc/ir-rc6-decoder.c +++ b/drivers/media/rc/ir-rc6-decoder.c | |||
| @@ -259,8 +259,8 @@ again: | |||
| 259 | case 32: | 259 | case 32: |
| 260 | if ((scancode & RC6_6A_LCC_MASK) == RC6_6A_MCE_CC) { | 260 | if ((scancode & RC6_6A_LCC_MASK) == RC6_6A_MCE_CC) { |
| 261 | protocol = RC_TYPE_RC6_MCE; | 261 | protocol = RC_TYPE_RC6_MCE; |
| 262 | scancode &= ~RC6_6A_MCE_TOGGLE_MASK; | ||
| 263 | toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK); | 262 | toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK); |
| 263 | scancode &= ~RC6_6A_MCE_TOGGLE_MASK; | ||
| 264 | } else { | 264 | } else { |
| 265 | protocol = RC_BIT_RC6_6A_32; | 265 | protocol = RC_BIT_RC6_6A_32; |
| 266 | toggle = 0; | 266 | toggle = 0; |
diff --git a/drivers/media/usb/s2255/s2255drv.c b/drivers/media/usb/s2255/s2255drv.c index ccc00099b261..1c0dbf428a3a 100644 --- a/drivers/media/usb/s2255/s2255drv.c +++ b/drivers/media/usb/s2255/s2255drv.c | |||
| @@ -632,7 +632,7 @@ static void s2255_fillbuff(struct s2255_vc *vc, | |||
| 632 | break; | 632 | break; |
| 633 | case V4L2_PIX_FMT_JPEG: | 633 | case V4L2_PIX_FMT_JPEG: |
| 634 | case V4L2_PIX_FMT_MJPEG: | 634 | case V4L2_PIX_FMT_MJPEG: |
| 635 | buf->vb.v4l2_buf.length = jpgsize; | 635 | vb2_set_plane_payload(&buf->vb, 0, jpgsize); |
| 636 | memcpy(vbuf, tmpbuf, jpgsize); | 636 | memcpy(vbuf, tmpbuf, jpgsize); |
| 637 | break; | 637 | break; |
| 638 | case V4L2_PIX_FMT_YUV422P: | 638 | case V4L2_PIX_FMT_YUV422P: |
diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c index c13d83e15ace..45f09a66e6c9 100644 --- a/drivers/net/bonding/bond_netlink.c +++ b/drivers/net/bonding/bond_netlink.c | |||
| @@ -225,7 +225,12 @@ static int bond_changelink(struct net_device *bond_dev, | |||
| 225 | 225 | ||
| 226 | bond_option_arp_ip_targets_clear(bond); | 226 | bond_option_arp_ip_targets_clear(bond); |
| 227 | nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) { | 227 | nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) { |
| 228 | __be32 target = nla_get_be32(attr); | 228 | __be32 target; |
| 229 | |||
| 230 | if (nla_len(attr) < sizeof(target)) | ||
| 231 | return -EINVAL; | ||
| 232 | |||
| 233 | target = nla_get_be32(attr); | ||
| 229 | 234 | ||
| 230 | bond_opt_initval(&newval, (__force u64)target); | 235 | bond_opt_initval(&newval, (__force u64)target); |
| 231 | err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS, | 236 | err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 8520d5529df8..279873cb6e3a 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -2442,9 +2442,13 @@ static unsigned int from_fw_linkcaps(unsigned int type, unsigned int caps) | |||
| 2442 | SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full | | 2442 | SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full | |
| 2443 | SUPPORTED_10000baseKX4_Full; | 2443 | SUPPORTED_10000baseKX4_Full; |
| 2444 | else if (type == FW_PORT_TYPE_FIBER_XFI || | 2444 | else if (type == FW_PORT_TYPE_FIBER_XFI || |
| 2445 | type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) | 2445 | type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) { |
| 2446 | v |= SUPPORTED_FIBRE; | 2446 | v |= SUPPORTED_FIBRE; |
| 2447 | else if (type == FW_PORT_TYPE_BP40_BA) | 2447 | if (caps & FW_PORT_CAP_SPEED_1G) |
| 2448 | v |= SUPPORTED_1000baseT_Full; | ||
| 2449 | if (caps & FW_PORT_CAP_SPEED_10G) | ||
| 2450 | v |= SUPPORTED_10000baseT_Full; | ||
| 2451 | } else if (type == FW_PORT_TYPE_BP40_BA) | ||
| 2448 | v |= SUPPORTED_40000baseSR4_Full; | 2452 | v |= SUPPORTED_40000baseSR4_Full; |
| 2449 | 2453 | ||
| 2450 | if (caps & FW_PORT_CAP_ANEG) | 2454 | if (caps & FW_PORT_CAP_ANEG) |
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index 60e9c2cd051e..b5db6b3f939f 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
| @@ -917,21 +917,13 @@ static int sh_eth_reset(struct net_device *ndev) | |||
| 917 | return ret; | 917 | return ret; |
| 918 | } | 918 | } |
| 919 | 919 | ||
| 920 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) | ||
| 921 | static void sh_eth_set_receive_align(struct sk_buff *skb) | 920 | static void sh_eth_set_receive_align(struct sk_buff *skb) |
| 922 | { | 921 | { |
| 923 | int reserve; | 922 | uintptr_t reserve = (uintptr_t)skb->data & (SH_ETH_RX_ALIGN - 1); |
| 924 | 923 | ||
| 925 | reserve = SH4_SKB_RX_ALIGN - ((u32)skb->data & (SH4_SKB_RX_ALIGN - 1)); | ||
| 926 | if (reserve) | 924 | if (reserve) |
| 927 | skb_reserve(skb, reserve); | 925 | skb_reserve(skb, SH_ETH_RX_ALIGN - reserve); |
| 928 | } | 926 | } |
| 929 | #else | ||
| 930 | static void sh_eth_set_receive_align(struct sk_buff *skb) | ||
| 931 | { | ||
| 932 | skb_reserve(skb, SH2_SH3_SKB_RX_ALIGN); | ||
| 933 | } | ||
| 934 | #endif | ||
| 935 | 927 | ||
| 936 | 928 | ||
| 937 | /* CPU <-> EDMAC endian convert */ | 929 | /* CPU <-> EDMAC endian convert */ |
| @@ -1119,6 +1111,7 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
| 1119 | struct sh_eth_txdesc *txdesc = NULL; | 1111 | struct sh_eth_txdesc *txdesc = NULL; |
| 1120 | int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; | 1112 | int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; |
| 1121 | int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; | 1113 | int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; |
| 1114 | int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1; | ||
| 1122 | 1115 | ||
| 1123 | mdp->cur_rx = 0; | 1116 | mdp->cur_rx = 0; |
| 1124 | mdp->cur_tx = 0; | 1117 | mdp->cur_tx = 0; |
| @@ -1131,21 +1124,21 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
| 1131 | for (i = 0; i < mdp->num_rx_ring; i++) { | 1124 | for (i = 0; i < mdp->num_rx_ring; i++) { |
| 1132 | /* skb */ | 1125 | /* skb */ |
| 1133 | mdp->rx_skbuff[i] = NULL; | 1126 | mdp->rx_skbuff[i] = NULL; |
| 1134 | skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz); | 1127 | skb = netdev_alloc_skb(ndev, skbuff_size); |
| 1135 | mdp->rx_skbuff[i] = skb; | 1128 | mdp->rx_skbuff[i] = skb; |
| 1136 | if (skb == NULL) | 1129 | if (skb == NULL) |
| 1137 | break; | 1130 | break; |
| 1138 | dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz, | ||
| 1139 | DMA_FROM_DEVICE); | ||
| 1140 | sh_eth_set_receive_align(skb); | 1131 | sh_eth_set_receive_align(skb); |
| 1141 | 1132 | ||
| 1142 | /* RX descriptor */ | 1133 | /* RX descriptor */ |
| 1143 | rxdesc = &mdp->rx_ring[i]; | 1134 | rxdesc = &mdp->rx_ring[i]; |
| 1135 | /* The size of the buffer is a multiple of 16 bytes. */ | ||
| 1136 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); | ||
| 1137 | dma_map_single(&ndev->dev, skb->data, rxdesc->buffer_length, | ||
| 1138 | DMA_FROM_DEVICE); | ||
| 1144 | rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4)); | 1139 | rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4)); |
| 1145 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); | 1140 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); |
| 1146 | 1141 | ||
| 1147 | /* The size of the buffer is 16 byte boundary. */ | ||
| 1148 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); | ||
| 1149 | /* Rx descriptor address set */ | 1142 | /* Rx descriptor address set */ |
| 1150 | if (i == 0) { | 1143 | if (i == 0) { |
| 1151 | sh_eth_write(ndev, mdp->rx_desc_dma, RDLAR); | 1144 | sh_eth_write(ndev, mdp->rx_desc_dma, RDLAR); |
| @@ -1397,6 +1390,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
| 1397 | struct sk_buff *skb; | 1390 | struct sk_buff *skb; |
| 1398 | u16 pkt_len = 0; | 1391 | u16 pkt_len = 0; |
| 1399 | u32 desc_status; | 1392 | u32 desc_status; |
| 1393 | int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1; | ||
| 1400 | 1394 | ||
| 1401 | rxdesc = &mdp->rx_ring[entry]; | 1395 | rxdesc = &mdp->rx_ring[entry]; |
| 1402 | while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) { | 1396 | while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) { |
| @@ -1448,7 +1442,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
| 1448 | if (mdp->cd->rpadir) | 1442 | if (mdp->cd->rpadir) |
| 1449 | skb_reserve(skb, NET_IP_ALIGN); | 1443 | skb_reserve(skb, NET_IP_ALIGN); |
| 1450 | dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr, | 1444 | dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr, |
| 1451 | mdp->rx_buf_sz, | 1445 | ALIGN(mdp->rx_buf_sz, 16), |
| 1452 | DMA_FROM_DEVICE); | 1446 | DMA_FROM_DEVICE); |
| 1453 | skb_put(skb, pkt_len); | 1447 | skb_put(skb, pkt_len); |
| 1454 | skb->protocol = eth_type_trans(skb, ndev); | 1448 | skb->protocol = eth_type_trans(skb, ndev); |
| @@ -1468,13 +1462,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
| 1468 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); | 1462 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); |
| 1469 | 1463 | ||
| 1470 | if (mdp->rx_skbuff[entry] == NULL) { | 1464 | if (mdp->rx_skbuff[entry] == NULL) { |
| 1471 | skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz); | 1465 | skb = netdev_alloc_skb(ndev, skbuff_size); |
| 1472 | mdp->rx_skbuff[entry] = skb; | 1466 | mdp->rx_skbuff[entry] = skb; |
| 1473 | if (skb == NULL) | 1467 | if (skb == NULL) |
| 1474 | break; /* Better luck next round. */ | 1468 | break; /* Better luck next round. */ |
| 1475 | dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz, | ||
| 1476 | DMA_FROM_DEVICE); | ||
| 1477 | sh_eth_set_receive_align(skb); | 1469 | sh_eth_set_receive_align(skb); |
| 1470 | dma_map_single(&ndev->dev, skb->data, | ||
| 1471 | rxdesc->buffer_length, DMA_FROM_DEVICE); | ||
| 1478 | 1472 | ||
| 1479 | skb_checksum_none_assert(skb); | 1473 | skb_checksum_none_assert(skb); |
| 1480 | rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4)); | 1474 | rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4)); |
| @@ -2042,6 +2036,8 @@ static int sh_eth_open(struct net_device *ndev) | |||
| 2042 | if (ret) | 2036 | if (ret) |
| 2043 | goto out_free_irq; | 2037 | goto out_free_irq; |
| 2044 | 2038 | ||
| 2039 | mdp->is_opened = 1; | ||
| 2040 | |||
| 2045 | return ret; | 2041 | return ret; |
| 2046 | 2042 | ||
| 2047 | out_free_irq: | 2043 | out_free_irq: |
| @@ -2131,6 +2127,36 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 2131 | return NETDEV_TX_OK; | 2127 | return NETDEV_TX_OK; |
| 2132 | } | 2128 | } |
| 2133 | 2129 | ||
| 2130 | static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev) | ||
| 2131 | { | ||
| 2132 | struct sh_eth_private *mdp = netdev_priv(ndev); | ||
| 2133 | |||
| 2134 | if (sh_eth_is_rz_fast_ether(mdp)) | ||
| 2135 | return &ndev->stats; | ||
| 2136 | |||
| 2137 | if (!mdp->is_opened) | ||
| 2138 | return &ndev->stats; | ||
| 2139 | |||
| 2140 | ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR); | ||
| 2141 | sh_eth_write(ndev, 0, TROCR); /* (write clear) */ | ||
| 2142 | ndev->stats.collisions += sh_eth_read(ndev, CDCR); | ||
| 2143 | sh_eth_write(ndev, 0, CDCR); /* (write clear) */ | ||
| 2144 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR); | ||
| 2145 | sh_eth_write(ndev, 0, LCCR); /* (write clear) */ | ||
| 2146 | |||
| 2147 | if (sh_eth_is_gether(mdp)) { | ||
| 2148 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR); | ||
| 2149 | sh_eth_write(ndev, 0, CERCR); /* (write clear) */ | ||
| 2150 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR); | ||
| 2151 | sh_eth_write(ndev, 0, CEECR); /* (write clear) */ | ||
| 2152 | } else { | ||
| 2153 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR); | ||
| 2154 | sh_eth_write(ndev, 0, CNDCR); /* (write clear) */ | ||
| 2155 | } | ||
| 2156 | |||
| 2157 | return &ndev->stats; | ||
| 2158 | } | ||
| 2159 | |||
| 2134 | /* device close function */ | 2160 | /* device close function */ |
| 2135 | static int sh_eth_close(struct net_device *ndev) | 2161 | static int sh_eth_close(struct net_device *ndev) |
| 2136 | { | 2162 | { |
| @@ -2145,6 +2171,7 @@ static int sh_eth_close(struct net_device *ndev) | |||
| 2145 | sh_eth_write(ndev, 0, EDTRR); | 2171 | sh_eth_write(ndev, 0, EDTRR); |
| 2146 | sh_eth_write(ndev, 0, EDRRR); | 2172 | sh_eth_write(ndev, 0, EDRRR); |
| 2147 | 2173 | ||
| 2174 | sh_eth_get_stats(ndev); | ||
| 2148 | /* PHY Disconnect */ | 2175 | /* PHY Disconnect */ |
| 2149 | if (mdp->phydev) { | 2176 | if (mdp->phydev) { |
| 2150 | phy_stop(mdp->phydev); | 2177 | phy_stop(mdp->phydev); |
| @@ -2163,36 +2190,9 @@ static int sh_eth_close(struct net_device *ndev) | |||
| 2163 | 2190 | ||
| 2164 | pm_runtime_put_sync(&mdp->pdev->dev); | 2191 | pm_runtime_put_sync(&mdp->pdev->dev); |
| 2165 | 2192 | ||
| 2166 | return 0; | 2193 | mdp->is_opened = 0; |
| 2167 | } | ||
| 2168 | |||
| 2169 | static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev) | ||
| 2170 | { | ||
| 2171 | struct sh_eth_private *mdp = netdev_priv(ndev); | ||
| 2172 | |||
| 2173 | if (sh_eth_is_rz_fast_ether(mdp)) | ||
| 2174 | return &ndev->stats; | ||
| 2175 | 2194 | ||
| 2176 | pm_runtime_get_sync(&mdp->pdev->dev); | 2195 | return 0; |
| 2177 | |||
| 2178 | ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR); | ||
| 2179 | sh_eth_write(ndev, 0, TROCR); /* (write clear) */ | ||
| 2180 | ndev->stats.collisions += sh_eth_read(ndev, CDCR); | ||
| 2181 | sh_eth_write(ndev, 0, CDCR); /* (write clear) */ | ||
| 2182 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR); | ||
| 2183 | sh_eth_write(ndev, 0, LCCR); /* (write clear) */ | ||
| 2184 | if (sh_eth_is_gether(mdp)) { | ||
| 2185 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR); | ||
| 2186 | sh_eth_write(ndev, 0, CERCR); /* (write clear) */ | ||
| 2187 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR); | ||
| 2188 | sh_eth_write(ndev, 0, CEECR); /* (write clear) */ | ||
| 2189 | } else { | ||
| 2190 | ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR); | ||
| 2191 | sh_eth_write(ndev, 0, CNDCR); /* (write clear) */ | ||
| 2192 | } | ||
| 2193 | pm_runtime_put_sync(&mdp->pdev->dev); | ||
| 2194 | |||
| 2195 | return &ndev->stats; | ||
| 2196 | } | 2196 | } |
| 2197 | 2197 | ||
| 2198 | /* ioctl to device function */ | 2198 | /* ioctl to device function */ |
diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h index b37c427144ee..22301bf9c21d 100644 --- a/drivers/net/ethernet/renesas/sh_eth.h +++ b/drivers/net/ethernet/renesas/sh_eth.h | |||
| @@ -162,9 +162,9 @@ enum { | |||
| 162 | 162 | ||
| 163 | /* Driver's parameters */ | 163 | /* Driver's parameters */ |
| 164 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) | 164 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) |
| 165 | #define SH4_SKB_RX_ALIGN 32 | 165 | #define SH_ETH_RX_ALIGN 32 |
| 166 | #else | 166 | #else |
| 167 | #define SH2_SH3_SKB_RX_ALIGN 2 | 167 | #define SH_ETH_RX_ALIGN 2 |
| 168 | #endif | 168 | #endif |
| 169 | 169 | ||
| 170 | /* Register's bits | 170 | /* Register's bits |
| @@ -522,6 +522,7 @@ struct sh_eth_private { | |||
| 522 | 522 | ||
| 523 | unsigned no_ether_link:1; | 523 | unsigned no_ether_link:1; |
| 524 | unsigned ether_link_active_low:1; | 524 | unsigned ether_link_active_low:1; |
| 525 | unsigned is_opened:1; | ||
| 525 | }; | 526 | }; |
| 526 | 527 | ||
| 527 | static inline void sh_eth_soft_swap(char *src, int len) | 528 | static inline void sh_eth_soft_swap(char *src, int len) |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 5b0da3986216..58a1a0a423d4 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | |||
| @@ -265,6 +265,15 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) | |||
| 265 | 265 | ||
| 266 | plat_dat = dev_get_platdata(&pdev->dev); | 266 | plat_dat = dev_get_platdata(&pdev->dev); |
| 267 | 267 | ||
| 268 | if (!plat_dat) | ||
| 269 | plat_dat = devm_kzalloc(&pdev->dev, | ||
| 270 | sizeof(struct plat_stmmacenet_data), | ||
| 271 | GFP_KERNEL); | ||
| 272 | if (!plat_dat) { | ||
| 273 | pr_err("%s: ERROR: no memory", __func__); | ||
| 274 | return -ENOMEM; | ||
| 275 | } | ||
| 276 | |||
| 268 | /* Set default value for multicast hash bins */ | 277 | /* Set default value for multicast hash bins */ |
| 269 | plat_dat->multicast_filter_bins = HASH_TABLE_SIZE; | 278 | plat_dat->multicast_filter_bins = HASH_TABLE_SIZE; |
| 270 | 279 | ||
| @@ -272,15 +281,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) | |||
| 272 | plat_dat->unicast_filter_entries = 1; | 281 | plat_dat->unicast_filter_entries = 1; |
| 273 | 282 | ||
| 274 | if (pdev->dev.of_node) { | 283 | if (pdev->dev.of_node) { |
| 275 | if (!plat_dat) | ||
| 276 | plat_dat = devm_kzalloc(&pdev->dev, | ||
| 277 | sizeof(struct plat_stmmacenet_data), | ||
| 278 | GFP_KERNEL); | ||
| 279 | if (!plat_dat) { | ||
| 280 | pr_err("%s: ERROR: no memory", __func__); | ||
| 281 | return -ENOMEM; | ||
| 282 | } | ||
| 283 | |||
| 284 | ret = stmmac_probe_config_dt(pdev, plat_dat, &mac); | 284 | ret = stmmac_probe_config_dt(pdev, plat_dat, &mac); |
| 285 | if (ret) { | 285 | if (ret) { |
| 286 | pr_err("%s: main dt probe failed", __func__); | 286 | pr_err("%s: main dt probe failed", __func__); |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index cca871346a0f..ece8d1804d13 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -496,9 +496,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue, | |||
| 496 | len = skb_frag_size(frag); | 496 | len = skb_frag_size(frag); |
| 497 | offset = frag->page_offset; | 497 | offset = frag->page_offset; |
| 498 | 498 | ||
| 499 | /* Data must not cross a page boundary. */ | ||
| 500 | BUG_ON(len + offset > PAGE_SIZE<<compound_order(page)); | ||
| 501 | |||
| 502 | /* Skip unused frames from start of page */ | 499 | /* Skip unused frames from start of page */ |
| 503 | page += offset >> PAGE_SHIFT; | 500 | page += offset >> PAGE_SHIFT; |
| 504 | offset &= ~PAGE_MASK; | 501 | offset &= ~PAGE_MASK; |
| @@ -506,8 +503,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue, | |||
| 506 | while (len > 0) { | 503 | while (len > 0) { |
| 507 | unsigned long bytes; | 504 | unsigned long bytes; |
| 508 | 505 | ||
| 509 | BUG_ON(offset >= PAGE_SIZE); | ||
| 510 | |||
| 511 | bytes = PAGE_SIZE - offset; | 506 | bytes = PAGE_SIZE - offset; |
| 512 | if (bytes > len) | 507 | if (bytes > len) |
| 513 | bytes = len; | 508 | bytes = len; |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 30e97bcc4f88..d134710de96d 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
| @@ -964,8 +964,6 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) | |||
| 964 | int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, | 964 | int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, |
| 965 | phys_addr_t size, bool nomap) | 965 | phys_addr_t size, bool nomap) |
| 966 | { | 966 | { |
| 967 | if (memblock_is_region_reserved(base, size)) | ||
| 968 | return -EBUSY; | ||
| 969 | if (nomap) | 967 | if (nomap) |
| 970 | return memblock_remove(base, size); | 968 | return memblock_remove(base, size); |
| 971 | return memblock_reserve(base, size); | 969 | return memblock_reserve(base, size); |
diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c index 3d43874319be..19bb19c7db4a 100644 --- a/drivers/pci/host/pci-tegra.c +++ b/drivers/pci/host/pci-tegra.c | |||
| @@ -276,6 +276,7 @@ struct tegra_pcie { | |||
| 276 | 276 | ||
| 277 | struct resource all; | 277 | struct resource all; |
| 278 | struct resource io; | 278 | struct resource io; |
| 279 | struct resource pio; | ||
| 279 | struct resource mem; | 280 | struct resource mem; |
| 280 | struct resource prefetch; | 281 | struct resource prefetch; |
| 281 | struct resource busn; | 282 | struct resource busn; |
| @@ -658,7 +659,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) | |||
| 658 | { | 659 | { |
| 659 | struct tegra_pcie *pcie = sys_to_pcie(sys); | 660 | struct tegra_pcie *pcie = sys_to_pcie(sys); |
| 660 | int err; | 661 | int err; |
| 661 | phys_addr_t io_start; | ||
| 662 | 662 | ||
| 663 | err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem); | 663 | err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem); |
| 664 | if (err < 0) | 664 | if (err < 0) |
| @@ -668,14 +668,12 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) | |||
| 668 | if (err) | 668 | if (err) |
| 669 | return err; | 669 | return err; |
| 670 | 670 | ||
| 671 | io_start = pci_pio_to_address(pcie->io.start); | ||
| 672 | |||
| 673 | pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); | 671 | pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); |
| 674 | pci_add_resource_offset(&sys->resources, &pcie->prefetch, | 672 | pci_add_resource_offset(&sys->resources, &pcie->prefetch, |
| 675 | sys->mem_offset); | 673 | sys->mem_offset); |
| 676 | pci_add_resource(&sys->resources, &pcie->busn); | 674 | pci_add_resource(&sys->resources, &pcie->busn); |
| 677 | 675 | ||
| 678 | pci_ioremap_io(nr * SZ_64K, io_start); | 676 | pci_ioremap_io(pcie->pio.start, pcie->io.start); |
| 679 | 677 | ||
| 680 | return 1; | 678 | return 1; |
| 681 | } | 679 | } |
| @@ -786,7 +784,6 @@ static irqreturn_t tegra_pcie_isr(int irq, void *arg) | |||
| 786 | static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) | 784 | static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) |
| 787 | { | 785 | { |
| 788 | u32 fpci_bar, size, axi_address; | 786 | u32 fpci_bar, size, axi_address; |
| 789 | phys_addr_t io_start = pci_pio_to_address(pcie->io.start); | ||
| 790 | 787 | ||
| 791 | /* Bar 0: type 1 extended configuration space */ | 788 | /* Bar 0: type 1 extended configuration space */ |
| 792 | fpci_bar = 0xfe100000; | 789 | fpci_bar = 0xfe100000; |
| @@ -799,7 +796,7 @@ static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) | |||
| 799 | /* Bar 1: downstream IO bar */ | 796 | /* Bar 1: downstream IO bar */ |
| 800 | fpci_bar = 0xfdfc0000; | 797 | fpci_bar = 0xfdfc0000; |
| 801 | size = resource_size(&pcie->io); | 798 | size = resource_size(&pcie->io); |
| 802 | axi_address = io_start; | 799 | axi_address = pcie->io.start; |
| 803 | afi_writel(pcie, axi_address, AFI_AXI_BAR1_START); | 800 | afi_writel(pcie, axi_address, AFI_AXI_BAR1_START); |
| 804 | afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ); | 801 | afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ); |
| 805 | afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1); | 802 | afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1); |
| @@ -1690,8 +1687,23 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie) | |||
| 1690 | 1687 | ||
| 1691 | switch (res.flags & IORESOURCE_TYPE_BITS) { | 1688 | switch (res.flags & IORESOURCE_TYPE_BITS) { |
| 1692 | case IORESOURCE_IO: | 1689 | case IORESOURCE_IO: |
| 1693 | memcpy(&pcie->io, &res, sizeof(res)); | 1690 | memcpy(&pcie->pio, &res, sizeof(res)); |
| 1694 | pcie->io.name = np->full_name; | 1691 | pcie->pio.name = np->full_name; |
| 1692 | |||
| 1693 | /* | ||
| 1694 | * The Tegra PCIe host bridge uses this to program the | ||
| 1695 | * mapping of the I/O space to the physical address, | ||
| 1696 | * so we override the .start and .end fields here that | ||
| 1697 | * of_pci_range_to_resource() converted to I/O space. | ||
| 1698 | * We also set the IORESOURCE_MEM type to clarify that | ||
| 1699 | * the resource is in the physical memory space. | ||
| 1700 | */ | ||
| 1701 | pcie->io.start = range.cpu_addr; | ||
| 1702 | pcie->io.end = range.cpu_addr + range.size - 1; | ||
| 1703 | pcie->io.flags = IORESOURCE_MEM; | ||
| 1704 | pcie->io.name = "I/O"; | ||
| 1705 | |||
| 1706 | memcpy(&res, &pcie->io, sizeof(res)); | ||
| 1695 | break; | 1707 | break; |
| 1696 | 1708 | ||
| 1697 | case IORESOURCE_MEM: | 1709 | case IORESOURCE_MEM: |
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 8532c3e2aea7..1626dc66e763 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
| @@ -161,7 +161,7 @@ static const struct s3c2410_wdt_variant drv_data_exynos5420 = { | |||
| 161 | static const struct s3c2410_wdt_variant drv_data_exynos7 = { | 161 | static const struct s3c2410_wdt_variant drv_data_exynos7 = { |
| 162 | .disable_reg = EXYNOS5_WDT_DISABLE_REG_OFFSET, | 162 | .disable_reg = EXYNOS5_WDT_DISABLE_REG_OFFSET, |
| 163 | .mask_reset_reg = EXYNOS5_WDT_MASK_RESET_REG_OFFSET, | 163 | .mask_reset_reg = EXYNOS5_WDT_MASK_RESET_REG_OFFSET, |
| 164 | .mask_bit = 0, | 164 | .mask_bit = 23, |
| 165 | .rst_stat_reg = EXYNOS5_RST_STAT_REG_OFFSET, | 165 | .rst_stat_reg = EXYNOS5_RST_STAT_REG_OFFSET, |
| 166 | .rst_stat_bit = 23, /* A57 WDTRESET */ | 166 | .rst_stat_bit = 23, /* A57 WDTRESET */ |
| 167 | .quirks = QUIRK_HAS_PMU_CONFIG | QUIRK_HAS_RST_STAT, | 167 | .quirks = QUIRK_HAS_PMU_CONFIG | QUIRK_HAS_RST_STAT, |
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 6df8d3d885e5..b8b92c2f9683 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c | |||
| @@ -736,7 +736,12 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry, | |||
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | alias = d_find_alias(inode); | 738 | alias = d_find_alias(inode); |
| 739 | if (alias && !vfat_d_anon_disconn(alias)) { | 739 | /* |
| 740 | * Checking "alias->d_parent == dentry->d_parent" to make sure | ||
| 741 | * FS is not corrupted (especially double linked dir). | ||
| 742 | */ | ||
| 743 | if (alias && alias->d_parent == dentry->d_parent && | ||
| 744 | !vfat_d_anon_disconn(alias)) { | ||
| 740 | /* | 745 | /* |
| 741 | * This inode has non anonymous-DCACHE_DISCONNECTED | 746 | * This inode has non anonymous-DCACHE_DISCONNECTED |
| 742 | * dentry. This means, the user did ->lookup() by an | 747 | * dentry. This means, the user did ->lookup() by an |
| @@ -755,12 +760,9 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry, | |||
| 755 | 760 | ||
| 756 | out: | 761 | out: |
| 757 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 762 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 758 | dentry->d_time = dentry->d_parent->d_inode->i_version; | 763 | if (!inode) |
| 759 | dentry = d_splice_alias(inode, dentry); | 764 | dentry->d_time = dir->i_version; |
| 760 | if (dentry) | 765 | return d_splice_alias(inode, dentry); |
| 761 | dentry->d_time = dentry->d_parent->d_inode->i_version; | ||
| 762 | return dentry; | ||
| 763 | |||
| 764 | error: | 766 | error: |
| 765 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 767 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 766 | return ERR_PTR(err); | 768 | return ERR_PTR(err); |
| @@ -793,7 +795,6 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode, | |||
| 793 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; | 795 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; |
| 794 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ | 796 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ |
| 795 | 797 | ||
| 796 | dentry->d_time = dentry->d_parent->d_inode->i_version; | ||
| 797 | d_instantiate(dentry, inode); | 798 | d_instantiate(dentry, inode); |
| 798 | out: | 799 | out: |
| 799 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 800 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| @@ -824,6 +825,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 824 | clear_nlink(inode); | 825 | clear_nlink(inode); |
| 825 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; | 826 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; |
| 826 | fat_detach(inode); | 827 | fat_detach(inode); |
| 828 | dentry->d_time = dir->i_version; | ||
| 827 | out: | 829 | out: |
| 828 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 830 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 829 | 831 | ||
| @@ -849,6 +851,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry) | |||
| 849 | clear_nlink(inode); | 851 | clear_nlink(inode); |
| 850 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; | 852 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; |
| 851 | fat_detach(inode); | 853 | fat_detach(inode); |
| 854 | dentry->d_time = dir->i_version; | ||
| 852 | out: | 855 | out: |
| 853 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 856 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 854 | 857 | ||
| @@ -889,7 +892,6 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 889 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; | 892 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; |
| 890 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ | 893 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ |
| 891 | 894 | ||
| 892 | dentry->d_time = dentry->d_parent->d_inode->i_version; | ||
| 893 | d_instantiate(dentry, inode); | 895 | d_instantiate(dentry, inode); |
| 894 | 896 | ||
| 895 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 897 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index e4dc74713a43..1df94fabe4eb 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
| @@ -1853,13 +1853,12 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat, | |||
| 1853 | journal->j_chksum_driver = NULL; | 1853 | journal->j_chksum_driver = NULL; |
| 1854 | return 0; | 1854 | return 0; |
| 1855 | } | 1855 | } |
| 1856 | } | ||
| 1857 | 1856 | ||
| 1858 | /* Precompute checksum seed for all metadata */ | 1857 | /* Precompute checksum seed for all metadata */ |
| 1859 | if (jbd2_journal_has_csum_v2or3(journal)) | ||
| 1860 | journal->j_csum_seed = jbd2_chksum(journal, ~0, | 1858 | journal->j_csum_seed = jbd2_chksum(journal, ~0, |
| 1861 | sb->s_uuid, | 1859 | sb->s_uuid, |
| 1862 | sizeof(sb->s_uuid)); | 1860 | sizeof(sb->s_uuid)); |
| 1861 | } | ||
| 1863 | } | 1862 | } |
| 1864 | 1863 | ||
| 1865 | /* If enabling v1 checksums, downgrade superblock */ | 1864 | /* If enabling v1 checksums, downgrade superblock */ |
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 4c94f31a8c99..8523f9bb72f2 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild | |||
| @@ -427,7 +427,7 @@ header-y += virtio_net.h | |||
| 427 | header-y += virtio_pci.h | 427 | header-y += virtio_pci.h |
| 428 | header-y += virtio_ring.h | 428 | header-y += virtio_ring.h |
| 429 | header-y += virtio_rng.h | 429 | header-y += virtio_rng.h |
| 430 | header=y += vm_sockets.h | 430 | header-y += vm_sockets.h |
| 431 | header-y += vt.h | 431 | header-y += vt.h |
| 432 | header-y += wait.h | 432 | header-y += wait.h |
| 433 | header-y += wanrouter.h | 433 | header-y += wanrouter.h |
| @@ -507,13 +507,6 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params) | |||
| 507 | return retval; | 507 | return retval; |
| 508 | } | 508 | } |
| 509 | 509 | ||
| 510 | id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni); | ||
| 511 | if (id < 0) { | ||
| 512 | ipc_rcu_putref(sma, sem_rcu_free); | ||
| 513 | return id; | ||
| 514 | } | ||
| 515 | ns->used_sems += nsems; | ||
| 516 | |||
| 517 | sma->sem_base = (struct sem *) &sma[1]; | 510 | sma->sem_base = (struct sem *) &sma[1]; |
| 518 | 511 | ||
| 519 | for (i = 0; i < nsems; i++) { | 512 | for (i = 0; i < nsems; i++) { |
| @@ -528,6 +521,14 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params) | |||
| 528 | INIT_LIST_HEAD(&sma->list_id); | 521 | INIT_LIST_HEAD(&sma->list_id); |
| 529 | sma->sem_nsems = nsems; | 522 | sma->sem_nsems = nsems; |
| 530 | sma->sem_ctime = get_seconds(); | 523 | sma->sem_ctime = get_seconds(); |
| 524 | |||
| 525 | id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni); | ||
| 526 | if (id < 0) { | ||
| 527 | ipc_rcu_putref(sma, sem_rcu_free); | ||
| 528 | return id; | ||
| 529 | } | ||
| 530 | ns->used_sems += nsems; | ||
| 531 | |||
| 531 | sem_unlock(sma, -1); | 532 | sem_unlock(sma, -1); |
| 532 | rcu_read_unlock(); | 533 | rcu_read_unlock(); |
| 533 | 534 | ||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 24beb9bb4c3e..89e7283015a6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -2874,10 +2874,14 @@ asmlinkage __visible void __sched schedule_user(void) | |||
| 2874 | * or we have been woken up remotely but the IPI has not yet arrived, | 2874 | * or we have been woken up remotely but the IPI has not yet arrived, |
| 2875 | * we haven't yet exited the RCU idle mode. Do it here manually until | 2875 | * we haven't yet exited the RCU idle mode. Do it here manually until |
| 2876 | * we find a better solution. | 2876 | * we find a better solution. |
| 2877 | * | ||
| 2878 | * NB: There are buggy callers of this function. Ideally we | ||
| 2879 | * should warn if prev_state != IN_USER, but that will trigger | ||
| 2880 | * too frequently to make sense yet. | ||
| 2877 | */ | 2881 | */ |
| 2878 | user_exit(); | 2882 | enum ctx_state prev_state = exception_enter(); |
| 2879 | schedule(); | 2883 | schedule(); |
| 2880 | user_enter(); | 2884 | exception_exit(prev_state); |
| 2881 | } | 2885 | } |
| 2882 | #endif | 2886 | #endif |
| 2883 | 2887 | ||
diff --git a/lib/genalloc.c b/lib/genalloc.c index cce4dd68c40d..2e65d206b01c 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c | |||
| @@ -598,6 +598,7 @@ struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order, | |||
| 598 | 598 | ||
| 599 | return pool; | 599 | return pool; |
| 600 | } | 600 | } |
| 601 | EXPORT_SYMBOL(devm_gen_pool_create); | ||
| 601 | 602 | ||
| 602 | /** | 603 | /** |
| 603 | * dev_get_gen_pool - Obtain the gen_pool (if any) for a device | 604 | * dev_get_gen_pool - Obtain the gen_pool (if any) for a device |
diff --git a/lib/show_mem.c b/lib/show_mem.c index 09225796991a..5e256271b47b 100644 --- a/lib/show_mem.c +++ b/lib/show_mem.c | |||
| @@ -28,7 +28,7 @@ void show_mem(unsigned int filter) | |||
| 28 | continue; | 28 | continue; |
| 29 | 29 | ||
| 30 | total += zone->present_pages; | 30 | total += zone->present_pages; |
| 31 | reserved = zone->present_pages - zone->managed_pages; | 31 | reserved += zone->present_pages - zone->managed_pages; |
| 32 | 32 | ||
| 33 | if (is_highmem_idx(zoneid)) | 33 | if (is_highmem_idx(zoneid)) |
| 34 | highmem += zone->present_pages; | 34 | highmem += zone->present_pages; |
diff --git a/mm/frontswap.c b/mm/frontswap.c index c30eec536f03..f2a3571c6e22 100644 --- a/mm/frontswap.c +++ b/mm/frontswap.c | |||
| @@ -244,8 +244,10 @@ int __frontswap_store(struct page *page) | |||
| 244 | the (older) page from frontswap | 244 | the (older) page from frontswap |
| 245 | */ | 245 | */ |
| 246 | inc_frontswap_failed_stores(); | 246 | inc_frontswap_failed_stores(); |
| 247 | if (dup) | 247 | if (dup) { |
| 248 | __frontswap_clear(sis, offset); | 248 | __frontswap_clear(sis, offset); |
| 249 | frontswap_ops->invalidate_page(type, offset); | ||
| 250 | } | ||
| 249 | } | 251 | } |
| 250 | if (frontswap_writethrough_enabled) | 252 | if (frontswap_writethrough_enabled) |
| 251 | /* report failure so swap also writes to swap device */ | 253 | /* report failure so swap also writes to swap device */ |
diff --git a/mm/memory.c b/mm/memory.c index 655fd3d34bb0..d3cb2ef66ee2 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -816,20 +816,20 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm, | |||
| 816 | if (!pte_file(pte)) { | 816 | if (!pte_file(pte)) { |
| 817 | swp_entry_t entry = pte_to_swp_entry(pte); | 817 | swp_entry_t entry = pte_to_swp_entry(pte); |
| 818 | 818 | ||
| 819 | if (swap_duplicate(entry) < 0) | 819 | if (likely(!non_swap_entry(entry))) { |
| 820 | return entry.val; | 820 | if (swap_duplicate(entry) < 0) |
| 821 | 821 | return entry.val; | |
| 822 | /* make sure dst_mm is on swapoff's mmlist. */ | 822 | |
| 823 | if (unlikely(list_empty(&dst_mm->mmlist))) { | 823 | /* make sure dst_mm is on swapoff's mmlist. */ |
| 824 | spin_lock(&mmlist_lock); | 824 | if (unlikely(list_empty(&dst_mm->mmlist))) { |
| 825 | if (list_empty(&dst_mm->mmlist)) | 825 | spin_lock(&mmlist_lock); |
| 826 | list_add(&dst_mm->mmlist, | 826 | if (list_empty(&dst_mm->mmlist)) |
| 827 | &src_mm->mmlist); | 827 | list_add(&dst_mm->mmlist, |
| 828 | spin_unlock(&mmlist_lock); | 828 | &src_mm->mmlist); |
| 829 | } | 829 | spin_unlock(&mmlist_lock); |
| 830 | if (likely(!non_swap_entry(entry))) | 830 | } |
| 831 | rss[MM_SWAPENTS]++; | 831 | rss[MM_SWAPENTS]++; |
| 832 | else if (is_migration_entry(entry)) { | 832 | } else if (is_migration_entry(entry)) { |
| 833 | page = migration_entry_to_page(entry); | 833 | page = migration_entry_to_page(entry); |
| 834 | 834 | ||
| 835 | if (PageAnon(page)) | 835 | if (PageAnon(page)) |
| @@ -776,8 +776,11 @@ again: remove_next = 1 + (end > next->vm_end); | |||
| 776 | * shrinking vma had, to cover any anon pages imported. | 776 | * shrinking vma had, to cover any anon pages imported. |
| 777 | */ | 777 | */ |
| 778 | if (exporter && exporter->anon_vma && !importer->anon_vma) { | 778 | if (exporter && exporter->anon_vma && !importer->anon_vma) { |
| 779 | if (anon_vma_clone(importer, exporter)) | 779 | int error; |
| 780 | return -ENOMEM; | 780 | |
| 781 | error = anon_vma_clone(importer, exporter); | ||
| 782 | if (error) | ||
| 783 | return error; | ||
| 781 | importer->anon_vma = exporter->anon_vma; | 784 | importer->anon_vma = exporter->anon_vma; |
| 782 | } | 785 | } |
| 783 | } | 786 | } |
| @@ -2469,7 +2472,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2469 | if (err) | 2472 | if (err) |
| 2470 | goto out_free_vma; | 2473 | goto out_free_vma; |
| 2471 | 2474 | ||
| 2472 | if (anon_vma_clone(new, vma)) | 2475 | err = anon_vma_clone(new, vma); |
| 2476 | if (err) | ||
| 2473 | goto out_free_mpol; | 2477 | goto out_free_mpol; |
| 2474 | 2478 | ||
| 2475 | if (new->vm_file) | 2479 | if (new->vm_file) |
| @@ -274,6 +274,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) | |||
| 274 | { | 274 | { |
| 275 | struct anon_vma_chain *avc; | 275 | struct anon_vma_chain *avc; |
| 276 | struct anon_vma *anon_vma; | 276 | struct anon_vma *anon_vma; |
| 277 | int error; | ||
| 277 | 278 | ||
| 278 | /* Don't bother if the parent process has no anon_vma here. */ | 279 | /* Don't bother if the parent process has no anon_vma here. */ |
| 279 | if (!pvma->anon_vma) | 280 | if (!pvma->anon_vma) |
| @@ -283,8 +284,9 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) | |||
| 283 | * First, attach the new VMA to the parent VMA's anon_vmas, | 284 | * First, attach the new VMA to the parent VMA's anon_vmas, |
| 284 | * so rmap can find non-COWed pages in child processes. | 285 | * so rmap can find non-COWed pages in child processes. |
| 285 | */ | 286 | */ |
| 286 | if (anon_vma_clone(vma, pvma)) | 287 | error = anon_vma_clone(vma, pvma); |
| 287 | return -ENOMEM; | 288 | if (error) |
| 289 | return error; | ||
| 288 | 290 | ||
| 289 | /* Then add our own anon_vma. */ | 291 | /* Then add our own anon_vma. */ |
| 290 | anon_vma = anon_vma_alloc(); | 292 | anon_vma = anon_vma_alloc(); |
| @@ -3076,7 +3076,7 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, | |||
| 3076 | void *obj; | 3076 | void *obj; |
| 3077 | int x; | 3077 | int x; |
| 3078 | 3078 | ||
| 3079 | VM_BUG_ON(nodeid > num_online_nodes()); | 3079 | VM_BUG_ON(nodeid < 0 || nodeid >= MAX_NUMNODES); |
| 3080 | n = get_node(cachep, nodeid); | 3080 | n = get_node(cachep, nodeid); |
| 3081 | BUG_ON(!n); | 3081 | BUG_ON(!n); |
| 3082 | 3082 | ||
diff --git a/mm/vmpressure.c b/mm/vmpressure.c index d4042e75f7c7..c5afd573d7da 100644 --- a/mm/vmpressure.c +++ b/mm/vmpressure.c | |||
| @@ -165,6 +165,7 @@ static void vmpressure_work_fn(struct work_struct *work) | |||
| 165 | unsigned long scanned; | 165 | unsigned long scanned; |
| 166 | unsigned long reclaimed; | 166 | unsigned long reclaimed; |
| 167 | 167 | ||
| 168 | spin_lock(&vmpr->sr_lock); | ||
| 168 | /* | 169 | /* |
| 169 | * Several contexts might be calling vmpressure(), so it is | 170 | * Several contexts might be calling vmpressure(), so it is |
| 170 | * possible that the work was rescheduled again before the old | 171 | * possible that the work was rescheduled again before the old |
| @@ -173,11 +174,12 @@ static void vmpressure_work_fn(struct work_struct *work) | |||
| 173 | * here. No need for any locks here since we don't care if | 174 | * here. No need for any locks here since we don't care if |
| 174 | * vmpr->reclaimed is in sync. | 175 | * vmpr->reclaimed is in sync. |
| 175 | */ | 176 | */ |
| 176 | if (!vmpr->scanned) | 177 | scanned = vmpr->scanned; |
| 178 | if (!scanned) { | ||
| 179 | spin_unlock(&vmpr->sr_lock); | ||
| 177 | return; | 180 | return; |
| 181 | } | ||
| 178 | 182 | ||
| 179 | spin_lock(&vmpr->sr_lock); | ||
| 180 | scanned = vmpr->scanned; | ||
| 181 | reclaimed = vmpr->reclaimed; | 183 | reclaimed = vmpr->reclaimed; |
| 182 | vmpr->scanned = 0; | 184 | vmpr->scanned = 0; |
| 183 | vmpr->reclaimed = 0; | 185 | vmpr->reclaimed = 0; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index b9b7dfaf202b..76321ea442c3 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -1498,6 +1498,7 @@ static int do_setlink(const struct sk_buff *skb, | |||
| 1498 | goto errout; | 1498 | goto errout; |
| 1499 | } | 1499 | } |
| 1500 | if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) { | 1500 | if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) { |
| 1501 | put_net(net); | ||
| 1501 | err = -EPERM; | 1502 | err = -EPERM; |
| 1502 | goto errout; | 1503 | goto errout; |
| 1503 | } | 1504 | } |
diff --git a/security/keys/internal.h b/security/keys/internal.h index b8960c4959a5..200e37867336 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h | |||
| @@ -117,6 +117,7 @@ struct keyring_search_context { | |||
| 117 | #define KEYRING_SEARCH_NO_UPDATE_TIME 0x0004 /* Don't update times */ | 117 | #define KEYRING_SEARCH_NO_UPDATE_TIME 0x0004 /* Don't update times */ |
| 118 | #define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */ | 118 | #define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */ |
| 119 | #define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */ | 119 | #define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */ |
| 120 | #define KEYRING_SEARCH_SKIP_EXPIRED 0x0020 /* Ignore expired keys (intention to replace) */ | ||
| 120 | 121 | ||
| 121 | int (*iterator)(const void *object, void *iterator_data); | 122 | int (*iterator)(const void *object, void *iterator_data); |
| 122 | 123 | ||
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index eff88a5f5d40..4743d71e4aa6 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
| 27 | #include "internal.h" | 27 | #include "internal.h" |
| 28 | 28 | ||
| 29 | #define KEY_MAX_DESC_SIZE 4096 | ||
| 30 | |||
| 29 | static int key_get_type_from_user(char *type, | 31 | static int key_get_type_from_user(char *type, |
| 30 | const char __user *_type, | 32 | const char __user *_type, |
| 31 | unsigned len) | 33 | unsigned len) |
| @@ -78,7 +80,7 @@ SYSCALL_DEFINE5(add_key, const char __user *, _type, | |||
| 78 | 80 | ||
| 79 | description = NULL; | 81 | description = NULL; |
| 80 | if (_description) { | 82 | if (_description) { |
| 81 | description = strndup_user(_description, PAGE_SIZE); | 83 | description = strndup_user(_description, KEY_MAX_DESC_SIZE); |
| 82 | if (IS_ERR(description)) { | 84 | if (IS_ERR(description)) { |
| 83 | ret = PTR_ERR(description); | 85 | ret = PTR_ERR(description); |
| 84 | goto error; | 86 | goto error; |
| @@ -177,7 +179,7 @@ SYSCALL_DEFINE4(request_key, const char __user *, _type, | |||
| 177 | goto error; | 179 | goto error; |
| 178 | 180 | ||
| 179 | /* pull the description into kernel space */ | 181 | /* pull the description into kernel space */ |
| 180 | description = strndup_user(_description, PAGE_SIZE); | 182 | description = strndup_user(_description, KEY_MAX_DESC_SIZE); |
| 181 | if (IS_ERR(description)) { | 183 | if (IS_ERR(description)) { |
| 182 | ret = PTR_ERR(description); | 184 | ret = PTR_ERR(description); |
| 183 | goto error; | 185 | goto error; |
| @@ -287,7 +289,7 @@ long keyctl_join_session_keyring(const char __user *_name) | |||
| 287 | /* fetch the name from userspace */ | 289 | /* fetch the name from userspace */ |
| 288 | name = NULL; | 290 | name = NULL; |
| 289 | if (_name) { | 291 | if (_name) { |
| 290 | name = strndup_user(_name, PAGE_SIZE); | 292 | name = strndup_user(_name, KEY_MAX_DESC_SIZE); |
| 291 | if (IS_ERR(name)) { | 293 | if (IS_ERR(name)) { |
| 292 | ret = PTR_ERR(name); | 294 | ret = PTR_ERR(name); |
| 293 | goto error; | 295 | goto error; |
| @@ -562,8 +564,9 @@ long keyctl_describe_key(key_serial_t keyid, | |||
| 562 | { | 564 | { |
| 563 | struct key *key, *instkey; | 565 | struct key *key, *instkey; |
| 564 | key_ref_t key_ref; | 566 | key_ref_t key_ref; |
| 565 | char *tmpbuf; | 567 | char *infobuf; |
| 566 | long ret; | 568 | long ret; |
| 569 | int desclen, infolen; | ||
| 567 | 570 | ||
| 568 | key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, KEY_NEED_VIEW); | 571 | key_ref = lookup_user_key(keyid, KEY_LOOKUP_PARTIAL, KEY_NEED_VIEW); |
| 569 | if (IS_ERR(key_ref)) { | 572 | if (IS_ERR(key_ref)) { |
| @@ -586,38 +589,31 @@ long keyctl_describe_key(key_serial_t keyid, | |||
| 586 | } | 589 | } |
| 587 | 590 | ||
| 588 | okay: | 591 | okay: |
| 589 | /* calculate how much description we're going to return */ | ||
| 590 | ret = -ENOMEM; | ||
| 591 | tmpbuf = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
| 592 | if (!tmpbuf) | ||
| 593 | goto error2; | ||
| 594 | |||
| 595 | key = key_ref_to_ptr(key_ref); | 592 | key = key_ref_to_ptr(key_ref); |
| 593 | desclen = strlen(key->description); | ||
| 596 | 594 | ||
| 597 | ret = snprintf(tmpbuf, PAGE_SIZE - 1, | 595 | /* calculate how much information we're going to return */ |
| 598 | "%s;%d;%d;%08x;%s", | 596 | ret = -ENOMEM; |
| 599 | key->type->name, | 597 | infobuf = kasprintf(GFP_KERNEL, |
| 600 | from_kuid_munged(current_user_ns(), key->uid), | 598 | "%s;%d;%d;%08x;", |
| 601 | from_kgid_munged(current_user_ns(), key->gid), | 599 | key->type->name, |
| 602 | key->perm, | 600 | from_kuid_munged(current_user_ns(), key->uid), |
| 603 | key->description ?: ""); | 601 | from_kgid_munged(current_user_ns(), key->gid), |
| 604 | 602 | key->perm); | |
| 605 | /* include a NUL char at the end of the data */ | 603 | if (!infobuf) |
| 606 | if (ret > PAGE_SIZE - 1) | 604 | goto error2; |
| 607 | ret = PAGE_SIZE - 1; | 605 | infolen = strlen(infobuf); |
| 608 | tmpbuf[ret] = 0; | 606 | ret = infolen + desclen + 1; |
| 609 | ret++; | ||
| 610 | 607 | ||
| 611 | /* consider returning the data */ | 608 | /* consider returning the data */ |
| 612 | if (buffer && buflen > 0) { | 609 | if (buffer && buflen >= ret) { |
| 613 | if (buflen > ret) | 610 | if (copy_to_user(buffer, infobuf, infolen) != 0 || |
| 614 | buflen = ret; | 611 | copy_to_user(buffer + infolen, key->description, |
| 615 | 612 | desclen + 1) != 0) | |
| 616 | if (copy_to_user(buffer, tmpbuf, buflen) != 0) | ||
| 617 | ret = -EFAULT; | 613 | ret = -EFAULT; |
| 618 | } | 614 | } |
| 619 | 615 | ||
| 620 | kfree(tmpbuf); | 616 | kfree(infobuf); |
| 621 | error2: | 617 | error2: |
| 622 | key_ref_put(key_ref); | 618 | key_ref_put(key_ref); |
| 623 | error: | 619 | error: |
| @@ -649,7 +645,7 @@ long keyctl_keyring_search(key_serial_t ringid, | |||
| 649 | if (ret < 0) | 645 | if (ret < 0) |
| 650 | goto error; | 646 | goto error; |
| 651 | 647 | ||
| 652 | description = strndup_user(_description, PAGE_SIZE); | 648 | description = strndup_user(_description, KEY_MAX_DESC_SIZE); |
| 653 | if (IS_ERR(description)) { | 649 | if (IS_ERR(description)) { |
| 654 | ret = PTR_ERR(description); | 650 | ret = PTR_ERR(description); |
| 655 | goto error; | 651 | goto error; |
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index 8177010174f7..e72548b5897e 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c | |||
| @@ -546,7 +546,8 @@ static int keyring_search_iterator(const void *object, void *iterator_data) | |||
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | if (key->expiry && ctx->now.tv_sec >= key->expiry) { | 548 | if (key->expiry && ctx->now.tv_sec >= key->expiry) { |
| 549 | ctx->result = ERR_PTR(-EKEYEXPIRED); | 549 | if (!(ctx->flags & KEYRING_SEARCH_SKIP_EXPIRED)) |
| 550 | ctx->result = ERR_PTR(-EKEYEXPIRED); | ||
| 550 | kleave(" = %d [expire]", ctx->skipped_ret); | 551 | kleave(" = %d [expire]", ctx->skipped_ret); |
| 551 | goto skipped; | 552 | goto skipped; |
| 552 | } | 553 | } |
| @@ -628,6 +629,10 @@ static bool search_nested_keyrings(struct key *keyring, | |||
| 628 | ctx->index_key.type->name, | 629 | ctx->index_key.type->name, |
| 629 | ctx->index_key.description); | 630 | ctx->index_key.description); |
| 630 | 631 | ||
| 632 | #define STATE_CHECKS (KEYRING_SEARCH_NO_STATE_CHECK | KEYRING_SEARCH_DO_STATE_CHECK) | ||
| 633 | BUG_ON((ctx->flags & STATE_CHECKS) == 0 || | ||
| 634 | (ctx->flags & STATE_CHECKS) == STATE_CHECKS); | ||
| 635 | |||
| 631 | if (ctx->index_key.description) | 636 | if (ctx->index_key.description) |
| 632 | ctx->index_key.desc_len = strlen(ctx->index_key.description); | 637 | ctx->index_key.desc_len = strlen(ctx->index_key.description); |
| 633 | 638 | ||
| @@ -637,7 +642,6 @@ static bool search_nested_keyrings(struct key *keyring, | |||
| 637 | if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE || | 642 | if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE || |
| 638 | keyring_compare_object(keyring, &ctx->index_key)) { | 643 | keyring_compare_object(keyring, &ctx->index_key)) { |
| 639 | ctx->skipped_ret = 2; | 644 | ctx->skipped_ret = 2; |
| 640 | ctx->flags |= KEYRING_SEARCH_DO_STATE_CHECK; | ||
| 641 | switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) { | 645 | switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) { |
| 642 | case 1: | 646 | case 1: |
| 643 | goto found; | 647 | goto found; |
| @@ -649,8 +653,6 @@ static bool search_nested_keyrings(struct key *keyring, | |||
| 649 | } | 653 | } |
| 650 | 654 | ||
| 651 | ctx->skipped_ret = 0; | 655 | ctx->skipped_ret = 0; |
| 652 | if (ctx->flags & KEYRING_SEARCH_NO_STATE_CHECK) | ||
| 653 | ctx->flags &= ~KEYRING_SEARCH_DO_STATE_CHECK; | ||
| 654 | 656 | ||
| 655 | /* Start processing a new keyring */ | 657 | /* Start processing a new keyring */ |
| 656 | descend_to_keyring: | 658 | descend_to_keyring: |
diff --git a/security/keys/request_key.c b/security/keys/request_key.c index bb4337c7ae1b..0c7aea4dea54 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c | |||
| @@ -516,6 +516,8 @@ struct key *request_key_and_link(struct key_type *type, | |||
| 516 | .match_data.cmp = key_default_cmp, | 516 | .match_data.cmp = key_default_cmp, |
| 517 | .match_data.raw_data = description, | 517 | .match_data.raw_data = description, |
| 518 | .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, | 518 | .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, |
| 519 | .flags = (KEYRING_SEARCH_DO_STATE_CHECK | | ||
| 520 | KEYRING_SEARCH_SKIP_EXPIRED), | ||
| 519 | }; | 521 | }; |
| 520 | struct key *key; | 522 | struct key *key; |
| 521 | key_ref_t key_ref; | 523 | key_ref_t key_ref; |
diff --git a/security/keys/request_key_auth.c b/security/keys/request_key_auth.c index 6639e2cb8853..5d672f7580dd 100644 --- a/security/keys/request_key_auth.c +++ b/security/keys/request_key_auth.c | |||
| @@ -249,6 +249,7 @@ struct key *key_get_instantiation_authkey(key_serial_t target_id) | |||
| 249 | .match_data.cmp = key_default_cmp, | 249 | .match_data.cmp = key_default_cmp, |
| 250 | .match_data.raw_data = description, | 250 | .match_data.raw_data = description, |
| 251 | .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, | 251 | .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, |
| 252 | .flags = KEYRING_SEARCH_DO_STATE_CHECK, | ||
| 252 | }; | 253 | }; |
| 253 | struct key *authkey; | 254 | struct key *authkey; |
| 254 | key_ref_t authkey_ref; | 255 | key_ref_t authkey_ref; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 14f16be3f374..b118a5be18df 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -4790,6 +4790,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 4790 | SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), | 4790 | SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), |
| 4791 | SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4791 | SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4792 | SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4792 | SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4793 | SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 4794 | SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 4793 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4795 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4794 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4796 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 4795 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 4797 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
