[patch 00/73] 2.6.23-stable review - Kernel

This is a discussion on [patch 00/73] 2.6.23-stable review - Kernel ; 2.6.23-stable review patch. If anyone has any objections, please let us know. ------------------ From: Len Brown This patch is appropriate for supporting a 2.6.23-based products. Signed-off-by: Len Brown Signed-off-by: Greg Kroah-Hartman --- drivers/acpi/blacklist.c | 388 +++++++++++++++++++++++++++++++++++++++++++++- drivers/acpi/osl.c | 173 +++++++++++++++----- ...

+ Reply to Thread
Page 4 of 4 FirstFirst ... 2 3 4
Results 61 to 66 of 66

Thread: [patch 00/73] 2.6.23-stable review

  1. [patch 72/73] ACPI: sync blacklist w/ latest


    2.6.23-stable review patch. If anyone has any objections, please let us know.
    ------------------
    From: Len Brown

    This patch is appropriate for supporting a 2.6.23-based products.

    Signed-off-by: Len Brown
    Signed-off-by: Greg Kroah-Hartman

    ---
    drivers/acpi/blacklist.c | 388 +++++++++++++++++++++++++++++++++++++++++++++-
    drivers/acpi/osl.c | 173 +++++++++++++++-----
    drivers/firmware/dmi-id.c | 2
    include/linux/acpi.h | 7
    include/linux/dmi.h | 2
    5 files changed, 523 insertions(+), 49 deletions(-)

    --- a/drivers/acpi/blacklist.c
    +++ b/drivers/acpi/blacklist.c
    @@ -3,6 +3,7 @@
    *
    * Check to see if the given machine has a known bad ACPI BIOS
    * or if the BIOS is too old.
    + * Check given machine against acpi_osi_dmi_table[].
    *
    * Copyright (C) 2004 Len Brown
    * Copyright (C) 2002 Andy Grover
    @@ -50,6 +51,8 @@ struct acpi_blacklist_item {
    u32 is_critical_error;
    };

    +static struct dmi_system_id acpi_osi_dmi_table[] __initdata;
    +
    /*
    * POLICY: If *anything* doesn't work, put it on the blacklist.
    * If they are critical errors, mark it critical, and abort driver load.
    @@ -67,8 +70,6 @@ static struct acpi_blacklist_item acpi_b
    /* IBM 600E - _ADR should return 7, but it returns 1 */
    {"IBM ", "TP600E ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal,
    "Incorrect _ADR", 1},
    - {"ASUS\0\0", "P2B-S ", 0, ACPI_SIG_DSDT, all_versions,
    - "Bogus PCI routing", 1},

    {""}
    };
    @@ -165,5 +166,388 @@ int __init acpi_blacklisted(void)

    blacklisted += blacklist_by_year();

    + dmi_check_system(acpi_osi_dmi_table);
    +
    return blacklisted;
    }
    +#ifdef CONFIG_DMI
    +static int __init dmi_enable_osi_linux(struct dmi_system_id *d)
    +{
    + acpi_dmi_osi_linux(1, d); /* enable */
    + return 0;
    +}
    +static int __init dmi_disable_osi_linux(struct dmi_system_id *d)
    +{
    + acpi_dmi_osi_linux(0, d); /* disable */
    + return 0;
    +}
    +static int __init dmi_unknown_osi_linux(struct dmi_system_id *d)
    +{
    + acpi_dmi_osi_linux(-1, d); /* unknown */
    + return 0;
    +}
    +
    +/*
    + * Most BIOS that invoke OSI(Linux) do nothing with it.
    + * But some cause Linux to break.
    + * Only a couple use it to make Linux run better.
    + *
    + * Thus, Linux should continue to disable OSI(Linux) by default,
    + * should continue to discourage BIOS writers from using it, and
    + * should whitelist the few existing systems that require it.
    + *
    + * If it appears clear a vendor isn't using OSI(Linux)
    + * for anything constructive, blacklist them by name to disable
    + * unnecessary dmesg warnings on all of their products.
    + */
    +
    +static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
    + /*
    + * Disable OSI(Linux) warnings on all "Acer, inc."
    + *
    + * _OSI(Linux) disables the latest Windows BIOS code:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
    + * _OSI(Linux) effect unknown:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
    + */
    + /*
    + * note that dmi_check_system() uses strstr()
    + * to match sub-strings rather than !strcmp(),
    + * so "Acer" below matches "Acer, inc." above.
    + */
    + /*
    + * Disable OSI(Linux) warnings on all "Acer"
    + *
    + * _OSI(Linux) effect unknown:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"),
    + */
    + {
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Acer",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "Apple Computer, Inc."
    + *
    + * _OSI(Linux) confirmed to be a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
    + * _OSI(Linux) effect unknown:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Apple",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "BenQ"
    + *
    + * _OSI(Linux) confirmed to be a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "BenQ",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "BenQ"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "Clevo Co."
    + *
    + * _OSI(Linux) confirmed to be a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Clevo",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "COMPAL"
    + *
    + * _OSI(Linux) confirmed to be a NOP:
    + * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"),
    + * _OSI(Linux) unknown effect:
    + * DMI_MATCH(DMI_BOARD_NAME, "IFL91"),
    + */
    + {
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Compal",
    + .matches = {
    + DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
    + },
    + },
    + { /* OSI(Linux) touches USB, unknown side-effect */
    + .callback = dmi_disable_osi_linux,
    + .ident = "Dell Dimension 5150",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"),
    + },
    + },
    + { /* OSI(Linux) is a NOP */
    + .callback = dmi_disable_osi_linux,
    + .ident = "Dell",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"),
    + },
    + },
    + { /* OSI(Linux) effect unknown */
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Dell",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"),
    + },
    + },
    + { /* OSI(Linux) effect unknown */
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Dell",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"),
    + },
    + },
    + { /* OSI(Linux) effect unknown */
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Dell",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"),
    + },
    + },
    + { /* OSI(Linux) touches USB */
    + .callback = dmi_disable_osi_linux,
    + .ident = "Dell",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"),
    + },
    + },
    + { /* OSI(Linux) is a NOP */
    + .callback = dmi_disable_osi_linux,
    + .ident = "Dell Vostro 1000",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1000"),
    + },
    + },
    + { /* OSI(Linux) effect unknown */
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Dell",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"),
    + },
    + },
    + { /* OSI(Linux) effect unknown */
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Dialogue Flybook V5",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"),
    + DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS"
    + *
    + * _OSI(Linux) disables latest Windows BIOS code:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"),
    + * _OSI(Linux) confirmed to be a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"),
    + * _OSI(Linux) unknown effect:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Fujitsu Siemens",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "Hewlett-Packard"
    + *
    + * _OSI(Linux) confirmed to be a NOP:
    + * .ident = "HP Pavilion tx 1000"
    + * DMI_MATCH(DMI_BOARD_NAME, "30BF"),
    + * .ident = "HP Pavilion dv2000"
    + * DMI_MATCH(DMI_BOARD_NAME, "30B5"),
    + * .ident = "HP Pavilion dv5000",
    + * DMI_MATCH(DMI_BOARD_NAME, "30A7"),
    + * .ident = "HP Pavilion dv6300 30BC",
    + * DMI_MATCH(DMI_BOARD_NAME, "30BC"),
    + * .ident = "HP Pavilion dv6000",
    + * DMI_MATCH(DMI_BOARD_NAME, "30B7"),
    + * DMI_MATCH(DMI_BOARD_NAME, "30B8"),
    + * .ident = "HP Pavilion dv9000",
    + * DMI_MATCH(DMI_BOARD_NAME, "30B9"),
    + * .ident = "HP Pavilion dv9500",
    + * DMI_MATCH(DMI_BOARD_NAME, "30CB"),
    + * .ident = "HP/Compaq Presario C500",
    + * DMI_MATCH(DMI_BOARD_NAME, "30C6"),
    + * .ident = "HP/Compaq Presario F500",
    + * DMI_MATCH(DMI_BOARD_NAME, "30D3"),
    + * _OSI(Linux) unknown effect:
    + * .ident = "HP Pavilion dv6500",
    + * DMI_MATCH(DMI_BOARD_NAME, "30D0"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Hewlett-Packard",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
    + },
    + },
    + /*
    + * Lenovo has a mix of systems OSI(Linux) situations
    + * and thus we can not wildcard the vendor.
    + *
    + * _OSI(Linux) helps sound
    + * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
    + * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
    + * _OSI(Linux) is a NOP:
    + * DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
    + */
    + {
    + .callback = dmi_enable_osi_linux,
    + .ident = "Lenovo ThinkPad R61",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
    + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
    + },
    + },
    + {
    + .callback = dmi_enable_osi_linux,
    + .ident = "Lenovo ThinkPad T61",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
    + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
    + },
    + },
    + {
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Lenovo 3000 V100",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
    + DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"),
    + },
    + },
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Lenovo 3000 N100",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
    + DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "LG Electronics"
    + *
    + * _OSI(Linux) confirmed to be a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
    + * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
    + *
    + * unknown:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
    + * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "LG",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
    + },
    + },
    + /* NEC - OSI(Linux) effect unknown */
    + {
    + .callback = dmi_unknown_osi_linux,
    + .ident = "NEC VERSA M360",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"),
    + DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "Samsung Electronics"
    + *
    + * OSI(Linux) disables PNP0C32 and other BIOS code for Windows:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Samsung",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "Sony Corporation"
    + *
    + * _OSI(Linux) is a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"),
    + * _OSI(Linux) unknown effect:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"),
    + */
    + {
    + .callback = dmi_unknown_osi_linux,
    + .ident = "Sony",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
    + },
    + },
    + /*
    + * Disable OSI(Linux) warnings on all "TOSHIBA"
    + *
    + * _OSI(Linux) breaks sound (bugzilla 7787):
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"),
    + * _OSI(Linux) is a NOP:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"),
    + * _OSI(Linux) unknown effect:
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"),
    + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"),
    + */
    + {
    + .callback = dmi_disable_osi_linux,
    + .ident = "Toshiba",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
    + },
    + },
    + {}
    +};
    +
    +#endif /* CONFIG_DMI */
    --- a/drivers/acpi/osl.c
    +++ b/drivers/acpi/osl.c
    @@ -77,11 +77,55 @@ static struct workqueue_struct *kacpi_no
    #define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
    static char osi_additional_string[OSI_STRING_LENGTH_MAX];

    -static int osi_linux; /* disable _OSI(Linux) by default */
    +/*
    + * "Ode to _OSI(Linux)"
    + *
    + * osi_linux -- Control response to BIOS _OSI(Linux) query.
    + *
    + * As Linux evolves, the features that it supports change.
    + * So an OSI string such as "Linux" is not specific enough
    + * to be useful across multiple versions of Linux. It
    + * doesn't identify any particular feature, interface,
    + * or even any particular version of Linux...
    + *
    + * Unfortunately, Linux-2.6.22 and earlier responded "yes"
    + * to a BIOS _OSI(Linux) query. When
    + * a reference mobile BIOS started using it, its use
    + * started to spread to many vendor platforms.
    + * As it is not supportable, we need to halt that spread.
    + *
    + * Today, most BIOS references to _OSI(Linux) are noise --
    + * they have no functional effect and are just dead code
    + * carried over from the reference BIOS.
    + *
    + * The next most common case is that _OSI(Linux) harms Linux,
    + * usually by causing the BIOS to follow paths that are
    + * not tested during Windows validation.
    + *
    + * Finally, there is a short list of platforms
    + * where OSI(Linux) benefits Linux.
    + *
    + * In Linux-2.6.23, OSI(Linux) is first disabled by default.
    + * DMI is used to disable the dmesg warning about OSI(Linux)
    + * on platforms where it is known to have no effect.
    + * But a dmesg warning remains for systems where
    + * we do not know if OSI(Linux) is good or bad for the system.
    + * DMI is also used to enable OSI(Linux) for the machines
    + * that are known to need it.
    + *
    + * BIOS writers should NOT query _OSI(Linux) on future systems.
    + * It will be ignored by default, and to get Linux to
    + * not ignore it will require a kernel source update to
    + * add a DMI entry, or a boot-time "acpi_osi=Linux" invocation.
    + */
    +#define OSI_LINUX_ENABLE 0

    -#ifdef CONFIG_DMI
    -static struct __initdata dmi_system_id acpi_osl_dmi_table[];
    -#endif
    +static struct osi_linux {
    + unsigned int enable:1;
    + unsigned int dmi:1;
    + unsigned int cmdline:1;
    + unsigned int known:1;
    +} osi_linux = { OSI_LINUX_ENABLE, 0, 0, 0};

    static void __init acpi_request_region (struct acpi_generic_address *addr,
    unsigned int length, char *desc)
    @@ -133,7 +177,6 @@ device_initcall(acpi_reserve_resources);

    acpi_status __init acpi_os_initialize(void)
    {
    - dmi_check_system(acpi_osl_dmi_table);
    return AE_OK;
    }

    @@ -971,13 +1014,37 @@ static int __init acpi_os_name_setup(cha

    __setup("acpi_os_name=", acpi_os_name_setup);

    -static void enable_osi_linux(int enable) {
    +static void __init set_osi_linux(unsigned int enable)
    +{
    + if (osi_linux.enable != enable) {
    + osi_linux.enable = enable;
    + printk(KERN_NOTICE PREFIX "%sed _OSI(Linux)\n",
    + enable ? "Add": "Delet");
    + }
    + return;
    +}

    - if (osi_linux != enable)
    - printk(KERN_INFO PREFIX "%sabled _OSI(Linux)\n",
    - enable ? "En": "Dis");
    +static void __init acpi_cmdline_osi_linux(unsigned int enable)
    +{
    + osi_linux.cmdline = 1; /* cmdline set the default */
    + set_osi_linux(enable);
    +
    + return;
    +}
    +
    +void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
    +{
    + osi_linux.dmi = 1; /* DMI knows that this box asks OSI(Linux) */
    +
    + printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
    +
    + if (enable == -1)
    + return;
    +
    + osi_linux.known = 1; /* DMI knows which OSI(Linux) default needed */
    +
    + set_osi_linux(enable);

    - osi_linux = enable;
    return;
    }

    @@ -994,12 +1061,12 @@ static int __init acpi_osi_setup(char *s
    printk(KERN_INFO PREFIX "_OSI method disabled\n");
    acpi_gbl_create_osi_method = FALSE;
    } else if (!strcmp("!Linux", str)) {
    - enable_osi_linux(0);
    + acpi_cmdline_osi_linux(0); /* !enable */
    } else if (*str == '!') {
    if (acpi_osi_invalidate(++str) == AE_OK)
    printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
    } else if (!strcmp("Linux", str)) {
    - enable_osi_linux(1);
    + acpi_cmdline_osi_linux(1); /* enable */
    } else if (*osi_additional_string == '\0') {
    strncpy(osi_additional_string, str, OSI_STRING_LENGTH_MAX);
    printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
    @@ -1156,6 +1223,34 @@ acpi_status acpi_os_release_object(acpi_
    return (AE_OK);
    }

    +/**
    + * acpi_dmi_dump - dump DMI slots needed for blacklist entry
    + *
    + * Returns 0 on success
    + */
    +static int acpi_dmi_dump(void)
    +{
    +
    + if (!dmi_available)
    + return -1;
    +
    + printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
    + dmi_get_system_info(DMI_SYS_VENDOR));
    + printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
    + dmi_get_system_info(DMI_PRODUCT_NAME));
    + printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
    + dmi_get_system_info(DMI_PRODUCT_VERSION));
    + printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
    + dmi_get_system_info(DMI_BOARD_NAME));
    + printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
    + dmi_get_system_info(DMI_BIOS_VENDOR));
    + printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
    + dmi_get_system_info(DMI_BIOS_DATE));
    +
    + return 0;
    +}
    +
    +
    /************************************************** ****************************
    *
    * FUNCTION: acpi_os_validate_interface
    @@ -1175,13 +1270,29 @@ acpi_os_validate_interface (char *interf
    if (!strncmp(osi_additional_string, interface, OSI_STRING_LENGTH_MAX))
    return AE_OK;
    if (!strcmp("Linux", interface)) {
    - printk(KERN_WARNING PREFIX
    - "System BIOS is requesting _OSI(Linux)\n");
    - printk(KERN_WARNING PREFIX
    - "If \"acpi_osi=Linux\" works better,\n"
    - "Please send dmidecode "
    - "to linux-acpi@vger.kernel.org\n");
    - if(osi_linux)
    +
    + printk(KERN_NOTICE PREFIX
    + "BIOS _OSI(Linux) query %s%s\n",
    + osi_linux.enable ? "honored" : "ignored",
    + osi_linux.cmdline ? " via cmdline" :
    + osi_linux.dmi ? " via DMI" : "");
    +
    + if (!osi_linux.dmi) {
    + if (acpi_dmi_dump())
    + printk(KERN_NOTICE PREFIX
    + "[please extract dmidecode output]\n");
    + printk(KERN_NOTICE PREFIX
    + "Please send DMI info above to "
    + "linux-acpi@vger.kernel.org\n");
    + }
    + if (!osi_linux.known && !osi_linux.cmdline) {
    + printk(KERN_NOTICE PREFIX
    + "If \"acpi_osi=%sLinux\" works better, "
    + "please notify linux-acpi@vger.kernel.org\n",
    + osi_linux.enable ? "!" : "");
    + }
    +
    + if (osi_linux.enable)
    return AE_OK;
    }
    return AE_SUPPORT;
    @@ -1213,28 +1324,4 @@ acpi_os_validate_address (
    return AE_OK;
    }

    -#ifdef CONFIG_DMI
    -static int dmi_osi_linux(struct dmi_system_id *d)
    -{
    - printk(KERN_NOTICE "%s detected: enabling _OSI(Linux)\n", d->ident);
    - enable_osi_linux(1);
    - return 0;
    -}
    -
    -static struct dmi_system_id acpi_osl_dmi_table[] __initdata = {
    - /*
    - * Boxes that need _OSI(Linux)
    - */
    - {
    - .callback = dmi_osi_linux,
    - .ident = "Intel Napa CRB",
    - .matches = {
    - DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
    - DMI_MATCH(DMI_BOARD_NAME, "MPAD-MSAE Customer Reference Boards"),
    - },
    - },
    - {}
    -};
    -#endif /* CONFIG_DMI */
    -
    #endif
    --- a/drivers/firmware/dmi-id.c
    +++ b/drivers/firmware/dmi-id.c
    @@ -159,8 +159,6 @@ static struct device *dmi_dev;
    if (dmi_get_system_info(_field)) \
    sys_dmi_attributes[i++] = & sys_dmi_##_name##_attr.attr;

    -extern int dmi_available;
    -
    static int __init dmi_id_init(void)
    {
    int ret, i;
    --- a/include/linux/acpi.h
    +++ b/include/linux/acpi.h
    @@ -40,6 +40,7 @@
    #include
    #include
    #include
    +#include


    #ifdef CONFIG_ACPI
    @@ -187,7 +188,9 @@ extern int ec_transaction(u8 command,
    #endif /*CONFIG_ACPI_EC*/

    extern int acpi_blacklisted(void);
    -extern void acpi_bios_year(char *s);
    +#ifdef CONFIG_DMI
    +extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
    +#endif

    #define ACPI_CSTATE_LIMIT_DEFINED /* for driver builds */
    #ifdef CONFIG_ACPI
    @@ -247,5 +250,5 @@ static inline int acpi_boot_table_init(v
    return 0;
    }

    -#endif /* CONFIG_ACPI */
    +#endif /* !CONFIG_ACPI */
    #endif /*_LINUX_ACPI_H*/
    --- a/include/linux/dmi.h
    +++ b/include/linux/dmi.h
    @@ -78,6 +78,7 @@ extern struct dmi_device * dmi_find_devi
    extern void dmi_scan_machine(void);
    extern int dmi_get_year(int field);
    extern int dmi_name_in_vendors(char *str);
    +extern int dmi_available;

    #else

    @@ -87,6 +88,7 @@ static inline struct dmi_device * dmi_fi
    struct dmi_device *from) { return NULL; }
    static inline int dmi_get_year(int year) { return 0; }
    static inline int dmi_name_in_vendors(char *s) { return 0; }
    +#define dmi_available 0

    #endif


    --
    --
    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/

  2. [patch 69/73] Fix dirty page accounting leak with ext3 data=journal

    2.6.23-stable review patch. If anyone has any objections, please let us know.
    ------------------
    From: Björn Steinbrink

    patch a2b345642f530054a92b8d2b5108436225a8093e in mainline.

    In 46d2277c796f9f4937bfa668c40b2e3f43e93dd0, try_to_free_buffers was
    changed to bail out if the page was dirty. That caused
    truncate_complete_page to leak massive amounts of memory, because the
    dirty bit was only cleared after the call to try_to_free_buffers. So the
    call to cancel_dirty_page was moved up to have the dirty bit cleared
    early in 3e67c0987d7567ad666641164a153dca9a43b11d.

    The problem with that fix is, that the page can be redirtied after
    cancel_dirty_page was called, eg. like this:

    truncate_complete_page()
    cancel_dirty_page() // PG_dirty cleared, decr. dirty pages
    do_invalidatepage()
    ext3_invalidatepage()
    journal_invalidatepage()
    journal_unmap_buffer()
    __dispose_buffer()
    __journal_unfile_buffer()
    __journal_temp_unlink_buffer()
    mark_buffer_dirty(); // PG_dirty set, incr. dirty pages

    And then we end up with dirty pages being wrongly accounted.

    In ecdfc9787fe527491baefc22dce8b2dbd5b2908d the changes to
    try_to_free_buffers were reverted, so the original reason for the
    massive memory leak is gone, so we can also revert the move of
    the call to cancel_dirty_page from truncate_complete_page and get the
    accounting right again.

    Signed-off-by: Björn Steinbrink
    Tested-by: Krzysztof Piotr Oledzki
    Tested-by: Zaid D.
    Cc: Jan Kara
    Cc: Nick Piggin
    Cc: Peter Zijlstra
    Cc: Thomas Osterried
    Cc: Kerin Millar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman


    ---
    mm/truncate.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/mm/truncate.c
    +++ b/mm/truncate.c
    @@ -95,11 +95,11 @@ truncate_complete_page(struct address_sp
    if (page->mapping != mapping)
    return;

    - cancel_dirty_page(page, PAGE_CACHE_SIZE);
    -
    if (PagePrivate(page))
    do_invalidatepage(page, 0);

    + cancel_dirty_page(page, PAGE_CACHE_SIZE);
    +
    remove_from_page_cache(page);
    ClearPageUptodate(page);
    ClearPageMappedToDisk(page);

    --
    --
    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/

  3. [patch 70/73] forcedeth: mac address mcp77/79

    2.6.23-stable review patch. If anyone has any objections, please let us know.
    ------------------
    From: Ayaz Abdulla

    patch 2b91213064bd882c3adf35f028c6d12fab3269ec in mainline.

    This patch is a critical fix for MCP77 and MCP79 devices. The feature
    flags were missing the define for correct mac address
    (DEV_HAS_CORRECT_MACADDR).

    Signed-off-by: Ayaz Abdulla
    Signed-off-by: Jeff Garzik
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    ---
    drivers/net/forcedeth.c | 16 ++++++++--------
    1 file changed, 8 insertions(+), 8 deletions(-)

    --- a/drivers/net/forcedeth.c
    +++ b/drivers/net/forcedeth.c
    @@ -5564,35 +5564,35 @@ static struct pci_device_id pci_tbl[] =
    },
    { /* MCP77 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP77 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP77 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP77 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP79 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP79 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP79 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    { /* MCP79 Ethernet Controller */
    PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39),
    - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
    + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECK SUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNT RL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV _HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRE CT_MACADDR,
    },
    {0,},
    };

    --
    --
    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/

  4. [patch 71/73] atl1: fix frame length bug

    2.6.23-stable review patch. If anyone has any objections, please let us know.
    ------------------
    From: Jay Cliburn


    Upstream commit: 2a49128f0a6edee337174ea341c1d6d7565be350

    The driver sets up the hardware to accept a frame with max length
    equal to MTU + Ethernet header + FCS + VLAN tag, but we neglect to
    add the VLAN tag size to the ingress buffer. When a VLAN-tagged
    frame arrives, the hardware passes it, but bad things happen
    because the buffer is too small. This patch fixes that.

    Thanks to David Harris for reporting the bug and testing the fix.

    Signed-off-by: Jay Cliburn
    Tested-by: David Harris
    Signed-off-by: Jeff Garzik
    Signed-off-by: Greg Kroah-Hartman

    ---
    drivers/net/atl1/atl1_main.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    --- a/drivers/net/atl1/atl1_main.c
    +++ b/drivers/net/atl1/atl1_main.c
    @@ -121,7 +121,7 @@ static int __devinit atl1_sw_init(struct
    struct atl1_hw *hw = &adapter->hw;
    struct net_device *netdev = adapter->netdev;

    - hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
    + hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
    hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;

    adapter->wol = 0;
    @@ -689,7 +689,7 @@ static int atl1_change_mtu(struct net_de
    {
    struct atl1_adapter *adapter = netdev_priv(netdev);
    int old_mtu = netdev->mtu;
    - int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
    + int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;

    if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
    @@ -854,8 +854,8 @@ static u32 atl1_configure(struct atl1_ad
    /* set Interrupt Clear Timer */
    iowrite16(adapter->ict, hw->hw_addr + REG_CMBDISDMA_TIMER);

    - /* set MTU, 4 : VLAN */
    - iowrite32(hw->max_frame_size + 4, hw->hw_addr + REG_MTU);
    + /* set max frame size hw will accept */
    + iowrite32(hw->max_frame_size, hw->hw_addr + REG_MTU);

    /* jumbo size & rrd retirement timer */
    value = (((u32) hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK)

    --
    --
    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/

  5. [patch 73/73] PCI: Fix fakephp deadlock


    2.6.23-stable review patch. If anyone has any objections, please let us know.
    ------------------
    From: Ian Abbott

    This patch works around a problem in the fakephp driver when a process
    writing "0" to a "power" sysfs file to fake removal of a PCI device ends
    up deadlocking itself in the sysfs code.

    The patch is functionally identical to the one in Linus' tree post 2.6.24:
    http://git.kernel.org/?p=linux/kerne...d7c16d733635ff

    I have tested it on a 2.6.23 kernel.

    Signed-off-by: Ian Abbott
    Signed-off-by: Greg Kroah-Hartman

    ---
    drivers/pci/hotplug/fakephp.c | 39 +++++++++++++++++++++++++++++++++++----
    1 file changed, 35 insertions(+), 4 deletions(-)

    --- a/drivers/pci/hotplug/fakephp.c
    +++ b/drivers/pci/hotplug/fakephp.c
    @@ -39,6 +39,7 @@
    #include
    #include
    #include
    +#include
    #include "../pci.h"

    #if !defined(MODULE)
    @@ -63,10 +64,16 @@ struct dummy_slot {
    struct list_head node;
    struct hotplug_slot *slot;
    struct pci_dev *dev;
    + struct work_struct remove_work;
    + unsigned long removed;
    };

    static int debug;
    static LIST_HEAD(slot_list);
    +static struct workqueue_struct *dummyphp_wq;
    +
    +static void pci_rescan_worker(struct work_struct *work);
    +static DECLARE_WORK(pci_rescan_work, pci_rescan_worker);

    static int enable_slot (struct hotplug_slot *slot);
    static int disable_slot (struct hotplug_slot *slot);
    @@ -109,7 +116,7 @@ static int add_slot(struct pci_dev *dev)
    slot->name = &dev->dev.bus_id[0];
    dbg("slot->name = %s\n", slot->name);

    - dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
    + dslot = kzalloc(sizeof(struct dummy_slot), GFP_KERNEL);
    if (!dslot)
    goto error_info;

    @@ -164,6 +171,14 @@ static void remove_slot(struct dummy_slo
    err("Problem unregistering a slot %s\n", dslot->slot->name);
    }

    +/* called from the single-threaded workqueue handler to remove a slot */
    +static void remove_slot_worker(struct work_struct *work)
    +{
    + struct dummy_slot *dslot =
    + container_of(work, struct dummy_slot, remove_work);
    + remove_slot(dslot);
    +}
    +
    /**
    * Rescan slot.
    * Tries hard not to re-enable already existing devices
    @@ -267,11 +282,17 @@ static inline void pci_rescan(void) {
    pci_rescan_buses(&pci_root_buses);
    }

    +/* called from the single-threaded workqueue handler to rescan all pci buses */
    +static void pci_rescan_worker(struct work_struct *work)
    +{
    + pci_rescan();
    +}

    static int enable_slot(struct hotplug_slot *hotplug_slot)
    {
    /* mis-use enable_slot for rescanning of the pci bus */
    - pci_rescan();
    + cancel_work_sync(&pci_rescan_work);
    + queue_work(dummyphp_wq, &pci_rescan_work);
    return -ENODEV;
    }

    @@ -306,6 +327,10 @@ static int disable_slot(struct hotplug_s
    err("Can't remove PCI devices with other PCI devices behind it yet.\n");
    return -ENODEV;
    }
    + if (test_and_set_bit(0, &dslot->removed)) {
    + dbg("Slot already scheduled for removal\n");
    + return -ENODEV;
    + }
    /* search for subfunctions and disable them first */
    if (!(dslot->dev->devfn & 7)) {
    for (func = 1; func < 8; func++) {
    @@ -328,8 +353,9 @@ static int disable_slot(struct hotplug_s
    /* remove the device from the pci core */
    pci_remove_bus_device(dslot->dev);

    - /* blow away this sysfs entry and other parts. */
    - remove_slot(dslot);
    + /* queue work item to blow away this sysfs entry and other parts. */
    + INIT_WORK(&dslot->remove_work, remove_slot_worker);
    + queue_work(dummyphp_wq, &dslot->remove_work);

    return 0;
    }
    @@ -340,6 +366,7 @@ static void cleanup_slots (void)
    struct list_head *next;
    struct dummy_slot *dslot;

    + destroy_workqueue(dummyphp_wq);
    list_for_each_safe (tmp, next, &slot_list) {
    dslot = list_entry (tmp, struct dummy_slot, node);
    remove_slot(dslot);
    @@ -351,6 +378,10 @@ static int __init dummyphp_init(void)
    {
    info(DRIVER_DESC "\n");

    + dummyphp_wq = create_singlethread_workqueue(MY_NAME);
    + if (!dummyphp_wq)
    + return -ENOMEM;
    +
    return pci_scan_buses();
    }


    --
    --
    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/

  6. Re: [stable] [patch 00/73] 2.6.23-stable review

    On Wed, Feb 06, 2008 at 03:50:15PM -0800, Greg KH wrote:
    > This is the start of the stable review cycle for the 2.6.23.15 release.
    > There are 73 patches in this series, all will be posted as a response to
    > this one. If anyone has any issues with these being applied, please let
    > us know. If anyone is a maintainer of the proper subsystem, and wants
    > to add a Signed-off-by: line to the patch, please respond with it.


    Rolled up patch can be found at:
    kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.23.15-rc1.gz

    thanks,

    greg k-h
    --
    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/

+ Reply to Thread
Page 4 of 4 FirstFirst ... 2 3 4