Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
authorLinus Torvalds <torvalds@woody.osdl.org>
Wed, 29 Nov 2006 04:54:40 +0000 (20:54 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Wed, 29 Nov 2006 04:54:40 +0000 (20:54 -0800)
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  [PATCH] libata: Fixup ata_sas_queuecmd to handle __ata_scsi_queuecmd failure
  [PATCH] ahci: AHCI mode SATA patch for Intel ICH9
  [PATCH] libata: don't schedule EH on wcache on/off if old EH

21 files changed:
arch/mips/mips-boards/malta/malta_setup.c
arch/x86_64/kernel/early_printk.c
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/traps.c
drivers/mtd/chips/cfi_cmdset_0001.c
fs/ecryptfs/crypto.c
include/asm-i386/mach-summit/mach_apic.h
include/scsi/libsas.h
include/sound/version.h
kernel/kmod.c
kernel/unwind.c
net/bridge/br_ioctl.c
security/selinux/hooks.c
sound/aoa/codecs/snd-aoa-codec-tas.c
sound/core/oss/pcm_oss.c
sound/core/pcm_native.c
sound/core/rtctimer.c
sound/pci/emu10k1/emu10k1_main.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_sigmatel.c
sound/usb/usbaudio.c

index ab460f805befcc57eb28a22ac63a14a80e8b7552..282f3e52eea3622eb1d00fd9ca710ac8e41cbda4 100644 (file)
@@ -159,7 +159,7 @@ void __init plat_mem_setup(void)
                                BONITO_PCIMEMBASECFG |=
                                        (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
                                         BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
-                               printk("Disabled Bonito IOBC coherency\n");
+                               printk("Enabled Bonito IOBC coherency\n");
                        }
                }
                else
index e22ecd54870d8e818dc0bc2563a8194a7699def2..47b6d90349da905f226709aaf29c9ff48e501741 100644 (file)
@@ -224,7 +224,7 @@ static int __init setup_early_printk(char *buf)
                return 0;
        early_console_initialized = 1;
 
