From: Greg Kroah-Hartman Date: Sat, 9 May 2015 17:24:23 +0000 (+0200) Subject: 3.14-stable patches X-Git-Tag: v3.19.8~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1b004d8c424294925cc14542c8478feed6e8c1ac;p=thirdparty%2Fkernel%2Fstable-queue.git 3.14-stable patches added patches: alsa-emu10k1-emu10k2-32-bit-dma-mode.patch alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch alsa-emux-fix-mutex-deadlock-at-unloading.patch alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch alsa-hda-add-mute-led-mode-control-to-thinkpad.patch alsa-hda-fix-mute-led-fixed-mode.patch asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch rbd-end-i-o-the-entire-obj_request-on-error.patch serial-of-serial-remove-device_type-serial-registration.patch tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch --- diff --git a/queue-3.14/alsa-emu10k1-emu10k2-32-bit-dma-mode.patch b/queue-3.14/alsa-emu10k1-emu10k2-32-bit-dma-mode.patch new file mode 100644 index 00000000000..e0ae28f5fec --- /dev/null +++ b/queue-3.14/alsa-emu10k1-emu10k2-32-bit-dma-mode.patch @@ -0,0 +1,205 @@ +From 7241ea558c6715501e777396b5fc312c372e11d9 Mon Sep 17 00:00:00 2001 +From: Peter Zubaj +Date: Tue, 28 Apr 2015 21:57:29 +0200 +Subject: ALSA: emu10k1: Emu10k2 32 bit DMA mode + +From: Peter Zubaj + +commit 7241ea558c6715501e777396b5fc312c372e11d9 upstream. + +Looks like audigy emu10k2 (probably emu10k1 - sb live too) support two +modes for DMA. Second mode is useful for 64 bit os with more then 2 GB +of ram (fixes problems with big soundfont loading) + +1) 32MB from 2 GB address space using 8192 pages (used now as default) +2) 16MB from 4 GB address space using 4096 pages + +Mode is set using HCFG_EXPANDED_MEM flag in HCFG register. +Also format of emu10k2 page table is then different. + +Signed-off-by: Peter Zubaj +Tested-by: Takashi Iwai +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + include/sound/emu10k1.h | 14 +++++++++----- + sound/pci/emu10k1/emu10k1_callback.c | 4 ++-- + sound/pci/emu10k1/emu10k1_main.c | 17 ++++++++++++----- + sound/pci/emu10k1/emupcm.c | 2 +- + sound/pci/emu10k1/memory.c | 11 ++++++----- + 5 files changed, 30 insertions(+), 18 deletions(-) + +--- a/include/sound/emu10k1.h ++++ b/include/sound/emu10k1.h +@@ -41,7 +41,8 @@ + + #define EMUPAGESIZE 4096 + #define MAXREQVOICES 8 +-#define MAXPAGES 8192 ++#define MAXPAGES0 4096 /* 32 bit mode */ ++#define MAXPAGES1 8192 /* 31 bit mode */ + #define RESERVED 0 + #define NUM_MIDI 16 + #define NUM_G 64 /* use all channels */ +@@ -50,8 +51,7 @@ + + /* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */ + #define EMU10K1_DMA_MASK 0x7fffffffUL /* 31bit */ +-#define AUDIGY_DMA_MASK 0x7fffffffUL /* 31bit FIXME - 32 should work? */ +- /* See ALSA bug #1276 - rlrevell */ ++#define AUDIGY_DMA_MASK 0xffffffffUL /* 32bit mode */ + + #define TMEMSIZE 256*1024 + #define TMEMSIZEREG 4 +@@ -468,8 +468,11 @@ + + #define MAPB 0x0d /* Cache map B */ + +-#define MAP_PTE_MASK 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */ +-#define MAP_PTI_MASK 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */ ++#define MAP_PTE_MASK0 0xfffff000 /* The 20 MSBs of the PTE indexed by the PTI */ ++#define MAP_PTI_MASK0 0x00000fff /* The 12 bit index to one of the 4096 PTE dwords */ ++ ++#define MAP_PTE_MASK1 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */ ++#define MAP_PTI_MASK1 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */ + + /* 0x0e, 0x0f: Not used */ + +@@ -1706,6 +1709,7 @@ struct snd_emu10k1 { + unsigned short model; /* subsystem id */ + unsigned int card_type; /* EMU10K1_CARD_* */ + unsigned int ecard_ctrl; /* ecard control bits */ ++ unsigned int address_mode; /* address mode */ + unsigned long dma_mask; /* PCI DMA mask */ + unsigned int delay_pcm_irq; /* in samples */ + int max_cache_pages; /* max memory size / PAGE_SIZE */ +--- a/sound/pci/emu10k1/emu10k1_callback.c ++++ b/sound/pci/emu10k1/emu10k1_callback.c +@@ -415,7 +415,7 @@ start_voice(struct snd_emux_voice *vp) + snd_emu10k1_ptr_write(hw, Z2, ch, 0); + + /* invalidate maps */ +- temp = (hw->silent_page.addr << 1) | MAP_PTI_MASK; ++ temp = (hw->silent_page.addr << hw->address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); + snd_emu10k1_ptr_write(hw, MAPA, ch, temp); + snd_emu10k1_ptr_write(hw, MAPB, ch, temp); + #if 0 +@@ -436,7 +436,7 @@ start_voice(struct snd_emux_voice *vp) + snd_emu10k1_ptr_write(hw, CDF, ch, sample); + + /* invalidate maps */ +- temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK; ++ temp = ((unsigned int)hw->silent_page.addr << hw_address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); + snd_emu10k1_ptr_write(hw, MAPA, ch, temp); + snd_emu10k1_ptr_write(hw, MAPB, ch, temp); + +--- a/sound/pci/emu10k1/emu10k1_main.c ++++ b/sound/pci/emu10k1/emu10k1_main.c +@@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_e + snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */ + snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */ + +- silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK; ++ silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); + for (ch = 0; ch < NUM_G; ch++) { + snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page); + snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page); +@@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_e + outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG); + } + ++ if (emu->address_mode == 0) { ++ /* use 16M in 4G */ ++ outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG); ++ } ++ + return 0; + } + +@@ -1865,8 +1870,10 @@ int snd_emu10k1_create(struct snd_card * + + is_audigy = emu->audigy = c->emu10k2_chip; + ++ /* set addressing mode */ ++ emu->address_mode = is_audigy ? 0 : 1; + /* set the DMA transfer mask */ +- emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK; ++ emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK; + if (pci_set_dma_mask(pci, emu->dma_mask) < 0 || + pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) { + snd_printk(KERN_ERR "architecture does not support PCI busmaster DMA with mask 0x%lx\n", emu->dma_mask); +@@ -1889,7 +1896,7 @@ int snd_emu10k1_create(struct snd_card * + + emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT; + if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), +- 32 * 1024, &emu->ptb_pages) < 0) { ++ (emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) { + err = -ENOMEM; + goto error; + } +@@ -1988,8 +1995,8 @@ int snd_emu10k1_create(struct snd_card * + + /* Clear silent pages and set up pointers */ + memset(emu->silent_page.area, 0, PAGE_SIZE); +- silent_page = emu->silent_page.addr << 1; +- for (idx = 0; idx < MAXPAGES; idx++) ++ silent_page = emu->silent_page.addr << emu->address_mode; ++ for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++) + ((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx); + + /* set up voice indices */ +--- a/sound/pci/emu10k1/emupcm.c ++++ b/sound/pci/emu10k1/emupcm.c +@@ -379,7 +379,7 @@ static void snd_emu10k1_pcm_init_voice(s + snd_emu10k1_ptr_write(emu, Z1, voice, 0); + snd_emu10k1_ptr_write(emu, Z2, voice, 0); + /* invalidate maps */ +- silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK; ++ silent_page = ((unsigned int)emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); + snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page); + snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page); + /* modulation envelope */ +--- a/sound/pci/emu10k1/memory.c ++++ b/sound/pci/emu10k1/memory.c +@@ -34,10 +34,11 @@ + * aligned pages in others + */ + #define __set_ptb_entry(emu,page,addr) \ +- (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 1) | (page))) ++ (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page))) + + #define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE) +-#define MAX_ALIGN_PAGES (MAXPAGES / UNIT_PAGES) ++#define MAX_ALIGN_PAGES0 (MAXPAGES0 / UNIT_PAGES) ++#define MAX_ALIGN_PAGES1 (MAXPAGES1 / UNIT_PAGES) + /* get aligned page from offset address */ + #define get_aligned_page(offset) ((offset) >> PAGE_SHIFT) + /* get offset address from aligned page */ +@@ -124,7 +125,7 @@ static int search_empty_map_area(struct + } + page = blk->mapped_page + blk->pages; + } +- size = MAX_ALIGN_PAGES - page; ++ size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page; + if (size >= max_size) { + *nextp = pos; + return page; +@@ -181,7 +182,7 @@ static int unmap_memblk(struct snd_emu10 + q = get_emu10k1_memblk(p, mapped_link); + end_page = q->mapped_page; + } else +- end_page = MAX_ALIGN_PAGES; ++ end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0); + + /* remove links */ + list_del(&blk->mapped_link); +@@ -305,7 +306,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10 + if (snd_BUG_ON(!emu)) + return NULL; + if (snd_BUG_ON(runtime->dma_bytes <= 0 || +- runtime->dma_bytes >= MAXPAGES * EMUPAGESIZE)) ++ runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : MAXPAGES0) * EMUPAGESIZE)) + return NULL; + hdr = emu->memhdr; + if (snd_BUG_ON(!hdr)) diff --git a/queue-3.14/alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch b/queue-3.14/alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch new file mode 100644 index 00000000000..4fde4277f0d --- /dev/null +++ b/queue-3.14/alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch @@ -0,0 +1,62 @@ +From d02260824e2cad626fb2a9d62e27006d34b6dedc Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 27 Apr 2015 13:00:09 +0200 +Subject: ALSA: emu10k1: Fix card shortname string buffer overflow + +From: Takashi Iwai + +commit d02260824e2cad626fb2a9d62e27006d34b6dedc upstream. + +Some models provide too long string for the shortname that has 32bytes +including the terminator, and it results in a non-terminated string +exposed to the user-space. This isn't too critical, though, as the +string is stopped at the succeeding longname string. + +This patch fixes such entries by dropping "SB" prefix (it's enough to +fit within 32 bytes, so far). Meanwhile, it also changes strcpy() +with strlcpy() to make sure that this kind of problem won't happen in +future, too. + +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/emu10k1/emu10k1.c | 6 ++++-- + sound/pci/emu10k1/emu10k1_main.c | 4 ++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +--- a/sound/pci/emu10k1/emu10k1.c ++++ b/sound/pci/emu10k1/emu10k1.c +@@ -181,8 +181,10 @@ static int snd_card_emu10k1_probe(struct + } + #endif + +- strcpy(card->driver, emu->card_capabilities->driver); +- strcpy(card->shortname, emu->card_capabilities->name); ++ strlcpy(card->driver, emu->card_capabilities->driver, ++ sizeof(card->driver)); ++ strlcpy(card->shortname, emu->card_capabilities->name, ++ sizeof(card->shortname)); + snprintf(card->longname, sizeof(card->longname), + "%s (rev.%d, serial:0x%x) at 0x%lx, irq %i", + card->shortname, emu->revision, emu->serial, emu->port, emu->irq); +--- a/sound/pci/emu10k1/emu10k1_main.c ++++ b/sound/pci/emu10k1/emu10k1_main.c +@@ -1411,7 +1411,7 @@ static struct snd_emu_chip_details emu_c + * + */ + {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102, +- .driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]", ++ .driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]", + .id = "Audigy2", + .emu10k2_chip = 1, + .ca0108_chip = 1, +@@ -1561,7 +1561,7 @@ static struct snd_emu_chip_details emu_c + .adc_1361t = 1, /* 24 bit capture instead of 16bit */ + .ac97_chip = 1} , + {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102, +- .driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]", ++ .driver = "Audigy2", .name = "Audigy 2 Platinum EX [SB0280]", + .id = "Audigy2", + .emu10k2_chip = 1, + .ca0102_chip = 1, diff --git a/queue-3.14/alsa-emux-fix-mutex-deadlock-at-unloading.patch b/queue-3.14/alsa-emux-fix-mutex-deadlock-at-unloading.patch new file mode 100644 index 00000000000..872d1675ccf --- /dev/null +++ b/queue-3.14/alsa-emux-fix-mutex-deadlock-at-unloading.patch @@ -0,0 +1,48 @@ +From 07b0e5d49d227e3950cb13a3e8caf248ef2a310e Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 27 Apr 2015 14:50:39 +0200 +Subject: ALSA: emux: Fix mutex deadlock at unloading + +From: Takashi Iwai + +commit 07b0e5d49d227e3950cb13a3e8caf248ef2a310e upstream. + +The emux-synth driver has a possible AB/BA mutex deadlock at unloading +the emu10k1 driver: + + snd_emux_free() -> + snd_emux_detach_seq(): mutex_lock(&emu->register_mutex) -> + snd_seq_delete_kernel_client() -> + snd_seq_free_client(): mutex_lock(®ister_mutex) + + snd_seq_release() -> + snd_seq_free_client(): mutex_lock(®ister_mutex) -> + snd_seq_delete_all_ports() -> + snd_emux_unuse(): mutex_lock(&emu->register_mutex) + +Basically snd_emux_detach_seq() doesn't need a protection of +emu->register_mutex as it's already being unregistered. So, we can +get rid of this for avoiding the deadlock. + +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/synth/emux/emux_seq.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/sound/synth/emux/emux_seq.c ++++ b/sound/synth/emux/emux_seq.c +@@ -124,12 +124,10 @@ snd_emux_detach_seq(struct snd_emux *emu + if (emu->voices) + snd_emux_terminate_all(emu); + +- mutex_lock(&emu->register_mutex); + if (emu->client >= 0) { + snd_seq_delete_kernel_client(emu->client); + emu->client = -1; + } +- mutex_unlock(&emu->register_mutex); + } + + diff --git a/queue-3.14/alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch b/queue-3.14/alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch new file mode 100644 index 00000000000..9e0902330d6 --- /dev/null +++ b/queue-3.14/alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch @@ -0,0 +1,154 @@ +From 1c94e65c668f44d2c69ae7e7fc268ab3268fba3e Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Tue, 28 Apr 2015 17:11:44 +0200 +Subject: ALSA: emux: Fix mutex deadlock in OSS emulation + +From: Takashi Iwai + +commit 1c94e65c668f44d2c69ae7e7fc268ab3268fba3e upstream. + +The OSS emulation in synth-emux helper has a potential AB/BA deadlock +at the simultaneous closing and opening: + + close -> + snd_seq_release() -> + sne_seq_free_client() -> + snd_seq_delete_all_ports(): takes client->ports_mutex -> + port_delete() -> + snd_emux_unuse(): takes emux->register_mutex + + open -> + snd_seq_oss_open() -> + snd_emux_open_seq_oss(): takes emux->register_mutex -> + snd_seq_event_port_attach() -> + snd_seq_create_port(): takes client->ports_mutex + +This patch addresses the deadlock by reducing the rance taking +emux->register_mutex in snd_emux_open_seq_oss(). The lock is needed +for the refcount handling, so move it locally. The calls in +emux_seq.c are already with the mutex, thus they are replaced with the +version without mutex lock/unlock. + +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/synth/emux/emux_oss.c | 11 +---------- + sound/synth/emux/emux_seq.c | 27 +++++++++++++++++++++------ + 2 files changed, 22 insertions(+), 16 deletions(-) + +--- a/sound/synth/emux/emux_oss.c ++++ b/sound/synth/emux/emux_oss.c +@@ -118,12 +118,8 @@ snd_emux_open_seq_oss(struct snd_seq_oss + if (snd_BUG_ON(!arg || !emu)) + return -ENXIO; + +- mutex_lock(&emu->register_mutex); +- +- if (!snd_emux_inc_count(emu)) { +- mutex_unlock(&emu->register_mutex); ++ if (!snd_emux_inc_count(emu)) + return -EFAULT; +- } + + memset(&callback, 0, sizeof(callback)); + callback.owner = THIS_MODULE; +@@ -135,7 +131,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss + if (p == NULL) { + snd_printk(KERN_ERR "can't create port\n"); + snd_emux_dec_count(emu); +- mutex_unlock(&emu->register_mutex); + return -ENOMEM; + } + +@@ -148,8 +143,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss + reset_port_mode(p, arg->seq_mode); + + snd_emux_reset_port(p); +- +- mutex_unlock(&emu->register_mutex); + return 0; + } + +@@ -195,13 +188,11 @@ snd_emux_close_seq_oss(struct snd_seq_os + if (snd_BUG_ON(!emu)) + return -ENXIO; + +- mutex_lock(&emu->register_mutex); + snd_emux_sounds_off_all(p); + snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port)); + snd_seq_event_port_detach(p->chset.client, p->chset.port); + snd_emux_dec_count(emu); + +- mutex_unlock(&emu->register_mutex); + return 0; + } + +--- a/sound/synth/emux/emux_seq.c ++++ b/sound/synth/emux/emux_seq.c +@@ -267,8 +267,8 @@ snd_emux_event_input(struct snd_seq_even + /* + * increment usage count + */ +-int +-snd_emux_inc_count(struct snd_emux *emu) ++static int ++__snd_emux_inc_count(struct snd_emux *emu) + { + emu->used++; + if (!try_module_get(emu->ops.owner)) +@@ -282,12 +282,21 @@ snd_emux_inc_count(struct snd_emux *emu) + return 1; + } + ++int snd_emux_inc_count(struct snd_emux *emu) ++{ ++ int ret; ++ ++ mutex_lock(&emu->register_mutex); ++ ret = __snd_emux_inc_count(emu); ++ mutex_unlock(&emu->register_mutex); ++ return ret; ++} + + /* + * decrease usage count + */ +-void +-snd_emux_dec_count(struct snd_emux *emu) ++static void ++__snd_emux_dec_count(struct snd_emux *emu) + { + module_put(emu->card->module); + emu->used--; +@@ -296,6 +305,12 @@ snd_emux_dec_count(struct snd_emux *emu) + module_put(emu->ops.owner); + } + ++void snd_emux_dec_count(struct snd_emux *emu) ++{ ++ mutex_lock(&emu->register_mutex); ++ __snd_emux_dec_count(emu); ++ mutex_unlock(&emu->register_mutex); ++} + + /* + * Routine that is called upon a first use of a particular port +@@ -315,7 +330,7 @@ snd_emux_use(void *private_data, struct + + mutex_lock(&emu->register_mutex); + snd_emux_init_port(p); +- snd_emux_inc_count(emu); ++ __snd_emux_inc_count(emu); + mutex_unlock(&emu->register_mutex); + return 0; + } +@@ -338,7 +353,7 @@ snd_emux_unuse(void *private_data, struc + + mutex_lock(&emu->register_mutex); + snd_emux_sounds_off_all(p); +- snd_emux_dec_count(emu); ++ __snd_emux_dec_count(emu); + mutex_unlock(&emu->register_mutex); + return 0; + } diff --git a/queue-3.14/alsa-hda-add-mute-led-mode-control-to-thinkpad.patch b/queue-3.14/alsa-hda-add-mute-led-mode-control-to-thinkpad.patch new file mode 100644 index 00000000000..155516a7d43 --- /dev/null +++ b/queue-3.14/alsa-hda-add-mute-led-mode-control-to-thinkpad.patch @@ -0,0 +1,33 @@ +From 7290006d8c0900c56d8c58428134f02c35109d17 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 27 Apr 2015 10:40:45 +0200 +Subject: ALSA: hda - Add mute-LED mode control to Thinkpad +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Takashi Iwai + +commit 7290006d8c0900c56d8c58428134f02c35109d17 upstream. + +This patch adds the missing flag to enable "Mute-LED Mode" mixer enum +ctl for Thinkpads that have also the software mute-LED control. + +Reported-and-tested-by: Pali Rohár +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/thinkpad_helper.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/thinkpad_helper.c ++++ b/sound/pci/hda/thinkpad_helper.c +@@ -71,6 +71,7 @@ static void hda_fixup_thinkpad_acpi(stru + if (led_set_func(TPACPI_LED_MUTE, false) >= 0) { + old_vmaster_hook = spec->vmaster_mute.hook; + spec->vmaster_mute.hook = update_tpacpi_mute_led; ++ spec->vmaster_mute_enum = 1; + removefunc = false; + } + if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) { diff --git a/queue-3.14/alsa-hda-fix-mute-led-fixed-mode.patch b/queue-3.14/alsa-hda-fix-mute-led-fixed-mode.patch new file mode 100644 index 00000000000..6e0b722d0e5 --- /dev/null +++ b/queue-3.14/alsa-hda-fix-mute-led-fixed-mode.patch @@ -0,0 +1,74 @@ +From ee52e56e7b12834476cd0031c5986254ba1b6317 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 27 Apr 2015 10:36:11 +0200 +Subject: ALSA: hda - Fix mute-LED fixed mode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Takashi Iwai + +commit ee52e56e7b12834476cd0031c5986254ba1b6317 upstream. + +The mute-LED mode control has the fixed on/off states that are +supposed to remain on/off regardless of the master switch. However, +this doesn't work actually because the vmaster hook is called in the +vmaster code itself. + +This patch fixes it by calling the hook indirectly after checking the +mute LED mode. + +Reported-and-tested-by: Pali Rohár +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/hda_codec.c | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +--- a/sound/pci/hda/hda_codec.c ++++ b/sound/pci/hda/hda_codec.c +@@ -2082,6 +2082,16 @@ static void put_vol_mute(struct hda_code + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, parm); + } + ++/* meta hook to call each driver's vmaster hook */ ++static void vmaster_hook(void *private_data, int enabled) ++{ ++ struct hda_vmaster_mute_hook *hook = private_data; ++ ++ if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER) ++ enabled = hook->mute_mode; ++ hook->hook(hook->codec, enabled); ++} ++ + /** + * snd_hda_codec_amp_read - Read AMP value + * @codec: HD-audio codec +@@ -2917,9 +2927,9 @@ int snd_hda_add_vmaster_hook(struct hda_ + + if (!hook->hook || !hook->sw_kctl) + return 0; +- snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec); + hook->codec = codec; + hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER; ++ snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook); + if (!expose_enum_ctl) + return 0; + kctl = snd_ctl_new1(&vmaster_mute_mode, hook); +@@ -2942,14 +2952,7 @@ void snd_hda_sync_vmaster_hook(struct hd + */ + if (hook->codec->bus->shutdown) + return; +- switch (hook->mute_mode) { +- case HDA_VMUTE_FOLLOW_MASTER: +- snd_ctl_sync_vmaster_hook(hook->sw_kctl); +- break; +- default: +- hook->hook(hook->codec, hook->mute_mode); +- break; +- } ++ snd_ctl_sync_vmaster_hook(hook->sw_kctl); + } + EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook); + diff --git a/queue-3.14/asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch b/queue-3.14/asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch new file mode 100644 index 00000000000..4d5bca7dac2 --- /dev/null +++ b/queue-3.14/asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch @@ -0,0 +1,31 @@ +From a2d97723cb3a7741af81868427b36bba274b681b Mon Sep 17 00:00:00 2001 +From: Charles Keepax +Date: Wed, 22 Apr 2015 13:58:47 +0100 +Subject: ASoC: dapm: Enable autodisable on SOC_DAPM_SINGLE_TLV_AUTODISABLE + +From: Charles Keepax + +commit a2d97723cb3a7741af81868427b36bba274b681b upstream. + +Correct small copy and paste error where autodisable was not being +enabled for the SOC_DAPM_SINGLE_TLV_AUTODISABLE control. + +Signed-off-by: Charles Keepax +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + include/sound/soc-dapm.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/include/sound/soc-dapm.h ++++ b/include/sound/soc-dapm.h +@@ -302,7 +302,7 @@ struct device; + .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\ + .tlv.p = (tlv_array), \ + .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ +- .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } ++ .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) } + #define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \ + SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array) + #define SOC_DAPM_ENUM(xname, xenum) \ diff --git a/queue-3.14/ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch b/queue-3.14/ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch new file mode 100644 index 00000000000..6bb7bd148d3 --- /dev/null +++ b/queue-3.14/ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch @@ -0,0 +1,90 @@ +From d2dc317d564a46dfc683978a2e5a4f91434e9711 Mon Sep 17 00:00:00 2001 +From: Lukas Czerner +Date: Sat, 2 May 2015 21:36:55 -0400 +Subject: ext4: fix data corruption caused by unwritten and delayed extents + +From: Lukas Czerner + +commit d2dc317d564a46dfc683978a2e5a4f91434e9711 upstream. + +Currently it is possible to lose whole file system block worth of data +when we hit the specific interaction with unwritten and delayed extents +in status extent tree. + +The problem is that when we insert delayed extent into extent status +tree the only way to get rid of it is when we write out delayed buffer. +However there is a limitation in the extent status tree implementation +so that when inserting unwritten extent should there be even a single +delayed block the whole unwritten extent would be marked as delayed. + +At this point, there is no way to get rid of the delayed extents, +because there are no delayed buffers to write out. So when a we write +into said unwritten extent we will convert it to written, but it still +remains delayed. + +When we try to write into that block later ext4_da_map_blocks() will set +the buffer new and delayed and map it to invalid block which causes +the rest of the block to be zeroed loosing already written data. + +For now we can fix this by simply not allowing to set delayed status on +written extent in the extent status tree. Also add WARN_ON() to make +sure that we notice if this happens in the future. + +This problem can be easily reproduced by running the following xfs_io. + +xfs_io -f -c "pwrite -S 0xaa 4096 2048" \ + -c "falloc 0 131072" \ + -c "pwrite -S 0xbb 65536 2048" \ + -c "fsync" /mnt/test/fff + +echo 3 > /proc/sys/vm/drop_caches +xfs_io -c "pwrite -S 0xdd 67584 2048" /mnt/test/fff + +This can be theoretically also reproduced by at random by running fsx, +but it's not very reliable, though on machines with bigger page size +(like ppc) this can be seen more often (especially xfstest generic/127) + +Signed-off-by: Lukas Czerner +Signed-off-by: Theodore Ts'o +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext4/extents_status.c | 8 ++++++++ + fs/ext4/inode.c | 2 ++ + 2 files changed, 10 insertions(+) + +--- a/fs/ext4/extents_status.c ++++ b/fs/ext4/extents_status.c +@@ -656,6 +656,14 @@ int ext4_es_insert_extent(struct inode * + + BUG_ON(end < lblk); + ++ if ((status & EXTENT_STATUS_DELAYED) && ++ (status & EXTENT_STATUS_WRITTEN)) { ++ ext4_warning(inode->i_sb, "Inserting extent [%u/%u] as " ++ " delayed and written which can potentially " ++ " cause data loss.\n", lblk, len); ++ WARN_ON(1); ++ } ++ + newes.es_lblk = lblk; + newes.es_len = len; + ext4_es_store_pblock(&newes, pblk); +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -569,6 +569,7 @@ int ext4_map_blocks(handle_t *handle, st + status = map->m_flags & EXT4_MAP_UNWRITTEN ? + EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; + if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) && ++ !(status & EXTENT_STATUS_WRITTEN) && + ext4_find_delalloc_range(inode, map->m_lblk, + map->m_lblk + map->m_len - 1)) + status |= EXTENT_STATUS_DELAYED; +@@ -678,6 +679,7 @@ found: + status = map->m_flags & EXT4_MAP_UNWRITTEN ? + EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; + if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) && ++ !(status & EXTENT_STATUS_WRITTEN) && + ext4_find_delalloc_range(inode, map->m_lblk, + map->m_lblk + map->m_len - 1)) + status |= EXTENT_STATUS_DELAYED; diff --git a/queue-3.14/rbd-end-i-o-the-entire-obj_request-on-error.patch b/queue-3.14/rbd-end-i-o-the-entire-obj_request-on-error.patch new file mode 100644 index 00000000000..d8c414734bc --- /dev/null +++ b/queue-3.14/rbd-end-i-o-the-entire-obj_request-on-error.patch @@ -0,0 +1,49 @@ +From 082a75dad84d79d1c15ea9e50f31cb4bb4fa7fd6 Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Sat, 25 Apr 2015 15:56:15 +0300 +Subject: rbd: end I/O the entire obj_request on error + +From: Ilya Dryomov + +commit 082a75dad84d79d1c15ea9e50f31cb4bb4fa7fd6 upstream. + +When we end I/O struct request with error, we need to pass +obj_request->length as @nr_bytes so that the entire obj_request worth +of bytes is completed. Otherwise block layer ends up confused and we +trip on + + rbd_assert(more ^ (which == img_request->obj_request_count)); + +in rbd_img_obj_callback() due to more being true no matter what. We +already do it in most cases but we are missing some, in particular +those where we don't even get a chance to submit any obj_requests, due +to an early -ENOMEM for example. + +A number of obj_request->xferred assignments seem to be redundant but +I haven't touched any of obj_request->xferred stuff to keep this small +and isolated. + +Cc: Alex Elder +Reported-by: Shawn Edwards +Reviewed-by: Sage Weil +Signed-off-by: Ilya Dryomov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/block/rbd.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/block/rbd.c ++++ b/drivers/block/rbd.c +@@ -2084,6 +2084,11 @@ static bool rbd_img_obj_end_request(stru + result, xferred); + if (!img_request->result) + img_request->result = result; ++ /* ++ * Need to end I/O on the entire obj_request worth of ++ * bytes in case of error. ++ */ ++ xferred = obj_request->length; + } + + /* Image object requests don't own their page array */ diff --git a/queue-3.14/serial-of-serial-remove-device_type-serial-registration.patch b/queue-3.14/serial-of-serial-remove-device_type-serial-registration.patch new file mode 100644 index 00000000000..28502003635 --- /dev/null +++ b/queue-3.14/serial-of-serial-remove-device_type-serial-registration.patch @@ -0,0 +1,43 @@ +From 6befa9d883385c580369a2cc9e53fbf329771f6d Mon Sep 17 00:00:00 2001 +From: Michal Simek +Date: Tue, 14 Apr 2015 12:03:09 +0200 +Subject: serial: of-serial: Remove device_type = "serial" registration + +From: Michal Simek + +commit 6befa9d883385c580369a2cc9e53fbf329771f6d upstream. + +Do not probe all serial drivers by of_serial.c which are using +device_type = "serial"; property. Only drivers which have valid +compatible strings listed in the driver should be probed. + +When PORT_UNKNOWN is setup probe will fail anyway. + +Arnd quotation about driver historical background: +"when I wrote that driver initially, the idea was that it would +get used as a stub to hook up all other serial drivers but after +that, the common code learned to create platform devices from DT" + +This patch fix the problem with on the system with xilinx_uartps and +16550a where of_serial failed to register for xilinx_uartps and because +of irq_dispose_mapping() removed irq_desc. Then when xilinx_uartps was asking +for irq with request_irq() EINVAL is returned. + +Signed-off-by: Michal Simek +Acked-by: Arnd Bergmann +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/tty/serial/of_serial.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/drivers/tty/serial/of_serial.c ++++ b/drivers/tty/serial/of_serial.c +@@ -261,7 +261,6 @@ static struct of_device_id of_platform_s + { .compatible = "ibm,qpace-nwp-serial", + .data = (void *)PORT_NWPSERIAL, }, + #endif +- { .type = "serial", .data = (void *)PORT_UNKNOWN, }, + { /* end of list */ }, + }; + diff --git a/queue-3.14/series b/queue-3.14/series index 3873c7853cf..12c0060a809 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -1 +1,12 @@ ipv4-missing-sk_nulls_node_init-in-ping_unhash.patch +alsa-emux-fix-mutex-deadlock-at-unloading.patch +alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch +alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch +alsa-emu10k1-emu10k2-32-bit-dma-mode.patch +alsa-hda-fix-mute-led-fixed-mode.patch +alsa-hda-add-mute-led-mode-control-to-thinkpad.patch +serial-of-serial-remove-device_type-serial-registration.patch +asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch +tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch +rbd-end-i-o-the-entire-obj_request-on-error.patch +ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch diff --git a/queue-3.14/tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch b/queue-3.14/tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch new file mode 100644 index 00000000000..4316f21db17 --- /dev/null +++ b/queue-3.14/tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch @@ -0,0 +1,39 @@ +From a8d4e01637902311c5643b69a5c80e2805f04054 Mon Sep 17 00:00:00 2001 +From: Ludovic Desroches +Date: Thu, 16 Apr 2015 16:58:12 +0200 +Subject: tty/serial: at91: maxburst was missing for dma transfers + +From: Ludovic Desroches + +commit a8d4e01637902311c5643b69a5c80e2805f04054 upstream. + +Maxburst was not set when doing the dma slave configuration. This value +is checked by the recently introduced xdmac. It causes an error when +doing the slave configuration and so prevents from using dma. + +Signed-off-by: Ludovic Desroches +Acked-by: Nicolas Ferre +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/tty/serial/atmel_serial.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/tty/serial/atmel_serial.c ++++ b/drivers/tty/serial/atmel_serial.c +@@ -757,6 +757,7 @@ static int atmel_prepare_tx_dma(struct u + config.direction = DMA_MEM_TO_DEV; + config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; + config.dst_addr = port->mapbase + ATMEL_US_THR; ++ config.dst_maxburst = 1; + + ret = dmaengine_device_control(atmel_port->chan_tx, + DMA_SLAVE_CONFIG, +@@ -921,6 +922,7 @@ static int atmel_prepare_rx_dma(struct u + config.direction = DMA_DEV_TO_MEM; + config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; + config.src_addr = port->mapbase + ATMEL_US_RHR; ++ config.src_maxburst = 1; + + ret = dmaengine_device_control(atmel_port->chan_rx, + DMA_SLAVE_CONFIG,