lkml.org 
[lkml]   [2009]   [Feb]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: Linux 2.6.27.16
    diff --git a/Documentation/filesystems/sysfs-pci.txt b/Documentation/filesystems/sysfs-pci.txt
    index 68ef488..de99749 100644
    --- a/Documentation/filesystems/sysfs-pci.txt
    +++ b/Documentation/filesystems/sysfs-pci.txt
    @@ -9,6 +9,7 @@ that support it. For example, a given bus might look like this:
    | |-- class
    | |-- config
    | |-- device
    + | |-- enable
    | |-- irq
    | |-- local_cpus
    | |-- resource
    @@ -32,6 +33,7 @@ files, each with their own function.
    class PCI class (ascii, ro)
    config PCI config space (binary, rw)
    device PCI device (ascii, ro)
    + enable Whether the device is enabled (ascii, rw)
    irq IRQ number (ascii, ro)
    local_cpus nearby CPU mask (cpumask, ro)
    resource PCI resource host addresses (ascii, ro)
    @@ -57,10 +59,19 @@ used to do actual device programming from userspace. Note that some platforms
    don't support mmapping of certain resources, so be sure to check the return
    value from any attempted mmap.

    +The 'enable' file provides a counter that indicates how many times the device
    +has been enabled. If the 'enable' file currently returns '4', and a '1' is
    +echoed into it, it will then return '5'. Echoing a '0' into it will decrease
    +the count. Even when it returns to 0, though, some of the initialisation
    +may not be reversed.
    +
    The 'rom' file is special in that it provides read-only access to the device's
    ROM file, if available. It's disabled by default, however, so applications
    should write the string "1" to the file to enable it before attempting a read
    -call, and disable it following the access by writing "0" to the file.
    +call, and disable it following the access by writing "0" to the file. Note
    +that the device must be enabled for a rom read to return data succesfully.
    +In the event a driver is not bound to the device, it can be enabled using the
    +'enable' file, documented above.

    Accessing legacy resources through sysfs
    ----------------------------------------
    diff --git a/Makefile b/Makefile
    index a2dcd97..d398828 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -1,7 +1,7 @@
    VERSION = 2
    PATCHLEVEL = 6
    SUBLEVEL = 27
    -EXTRAVERSION = .15
    +EXTRAVERSION = .16
    NAME = Trembling Tortoise

    # *DOCUMENTATION*
    diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c
    index a15baac..0c3f2a0 100644
    --- a/arch/ia64/sn/kernel/io_acpi_init.c
    +++ b/arch/ia64/sn/kernel/io_acpi_init.c
    @@ -434,7 +434,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
    size = pci_resource_len(dev, PCI_ROM_RESOURCE);
    addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
    size);
    - image_size = pci_get_rom_size(addr, size);
    + image_size = pci_get_rom_size(dev, addr, size);
    dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
    dev->resource[PCI_ROM_RESOURCE].end =
    (unsigned long) addr + image_size - 1;
    diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
    index c3aa851..1a3ed90 100644
    --- a/arch/ia64/sn/kernel/io_init.c
    +++ b/arch/ia64/sn/kernel/io_init.c
    @@ -269,7 +269,7 @@ sn_io_slot_fixup(struct pci_dev *dev)

    rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
    size + 1);
    - image_size = pci_get_rom_size(rom, size + 1);
    + image_size = pci_get_rom_size(dev, rom, size + 1);
    dev->resource[PCI_ROM_RESOURCE].end =
    dev->resource[PCI_ROM_RESOURCE].start +
    image_size - 1;
    diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c
    index f88bd0d..ffc633c 100644
    --- a/arch/x86/kernel/apic_32.c
    +++ b/arch/x86/kernel/apic_32.c
    @@ -1115,7 +1115,7 @@ static int __init detect_init_APIC(void)
    switch (boot_cpu_data.x86_vendor) {
    case X86_VENDOR_AMD:
    if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
    - (boot_cpu_data.x86 == 15))
    + (boot_cpu_data.x86 >= 15))
    break;
    goto no_apic;
    case X86_VENDOR_INTEL:
    diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
    index dd097b8..9943b4c 100644
    --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
    +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
    @@ -779,6 +779,9 @@ static int __init acpi_cpufreq_init(void)
    {
    int ret;

    + if (acpi_disabled)
    + return 0;
    +
    dprintk("acpi_cpufreq_init\n");

    ret = acpi_cpufreq_early_init();
    diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
    index da1973b..3384255 100644
    --- a/arch/x86/mm/fault.c
    +++ b/arch/x86/mm/fault.c
    @@ -607,8 +607,6 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)

    si_code = SEGV_MAPERR;

    - if (notify_page_fault(regs))
    - return;
    if (unlikely(kmmio_fault(regs, address)))
    return;

    @@ -638,6 +636,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
    if (spurious_fault(address, error_code))
    return;

    + /* kprobes don't want to hook the spurious faults. */
    + if (notify_page_fault(regs))
    + return;
    /*
    * Don't take the mm semaphore here. If we fixup a prefetch
    * fault we could otherwise deadlock.
    @@ -645,6 +646,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
    goto bad_area_nosemaphore;
    }

    + /* kprobes don't want to hook the spurious faults. */
    + if (notify_page_fault(regs))
    + return;

    #ifdef CONFIG_X86_32
    /* It's safe to allow irq's after cr2 has been saved and the vmalloc
    diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
    index e28469e..eab790f 100644
    --- a/drivers/acpi/dock.c
    +++ b/drivers/acpi/dock.c
    @@ -691,8 +691,14 @@ fdd_out:
    static ssize_t show_docked(struct device *dev,
    struct device_attribute *attr, char *buf)
    {
    - return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station));
    + struct acpi_device *tmp;
    +
    + struct dock_station *dock_station = *((struct dock_station **)
    + dev->platform_data);

    + if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
    + return snprintf(buf, PAGE_SIZE, "1\n");
    + return snprintf(buf, PAGE_SIZE, "0\n");
    }
    static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);

    diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c
    index 8892b98..331a114 100644
    --- a/drivers/acpi/executer/exconfig.c
    +++ b/drivers/acpi/executer/exconfig.c
    @@ -280,6 +280,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
    struct acpi_walk_state *walk_state)
    {
    union acpi_operand_object *ddb_handle;
    + struct acpi_table_header *table;
    struct acpi_table_desc table_desc;
    u32 table_index;
    acpi_status status;
    @@ -294,9 +295,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
    switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
    case ACPI_TYPE_REGION:

    - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Load from Region %p %s\n",
    - obj_desc,
    - acpi_ut_get_object_type_name(obj_desc)));
    + ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
    + "Load table from Region %p\n", obj_desc));

    /* Region must be system_memory (from ACPI spec) */

    @@ -316,61 +316,112 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
    }

    /*
    - * We will simply map the memory region for the table. However, the
    - * memory region is technically not guaranteed to remain stable and
    - * we may eventually have to copy the table to a local buffer.
    + * Map the table header and get the actual table length. The region
    + * length is not guaranteed to be the same as the table length.
    + */
    + table = acpi_os_map_memory(obj_desc->region.address,
    + sizeof(struct acpi_table_header));
    + if (!table) {
    + return_ACPI_STATUS(AE_NO_MEMORY);
    + }
    +
    + length = table->length;
    + acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
    +
    + /* Must have at least an ACPI table header */
    +
    + if (length < sizeof(struct acpi_table_header)) {
    + return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
    + }
    +
    + /*
    + * The memory region is not guaranteed to remain stable and we must
    + * copy the table to a local buffer. For example, the memory region
    + * is corrupted after suspend on some machines. Dynamically loaded
    + * tables are usually small, so this overhead is minimal.
    */
    +
    + /* Allocate a buffer for the table */
    +
    + table_desc.pointer = ACPI_ALLOCATE(length);
    + if (!table_desc.pointer) {
    + return_ACPI_STATUS(AE_NO_MEMORY);
    + }
    +
    + /* Map the entire table and copy it */
    +
    + table = acpi_os_map_memory(obj_desc->region.address, length);
    + if (!table) {
    + ACPI_FREE(table_desc.pointer);
    + return_ACPI_STATUS(AE_NO_MEMORY);
    + }
    +
    + ACPI_MEMCPY(table_desc.pointer, table, length);
    + acpi_os_unmap_memory(table, length);
    +
    table_desc.address = obj_desc->region.address;
    - table_desc.length = obj_desc->region.length;
    - table_desc.flags = ACPI_TABLE_ORIGIN_MAPPED;
    break;

    case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */

    ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
    - "Load from Buffer or Field %p %s\n", obj_desc,
    - acpi_ut_get_object_type_name(obj_desc)));
    -
    - length = obj_desc->buffer.length;
    + "Load table from Buffer or Field %p\n",
    + obj_desc));

    /* Must have at least an ACPI table header */

    - if (length < sizeof(struct acpi_table_header)) {
    + if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
    return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
    }

    - /* Validate checksum here. It won't get validated in tb_add_table */
    + /* Get the actual table length from the table header */

    - status =
    - acpi_tb_verify_checksum(ACPI_CAST_PTR
    - (struct acpi_table_header,
    - obj_desc->buffer.pointer), length);
    - if (ACPI_FAILURE(status)) {
    - return_ACPI_STATUS(status);
    + table =
    + ACPI_CAST_PTR(struct acpi_table_header,
    + obj_desc->buffer.pointer);
    + length = table->length;
    +
    + /* Table cannot extend beyond the buffer */
    +
    + if (length > obj_desc->buffer.length) {
    + return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
    + }
    + if (length < sizeof(struct acpi_table_header)) {
    + return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
    }

    /*
    - * We need to copy the buffer since the original buffer could be
    - * changed or deleted in the future
    + * Copy the table from the buffer because the buffer could be modified
    + * or even deleted in the future
    */
    table_desc.pointer = ACPI_ALLOCATE(length);
    if (!table_desc.pointer) {
    return_ACPI_STATUS(AE_NO_MEMORY);
    }

    - ACPI_MEMCPY(table_desc.pointer, obj_desc->buffer.pointer,
    - length);
    - table_desc.length = length;
    - table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
    + ACPI_MEMCPY(table_desc.pointer, table, length);
    + table_desc.address = ACPI_TO_INTEGER(table_desc.pointer);
    break;

    default:
    return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
    }

    - /*
    - * Install the new table into the local data structures
    - */
    + /* Validate table checksum (will not get validated in tb_add_table) */
    +
    + status = acpi_tb_verify_checksum(table_desc.pointer, length);
    + if (ACPI_FAILURE(status)) {
    + ACPI_FREE(table_desc.pointer);
    + return_ACPI_STATUS(status);
    + }
    +
    + /* Complete the table descriptor */
    +
    + table_desc.length = length;
    + table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
    +
    + /* Install the new table into the local data structures */
    +
    status = acpi_tb_add_table(&table_desc, &table_index);
    if (ACPI_FAILURE(status)) {
    goto cleanup;
    @@ -379,7 +430,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
    /*
    * Add the table to the namespace.
    *
    - * Note: We load the table objects relative to the root of the namespace.
    + * Note: Load the table objects relative to the root of the namespace.
    * This appears to go against the ACPI specification, but we do it for
    * compatibility with other ACPI implementations.
    */
    @@ -415,7 +466,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
    cleanup:
    if (ACPI_FAILURE(status)) {

    - /* Delete allocated buffer or mapping */
    + /* Delete allocated table buffer */

    acpi_tb_delete_table(&table_desc);
    }
    diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c
    index 38be586..f3cc376 100644
    --- a/drivers/acpi/namespace/nsxfeval.c
    +++ b/drivers/acpi/namespace/nsxfeval.c
    @@ -45,9 +45,14 @@
    #include <acpi/acpi.h>
    #include <acpi/acnamesp.h>
    #include <acpi/acinterp.h>
    +#include <acpi/amlcode.h>

    #define _COMPONENT ACPI_NAMESPACE
    ACPI_MODULE_NAME("nsxfeval")
    +
    +/* Local prototypes */
    +static void acpi_ns_resolve_references(struct acpi_evaluate_info *info);
    +
    #ifdef ACPI_FUTURE_USAGE
    /*******************************************************************************
    *
    @@ -69,6 +74,7 @@ ACPI_MODULE_NAME("nsxfeval")
    * be valid (non-null)
    *
    ******************************************************************************/
    +
    acpi_status
    acpi_evaluate_object_typed(acpi_handle handle,
    acpi_string pathname,
    @@ -283,6 +289,10 @@ acpi_evaluate_object(acpi_handle handle,

    if (ACPI_SUCCESS(status)) {

    + /* Dereference Index and ref_of references */
    +
    + acpi_ns_resolve_references(info);
    +
    /* Get the size of the returned object */

    status =
    @@ -352,6 +362,74 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)

    /*******************************************************************************
    *
    + * FUNCTION: acpi_ns_resolve_references
    + *
    + * PARAMETERS: Info - Evaluation info block
    + *
    + * RETURN: Info->return_object is replaced with the dereferenced object
    + *
    + * DESCRIPTION: Dereference certain reference objects. Called before an
    + * internal return object is converted to an external union acpi_object.
    + *
    + * Performs an automatic dereference of Index and ref_of reference objects.
    + * These reference objects are not supported by the union acpi_object, so this is a
    + * last resort effort to return something useful. Also, provides compatibility
    + * with other ACPI implementations.
    + *
    + * NOTE: does not handle references within returned package objects or nested
    + * references, but this support could be added later if found to be necessary.
    + *
    + ******************************************************************************/
    +static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
    +{
    + union acpi_operand_object *obj_desc = NULL;
    + struct acpi_namespace_node *node;
    +
    + /* We are interested in reference objects only */
    +
    + if (ACPI_GET_OBJECT_TYPE(info->return_object) !=
    + ACPI_TYPE_LOCAL_REFERENCE) {
    + return;
    + }
    +
    + /*
    + * Two types of references are supported - those created by Index and
    + * ref_of operators. A name reference (AML_NAMEPATH_OP) can be converted
    + * to an union acpi_object, so it is not dereferenced here. A ddb_handle
    + * (AML_LOAD_OP) cannot be dereferenced, nor can it be converted to
    + * an union acpi_object.
    + */
    + switch (info->return_object->reference.opcode) {
    + case AML_INDEX_OP:
    +
    + obj_desc = *(info->return_object->reference.where);
    + break;
    +
    + case AML_REF_OF_OP:
    +
    + node = info->return_object->reference.object;
    + if (node) {
    + obj_desc = node->object;
    + }
    + break;
    +
    + default:
    + return;
    + }
    +
    + /* Replace the existing reference object */
    +
    + if (obj_desc) {
    + acpi_ut_add_reference(obj_desc);
    + acpi_ut_remove_reference(info->return_object);
    + info->return_object = obj_desc;
    + }
    +
    + return;
    +}
    +
    +/*******************************************************************************
    + *
    * FUNCTION: acpi_walk_namespace
    *
    * PARAMETERS: Type - acpi_object_type to search for
    @@ -379,6 +457,7 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
    * function, etc.
    *
    ******************************************************************************/
    +
    acpi_status
    acpi_walk_namespace(acpi_object_type type,
    acpi_handle start_object,
    diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
    index 775c97a..a885295 100644
    --- a/drivers/acpi/tables.c
    +++ b/drivers/acpi/tables.c
    @@ -293,7 +293,12 @@ static void __init check_multiple_madt(void)

    int __init acpi_table_init(void)
    {
    - acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
    + acpi_status status;
    +
    + status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
    + if (ACPI_FAILURE(status))
    + return 1;
    +
    check_multiple_madt();
    return 0;
    }
    diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
    index 0cc92ef..f5d7aec 100644
    --- a/drivers/acpi/tables/tbutils.c
    +++ b/drivers/acpi/tables/tbutils.c
    @@ -512,10 +512,9 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
    if (ACPI_FAILURE(status)) {
    ACPI_WARNING((AE_INFO,
    "Truncating %u table entries!",
    - (unsigned)
    - (acpi_gbl_root_table_list.size -
    - acpi_gbl_root_table_list.
    - count)));
    + (unsigned) (table_count -
    + (acpi_gbl_root_table_list.
    + count - 2))));
    break;
    }
    }
    diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
    index 42e1e84..a953b5d 100644
    --- a/drivers/acpi/video.c
    +++ b/drivers/acpi/video.c
    @@ -36,6 +36,7 @@
    #include <linux/backlight.h>
    #include <linux/thermal.h>
    #include <linux/video_output.h>
    +#include <linux/sort.h>
    #include <asm/uaccess.h>

    #include <acpi/acpi_bus.h>
    @@ -632,6 +633,16 @@ acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
    }

    /*
    + * Simple comparison function used to sort backlight levels.
    + */
    +
    +static int
    +acpi_video_cmp_level(const void *a, const void *b)
    +{
    + return *(int *)a - *(int *)b;
    +}
    +
    +/*
    * Arg:
    * device : video output device (LCD, CRT, ..)
    *
    @@ -682,6 +693,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
    count++;
    }

    + /* don't sort the first two brightness levels */
    + sort(&br->levels[2], count - 2, sizeof(br->levels[2]),
    + acpi_video_cmp_level, NULL);
    +
    if (count < 2)
    goto out_free_levels;

    @@ -997,7 +1012,7 @@ acpi_video_device_brightness_seq_show(struct seq_file *seq, void *offset)
    }

    seq_printf(seq, "levels: ");
    - for (i = 0; i < dev->brightness->count; i++)
    + for (i = 2; i < dev->brightness->count; i++)
    seq_printf(seq, " %d", dev->brightness->levels[i]);
    seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);

    @@ -1036,7 +1051,7 @@ acpi_video_device_write_brightness(struct file *file,
    return -EFAULT;

    /* validate through the list of available levels */
    - for (i = 0; i < dev->brightness->count; i++)
    + for (i = 2; i < dev->brightness->count; i++)
    if (level == dev->brightness->levels[i]) {
    if (ACPI_SUCCESS
    (acpi_video_device_lcd_set_level(dev, level)))
    @@ -1689,7 +1704,7 @@ acpi_video_get_next_level(struct acpi_video_device *device,
    max = max_below = 0;
    min = min_above = 255;
    /* Find closest level to level_current */
    - for (i = 0; i < device->brightness->count; i++) {
    + for (i = 2; i < device->brightness->count; i++) {
    l = device->brightness->levels[i];
    if (abs(l - level_current) < abs(delta)) {
    delta = l - level_current;
    @@ -1699,7 +1714,7 @@ acpi_video_get_next_level(struct acpi_video_device *device,
    }
    /* Ajust level_current to closest available level */
    level_current += delta;
    - for (i = 0; i < device->brightness->count; i++) {
    + for (i = 2; i < device->brightness->count; i++) {
    l = device->brightness->levels[i];
    if (l < min)
    min = l;
    @@ -1983,6 +1998,12 @@ static int acpi_video_bus_add(struct acpi_device *device)
    device->pnp.bus_id[3] = '0' + instance;
    instance ++;
    }
    + /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
    + if (!strcmp(device->pnp.bus_id, "VGA")) {
    + if (instance)
    + device->pnp.bus_id[3] = '0' + instance;
    + instance++;
    + }

    video->device = device;
    strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
    diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
    index f1fe749..5eb23fa 100644
    --- a/drivers/char/agp/intel-agp.c
    +++ b/drivers/char/agp/intel-agp.c
    @@ -40,6 +40,8 @@
    #define PCI_DEVICE_ID_INTEL_Q45_IG 0x2E12
    #define PCI_DEVICE_ID_INTEL_G45_HB 0x2E20
    #define PCI_DEVICE_ID_INTEL_G45_IG 0x2E22
    +#define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30
    +#define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32

    /* cover 915 and 945 variants */
    #define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \
    @@ -63,7 +65,8 @@
    #define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_E_HB || \
    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \
    agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \
    - agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB)
    + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \
    + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB)

    extern int agp_memory_reserved;

    @@ -214,8 +217,8 @@ static int intel_i810_configure(void)
    if (agp_bridge->driver->needs_scratch_page) {
    for (i = 0; i < current_size->num_entries; i++) {
    writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
    - readl(intel_private.registers+I810_PTE_BASE+(i*4)); /* PCI posting. */
    }
    + readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI posting. */
    }
    global_cache_flush();
    return 0;
    @@ -775,8 +778,8 @@ static int intel_i830_configure(void)
    if (agp_bridge->driver->needs_scratch_page) {
    for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
    writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
    - readl(intel_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */
    }
    + readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */
    }

    global_cache_flush();
    @@ -991,8 +994,8 @@ static int intel_i915_configure(void)
    if (agp_bridge->driver->needs_scratch_page) {
    for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
    writel(agp_bridge->scratch_page, intel_private.gtt+i);
    - readl(intel_private.gtt+i); /* PCI Posting. */
    }
    + readl(intel_private.gtt+i-1); /* PCI Posting. */
    }

    global_cache_flush();
    @@ -1196,6 +1199,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
    case PCI_DEVICE_ID_INTEL_IGD_E_HB:
    case PCI_DEVICE_ID_INTEL_Q45_HB:
    case PCI_DEVICE_ID_INTEL_G45_HB:
    + case PCI_DEVICE_ID_INTEL_G41_HB:
    *gtt_offset = *gtt_size = MB(2);
    break;
    default:
    @@ -2128,13 +2132,15 @@ static const struct intel_driver_description {
    { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33",
    NULL, &intel_g33_driver },
    { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG, 0,
    - "Mobile Intel? GM45 Express", NULL, &intel_i965_driver },
    + "Mobile Intel® GM45 Express", NULL, &intel_i965_driver },
    { PCI_DEVICE_ID_INTEL_IGD_E_HB, PCI_DEVICE_ID_INTEL_IGD_E_IG, 0,
    "Intel Integrated Graphics Device", NULL, &intel_i965_driver },
    { PCI_DEVICE_ID_INTEL_Q45_HB, PCI_DEVICE_ID_INTEL_Q45_IG, 0,
    "Q45/Q43", NULL, &intel_i965_driver },
    { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0,
    "G45/G43", NULL, &intel_i965_driver },
    + { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0,
    + "G41", NULL, &intel_i965_driver },
    { 0, 0, 0, NULL, NULL, NULL }
    };

    @@ -2332,6 +2338,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
    ID(PCI_DEVICE_ID_INTEL_IGD_E_HB),
    ID(PCI_DEVICE_ID_INTEL_Q45_HB),
    ID(PCI_DEVICE_ID_INTEL_G45_HB),
    + ID(PCI_DEVICE_ID_INTEL_G41_HB),
    { }
    };

    diff --git a/drivers/char/vt.c b/drivers/char/vt.c
    index d429499..372267d 100644
    --- a/drivers/char/vt.c
    +++ b/drivers/char/vt.c
    @@ -301,7 +301,7 @@ static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
    d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
    s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr));
    scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
    - scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_scrl_erase_char,
    + scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char,
    vc->vc_size_row * nr);
    }

    @@ -319,7 +319,7 @@ static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
    s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
    step = vc->vc_cols * nr;
    scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
    - scr_memsetw(s, vc->vc_scrl_erase_char, 2 * step);
    + scr_memsetw(s, vc->vc_video_erase_char, 2 * step);
    }

    static void do_update_region(struct vc_data *vc, unsigned long start, int count)
    @@ -434,7 +434,6 @@ static void update_attr(struct vc_data *vc)
    vc->vc_blink, vc->vc_underline,
    vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic);
    vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' ';
    - vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' ';
    }

    /* Note: inverting the screen twice should revert to the original state */
    diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
    index 595759c..cd589ca 100644
    --- a/drivers/firewire/fw-ohci.c
    +++ b/drivers/firewire/fw-ohci.c
    @@ -226,7 +226,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
    #define CONTEXT_DEAD 0x0800
    #define CONTEXT_ACTIVE 0x0400

    -#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
    +#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
    #define OHCI1394_MAX_AT_RESP_RETRIES 0x2
    #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8

    diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
    index 64142c1..716370c 100644
    --- a/drivers/firewire/fw-sbp2.c
    +++ b/drivers/firewire/fw-sbp2.c
    @@ -350,15 +350,17 @@ static const struct {
    .model = ~0,
    .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
    },
    -
    /*
    - * There are iPods (2nd gen, 3rd gen) with model_id == 0, but
    - * these iPods do not feature the read_capacity bug according
    - * to one report. Read_capacity behaviour as well as model_id
    - * could change due to Apple-supplied firmware updates though.
    + * iPod 2nd generation: needs 128k max transfer size workaround
    + * iPod 3rd generation: needs fix capacity workaround
    */
    -
    - /* iPod 4th generation. */ {
    + {
    + .firmware_revision = 0x0a2700,
    + .model = 0x000000,
    + .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
    + SBP2_WORKAROUND_FIX_CAPACITY,
    + },
    + /* iPod 4th generation */ {
    .firmware_revision = 0x0a2700,
    .model = 0x000021,
    .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
    @@ -1293,6 +1295,19 @@ static struct fw_driver sbp2_driver = {
    .id_table = sbp2_id_table,
    };

    +static void sbp2_unmap_scatterlist(struct device *card_device,
    + struct sbp2_command_orb *orb)
    +{
    + if (scsi_sg_count(orb->cmd))
    + dma_unmap_sg(card_device, scsi_sglist(orb->cmd),
    + scsi_sg_count(orb->cmd),
    + orb->cmd->sc_data_direction);
    +
    + if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT))
    + dma_unmap_single(card_device, orb->page_table_bus,
    + sizeof(orb->page_table), DMA_TO_DEVICE);
    +}
    +
    static unsigned int
    sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
    {
    @@ -1372,15 +1387,7 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)

    dma_unmap_single(device->card->device, orb->base.request_bus,
    sizeof(orb->request), DMA_TO_DEVICE);
    -
    - if (scsi_sg_count(orb->cmd) > 0)
    - dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd),
    - scsi_sg_count(orb->cmd),
    - orb->cmd->sc_data_direction);
    -
    - if (orb->page_table_bus != 0)
    - dma_unmap_single(device->card->device, orb->page_table_bus,
    - sizeof(orb->page_table), DMA_TO_DEVICE);
    + sbp2_unmap_scatterlist(device->card->device, orb);

    orb->cmd->result = result;
    orb->done(orb->cmd);
    @@ -1530,8 +1537,10 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done)
    orb->base.request_bus =
    dma_map_single(device->card->device, &orb->request,
    sizeof(orb->request), DMA_TO_DEVICE);
    - if (dma_mapping_error(device->card->device, orb->base.request_bus))
    + if (dma_mapping_error(device->card->device, orb->base.request_bus)) {
    + sbp2_unmap_scatterlist(device->card->device, orb);
    goto out;
    + }

    sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, lu->generation,
    lu->command_block_agent_address + SBP2_ORB_POINTER);
    diff --git a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h
    index 4320bf0..7fb8ab9 100644
    --- a/drivers/ieee1394/ohci1394.h
    +++ b/drivers/ieee1394/ohci1394.h
    @@ -26,7 +26,7 @@

    #define OHCI1394_DRIVER_NAME "ohci1394"

    -#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
    +#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
    #define OHCI1394_MAX_AT_RESP_RETRIES 0x2
    #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
    #define OHCI1394_MAX_SELF_ID_ERRORS 16
    diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
    index bad46ea..0c0fdbb 100644
    --- a/drivers/ieee1394/sbp2.c
    +++ b/drivers/ieee1394/sbp2.c
    @@ -395,6 +395,16 @@ static const struct {
    .model_id = SBP2_ROM_VALUE_WILDCARD,
    .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
    },
    + /*
    + * iPod 2nd generation: needs 128k max transfer size workaround
    + * iPod 3rd generation: needs fix capacity workaround
    + */
    + {
    + .firmware_revision = 0x0a2700,
    + .model_id = 0x000000,
    + .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
    + SBP2_WORKAROUND_FIX_CAPACITY,
    + },
    /* iPod 4th generation */ {
    .firmware_revision = 0x0a2700,
    .model_id = 0x000021,
    diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
    index c2fcf28..61f5753 100644
    --- a/drivers/md/dm-mpath.c
    +++ b/drivers/md/dm-mpath.c
    @@ -427,13 +427,13 @@ static void process_queued_ios(struct work_struct *work)
    __choose_pgpath(m);

    pgpath = m->current_pgpath;
    - m->pgpath_to_activate = m->current_pgpath;

    if ((pgpath && !m->queue_io) ||
    (!pgpath && !m->queue_if_no_path))
    must_queue = 0;

    - if (m->pg_init_required && !m->pg_init_in_progress) {
    + if (m->pg_init_required && !m->pg_init_in_progress && pgpath) {
    + m->pgpath_to_activate = pgpath;
    m->pg_init_count++;
    m->pg_init_required = 0;
    m->pg_init_in_progress = 1;
    diff --git a/drivers/md/md.c b/drivers/md/md.c
    index fe6eccd..60f3e59 100644
    --- a/drivers/md/md.c
    +++ b/drivers/md/md.c
    @@ -1454,6 +1454,11 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
    if (find_rdev_nr(mddev, rdev->desc_nr))
    return -EBUSY;
    }
    + if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
    + printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
    + mdname(mddev), mddev->max_disks);
    + return -EBUSY;
    + }
    bdevname(rdev->bdev,b);
    while ( (s=strchr(b, '/')) != NULL)
    *s = '!';
    @@ -2362,6 +2367,15 @@ static void analyze_sbs(mddev_t * mddev)

    i = 0;
    rdev_for_each(rdev, tmp, mddev) {
    + if (rdev->desc_nr >= mddev->max_disks ||
    + i > mddev->max_disks) {
    + printk(KERN_WARNING
    + "md: %s: %s: only %d devices permitted\n",
    + mdname(mddev), bdevname(rdev->bdev, b),
    + mddev->max_disks);
    + kick_rdev_from_array(rdev);
    + continue;
    + }
    if (rdev != freshest)
    if (super_types[mddev->major_version].
    validate_super(mddev, rdev)) {
    @@ -2728,9 +2742,9 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
    break;
    case read_auto:
    if (mddev->pers) {
    - if (mddev->ro != 1)
    + if (mddev->ro == 0)
    err = do_md_stop(mddev, 1, 0);
    - else
    + else if (mddev->ro == 1)
    err = restart_array(mddev);
    if (err == 0) {
    mddev->ro = 2;
    @@ -2946,7 +2960,13 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len)
    {
    int major, minor;
    char *e;
    - if (!list_empty(&mddev->disks))
    + /* Changing the details of 'external' metadata is
    + * always permitted. Otherwise there must be
    + * no devices attached to the array.
    + */
    + if (mddev->external && strncmp(buf, "external:", 9) == 0)
    + ;
    + else if (!list_empty(&mddev->disks))
    return -EBUSY;

    if (cmd_match(buf, "none")) {
    @@ -4450,13 +4470,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
    * noticed in interrupt contexts ...
    */

    - if (rdev->desc_nr == mddev->max_disks) {
    - printk(KERN_WARNING "%s: can not hot-add to full array!\n",
    - mdname(mddev));
    - err = -EBUSY;
    - goto abort_unbind_export;
    - }
    -
    rdev->raid_disk = -1;

    md_update_sb(mddev, 1);
    @@ -4470,9 +4483,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
    md_new_event(mddev);
    return 0;

    -abort_unbind_export:
    - unbind_rdev_from_array(rdev);
    -
    abort_export:
    export_rdev(rdev);
    return err;
    diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c
    index 616bcbd..13a8996 100644
    --- a/drivers/misc/eeepc-laptop.c
    +++ b/drivers/misc/eeepc-laptop.c
    @@ -381,7 +381,8 @@ static void notify_wlan(u32 *event)
    static void notify_brn(void)
    {
    struct backlight_device *bd = eeepc_backlight_device;
    - bd->props.brightness = read_brightness(bd);
    + if (bd)
    + bd->props.brightness = read_brightness(bd);
    }

    static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)
    diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h
    index 619208d..bcf3782 100644
    --- a/drivers/misc/sgi-xp/xpc.h
    +++ b/drivers/misc/sgi-xp/xpc.h
    @@ -3,7 +3,7 @@
    * License. See the file "COPYING" in the main directory of this archive
    * for more details.
    *
    - * Copyright (c) 2004-2008 Silicon Graphics, Inc. All Rights Reserved.
    + * Copyright (c) 2004-2009 Silicon Graphics, Inc. All Rights Reserved.
    */

    /*
    @@ -502,7 +502,8 @@ struct xpc_channel_uv {
    /* partition's notify mq */

    struct xpc_send_msg_slot_uv *send_msg_slots;
    - struct xpc_notify_mq_msg_uv *recv_msg_slots;
    + void *recv_msg_slots; /* each slot will hold a xpc_notify_mq_msg_uv */
    + /* structure plus the user's payload */

    struct xpc_fifo_head_uv msg_slot_free_list;
    struct xpc_fifo_head_uv recv_msg_list; /* deliverable payloads */
    diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c
    index b8f8d50..1bb8bc5 100644
    --- a/drivers/misc/sgi-xp/xpc_uv.c
    +++ b/drivers/misc/sgi-xp/xpc_uv.c
    @@ -3,7 +3,7 @@
    * License. See the file "COPYING" in the main directory of this archive
    * for more details.
    *
    - * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
    + * Copyright (c) 2008-2009 Silicon Graphics, Inc. All Rights Reserved.
    */

    /*
    @@ -825,8 +825,8 @@ xpc_allocate_recv_msg_slot_uv(struct xpc_channel *ch)
    continue;

    for (entry = 0; entry < nentries; entry++) {
    - msg_slot = ch_uv->recv_msg_slots + entry *
    - ch->entry_size;
    + msg_slot = ch_uv->recv_msg_slots +
    + entry * ch->entry_size;

    msg_slot->hdr.msg_slot_number = entry;
    }
    @@ -1123,9 +1123,8 @@ xpc_handle_notify_mq_msg_uv(struct xpc_partition *part,
    /* we're dealing with a normal message sent via the notify_mq */
    ch_uv = &ch->sn.uv;

    - msg_slot = (struct xpc_notify_mq_msg_uv *)((u64)ch_uv->recv_msg_slots +
    - (msg->hdr.msg_slot_number % ch->remote_nentries) *
    - ch->entry_size);
    + msg_slot = ch_uv->recv_msg_slots +
    + (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size;

    BUG_ON(msg->hdr.msg_slot_number != msg_slot->hdr.msg_slot_number);
    BUG_ON(msg_slot->hdr.size != 0);
    diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
    index 872ea58..6b96357 100644
    --- a/drivers/net/e1000/e1000_main.c
    +++ b/drivers/net/e1000/e1000_main.c
    @@ -31,7 +31,7 @@

    char e1000_driver_name[] = "e1000";
    static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
    -#define DRV_VERSION "7.3.20-k3-NAPI"
    +#define DRV_VERSION "7.3.21-k3-NAPI"
    const char e1000_driver_version[] = DRV_VERSION;
    static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";

    @@ -927,7 +927,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
    err = pci_enable_device(pdev);
    } else {
    bars = pci_select_bars(pdev, IORESOURCE_MEM);
    - err = pci_enable_device(pdev);
    + err = pci_enable_device_mem(pdev);
    }
    if (err)
    return err;
    @@ -3835,7 +3835,7 @@ static irqreturn_t e1000_intr(int irq, void *data)
    struct e1000_hw *hw = &adapter->hw;
    u32 rctl, icr = er32(ICR);

    - if (unlikely(!icr))
    + if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags)))
    return IRQ_NONE; /* Not our interrupt */

    /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
    diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
    index 6e42b5a..5790194 100644
    --- a/drivers/net/usb/hso.c
    +++ b/drivers/net/usb/hso.c
    @@ -2047,7 +2047,7 @@ static void hso_create_rfkill(struct hso_device *hso_dev,
    char *rfkn;

    hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev,
    - RFKILL_TYPE_WLAN);
    + RFKILL_TYPE_WWAN);
    if (!hso_net->rfkill) {
    dev_err(dev, "%s - Out of memory", __func__);
    return;
    diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
    index dcce354..966c86c 100644
    --- a/drivers/net/wireless/ipw2200.c
    +++ b/drivers/net/wireless/ipw2200.c
    @@ -4346,7 +4346,8 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv,
    return;
    }

    - if (priv->status & STATUS_SCANNING) {
    + if (priv->status & STATUS_SCANNING &&
    + missed_count > IPW_MB_SCAN_CANCEL_THRESHOLD) {
    /* Stop scan to keep fw from getting
    * stuck (only if we aren't roaming --
    * otherwise we'll never scan more than 2 or 3
    @@ -6276,6 +6277,20 @@ static void ipw_add_scan_channels(struct ipw_priv *priv,
    }
    }

    +static int ipw_passive_dwell_time(struct ipw_priv *priv)
    +{
    + /* staying on passive channels longer than the DTIM interval during a
    + * scan, while associated, causes the firmware to cancel the scan
    + * without notification. Hence, don't stay on passive channels longer
    + * than the beacon interval.
    + */
    + if (priv->status & STATUS_ASSOCIATED
    + && priv->assoc_network->beacon_interval > 10)
    + return priv->assoc_network->beacon_interval - 10;
    + else
    + return 120;
    +}
    +
    static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct)
    {
    struct ipw_scan_request_ext scan;
    @@ -6319,16 +6334,16 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct)
    scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));

    if (type == IW_SCAN_TYPE_PASSIVE) {
    - IPW_DEBUG_WX("use passive scanning\n");
    - scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN;
    + IPW_DEBUG_WX("use passive scanning\n");
    + scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN;
    scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
    - cpu_to_le16(120);
    + cpu_to_le16(ipw_passive_dwell_time(priv));
    ipw_add_scan_channels(priv, &scan, scan_type);
    goto send_request;
    }

    /* Use active scan by default. */
    - if (priv->config & CFG_SPEED_SCAN)
    + if (priv->config & CFG_SPEED_SCAN)
    scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
    cpu_to_le16(30);
    else
    @@ -6338,7 +6353,8 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct)
    scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
    cpu_to_le16(20);

    - scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
    + scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
    + cpu_to_le16(ipw_passive_dwell_time(priv));
    scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20);

    #ifdef CONFIG_IPW2200_MONITOR
    diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h
    index d4ab28b..60b4e71 100644
    --- a/drivers/net/wireless/ipw2200.h
    +++ b/drivers/net/wireless/ipw2200.h
    @@ -244,6 +244,7 @@ enum connection_manager_assoc_states {
    #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED 31

    #define HOST_NOTIFICATION_STATUS_BEACON_MISSING 1
    +#define IPW_MB_SCAN_CANCEL_THRESHOLD 3
    #define IPW_MB_ROAMING_THRESHOLD_MIN 1
    #define IPW_MB_ROAMING_THRESHOLD_DEFAULT 8
    #define IPW_MB_ROAMING_THRESHOLD_MAX 30
    diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
    index 77baff0..3f2309f 100644
    --- a/drivers/pci/pci-sysfs.c
    +++ b/drivers/pci/pci-sysfs.c
    @@ -694,8 +694,8 @@ pci_read_rom(struct kobject *kobj, struct bin_attribute *bin_attr,
    return -EINVAL;

    rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
    - if (!rom)
    - return 0;
    + if (!rom || !size)
    + return -EIO;

    if (off >= size)
    count = 0;
    diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
    index 8a82a62..e4df84b 100644
    --- a/drivers/pci/pcie/aspm.c
    +++ b/drivers/pci/pcie/aspm.c
    @@ -713,9 +713,9 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)

    /*
    * All PCIe functions are in one slot, remove one function will remove
    - * the the whole slot, so just wait
    + * the whole slot, so just wait until we are the last function left.
    */
    - if (!list_empty(&parent->subordinate->devices))
    + if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices))
    goto out;

    /* All functions are removed, so just disable ASPM for the link */
    diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c
    index bd5c0e0..b2bac71 100644
    --- a/drivers/pci/rom.c
    +++ b/drivers/pci/rom.c
    @@ -63,7 +63,7 @@ static void pci_disable_rom(struct pci_dev *pdev)
    * The PCI window size could be much larger than the
    * actual image size.
    */
    -size_t pci_get_rom_size(void __iomem *rom, size_t size)
    +size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
    {
    void __iomem *image;
    int last_image;
    @@ -72,8 +72,10 @@ size_t pci_get_rom_size(void __iomem *rom, size_t size)
    do {
    void __iomem *pds;
    /* Standard PCI ROMs start out with these bytes 55 AA */
    - if (readb(image) != 0x55)
    + if (readb(image) != 0x55) {
    + dev_err(&pdev->dev, "Invalid ROM contents\n");
    break;
    + }
    if (readb(image + 1) != 0xAA)
    break;
    /* get the PCI data structure and check its signature */
    @@ -158,7 +160,7 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
    * size is much larger than the actual size of the ROM.
    * True size is important if the ROM is going to be copied.
    */
    - *size = pci_get_rom_size(rom, *size);
    + *size = pci_get_rom_size(pdev, rom, *size);
    return rom;
    }

    diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
    index fd0695b..056071d 100644
    --- a/drivers/serial/8250_pci.c
    +++ b/drivers/serial/8250_pci.c
    @@ -599,6 +599,10 @@ static int pci_netmos_init(struct pci_dev *dev)
    /* subdevice 0x00PS means <P> parallel, <S> serial */
    unsigned int num_serial = dev->subsystem_device & 0xf;

    + if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
    + dev->subsystem_device == 0x0299)
    + return 0;
    +
    if (num_serial == 0)
    return -ENODEV;
    return num_serial;
    @@ -766,6 +770,8 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
    #define PCI_SUBDEVICE_ID_OCTPRO422 0x0208
    #define PCI_SUBDEVICE_ID_POCTAL232 0x0308
    #define PCI_SUBDEVICE_ID_POCTAL422 0x0408
    +#define PCI_VENDOR_ID_ADVANTECH 0x13fe
    +#define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620

    /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
    #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
    @@ -2051,6 +2057,10 @@ static int pciserial_resume_one(struct pci_dev *dev)
    #endif

    static struct pci_device_id serial_pci_tbl[] = {
    + /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
    + { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
    + PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
    + pbn_b2_8_921600 },
    { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
    PCI_SUBVENDOR_ID_CONNECT_TECH,
    PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
    @@ -2294,6 +2304,9 @@ static struct pci_device_id serial_pci_tbl[] = {
    * For now just used the hex ID 0x950a.
    */
    { PCI_VENDOR_ID_OXSEMI, 0x950a,
    + PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL, 0, 0,
    + pbn_b0_2_115200 },
    + { PCI_VENDOR_ID_OXSEMI, 0x950a,
    PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    pbn_b0_2_1130000 },
    { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
    @@ -2846,6 +2859,10 @@ static struct pci_device_id serial_pci_tbl[] = {
    0,
    pbn_b0_8_115200 },

    + { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
    + PCI_VENDOR_ID_IBM, 0x0299,
    + 0, 0, pbn_b0_bt_2_115200 },
    +
    /*
    * These entries match devices with class COMMUNICATION_SERIAL,
    * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
    diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
    index b205311..876bf36 100644
    --- a/drivers/usb/serial/option.c
    +++ b/drivers/usb/serial/option.c
    @@ -192,14 +192,15 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
    #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400

    /* FUTURE NOVATEL PRODUCTS */
    -#define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000
    -#define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000
    -#define NOVATELWIRELESS_PRODUCT_EMBEDDED_1 0x8000
    -#define NOVATELWIRELESS_PRODUCT_GLOBAL_1 0x9000
    -#define NOVATELWIRELESS_PRODUCT_EVDO_2 0x6001
    -#define NOVATELWIRELESS_PRODUCT_HSPA_2 0x7001
    -#define NOVATELWIRELESS_PRODUCT_EMBEDDED_2 0x8001
    -#define NOVATELWIRELESS_PRODUCT_GLOBAL_2 0x9001
    +#define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED 0X6000
    +#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED 0X6001
    +#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED 0X7000
    +#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED 0X7001
    +#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED 0X8000
    +#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0X8001
    +#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0X9000
    +#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0X9001
    +#define NOVATELWIRELESS_PRODUCT_GLOBAL 0XA001

    /* AMOI PRODUCTS */
    #define AMOI_VENDOR_ID 0x1614
    @@ -209,6 +210,27 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po

    #define DELL_VENDOR_ID 0x413C

    +/* Dell modems */
    +#define DELL_PRODUCT_5700_MINICARD 0x8114
    +#define DELL_PRODUCT_5500_MINICARD 0x8115
    +#define DELL_PRODUCT_5505_MINICARD 0x8116
    +#define DELL_PRODUCT_5700_EXPRESSCARD 0x8117
    +#define DELL_PRODUCT_5510_EXPRESSCARD 0x8118
    +
    +#define DELL_PRODUCT_5700_MINICARD_SPRINT 0x8128
    +#define DELL_PRODUCT_5700_MINICARD_TELUS 0x8129
    +
    +#define DELL_PRODUCT_5720_MINICARD_VZW 0x8133
    +#define DELL_PRODUCT_5720_MINICARD_SPRINT 0x8134
    +#define DELL_PRODUCT_5720_MINICARD_TELUS 0x8135
    +#define DELL_PRODUCT_5520_MINICARD_CINGULAR 0x8136
    +#define DELL_PRODUCT_5520_MINICARD_GENERIC_L 0x8137
    +#define DELL_PRODUCT_5520_MINICARD_GENERIC_I 0x8138
    +
    +#define DELL_PRODUCT_5730_MINICARD_SPRINT 0x8180
    +#define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181
    +#define DELL_PRODUCT_5730_MINICARD_VZW 0x8182
    +
    #define KYOCERA_VENDOR_ID 0x0c88
    #define KYOCERA_PRODUCT_KPC650 0x17da
    #define KYOCERA_PRODUCT_KPC680 0x180a
    @@ -267,12 +289,6 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
    #define ERICSSON_VENDOR_ID 0x0bdb
    #define ERICSSON_PRODUCT_F3507G 0x1900

    -/* Pantech products */
    -#define PANTECH_VENDOR_ID 0x106c
    -#define PANTECH_PRODUCT_PC5740 0x3701
    -#define PANTECH_PRODUCT_PC5750 0x3702 /* PX-500 */
    -#define PANTECH_PRODUCT_UM150 0x3711
    -
    static struct usb_device_id option_ids[] = {
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
    @@ -383,31 +399,37 @@ static struct usb_device_id option_ids[] = {
    { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
    { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
    { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */
    - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
    + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */

    { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
    { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
    { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },

    - { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
    - { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) }, /* Dell Wireless HSDPA 5520 */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
    + { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
    + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
    { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
    { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
    { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
    @@ -476,9 +498,6 @@ static struct usb_device_id option_ids[] = {
    { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
    { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
    { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
    - { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
    - { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
    - { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
    { } /* Terminating entry */
    };
    MODULE_DEVICE_TABLE(usb, option_ids);
    diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
    index 9a3e495..d8c41ae 100644
    --- a/drivers/usb/serial/ti_usb_3410_5052.c
    +++ b/drivers/usb/serial/ti_usb_3410_5052.c
    @@ -227,25 +227,32 @@ static unsigned int product_5052_count;
    /* the array dimension is the number of default entries plus */
    /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
    /* null entry */
    -static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = {
    +static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
    };

    -static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = {
    +static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
    };

    -static struct usb_device_id ti_id_table_combined[] = {
    +static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
    + { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
    { }
    };

    diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h
    index b5541bf..d4e4d7e 100644
    --- a/drivers/usb/serial/ti_usb_3410_5052.h
    +++ b/drivers/usb/serial/ti_usb_3410_5052.h
    @@ -27,7 +27,11 @@

    /* Vendor and product ids */
    #define TI_VENDOR_ID 0x0451
    +#define IBM_VENDOR_ID 0x04b3
    #define TI_3410_PRODUCT_ID 0x3410
    +#define IBM_4543_PRODUCT_ID 0x4543
    +#define IBM_454B_PRODUCT_ID 0x454b
    +#define IBM_454C_PRODUCT_ID 0x454c
    #define TI_3410_EZ430_ID 0xF430 /* TI ez430 development tool */
    #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */
    #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */
    diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
    index 620c2b5..8daaace 100644
    --- a/drivers/usb/storage/scsiglue.c
    +++ b/drivers/usb/storage/scsiglue.c
    @@ -64,6 +64,7 @@
    */
    #define VENDOR_ID_NOKIA 0x0421
    #define VENDOR_ID_NIKON 0x04b0
    +#define VENDOR_ID_PENTAX 0x0a17
    #define VENDOR_ID_MOTOROLA 0x22b8

    /***********************************************************************
    @@ -150,6 +151,7 @@ static int slave_configure(struct scsi_device *sdev)
    switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
    case VENDOR_ID_NOKIA:
    case VENDOR_ID_NIKON:
    + case VENDOR_ID_PENTAX:
    case VENDOR_ID_MOTOROLA:
    if (!(us->fflags & (US_FL_FIX_CAPACITY |
    US_FL_CAPACITY_OK)))
    diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
    index aae786c..d775cfe 100644
    --- a/drivers/usb/storage/unusual_devs.h
    +++ b/drivers/usb/storage/unusual_devs.h
    @@ -1381,21 +1381,6 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000,
    US_SC_DEVICE, US_PR_DEVICE, NULL,
    US_FL_FIX_INQUIRY ),

    -
    -/* Submitted by Per Winkvist <per.winkvist@uk.com> */
    -UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
    - "Pentax",
    - "Optio S/S4",
    - US_SC_DEVICE, US_PR_DEVICE, NULL,
    - US_FL_FIX_INQUIRY ),
    -
    -/* Reported by Jaak Ristioja <Ristioja@gmail.com> */
    -UNUSUAL_DEV( 0x0a17, 0x006e, 0x0100, 0x0100,
    - "Pentax",
    - "K10D",
    - US_SC_DEVICE, US_PR_DEVICE, NULL,
    - US_FL_FIX_CAPACITY ),
    -
    /* These are virtual windows driver CDs, which the zd1211rw driver
    * automatically converts into WLAN devices. */
    UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
    diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
    index 038ea62..93a080e 100644
    --- a/drivers/video/console/fbcon.c
    +++ b/drivers/video/console/fbcon.c
    @@ -1855,8 +1855,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
    struct display *p = &fb_display[vc->vc_num];
    int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK;
    - unsigned short saved_ec;
    - int ret;

    if (fbcon_is_inactive(vc, info))
    return -EINVAL;
    @@ -1869,11 +1867,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    * whole screen (prevents flicker).
    */

    - saved_ec = vc->vc_video_erase_char;
    - vc->vc_video_erase_char = vc->vc_scrl_erase_char;
    -
    - ret = 0;
    -
    switch (dir) {
    case SM_UP:
    if (count > vc->vc_rows) /* Maximum realistic size */
    @@ -1890,9 +1883,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    scr_memsetw((unsigned short *) (vc->vc_origin +
    vc->vc_size_row *
    (b - count)),
    - vc->vc_scrl_erase_char,
    + vc->vc_video_erase_char,
    vc->vc_size_row * count);
    - ret = 1;
    + return 1;
    break;

    case SCROLL_WRAP_MOVE:
    @@ -1962,10 +1955,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    scr_memsetw((unsigned short *) (vc->vc_origin +
    vc->vc_size_row *
    (b - count)),
    - vc->vc_scrl_erase_char,
    + vc->vc_video_erase_char,
    vc->vc_size_row * count);
    - ret = 1;
    - break;
    + return 1;
    }
    break;

    @@ -1982,9 +1974,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    scr_memsetw((unsigned short *) (vc->vc_origin +
    vc->vc_size_row *
    t),
    - vc->vc_scrl_erase_char,
    + vc->vc_video_erase_char,
    vc->vc_size_row * count);
    - ret = 1;
    + return 1;
    break;

    case SCROLL_WRAP_MOVE:
    @@ -2052,15 +2044,12 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    scr_memsetw((unsigned short *) (vc->vc_origin +
    vc->vc_size_row *
    t),
    - vc->vc_scrl_erase_char,
    + vc->vc_video_erase_char,
    vc->vc_size_row * count);
    - ret = 1;
    - break;
    + return 1;
    }
    - break;
    }
    - vc->vc_video_erase_char = saved_ec;
    - return ret;
    + return 0;
    }


    @@ -2522,9 +2511,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
    c = vc->vc_video_erase_char;
    vc->vc_video_erase_char =
    ((c & 0xfe00) >> 1) | (c & 0xff);
    - c = vc->vc_scrl_erase_char;
    - vc->vc_scrl_erase_char =
    - ((c & 0xFE00) >> 1) | (c & 0xFF);
    vc->vc_attr >>= 1;
    }
    } else if (!vc->vc_hi_font_mask && cnt == 512) {
    @@ -2555,14 +2541,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
    if (vc->vc_can_do_color) {
    vc->vc_video_erase_char =
    ((c & 0xff00) << 1) | (c & 0xff);
    - c = vc->vc_scrl_erase_char;
    - vc->vc_scrl_erase_char =
    - ((c & 0xFF00) << 1) | (c & 0xFF);
    vc->vc_attr <<= 1;
    - } else {
    + } else
    vc->vc_video_erase_char = c & ~0x100;
    - vc->vc_scrl_erase_char = c & ~0x100;
    - }
    }

    }
    diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
    index 9901064..dd3eaaa 100644
    --- a/drivers/video/console/mdacon.c
    +++ b/drivers/video/console/mdacon.c
    @@ -533,7 +533,7 @@ static void mdacon_cursor(struct vc_data *c, int mode)

    static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
    {
    - u16 eattr = mda_convert_attr(c->vc_scrl_erase_char);
    + u16 eattr = mda_convert_attr(c->vc_video_erase_char);

    if (!lines)
    return 0;
    diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
    index 4055dbd..491c1c1 100644
    --- a/drivers/video/console/sticon.c
    +++ b/drivers/video/console/sticon.c
    @@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count)
    switch (dir) {
    case SM_UP:
    sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols);
    - sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
    + sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char);
    break;

    case SM_DOWN:
    sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols);
    - sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
    + sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char);
    break;
    }

    diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
    index bd1f57b..6df29a6 100644
    --- a/drivers/video/console/vgacon.c
    +++ b/drivers/video/console/vgacon.c
    @@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
    } else
    c->vc_origin += delta;
    scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size -
    - delta), c->vc_scrl_erase_char,
    + delta), c->vc_video_erase_char,
    delta);
    } else {
    if (oldo - delta < vga_vram_base) {
    @@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
    } else
    c->vc_origin -= delta;
    c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
    - scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char,
    + scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char,
    delta);
    }
    c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
    diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
    index 655ed8d..e57df48 100644
    --- a/fs/binfmt_elf.c
    +++ b/fs/binfmt_elf.c
    @@ -1188,9 +1188,11 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,
    * check for an ELF header. If we find one, dump the first page to
    * aid in determining what was mapped here.
    */
    - if (FILTER(ELF_HEADERS) && vma->vm_file != NULL && vma->vm_pgoff == 0) {
    + if (FILTER(ELF_HEADERS) &&
    + vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
    u32 __user *header = (u32 __user *) vma->vm_start;
    u32 word;
    + mm_segment_t fs = get_fs();
    /*
    * Doing it this way gets the constant folded by GCC.
    */
    @@ -1203,7 +1205,15 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,
    magic.elfmag[EI_MAG1] = ELFMAG1;
    magic.elfmag[EI_MAG2] = ELFMAG2;
    magic.elfmag[EI_MAG3] = ELFMAG3;
    - if (get_user(word, header) == 0 && word == magic.cmp)
    + /*
    + * Switch to the user "segment" for get_user(),
    + * then put back what elf_core_dump() had in place.
    + */
    + set_fs(USER_DS);
    + if (unlikely(get_user(word, header)))
    + word = 0;
    + set_fs(fs);
    + if (word == magic.cmp)
    return PAGE_SIZE;
    }

    diff --git a/fs/seq_file.c b/fs/seq_file.c
    index bd20f7f..ef4d497 100644
    --- a/fs/seq_file.c
    +++ b/fs/seq_file.c
    @@ -54,6 +54,64 @@ int seq_open(struct file *file, const struct seq_operations *op)
    }
    EXPORT_SYMBOL(seq_open);

    +static int traverse(struct seq_file *m, loff_t offset)
    +{
    + loff_t pos = 0, index;
    + int error = 0;
    + void *p;
    +
    + m->version = 0;
    + index = 0;
    + m->count = m->from = 0;
    + if (!offset) {
    + m->index = index;
    + return 0;
    + }
    + if (!m->buf) {
    + m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
    + if (!m->buf)
    + return -ENOMEM;
    + }
    + p = m->op->start(m, &index);
    + while (p) {
    + error = PTR_ERR(p);
    + if (IS_ERR(p))
    + break;
    + error = m->op->show(m, p);
    + if (error < 0)
    + break;
    + if (unlikely(error)) {
    + error = 0;
    + m->count = 0;
    + }
    + if (m->count == m->size)
    + goto Eoverflow;
    + if (pos + m->count > offset) {
    + m->from = offset - pos;
    + m->count -= m->from;
    + m->index = index;
    + break;
    + }
    + pos += m->count;
    + m->count = 0;
    + if (pos == offset) {
    + index++;
    + m->index = index;
    + break;
    + }
    + p = m->op->next(m, p, &index);
    + }
    + m->op->stop(m, p);
    + m->index = index;
    + return error;
    +
    +Eoverflow:
    + m->op->stop(m, p);
    + kfree(m->buf);
    + m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
    + return !m->buf ? -ENOMEM : -EAGAIN;
    +}
    +
    /**
    * seq_read - ->read() method for sequential files.
    * @file: the file to read from
    @@ -186,63 +244,6 @@ Efault:
    }
    EXPORT_SYMBOL(seq_read);

    -static int traverse(struct seq_file *m, loff_t offset)
    -{
    - loff_t pos = 0, index;
    - int error = 0;
    - void *p;
    -
    - m->version = 0;
    - index = 0;
    - m->count = m->from = 0;
    - if (!offset) {
    - m->index = index;
    - return 0;
    - }
    - if (!m->buf) {
    - m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
    - if (!m->buf)
    - return -ENOMEM;
    - }
    - p = m->op->start(m, &index);
    - while (p) {
    - error = PTR_ERR(p);
    - if (IS_ERR(p))
    - break;
    - error = m->op->show(m, p);
    - if (error < 0)
    - break;
    - if (unlikely(error)) {
    - error = 0;
    - m->count = 0;
    - }
    - if (m->count == m->size)
    - goto Eoverflow;
    - if (pos + m->count > offset) {
    - m->from = offset - pos;
    - m->count -= m->from;
    - m->index = index;
    - break;
    - }
    - pos += m->count;
    - m->count = 0;
    - if (pos == offset) {
    - index++;
    - m->index = index;
    - break;
    - }
    - p = m->op->next(m, p, &index);
    - }
    - m->op->stop(m, p);
    - return error;
    -
    -Eoverflow:
    - m->op->stop(m, p);
    - kfree(m->buf);
    - m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
    - return !m->buf ? -ENOMEM : -EAGAIN;
    -}
    -
    /**
    * seq_lseek - ->llseek() method for sequential files.
    * @file: the file in question
    diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
    index 36d5fcd..8454dee 100644
    --- a/fs/xfs/linux-2.6/xfs_buf.c
    +++ b/fs/xfs/linux-2.6/xfs_buf.c
    @@ -1114,8 +1114,7 @@ xfs_buf_bio_end_io(
    unsigned int blocksize = bp->b_target->bt_bsize;
    struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;

    - if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
    - bp->b_error = EIO;
    + xfs_buf_ioerror(bp, -error);

    do {
    struct page *page = bvec->bv_page;
    diff --git a/include/acpi/pdc_intel.h b/include/acpi/pdc_intel.h
    index e72bfdd..552637b 100644
    --- a/include/acpi/pdc_intel.h
    +++ b/include/acpi/pdc_intel.h
    @@ -14,6 +14,7 @@
    #define ACPI_PDC_SMP_T_SWCOORD (0x0080)
    #define ACPI_PDC_C_C1_FFH (0x0100)
    #define ACPI_PDC_C_C2C3_FFH (0x0200)
    +#define ACPI_PDC_SMP_P_HWCOORD (0x0800)

    #define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \
    ACPI_PDC_C_C1_HALT | \
    @@ -22,6 +23,7 @@
    #define ACPI_PDC_EST_CAPABILITY_SWSMP (ACPI_PDC_SMP_C1PT | \
    ACPI_PDC_C_C1_HALT | \
    ACPI_PDC_SMP_P_SWCOORD | \
    + ACPI_PDC_SMP_P_HWCOORD | \
    ACPI_PDC_P_FFH)

    #define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \
    diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
    index b03f80a..d71f7c0 100644
    --- a/include/linux/console_struct.h
    +++ b/include/linux/console_struct.h
    @@ -53,7 +53,6 @@ struct vc_data {
    unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */
    struct console_font vc_font; /* Current VC font set */
    unsigned short vc_video_erase_char; /* Background erase character */
    - unsigned short vc_scrl_erase_char; /* Erase character for scroll */
    /* VT terminal data */
    unsigned int vc_state; /* Escape sequence parser state */
    unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */
    diff --git a/include/linux/module.h b/include/linux/module.h
    index 68e0955..760a41b 100644
    --- a/include/linux/module.h
    +++ b/include/linux/module.h
    @@ -387,7 +387,6 @@ void symbol_put_addr(void *addr);
    static inline void __module_get(struct module *module)
    {
    if (module) {
    - BUG_ON(module_refcount(module) == 0);
    local_inc(&module->ref[get_cpu()].count);
    put_cpu();
    }
    diff --git a/include/linux/pci.h b/include/linux/pci.h
    index 426e029..911b99d 100644
    --- a/include/linux/pci.h
    +++ b/include/linux/pci.h
    @@ -639,7 +639,7 @@ int pci_select_bars(struct pci_dev *dev, unsigned long flags);
    /* ROM control related routines */
    void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
    void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
    -size_t pci_get_rom_size(void __iomem *rom, size_t size);
    +size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);

    /* Power management related routines */
    int pci_save_state(struct pci_dev *dev);
    diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
    index 26b59cb..794e546 100644
    --- a/include/linux/pci_ids.h
    +++ b/include/linux/pci_ids.h
    @@ -1755,6 +1755,7 @@
    #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081
    #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082
    #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050
    +#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530

    #define PCI_VENDOR_ID_RADISYS 0x1331

    diff --git a/include/linux/wait.h b/include/linux/wait.h
    index 0081147..3c2f411 100644
    --- a/include/linux/wait.h
    +++ b/include/linux/wait.h
    @@ -141,6 +141,8 @@ static inline void __remove_wait_queue(wait_queue_head_t *head,
    list_del(&old->task_list);
    }

    +void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
    + int nr_exclusive, int sync, void *key);
    void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key);
    extern void __wake_up_locked(wait_queue_head_t *q, unsigned int mode);
    extern void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr);
    @@ -342,16 +344,19 @@ do { \
    for (;;) { \
    prepare_to_wait_exclusive(&wq, &__wait, \
    TASK_INTERRUPTIBLE); \
    - if (condition) \
    + if (condition) { \
    + finish_wait(&wq, &__wait); \
    break; \
    + } \
    if (!signal_pending(current)) { \
    schedule(); \
    continue; \
    } \
    ret = -ERESTARTSYS; \
    + abort_exclusive_wait(&wq, &__wait, \
    + TASK_INTERRUPTIBLE, NULL); \
    break; \
    } \
    - finish_wait(&wq, &__wait); \
    } while (0)

    #define wait_event_interruptible_exclusive(wq, condition) \
    @@ -440,6 +445,8 @@ extern long interruptible_sleep_on_timeout(wait_queue_head_t *q,
    void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state);
    void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state);
    void finish_wait(wait_queue_head_t *q, wait_queue_t *wait);
    +void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
    + unsigned int mode, void *key);
    int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
    int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key);

    diff --git a/ipc/shm.c b/ipc/shm.c
    index f00c897..35a65be 100644
    --- a/ipc/shm.c
    +++ b/ipc/shm.c
    @@ -565,11 +565,15 @@ static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
    struct hstate *h = hstate_file(shp->shm_file);
    *rss += pages_per_huge_page(h) * mapping->nrpages;
    } else {
    +#ifdef CONFIG_SHMEM
    struct shmem_inode_info *info = SHMEM_I(inode);
    spin_lock(&info->lock);
    *rss += inode->i_mapping->nrpages;
    *swp += info->swapped;
    spin_unlock(&info->lock);
    +#else
    + *rss += inode->i_mapping->nrpages;
    +#endif
    }

    total++;
    diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
    index 3cd441e..48c58fe 100644
    --- a/kernel/irq/chip.c
    +++ b/kernel/irq/chip.c
    @@ -78,6 +78,7 @@ void dynamic_irq_cleanup(unsigned int irq)
    desc->chip_data = NULL;
    desc->handle_irq = handle_bad_irq;
    desc->chip = &no_irq_chip;
    + desc->name = NULL;
    spin_unlock_irqrestore(&desc->lock, flags);
    }

    diff --git a/kernel/sched.c b/kernel/sched.c
    index 2a09e44..98c0cdc 100644
    --- a/kernel/sched.c
    +++ b/kernel/sched.c
    @@ -4556,8 +4556,8 @@ EXPORT_SYMBOL(default_wake_function);
    * started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
    * zero in this (rare) case, and we handle it by continuing to scan the queue.
    */
    -static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
    - int nr_exclusive, int sync, void *key)
    +void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
    + int nr_exclusive, int sync, void *key)
    {
    wait_queue_t *curr, *next;

    diff --git a/kernel/wait.c b/kernel/wait.c
    index c275c56..24688c7 100644
    --- a/kernel/wait.c
    +++ b/kernel/wait.c
    @@ -101,6 +101,15 @@ prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
    }
    EXPORT_SYMBOL(prepare_to_wait_exclusive);

    +/*
    + * finish_wait - clean up after waiting in a queue
    + * @q: waitqueue waited on
    + * @wait: wait descriptor
    + *
    + * Sets current thread back to running state and removes
    + * the wait descriptor from the given waitqueue if still
    + * queued.
    + */
    void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
    {
    unsigned long flags;
    @@ -127,6 +136,39 @@ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
    }
    EXPORT_SYMBOL(finish_wait);

    +/*
    + * abort_exclusive_wait - abort exclusive waiting in a queue
    + * @q: waitqueue waited on
    + * @wait: wait descriptor
    + * @state: runstate of the waiter to be woken
    + * @key: key to identify a wait bit queue or %NULL
    + *
    + * Sets current thread back to running state and removes
    + * the wait descriptor from the given waitqueue if still
    + * queued.
    + *
    + * Wakes up the next waiter if the caller is concurrently
    + * woken up through the queue.
    + *
    + * This prevents waiter starvation where an exclusive waiter
    + * aborts and is woken up concurrently and noone wakes up
    + * the next waiter.
    + */
    +void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
    + unsigned int mode, void *key)
    +{
    + unsigned long flags;
    +
    + __set_current_state(TASK_RUNNING);
    + spin_lock_irqsave(&q->lock, flags);
    + if (!list_empty(&wait->task_list))
    + list_del_init(&wait->task_list);
    + else if (waitqueue_active(q))
    + __wake_up_common(q, mode, 1, 0, key);
    + spin_unlock_irqrestore(&q->lock, flags);
    +}
    +EXPORT_SYMBOL(abort_exclusive_wait);
    +
    int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
    {
    int ret = default_wake_function(wait, mode, sync, key);
    @@ -187,17 +229,20 @@ int __sched
    __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,
    int (*action)(void *), unsigned mode)
    {
    - int ret = 0;
    -
    do {
    + int ret;
    +
    prepare_to_wait_exclusive(wq, &q->wait, mode);
    - if (test_bit(q->key.bit_nr, q->key.flags)) {
    - if ((ret = (*action)(q->key.flags)))
    - break;
    - }
    + if (!test_bit(q->key.bit_nr, q->key.flags))
    + continue;
    + ret = action(q->key.flags);
    + if (!ret)
    + continue;
    + abort_exclusive_wait(wq, &q->wait, mode, &q->key);
    + return ret;
    } while (test_and_set_bit(q->key.bit_nr, q->key.flags));
    finish_wait(wq, &q->wait);
    - return ret;
    + return 0;
    }
    EXPORT_SYMBOL(__wait_on_bit_lock);

    diff --git a/mm/swap.c b/mm/swap.c
    index 9e0cb31..65e6825 100644
    --- a/mm/swap.c
    +++ b/mm/swap.c
    @@ -244,7 +244,6 @@ void lru_add_drain(void)
    put_cpu();
    }

    -#ifdef CONFIG_NUMA
    static void lru_add_drain_per_cpu(struct work_struct *dummy)
    {
    lru_add_drain();
    @@ -258,18 +257,6 @@ int lru_add_drain_all(void)
    return schedule_on_each_cpu(lru_add_drain_per_cpu);
    }

    -#else
    -
    -/*
    - * Returns 0 for success
    - */
    -int lru_add_drain_all(void)
    -{
    - lru_add_drain();
    - return 0;
    -}
    -#endif
    -
    /*
    * Batched page_cache_release(). Decrement the reference count on all the
    * passed pages. If it fell to zero then remove the page from the LRU and
    diff --git a/net/sctp/input.c b/net/sctp/input.c
    index a49fa80..be736af 100644
    --- a/net/sctp/input.c
    +++ b/net/sctp/input.c
    @@ -249,6 +249,19 @@ int sctp_rcv(struct sk_buff *skb)
    */
    sctp_bh_lock_sock(sk);

    + if (sk != rcvr->sk) {
    + /* Our cached sk is different from the rcvr->sk. This is
    + * because migrate()/accept() may have moved the association
    + * to a new socket and released all the sockets. So now we
    + * are holding a lock on the old socket while the user may
    + * be doing something with the new socket. Switch our veiw
    + * of the current sk.
    + */
    + sctp_bh_unlock_sock(sk);
    + sk = rcvr->sk;
    + sctp_bh_lock_sock(sk);
    + }
    +
    if (sock_owned_by_user(sk)) {
    SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
    sctp_add_backlog(sk, skb);
    diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
    index 3e65719..e4c27c1 100644
    --- a/net/sunrpc/svcsock.c
    +++ b/net/sunrpc/svcsock.c
    @@ -1171,7 +1171,11 @@ int svc_addsock(struct svc_serv *serv,
    else if (so->state > SS_UNCONNECTED)
    err = -EISCONN;
    else {
    - svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS);
    + if (!try_module_get(THIS_MODULE))
    + err = -ENOENT;
    + else
    + svsk = svc_setup_socket(serv, so, &err,
    + SVC_SOCK_DEFAULTS);
    if (svsk) {
    struct sockaddr_storage addr;
    struct sockaddr *sin = (struct sockaddr *)&addr;
    @@ -1184,7 +1188,8 @@ int svc_addsock(struct svc_serv *serv,
    spin_unlock_bh(&serv->sv_lock);
    svc_xprt_received(&svsk->sk_xprt);
    err = 0;
    - }
    + } else
    + module_put(THIS_MODULE);
    }
    if (err) {
    sockfd_put(so);
    diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
    index aa7dc03..db9c702 100644
    --- a/sound/pci/hda/patch_realtek.c
    +++ b/sound/pci/hda/patch_realtek.c
    @@ -920,6 +920,7 @@ do_sku:
    case 0x10ec0267:
    case 0x10ec0268:
    case 0x10ec0269:
    + case 0x10ec0272:
    case 0x10ec0660:
    case 0x10ec0662:
    case 0x10ec0663:
    @@ -948,6 +949,7 @@ do_sku:
    case 0x10ec0882:
    case 0x10ec0883:
    case 0x10ec0885:
    + case 0x10ec0887:
    case 0x10ec0889:
    snd_hda_codec_write(codec, 0x20, 0,
    AC_VERB_SET_COEF_INDEX, 7);
    @@ -8059,6 +8061,8 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
    SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD),
    SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
    SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
    + SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550",
    + ALC883_FUJITSU_PI2515),
    SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515),
    SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
    SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
    diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
    index b8cfb7c..7a1a8c8 100644
    --- a/sound/usb/usbaudio.c
    +++ b/sound/usb/usbaudio.c
    @@ -2958,6 +2958,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
    return -EINVAL;
    }
    alts = &iface->altsetting[fp->altset_idx];
    + fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
    usb_set_interface(chip->dev, fp->iface, 0);
    init_usb_pitch(chip->dev, fp->iface, alts, fp);
    init_usb_sample_rate(chip->dev, fp->iface, alts, fp, fp->rate_max);
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2009-02-12 19:11    [W:0.150 / U:9.512 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site