-       if (!strcmp(buf,"keep"))
+       if (strstr(buf, "keep"))
                keep_early = 1;
 
        if (!strncmp(buf, "serial", 6)) {
index 14654e6824116f5c96766b07c93cacf1a6a28c5d..c80081a6ba415584553eea8c78377663914e4347 100644 (file)
@@ -754,10 +754,8 @@ void __setup_vector_irq(int cpu)
 {
        /* Initialize vector_irq on a new cpu */
        /* This function must be called with vector_lock held */
-       unsigned long flags;
        int irq, vector;
 
-
        /* Mark the inuse vectors */
        for (irq = 0; irq < NR_IRQ_VECTORS; ++irq) {
                if (!cpu_isset(cpu, irq_domain[irq]))
index a153d0a01b72152fa34b5fc22cfeec9a2c6ffda3..0d65b22f229ccfbf895ff2aa12e3dd2d9977cdd8 100644 (file)
@@ -242,12 +242,19 @@ static int dump_trace_unwind(struct unwind_frame_info *info, void *context)
  * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
  */
 
+static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
+{
+       void *t = (void *)tinfo;
+        return p > t && p < t + THREAD_SIZE - 3;
+}
+
 void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack,
                struct stacktrace_ops *ops, void *data)
 {
        const unsigned cpu = smp_processor_id();
        unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
        unsigned used = 0;
+       struct thread_info *tinfo;
 
        if (!tsk)
                tsk = current;
@@ -370,7 +377,8 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
        /*
         * This handles the process stack:
         */
-       HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
+       tinfo = current_thread_info();
+       HANDLE_STACK (valid_stack_ptr(tinfo, stack));
 #undef HANDLE_STACK
 }
 EXPORT_SYMBOL(dump_trace);
index 7ea49a0d5ec32490633e27a3219e9b2335c3024b..296159ec5189eafc0e6c68d118bde8772725ac95 100644 (file)
@@ -1087,7 +1087,7 @@ static int inval_cache_and_wait_for_operation(
                }
                spin_lock(chip->mutex);
 
-               if (chip->state != chip_state) {
+               while (chip->state != chip_state) {
                        /* Someone's suspended the operation: sleep */
                        DECLARE_WAITQUEUE(wait, current);
                        set_current_state(TASK_UNINTERRUPTIBLE);
index 136175a693321300743e02a7dd1f663e3ff41c4d..f63a7755fe8697ea7469182b1baa487fd1b48c7a 100644 (file)
@@ -820,7 +820,8 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat)
        crypt_stat->tfm = crypto_alloc_blkcipher(full_alg_name, 0,
                                                 CRYPTO_ALG_ASYNC);
        kfree(full_alg_name);
-       if (!crypt_stat->tfm) {
+       if (IS_ERR(crypt_stat->tfm)) {
+               rc = PTR_ERR(crypt_stat->tfm);
                ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): "
                                "Error initializing cipher [%s]\n",
                                crypt_stat->cipher);
index ef0671e5d5c549f244daa69be31acb46583b36ca..43e5bd8f4a196d32db7460afe927e1a83f08ce72 100644 (file)
@@ -88,7 +88,11 @@ static inline void clustered_apic_check(void)
 
 static inline int apicid_to_node(int logical_apicid)
 {
+#ifdef CONFIG_SMP
        return apicid_2_node[hard_smp_processor_id()];
+#else
+       return 0;
+#endif
 }
 
 /* Mapping from cpu number to logical apicid */
index 9582e8401669b89ceba0d555499c0d3e263c8e30..1d77b63c5ea4c64882b3e7d37d0c650941729f4a 100644 (file)
@@ -35,6 +35,7 @@
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_transport_sas.h>
+#include <asm/scatterlist.h>
 
 struct block_device;
 
index 52fd6879b86e1142f1c604367b5eb552e2dc26f5..17137f3a3b6fc39cc4ad3040beae03f3bec9b900 100644 (file)
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated by alsa/ksync script.  */
 #define CONFIG_SND_VERSION "1.0.13"
-#define CONFIG_SND_DATE " (Sun Oct 22 08:56:16 2006 UTC)"
+#define CONFIG_SND_DATE " (Tue Nov 28 14:07:24 2006 UTC)"
index bb4e29d924e4ff29567a962e7b643e0c1c875896..2b76dee284964c82ca42a81b2ddd1463f72d001d 100644 (file)
@@ -307,14 +307,14 @@ int call_usermodehelper_pipe(char *path, char **argv, char **envp,
                return 0;
 
        f = create_write_pipe();
-       if (!f)
-               return -ENOMEM;
+       if (IS_ERR(f))
+               return PTR_ERR(f);
        *filp = f;
 
        f = create_read_pipe(f);
-       if (!f) {
+       if (IS_ERR(f)) {
                free_write_pipe(*filp);
-               return -ENOMEM;
+               return PTR_ERR(f);
        }
        sub_info.stdin = f;
 
index f7e50d16dbf6b6ba55980dda3e0841d0a9d0d394..ed0a21d4a902339acef700eea0e291220ce7fb2a 100644 (file)
@@ -938,8 +938,11 @@ int unwind(struct unwind_frame_info *frame)
                else {
                        retAddrReg = state.version <= 1 ? *ptr++ : get_uleb128(&ptr, end);
                        /* skip augmentation */
-                       if (((const char *)(cie + 2))[1] == 'z')
-                               ptr += get_uleb128(&ptr, end);
+                       if (((const char *)(cie + 2))[1] == 'z') {
+                               uleb128_t augSize = get_uleb128(&ptr, end);
+
+                               ptr += augSize;
+                       }
                        if (ptr > end
                           || retAddrReg >= ARRAY_SIZE(reg_info)
                           || REG_INVALID(retAddrReg)
@@ -963,9 +966,7 @@ int unwind(struct unwind_frame_info *frame)
        if (cie == NULL || fde == NULL) {
 #ifdef CONFIG_FRAME_POINTER
                unsigned long top, bottom;
-#endif
 
-#ifdef CONFIG_FRAME_POINTER
                top = STACK_TOP(frame->task);
                bottom = STACK_BOTTOM(frame->task);
 # if FRAME_RETADDR_OFFSET < 0
index 4e4119a1213925568b8a1acdef9bf52b98b19da3..4c61a7e0a86e1ae9e16867f9f8e4b0412b8edbaf 100644 (file)
@@ -58,12 +58,13 @@ static int get_fdb_entries(struct net_bridge *br, void __user *userbuf,
 {
        int num;
        void *buf;
-       size_t size = maxnum * sizeof(struct __fdb_entry);
+       size_t size;
 
-       if (size > PAGE_SIZE) {
-               size = PAGE_SIZE;
+       /* Clamp size to PAGE_SIZE, test maxnum to avoid overflow */
+       if (maxnum > PAGE_SIZE/sizeof(struct __fdb_entry))
                maxnum = PAGE_SIZE/sizeof(struct __fdb_entry);
-       }
+
+       size = maxnum * sizeof(struct __fdb_entry);
 
        buf = kmalloc(size, GFP_USER);
        if (!buf)
index 8ab5679a37a30324b9b61a61c159dd4978512447..28ee187ed2249423e17ad4542e9017b458ffe1ba 100644 (file)
@@ -1754,7 +1754,8 @@ static inline void flush_unauthorized_files(struct files_struct * files)
                                                get_file(devnull);
                                        } else {
                                                devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR);
-                                               if (!devnull) {
+                                               if (IS_ERR(devnull)) {
+                                                       devnull = NULL;
                                                        put_unused_fd(fd);
                                                        fput(file);
                                                        continue;
index 2ef55a17917c64999740b02780e035b2457429c2..9de8485ba3f591cf5d29ba6c416773683f4191f3 100644 (file)
@@ -514,9 +514,15 @@ static int tas_snd_capture_source_put(struct snd_kcontrol *kcontrol,
        mutex_lock(&tas->mtx);
        oldacr = tas->acr;
 
-       tas->acr &= ~TAS_ACR_INPUT_B;
+       /*
+        * Despite what the data sheet says in one place, the
+        * TAS_ACR_B_MONAUREAL bit forces mono output even when
+        * input A (line in) is selected.
+        */
+       tas->acr &= ~(TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL);
        if (ucontrol->value.enumerated.item[0])
-               tas->acr |= TAS_ACR_INPUT_B;
+               tas->acr |= TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL |
+                     TAS_ACR_B_MON_SEL_RIGHT;
        if (oldacr == tas->acr) {
                mutex_unlock(&tas->mtx);
                return 0;
@@ -686,8 +692,7 @@ static int tas_reset_init(struct tas *tas)
        if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp))
                goto outerr;
 
-       tas->acr |= TAS_ACR_ANALOG_PDOWN | TAS_ACR_B_MONAUREAL |
-               TAS_ACR_B_MON_SEL_RIGHT;
+       tas->acr |= TAS_ACR_ANALOG_PDOWN;
        if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr))
                goto outerr;
 
index 505b23ec4058c29a4407d8cd29c78e0c3509bdb1..e0821eb3d8517b2f258bb0353ebe0c10418f8b73 100644 (file)
@@ -2359,7 +2359,8 @@ static int snd_pcm_oss_release(struct inode *inode, struct file *file)
                substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE];
        snd_assert(substream != NULL, return -ENXIO);
        pcm = substream->pcm;
-       snd_pcm_oss_sync(pcm_oss_file);
+       if (!pcm->card->shutdown)
+               snd_pcm_oss_sync(pcm_oss_file);
        mutex_lock(&pcm->open_mutex);
        snd_pcm_oss_release_file(pcm_oss_file);
        mutex_unlock(&pcm->open_mutex);
index 37b4b10850ae0358cdbbf654fffd6754aa5a11d4..66e24b5da4694dbaa40529a98b14743520aa41ef 100644 (file)
@@ -1310,7 +1310,8 @@ static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream,
                               int f_flags)
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
        if (snd_pcm_running(substream))
                return -EBUSY;
@@ -1568,7 +1569,8 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream)
        runtime = substream->runtime;
        card = substream->pcm->card;
 
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
 
        snd_power_lock(card);
index 412dd62b654ec2907b3108df5415b0697032e29c..9f7b32e1ccdeb29a7122aaea0f485a0dafa144c5 100644 (file)
 
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/time.h>
-#include <linux/threads.h>
 #include <linux/interrupt.h>
 #include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/timer.h>
-#include <sound/info.h>
 
 #if defined(CONFIG_RTC) || defined(CONFIG_RTC_MODULE)
 
@@ -50,7 +47,9 @@ static int rtctimer_stop(struct snd_timer *t);
  * The hardware dependent description for this timer.
  */
 static struct snd_timer_hardware rtc_hw = {
-       .flags =        SNDRV_TIMER_HW_FIRST|SNDRV_TIMER_HW_AUTO,
+       .flags =        SNDRV_TIMER_HW_AUTO |
+                       SNDRV_TIMER_HW_FIRST |
+                       SNDRV_TIMER_HW_TASKLET,
        .ticks =        100000000L,             /* FIXME: XXX */
        .open =         rtctimer_open,
        .close =        rtctimer_close,
@@ -60,6 +59,7 @@ static struct snd_timer_hardware rtc_hw = {
 
 static int rtctimer_freq = RTC_FREQ;           /* frequency */
 static struct snd_timer *rtctimer;
+static struct tasklet_struct rtc_tasklet;
 static rtc_task_t rtc_task;
 
 
@@ -81,6 +81,7 @@ rtctimer_close(struct snd_timer *t)
        rtc_task_t *rtc = t->private_data;
        if (rtc) {
                rtc_unregister(rtc);
+               tasklet_kill(&rtc_tasklet);
                t->private_data = NULL;
        }
        return 0;
@@ -105,12 +106,17 @@ rtctimer_stop(struct snd_timer *timer)
        return 0;
 }
 
+static void rtctimer_tasklet(unsigned long data)
+{
+       snd_timer_interrupt((struct snd_timer *)data, 1);
+}
+
 /*
  * interrupt
  */
 static void rtctimer_interrupt(void *private_data)
 {
-       snd_timer_interrupt(private_data, 1);
+       tasklet_hi_schedule(private_data);
 }
 
 
@@ -139,9 +145,11 @@ static int __init rtctimer_init(void)
        timer->hw = rtc_hw;
        timer->hw.resolution = NANO_SEC / rtctimer_freq;
 
+       tasklet_init(&rtc_tasklet, rtctimer_tasklet, (unsigned long)timer);
+
        /* set up RTC callback */
        rtc_task.func = rtctimer_interrupt;
-       rtc_task.private_data = timer;
+       rtc_task.private_data = &rtc_tasklet;
 
        err = snd_timer_global_register(timer);
        if (err < 0) {
index 8058059c56e9b70ebc716196d996b45a0ea0af6b..8bc4ffa6220db1c9d629fef93db74d3fced0bd47 100644 (file)
@@ -956,6 +956,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
         .ca0151_chip = 1,
         .spk71 = 1,
         .spdif_bug = 1,
+        .adc_1361t = 1,  /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */
         .ac97_chip = 1} ,
        {.vendor = 0x1102, .device = 0x0004, .revision = 0x04,
         .driver = "Audigy2", .name = "Audigy 2 [Unknown]",
index 0d728c6f697c47c001b7672bb146757ffe3ec1a6..fb961448db199701271a4688840b8a1e300f983f 100644 (file)
@@ -5870,7 +5870,7 @@ static struct hda_board_config alc262_cfg_tbl[] = {
        { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397,
          .config = ALC262_FUJITSU },
        { .modelname = "hp-bpc", .config = ALC262_HP_BPC },
-       { .pci_subvendor = 0x103c, .pci_subdevice = 0x208c,
+       { .pci_subvendor = 0x103c, .pci_subdevice = 0x280c,
          .config = ALC262_HP_BPC }, /* xw4400 */
        { .pci_subvendor = 0x103c, .pci_subdevice = 0x3014,
          .config = ALC262_HP_BPC }, /* xw6400 */
index 731b7b97ee711ebaec26969519f5488ea2f8eaa3..fe51ef3e49d297a08622109d902f15c4b436ab0f 100644 (file)
@@ -336,6 +336,13 @@ static struct hda_board_config stac9200_cfg_tbl[] = {
          .pci_subvendor = PCI_VENDOR_ID_INTEL,
          .pci_subdevice = 0x2668,      /* DFI LanParty */
          .config = STAC_REF },
+       /* Dell laptops have BIOS problem */
+       { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01b5,
+         .config = STAC_REF }, /* Dell Inspiron 630m */
+       { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01c2,
+         .config = STAC_REF }, /* Dell Latitude D620 */
+       { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01cb,
+         .config = STAC_REF }, /* Dell Latitude 120L */
        {} /* terminator */
 };
 
@@ -591,13 +598,6 @@ static struct hda_board_config stac9205_cfg_tbl[] = {
          .pci_subvendor = PCI_VENDOR_ID_INTEL,
          .pci_subdevice = 0x2668,      /* DFI LanParty */
          .config = STAC_REF },         /* SigmaTel reference board */
-       /* Dell laptops have BIOS problem */
-       { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01b5,
-         .config = STAC_REF }, /* Dell Inspiron 630m */
-       { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01c2,
-         .config = STAC_REF }, /* Dell Latitude D620 */
-       { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01cb,
-         .config = STAC_REF }, /* Dell Latitude 120L */
        {} /* terminator */
 };
 
index c82b01c7ad3ad9871f5fe619db8929fb596cbc51..67202b9eeb77c09bf4c3d10fb372c5582e92394c 100644 (file)
@@ -1469,7 +1469,8 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
        subs->cur_audiofmt = NULL;
        subs->cur_rate = 0;
        subs->period_bytes = 0;
-       release_substream_urbs(subs, 0);
+       if (!subs->stream->chip->shutdown)
+               release_substream_urbs(subs, 0);
        return snd_pcm_free_vmalloc_buffer(substream);
 }