From: Greg Kroah-Hartman Date: Sat, 5 Dec 2009 20:34:23 +0000 (-0800) Subject: more .31 patches X-Git-Tag: v2.6.31.7~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a1cd6b1edf9d59790adab5eb6281181f40062a82;p=thirdparty%2Fkernel%2Fstable-queue.git more .31 patches --- diff --git a/queue-2.6.31/acerhdf-additional-bios-versions.patch b/queue-2.6.31/acerhdf-additional-bios-versions.patch new file mode 100644 index 00000000000..4f829652a44 --- /dev/null +++ b/queue-2.6.31/acerhdf-additional-bios-versions.patch @@ -0,0 +1,51 @@ +From f944915187f53810130eb1c56985e27e3cbe4a6d Mon Sep 17 00:00:00 2001 +From: Peter Feuerer +Date: Fri, 18 Sep 2009 12:41:07 -0700 +Subject: acerhdf: additional BIOS versions + +From: Peter Feuerer + +commit f944915187f53810130eb1c56985e27e3cbe4a6d upstream. + +Added BIOS versions: +Acer: AOA110-v0.3307, AOA150-v0.3301, AOA150-v0.3307 +Packard Bell: AOA150-v0.3105 + +Signed-off-by: Peter Feuerer +Cc: Andreas Mohr +Cc: Borislav Petkov +Signed-off-by: Andrew Morton +Signed-off-by: Len Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/acerhdf.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/platform/x86/acerhdf.c ++++ b/drivers/platform/x86/acerhdf.c +@@ -139,13 +139,16 @@ static const struct bios_settings_t bios + {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, ++ {"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00} }, + {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, + {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, + {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, + /* AOA150 */ + {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} }, + {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} }, +@@ -154,6 +157,7 @@ static const struct bios_settings_t bios + {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} }, + {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} }, + {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, ++ {"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, + /* pewpew-terminator */ + {"", "", "", 0, 0, {0, 0} } + }; diff --git a/queue-2.6.31/acerhdf-fix-fan-control-for-aoa150-model.patch b/queue-2.6.31/acerhdf-fix-fan-control-for-aoa150-model.patch new file mode 100644 index 00000000000..fb4478bc233 --- /dev/null +++ b/queue-2.6.31/acerhdf-fix-fan-control-for-aoa150-model.patch @@ -0,0 +1,239 @@ +From ded0cdfc6a7673916b0878c32fa8ba566b4f8cdb Mon Sep 17 00:00:00 2001 +From: Peter Feuerer +Date: Thu, 6 Aug 2009 15:57:52 -0700 +Subject: acerhdf: fix fan control for AOA150 model + +From: Peter Feuerer + +commit ded0cdfc6a7673916b0878c32fa8ba566b4f8cdb upstream. + +- Apply Borislav Petkov's patch (convert the fancmd[] array to a real + struct thus disambiguating command handling and making code more + readable.) + +- Add BIOS product to BIOS table as AOA110 and AOA150 have different + register values + +- Add force_product parameter to allow forcing different product + +- fix linker warning caused by "acerhdf_drv" not being named + "acerhdf_driver" + +Signed-off-by: Peter Feuerer +Cc: Andreas Mohr +Acked-by: Borislav Petkov +Signed-off-by: Andrew Morton +Signed-off-by: Len Brown +Cc: Adrian von Bidder +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/acerhdf.c | 97 +++++++++++++++++++++++++++-------------- + 1 file changed, 66 insertions(+), 31 deletions(-) + +--- a/drivers/platform/x86/acerhdf.c ++++ b/drivers/platform/x86/acerhdf.c +@@ -52,7 +52,7 @@ + */ + #undef START_IN_KERNEL_MODE + +-#define DRV_VER "0.5.13" ++#define DRV_VER "0.5.16" + + /* + * According to the Atom N270 datasheet, +@@ -90,6 +90,7 @@ static unsigned int fanoff = 58; + static unsigned int verbose; + static unsigned int fanstate = ACERHDF_FAN_AUTO; + static char force_bios[16]; ++static char force_product[16]; + static unsigned int prev_interval; + struct thermal_zone_device *thz_dev; + struct thermal_cooling_device *cl_dev; +@@ -107,34 +108,58 @@ module_param(verbose, uint, 0600); + MODULE_PARM_DESC(verbose, "Enable verbose dmesg output"); + module_param_string(force_bios, force_bios, 16, 0); + MODULE_PARM_DESC(force_bios, "Force BIOS version and omit BIOS check"); ++module_param_string(force_product, force_product, 16, 0); ++MODULE_PARM_DESC(force_product, "Force BIOS product and omit BIOS check"); ++ ++/* ++ * cmd_off: to switch the fan completely off / to check if the fan is off ++ * cmd_auto: to set the BIOS in control of the fan. The BIOS regulates then ++ * the fan speed depending on the temperature ++ */ ++struct fancmd { ++ u8 cmd_off; ++ u8 cmd_auto; ++}; + + /* BIOS settings */ + struct bios_settings_t { + const char *vendor; ++ const char *product; + const char *version; + unsigned char fanreg; + unsigned char tempreg; +- unsigned char fancmd[2]; /* fan off and auto commands */ ++ struct fancmd cmd; + }; + + /* Register addresses and values for different BIOS versions */ + static const struct bios_settings_t bios_tbl[] = { +- {"Acer", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, +- {"Acer", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, +- {"Acer", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, +- {"Acer", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, +- {"Acer", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, +- {"Acer", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, +- {"Acer", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, +- {"Acer", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, +- {"Gateway", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, +- {"Packard Bell", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, +- {"", "", 0, 0, {0, 0} } ++ /* AOA110 */ ++ {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, ++ {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, ++ {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, ++ {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, ++ {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, ++ {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, ++ {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, ++ {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, ++ /* AOA150 */ ++ {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} }, ++ {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} }, ++ /* special BIOS / other */ ++ {"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, ++ {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} }, ++ {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} }, ++ {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, ++ /* pewpew-terminator */ ++ {"", "", "", 0, 0, {0, 0} } + }; + + static const struct bios_settings_t *bios_cfg __read_mostly; + +- + static int acerhdf_get_temp(int *temp) + { + u8 read_temp; +@@ -150,13 +175,14 @@ static int acerhdf_get_temp(int *temp) + static int acerhdf_get_fanstate(int *state) + { + u8 fan; +- bool tmp; + + if (ec_read(bios_cfg->fanreg, &fan)) + return -EINVAL; + +- tmp = (fan == bios_cfg->fancmd[ACERHDF_FAN_OFF]); +- *state = tmp ? ACERHDF_FAN_OFF : ACERHDF_FAN_AUTO; ++ if (fan != bios_cfg->cmd.cmd_off) ++ *state = ACERHDF_FAN_AUTO; ++ else ++ *state = ACERHDF_FAN_OFF; + + return 0; + } +@@ -175,7 +201,8 @@ static void acerhdf_change_fanstate(int + state = ACERHDF_FAN_AUTO; + } + +- cmd = bios_cfg->fancmd[state]; ++ cmd = (state == ACERHDF_FAN_OFF) ? bios_cfg->cmd.cmd_off ++ : bios_cfg->cmd.cmd_auto; + fanstate = state; + + ec_write(bios_cfg->fanreg, cmd); +@@ -437,7 +464,7 @@ static int acerhdf_remove(struct platfor + return 0; + } + +-struct platform_driver acerhdf_drv = { ++static struct platform_driver acerhdf_driver = { + .driver = { + .name = "acerhdf", + .owner = THIS_MODULE, +@@ -454,32 +481,40 @@ static int acerhdf_check_hardware(void) + { + char const *vendor, *version, *product; + int i; ++ unsigned long prod_len = 0; + + /* get BIOS data */ + vendor = dmi_get_system_info(DMI_SYS_VENDOR); + version = dmi_get_system_info(DMI_BIOS_VERSION); + product = dmi_get_system_info(DMI_PRODUCT_NAME); + ++ + pr_info("Acer Aspire One Fan driver, v.%s\n", DRV_VER); + +- if (!force_bios[0]) { +- if (strncmp(product, "AO", 2)) { +- pr_err("no Aspire One hardware found\n"); +- return -EINVAL; +- } +- } else { +- pr_info("forcing BIOS version: %s\n", version); ++ if (force_bios[0]) { + version = force_bios; ++ pr_info("forcing BIOS version: %s\n", version); + kernelmode = 0; + } + ++ if (force_product[0]) { ++ product = force_product; ++ pr_info("forcing BIOS product: %s\n", product); ++ kernelmode = 0; ++ } ++ ++ prod_len = strlen(product); ++ + if (verbose) + pr_info("BIOS info: %s %s, product: %s\n", + vendor, version, product); + + /* search BIOS version and vendor in BIOS settings table */ + for (i = 0; bios_tbl[i].version[0]; i++) { +- if (!strcmp(bios_tbl[i].vendor, vendor) && ++ if (strlen(bios_tbl[i].product) >= prod_len && ++ !strncmp(bios_tbl[i].product, product, ++ strlen(bios_tbl[i].product)) && ++ !strcmp(bios_tbl[i].vendor, vendor) && + !strcmp(bios_tbl[i].version, version)) { + bios_cfg = &bios_tbl[i]; + break; +@@ -487,8 +522,8 @@ static int acerhdf_check_hardware(void) + } + + if (!bios_cfg) { +- pr_err("unknown (unsupported) BIOS version %s/%s, " +- "please report, aborting!\n", vendor, version); ++ pr_err("unknown (unsupported) BIOS version %s/%s/%s, " ++ "please report, aborting!\n", vendor, product, version); + return -EINVAL; + } + +@@ -509,7 +544,7 @@ static int acerhdf_register_platform(voi + { + int err = 0; + +- err = platform_driver_register(&acerhdf_drv); ++ err = platform_driver_register(&acerhdf_driver); + if (err) + return err; + +@@ -525,7 +560,7 @@ static void acerhdf_unregister_platform( + return; + + platform_device_del(acerhdf_dev); +- platform_driver_unregister(&acerhdf_drv); ++ platform_driver_unregister(&acerhdf_driver); + } + + static int acerhdf_register_thermal(void) diff --git a/queue-2.6.31/acerhdf-return-temperature-in-milidegree-instead-of-degree.patch b/queue-2.6.31/acerhdf-return-temperature-in-milidegree-instead-of-degree.patch new file mode 100644 index 00000000000..96c2149c73e --- /dev/null +++ b/queue-2.6.31/acerhdf-return-temperature-in-milidegree-instead-of-degree.patch @@ -0,0 +1,63 @@ +From 7005291706341a11c094f39a756a01c9e649e5f9 Mon Sep 17 00:00:00 2001 +From: Peter Feuerer +Date: Tue, 17 Nov 2009 14:07:21 -0800 +Subject: acerhdf: return temperature in milidegree instead of degree + +From: Peter Feuerer + +commit 7005291706341a11c094f39a756a01c9e649e5f9 upstream. + +Return temperature in milidegree instead of degree, as sysfs-api requires +the temperature in milidegree. + +Signed-off-by: Peter Feuerer +Tested-by: Borislav Petkov +Cc: Andreas Mohr +Signed-off-by: Andrew Morton +Signed-off-by: Len Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/acerhdf.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +--- a/drivers/platform/x86/acerhdf.c ++++ b/drivers/platform/x86/acerhdf.c +@@ -61,7 +61,7 @@ + * measured by the on-die thermal monitor are within 0 <= Tj <= 90. So, + * assume 89°C is critical temperature. + */ +-#define ACERHDF_TEMP_CRIT 89 ++#define ACERHDF_TEMP_CRIT 89000 + #define ACERHDF_FAN_OFF 0 + #define ACERHDF_FAN_AUTO 1 + +@@ -69,7 +69,7 @@ + * No matter what value the user puts into the fanon variable, turn on the fan + * at 80 degree Celsius to prevent hardware damage + */ +-#define ACERHDF_MAX_FANON 80 ++#define ACERHDF_MAX_FANON 80000 + + /* + * Maximum interval between two temperature checks is 15 seconds, as the die +@@ -85,8 +85,8 @@ static int kernelmode; + #endif + + static unsigned int interval = 10; +-static unsigned int fanon = 63; +-static unsigned int fanoff = 58; ++static unsigned int fanon = 63000; ++static unsigned int fanoff = 58000; + static unsigned int verbose; + static unsigned int fanstate = ACERHDF_FAN_AUTO; + static char force_bios[16]; +@@ -171,7 +171,7 @@ static int acerhdf_get_temp(int *temp) + if (ec_read(bios_cfg->tempreg, &read_temp)) + return -EINVAL; + +- *temp = read_temp; ++ *temp = read_temp * 1000; + + return 0; + } diff --git a/queue-2.6.31/agp-intel-new-host-bridge-support.patch b/queue-2.6.31/agp-intel-new-host-bridge-support.patch new file mode 100644 index 00000000000..59843a4a94d --- /dev/null +++ b/queue-2.6.31/agp-intel-new-host-bridge-support.patch @@ -0,0 +1,66 @@ +From 9cf1e35cb025eaa52dde37df38e2750b6adb1620 Mon Sep 17 00:00:00 2001 +From: Zhenyu Wang +Date: Tue, 10 Nov 2009 03:10:22 +0000 +Subject: agp/intel: new host bridge support + +From: Zhenyu Wang + +commit 9cf1e35cb025eaa52dde37df38e2750b6adb1620 upstream. + +Add new CPU host bridge id, needed for support Ironlake graphics +device with it. No change for graphics device itself, so no need to +update drm/i915. + +Signed-off-by: Zhenyu Wang +Signed-off-by: Eric Anholt +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/agp/intel-agp.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +--- a/drivers/char/agp/intel-agp.c ++++ b/drivers/char/agp/intel-agp.c +@@ -52,6 +52,7 @@ + #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 + #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 + #define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062 ++#define PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB 0x006a + #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 + + /* cover 915 and 945 variants */ +@@ -86,7 +87,8 @@ + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \ + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \ +- agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB) ++ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB || \ ++ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB) + + extern int agp_memory_reserved; + +@@ -1239,6 +1241,7 @@ static void intel_i965_get_gtt_range(int + case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: + case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: + case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB: ++ case PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB: + *gtt_offset = *gtt_size = MB(2); + break; + default: +@@ -2222,6 +2225,8 @@ static const struct intel_driver_descrip + "IGDNG/M", NULL, &intel_i965_driver }, + { PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, + "IGDNG/MA", NULL, &intel_i965_driver }, ++ { PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, ++ "IGDNG/MC2", NULL, &intel_i965_driver }, + { 0, 0, 0, NULL, NULL, NULL } + }; + +@@ -2418,6 +2423,7 @@ static struct pci_device_id agp_intel_pc + ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), + ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), + ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB), ++ ID(PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB), + { } + }; + diff --git a/queue-2.6.31/ath5k-linear-pcdac-code-fixes.patch b/queue-2.6.31/ath5k-linear-pcdac-code-fixes.patch new file mode 100644 index 00000000000..1c5f14bde03 --- /dev/null +++ b/queue-2.6.31/ath5k-linear-pcdac-code-fixes.patch @@ -0,0 +1,69 @@ +From d1cb0bdac180a4afdd3c001acb2618d2a62d9abe Mon Sep 17 00:00:00 2001 +From: Nick Kossifidis +Date: Mon, 10 Aug 2009 03:27:59 +0300 +Subject: ath5k: Linear PCDAC code fixes + +From: Nick Kossifidis + +commit d1cb0bdac180a4afdd3c001acb2618d2a62d9abe upstream. + +* Set correct xpd curve indices for high/low gain curves during + rfbuffer setup on RF5112B with both calibration curves available. + + * Don't return zero min power when we have the same pcdac value + twice because it breaks interpolation. Instead return the right + x barrier as we do when we have equal power levels for 2 different + pcdac values. + +Signed-off-by: Nick Kossifidis +Acked-by: Bob Copeland +Signed-off-by: John W. Linville +Cc: Dan Williams +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/ath/ath5k/phy.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +--- a/drivers/net/wireless/ath/ath5k/phy.c ++++ b/drivers/net/wireless/ath/ath5k/phy.c +@@ -740,13 +740,22 @@ int ath5k_hw_rfregs_init(struct ath5k_hw + AR5K_RF_XPD_GAIN, true); + + } else { +- /* TODO: Set high and low gain bits */ +- ath5k_hw_rfb_op(ah, rf_regs, +- ee->ee_x_gain[ee_mode], ++ u8 *pdg_curve_to_idx = ee->ee_pdc_to_idx[ee_mode]; ++ if (ee->ee_pd_gains[ee_mode] > 1) { ++ ath5k_hw_rfb_op(ah, rf_regs, ++ pdg_curve_to_idx[0], + AR5K_RF_PD_GAIN_LO, true); +- ath5k_hw_rfb_op(ah, rf_regs, +- ee->ee_x_gain[ee_mode], ++ ath5k_hw_rfb_op(ah, rf_regs, ++ pdg_curve_to_idx[1], + AR5K_RF_PD_GAIN_HI, true); ++ } else { ++ ath5k_hw_rfb_op(ah, rf_regs, ++ pdg_curve_to_idx[0], ++ AR5K_RF_PD_GAIN_LO, true); ++ ath5k_hw_rfb_op(ah, rf_regs, ++ pdg_curve_to_idx[0], ++ AR5K_RF_PD_GAIN_HI, true); ++ } + + /* Lower synth voltage on Rev 2 */ + ath5k_hw_rfb_op(ah, rf_regs, 2, +@@ -1897,8 +1906,9 @@ ath5k_get_linear_pcdac_min(const u8 *ste + s16 min_pwrL, min_pwrR; + s16 pwr_i; + +- if (WARN_ON(stepL[0] == stepL[1] || stepR[0] == stepR[1])) +- return 0; ++ /* Some vendors write the same pcdac value twice !!! */ ++ if (stepL[0] == stepL[1] || stepR[0] == stepR[1]) ++ return max(pwrL[0], pwrR[0]); + + if (pwrL[0] == pwrL[1]) + min_pwrL = pwrL[0]; diff --git a/queue-2.6.31/b43-fix-dma-tx-bounce-buffer-copying.patch b/queue-2.6.31/b43-fix-dma-tx-bounce-buffer-copying.patch new file mode 100644 index 00000000000..102f18746b0 --- /dev/null +++ b/queue-2.6.31/b43-fix-dma-tx-bounce-buffer-copying.patch @@ -0,0 +1,72 @@ +From 9a3f45116f5e08819136cd512fd7f6450ac22aa8 Mon Sep 17 00:00:00 2001 +From: Michael Buesch +Date: Wed, 28 Oct 2009 22:08:13 +0100 +Subject: b43: Fix DMA TX bounce buffer copying + +From: Michael Buesch + +commit 9a3f45116f5e08819136cd512fd7f6450ac22aa8 upstream. + +b43 allocates a bouncebuffer, if the supplied TX skb is in an invalid +memory range for DMA. +However, this is broken in that it fails to copy over some metadata to the +new skb. + +This patch fixes three problems: +* Failure to adjust the ieee80211_tx_info pointer to the new buffer. + This results in a kmemcheck warning. +* Failure to copy the skb cb, which contains ieee80211_tx_info, to the new skb. + This results in breakage of various TX-status postprocessing (Rate control). +* Failure to transfer the queue mapping. + This results in the wrong queue being stopped on saturation and can result in queue overflow. + +Signed-off-by: Michael Buesch +Tested-by: Christian Casteyde +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/b43/dma.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/b43/dma.c ++++ b/drivers/net/wireless/b43/dma.c +@@ -1158,8 +1158,9 @@ struct b43_dmaring *parse_cookie(struct + } + + static int dma_tx_fragment(struct b43_dmaring *ring, +- struct sk_buff *skb) ++ struct sk_buff **in_skb) + { ++ struct sk_buff *skb = *in_skb; + const struct b43_dma_ops *ops = ring->ops; + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + u8 *header; +@@ -1225,8 +1226,14 @@ static int dma_tx_fragment(struct b43_dm + } + + memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); ++ memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb)); ++ bounce_skb->dev = skb->dev; ++ skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb)); ++ info = IEEE80211_SKB_CB(bounce_skb); ++ + dev_kfree_skb_any(skb); + skb = bounce_skb; ++ *in_skb = bounce_skb; + meta->skb = skb; + meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); + if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { +@@ -1359,7 +1366,11 @@ int b43_dma_tx(struct b43_wldev *dev, st + * static, so we don't need to store it per frame. */ + ring->queue_prio = skb_get_queue_mapping(skb); + +- err = dma_tx_fragment(ring, skb); ++ /* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing ++ * into the skb data or cb now. */ ++ hdr = NULL; ++ info = NULL; ++ err = dma_tx_fragment(ring, &skb); + if (unlikely(err == -ENOKEY)) { + /* Drop this packet, as we don't have the encryption key + * anymore and must not transmit it unencrypted. */ diff --git a/queue-2.6.31/block-use-after-free-bug-in-__blkdev_get.patch b/queue-2.6.31/block-use-after-free-bug-in-__blkdev_get.patch new file mode 100644 index 00000000000..2b8e5e636c0 --- /dev/null +++ b/queue-2.6.31/block-use-after-free-bug-in-__blkdev_get.patch @@ -0,0 +1,40 @@ +From 960cc0f4fef607baabc2232fbd7cce5368a9dcfd Mon Sep 17 00:00:00 2001 +From: Neil Brown +Date: Mon, 26 Oct 2009 08:59:17 +0100 +Subject: block: use after free bug in __blkdev_get + +From: Neil Brown + +commit 960cc0f4fef607baabc2232fbd7cce5368a9dcfd upstream. + +commit 0762b8bde9729f10f8e6249809660ff2ec3ad735 +(from 14 months ago) introduced a use-after-free bug which has just +recently started manifesting in my md testing. +I tried git bisect to find out what caused the bug to start +manifesting, and it could have been the recent change to +blk_unregister_queue (48c0d4d4c04) but the results were inconclusive. + +This patch certainly fixes my symptoms and looks correct as the two +calls are now in the same order as elsewhere in that function. + +Signed-off-by: NeilBrown +Acked-by: Tejun Heo +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + fs/block_dev.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -1243,8 +1243,8 @@ static int __blkdev_get(struct block_dev + bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9); + } + } else { +- put_disk(disk); + module_put(disk->fops->owner); ++ put_disk(disk); + disk = NULL; + if (bdev->bd_contains == bdev) { + if (bdev->bd_disk->fops->open) { diff --git a/queue-2.6.31/crypto-padlock-aes-use-the-correct-mask-when-checking-whether-copying-is-required.patch b/queue-2.6.31/crypto-padlock-aes-use-the-correct-mask-when-checking-whether-copying-is-required.patch new file mode 100644 index 00000000000..4a2b73ec1dc --- /dev/null +++ b/queue-2.6.31/crypto-padlock-aes-use-the-correct-mask-when-checking-whether-copying-is-required.patch @@ -0,0 +1,39 @@ +From e8edb3cbd7dd8acf6c748a02d06ec1d82c4124ea Mon Sep 17 00:00:00 2001 +From: Chuck Ebbert +Date: Tue, 3 Nov 2009 10:32:03 -0500 +Subject: crypto: padlock-aes - Use the correct mask when checking whether copying is required + +From: Chuck Ebbert + +commit e8edb3cbd7dd8acf6c748a02d06ec1d82c4124ea upstream. + +Masking with PAGE_SIZE is just wrong... + +Signed-off-by: Chuck Ebbert +Signed-off-by: Herbert Xu +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/crypto/padlock-aes.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/crypto/padlock-aes.c ++++ b/drivers/crypto/padlock-aes.c +@@ -236,7 +236,7 @@ static inline void ecb_crypt(const u8 *i + /* Padlock in ECB mode fetches at least ecb_fetch_bytes of data. + * We could avoid some copying here but it's probably not worth it. + */ +- if (unlikely(((unsigned long)in & PAGE_SIZE) + ecb_fetch_bytes > PAGE_SIZE)) { ++ if (unlikely(((unsigned long)in & ~PAGE_MASK) + ecb_fetch_bytes > PAGE_SIZE)) { + ecb_crypt_copy(in, out, key, cword, count); + return; + } +@@ -248,7 +248,7 @@ static inline u8 *cbc_crypt(const u8 *in + u8 *iv, struct cword *cword, int count) + { + /* Padlock in CBC mode fetches at least cbc_fetch_bytes of data. */ +- if (unlikely(((unsigned long)in & PAGE_SIZE) + cbc_fetch_bytes > PAGE_SIZE)) ++ if (unlikely(((unsigned long)in & ~PAGE_MASK) + cbc_fetch_bytes > PAGE_SIZE)) + return cbc_crypt_copy(in, out, key, iv, cword, count); + + return rep_xcrypt_cbc(in, out, key, iv, cword, count); diff --git a/queue-2.6.31/drm-fb-fix-fbioget-put_vscreeninfo-pixel-clock-handling.patch b/queue-2.6.31/drm-fb-fix-fbioget-put_vscreeninfo-pixel-clock-handling.patch new file mode 100644 index 00000000000..a3044216c4d --- /dev/null +++ b/queue-2.6.31/drm-fb-fix-fbioget-put_vscreeninfo-pixel-clock-handling.patch @@ -0,0 +1,99 @@ +From clemens@ladisch.de Sat Dec 5 12:11:25 2009 +From: Clemens Ladisch +Date: Wed, 02 Dec 2009 08:16:55 +0100 +Subject: drm/fb: fix FBIOGET/PUT_VSCREENINFO pixel clock handling +To: Greg KH +Cc: Dave Airlie , stable@kernel.org, Paulius Zaleckas +Message-ID: <4B161467.9050909@ladisch.de> + +From: Clemens Ladisch + +commit 5349ef3127c77075ff70b2014f17ae0fbcaaf199 upstream + +When the framebuffer driver does not publish detailed timing information +for the current video mode, the correct value for the pixclock field is +zero, not -1. + +Since pixclock is actually unsigned, the value -1 would be interpreted +as 4294967295 picoseconds (i.e., about 4 milliseconds) by +register_framebuffer() and userspace programs. + +This patch allows X.org's fbdev driver to work. + +Signed-off-by: Clemens Ladisch +Tested-by: Paulius Zaleckas +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_fb.c | 8 ++++---- + drivers/gpu/drm/radeon/radeon_fb.c | 6 +++--- + 2 files changed, 7 insertions(+), 7 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_fb.c ++++ b/drivers/gpu/drm/i915/intel_fb.c +@@ -114,7 +114,7 @@ static int intelfb_check_var(struct fb_v + struct drm_framebuffer *fb = &intel_fb->base; + int depth; + +- if (var->pixclock == -1 || !var->pixclock) ++ if (var->pixclock != 0) + return -EINVAL; + + /* Need to resize the fb object !!! */ +@@ -205,7 +205,7 @@ static int intelfb_set_par(struct fb_inf + + DRM_DEBUG("%d %d\n", var->xres, var->pixclock); + +- if (var->pixclock != -1) { ++ if (var->pixclock != 0) { + + DRM_ERROR("PIXEL CLOCK SET\n"); + return -EINVAL; +@@ -692,7 +692,7 @@ static int intelfb_multi_fb_probe_crtc(s + par->crtc_count = 1; + + if (new_fb) { +- info->var.pixclock = -1; ++ info->var.pixclock = 0; + if (register_framebuffer(info) < 0) + return -EINVAL; + } else +@@ -846,7 +846,7 @@ static int intelfb_single_fb_probe(struc + par->crtc_count = crtc_count; + + if (new_fb) { +- info->var.pixclock = -1; ++ info->var.pixclock = 0; + if (register_framebuffer(info) < 0) + return -EINVAL; + } else +--- a/drivers/gpu/drm/radeon/radeon_fb.c ++++ b/drivers/gpu/drm/radeon/radeon_fb.c +@@ -120,7 +120,7 @@ static int radeonfb_check_var(struct fb_ + struct drm_framebuffer *fb = &rfb->base; + int depth; + +- if (var->pixclock == -1 || !var->pixclock) { ++ if (var->pixclock != 0) { + return -EINVAL; + } + /* Need to resize the fb object !!! */ +@@ -234,7 +234,7 @@ static int radeonfb_set_par(struct fb_in + int ret; + int i; + +- if (var->pixclock != -1) { ++ if (var->pixclock != 0) { + DRM_ERROR("PIXEL CLCOK SET\n"); + return -EINVAL; + } +@@ -828,7 +828,7 @@ static int radeonfb_single_fb_probe(stru + rfbdev->crtc_count = crtc_count; + + if (new_fb) { +- info->var.pixclock = -1; ++ info->var.pixclock = 0; + if (register_framebuffer(info) < 0) + return -EINVAL; + } else { diff --git a/queue-2.6.31/hso-fix-soft-lockup.patch b/queue-2.6.31/hso-fix-soft-lockup.patch new file mode 100644 index 00000000000..cc41193fb66 --- /dev/null +++ b/queue-2.6.31/hso-fix-soft-lockup.patch @@ -0,0 +1,46 @@ +From dcfcb256cc23c4436691b0fe677275306699d6a1 Mon Sep 17 00:00:00 2001 +From: Antti Kaijanmäki +Date: Mon, 23 Nov 2009 10:54:47 -0800 +Subject: hso: fix soft-lockup +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Antti Kaijanmäki + +commit dcfcb256cc23c4436691b0fe677275306699d6a1 upstream. + +Fix soft-lockup in hso.c which is triggered on SMP machine when +modem is removed while file descriptor(s) under /dev are still open: + + old version called kref_put() too early which resulted in destroying + hso_serial and hso_device objects which were still used later on. + +Signed-off-by: Antti Kaijanmäki +Signed-off-by: Andrew Morton +Signed-off-by: David S. Miller + +--- + drivers/net/usb/hso.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/net/usb/hso.c ++++ b/drivers/net/usb/hso.c +@@ -1362,7 +1362,7 @@ static void hso_serial_close(struct tty_ + /* reset the rts and dtr */ + /* do the actual close */ + serial->open_count--; +- kref_put(&serial->parent->ref, hso_serial_ref_free); ++ + if (serial->open_count <= 0) { + serial->open_count = 0; + spin_lock_irq(&serial->serial_lock); +@@ -1382,6 +1382,8 @@ static void hso_serial_close(struct tty_ + usb_autopm_put_interface(serial->parent->interface); + + mutex_unlock(&serial->parent->mutex); ++ ++ kref_put(&serial->parent->ref, hso_serial_ref_free); + } + + /* close the requested serial port */ diff --git a/queue-2.6.31/hwmon-adt7475-cache-limits-for-60-seconds.patch b/queue-2.6.31/hwmon-adt7475-cache-limits-for-60-seconds.patch new file mode 100644 index 00000000000..855bb62ac24 --- /dev/null +++ b/queue-2.6.31/hwmon-adt7475-cache-limits-for-60-seconds.patch @@ -0,0 +1,33 @@ +From 56e35eeebed2dcb4e1a17ad119e039cf095854ac Mon Sep 17 00:00:00 2001 +From: Jean Delvare +Date: Mon, 16 Nov 2009 12:45:40 +0100 +Subject: hwmon: (adt7475) Cache limits for 60 seconds + +From: Jean Delvare + +commit 56e35eeebed2dcb4e1a17ad119e039cf095854ac upstream. + +The comment says that limits are cached for 60 seconds but the code +actually caches them for only 2 seconds. Align the code on the +comment, as 60 seconds makes more sense. + +Signed-off-by: Jean Delvare +Acked-by: Hans de Goede +Cc: Jordan Crouse +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hwmon/adt7475.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -1151,7 +1151,7 @@ static struct adt7475_data *adt7475_upda + } + + /* Limits and settings, should never change update every 60 seconds */ +- if (time_after(jiffies, data->limits_updated + HZ * 2) || ++ if (time_after(jiffies, data->limits_updated + HZ * 60) || + !data->valid) { + data->config5 = adt7475_read(REG_CONFIG5); + diff --git a/queue-2.6.31/hwmon-adt7475-fix-temperature-fault-flags.patch b/queue-2.6.31/hwmon-adt7475-fix-temperature-fault-flags.patch new file mode 100644 index 00000000000..2b07d516a30 --- /dev/null +++ b/queue-2.6.31/hwmon-adt7475-fix-temperature-fault-flags.patch @@ -0,0 +1,37 @@ +From cf312e077662ec3a07529551ab6e885828ccfb1d Mon Sep 17 00:00:00 2001 +From: Jean Delvare +Date: Mon, 16 Nov 2009 12:45:39 +0100 +Subject: hwmon: (adt7475) Fix temperature fault flags + +From: Jean Delvare + +commit cf312e077662ec3a07529551ab6e885828ccfb1d upstream. + +The logic of temperature fault flags is wrong, it shows faults when +there are none and vice versa. Fix it. + +I can't believe this has been broken since the driver was added, 8 +months ago, basically breaking temp1 and temp3, and nobody ever +complained. + +Signed-off-by: Jean Delvare +Acked-by: Hans de Goede +Cc: Jordan Crouse +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hwmon/adt7475.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -350,8 +350,7 @@ static ssize_t show_temp(struct device * + + case FAULT: + /* Note - only for remote1 and remote2 */ +- out = data->alarms & (sattr->index ? 0x8000 : 0x4000); +- out = out ? 0 : 1; ++ out = !!(data->alarms & (sattr->index ? 0x8000 : 0x4000)); + break; + + default: diff --git a/queue-2.6.31/i2c-fix-userspace_device-list-corruption.patch b/queue-2.6.31/i2c-fix-userspace_device-list-corruption.patch new file mode 100644 index 00000000000..44e0a079a1e --- /dev/null +++ b/queue-2.6.31/i2c-fix-userspace_device-list-corruption.patch @@ -0,0 +1,78 @@ +From bbd2d9c9198c6efd449e9d395b3eaf2d03aa3bba Mon Sep 17 00:00:00 2001 +From: Jean Delvare +Date: Thu, 26 Nov 2009 09:22:33 +0100 +Subject: i2c: Fix userspace_device list corruption + +From: Jean Delvare + +commit bbd2d9c9198c6efd449e9d395b3eaf2d03aa3bba upstream. + +Fix userspace_device list corruption. The corruption was caused by +clients not being removed when adapters with such clients were +themselves removed. Something like the following would trigger it +(assuming i2c-stub gets adapter number 3): + +# modprobe i2c-stub chip_addr=0x50 +# echo 24c08 0x50 > /sys/bus/i2c/devices/i2c-3/new_device +# rmmod i2c-stub +# modprobe i2c-stub chip_addr=0x50 +# echo 24c08 0x50 > /sys/bus/i2c/devices/i2c-3/new_device + +For the records, the stack trace in the kernel logs look like this: + +kernel: WARNING: at lib/list_debug.c:30 __list_add+0x8b/0x90() +kernel: Hardware name: (...) +kernel: list_add corruption. prev->next should be next (c137fc84), but was (null). (prev=f57111b8). +kernel: Modules linked in: (...) +kernel: Pid: 4669, comm: bash Not tainted 2.6.32-rc8 #259 +kernel: Call Trace: +kernel: [] ? __list_add+0x8b/0x90 +kernel: [] ? __list_add+0x8b/0x90 +kernel: [] warn_slowpath_common+0x6c/0xc0 +kernel: [] ? __list_add+0x8b/0x90 +kernel: [] warn_slowpath_fmt+0x26/0x30 +kernel: [] __list_add+0x8b/0x90 +kernel: [] i2c_sysfs_new_device+0x1c5/0x250 +kernel: [] ? might_fault+0x2e/0x80 +kernel: [] ? i2c_sysfs_new_device+0x0/0x250 +kernel: [] dev_attr_store+0x25/0x30 +kernel: [] sysfs_write_file+0x9c/0xf0 +kernel: [] vfs_write+0x9c/0x160 +kernel: [] ? sysfs_write_file+0x0/0xf0 +kernel: [] sys_write+0x3d/0x70 +kernel: [] sysenter_do_call+0x12/0x36 + +Signed-off-by: Jean Delvare +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/i2c/i2c-core.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/drivers/i2c/i2c-core.c ++++ b/drivers/i2c/i2c-core.c +@@ -718,6 +718,7 @@ int i2c_del_adapter(struct i2c_adapter * + { + int res = 0; + struct i2c_adapter *found; ++ struct i2c_client *client, *next; + + /* First make sure that this adapter was ever added */ + mutex_lock(&core_lock); +@@ -737,6 +738,16 @@ int i2c_del_adapter(struct i2c_adapter * + if (res) + return res; + ++ /* Remove devices instantiated from sysfs */ ++ list_for_each_entry_safe(client, next, &userspace_devices, detected) { ++ if (client->adapter == adap) { ++ dev_dbg(&adap->dev, "Removing %s at 0x%x\n", ++ client->name, client->addr); ++ list_del(&client->detected); ++ i2c_unregister_device(client); ++ } ++ } ++ + /* Detach any active clients. This can't fail, thus we do not + checking the returned value. */ + res = device_for_each_child(&adap->dev, NULL, __unregister_client); diff --git a/queue-2.6.31/input-keyboard-fix-braille-keyboard-keysym-generation.patch b/queue-2.6.31/input-keyboard-fix-braille-keyboard-keysym-generation.patch new file mode 100644 index 00000000000..eab17f56c4e --- /dev/null +++ b/queue-2.6.31/input-keyboard-fix-braille-keyboard-keysym-generation.patch @@ -0,0 +1,33 @@ +From 46a965462a1c568a7cd7dc338de4a0afa5ce61c5 Mon Sep 17 00:00:00 2001 +From: Samuel Thibault +Date: Wed, 25 Nov 2009 22:28:20 -0800 +Subject: Input: keyboard - fix braille keyboard keysym generation + +From: Samuel Thibault + +commit 46a965462a1c568a7cd7dc338de4a0afa5ce61c5 upstream. + +Keysyms stored in key_map[] are not simply K() values, but U(K()) values, +as can be seen in the KDSKBENT ioctl handler. The kernel-generated +braille keysyms thus need a U() call too. + +Signed-off-by: Samuel Thibault +Signed-off-by: Andrew Morton +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/char/keyboard.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/char/keyboard.c ++++ b/drivers/char/keyboard.c +@@ -1249,7 +1249,7 @@ static void kbd_keycode(unsigned int key + + if (keycode >= NR_KEYS) + if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8) +- keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1); ++ keysym = U(K(KT_BRL, keycode - KEY_BRL_DOT1 + 1)); + else + return; + else diff --git a/queue-2.6.31/isdn-hfc_usb-fix-read-buffer-overflow.patch b/queue-2.6.31/isdn-hfc_usb-fix-read-buffer-overflow.patch new file mode 100644 index 00000000000..9bc94b9c925 --- /dev/null +++ b/queue-2.6.31/isdn-hfc_usb-fix-read-buffer-overflow.patch @@ -0,0 +1,34 @@ +From 286e633ef0ff5bb63c07b4516665da8004966fec Mon Sep 17 00:00:00 2001 +From: Roel Kluin +Date: Wed, 4 Nov 2009 08:31:59 -0800 +Subject: isdn: hfc_usb: Fix read buffer overflow + +From: Roel Kluin + +commit 286e633ef0ff5bb63c07b4516665da8004966fec upstream. + +Check whether index is within bounds before testing the element. + +Signed-off-by: Roel Kluin +Cc: Karsten Keil +Signed-off-by: Andrew Morton +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/isdn/hisax/hfc_usb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/isdn/hisax/hfc_usb.c ++++ b/drivers/isdn/hisax/hfc_usb.c +@@ -817,8 +817,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * + } + /* we have a complete hdlc packet */ + if (finish) { +- if ((!fifo->skbuff->data[fifo->skbuff->len - 1]) +- && (fifo->skbuff->len > 3)) { ++ if (fifo->skbuff->len > 3 && ++ !fifo->skbuff->data[fifo->skbuff->len - 1]) { + + if (fifon == HFCUSB_D_RX) { + DBG(HFCUSB_DBG_DCHANNEL, diff --git a/queue-2.6.31/netfilter-nf_nat-fix-nat-issue-in-2.6.30.4.patch b/queue-2.6.31/netfilter-nf_nat-fix-nat-issue-in-2.6.30.4.patch new file mode 100644 index 00000000000..0e92949ed2a --- /dev/null +++ b/queue-2.6.31/netfilter-nf_nat-fix-nat-issue-in-2.6.30.4.patch @@ -0,0 +1,277 @@ +From f9dd09c7f7199685601d75882447a6598be8a3e0 Mon Sep 17 00:00:00 2001 +From: Jozsef Kadlecsik +Date: Fri, 6 Nov 2009 00:43:42 -0800 +Subject: netfilter: nf_nat: fix NAT issue in 2.6.30.4+ + +From: Jozsef Kadlecsik + +commit f9dd09c7f7199685601d75882447a6598be8a3e0 upstream. + +Vitezslav Samel discovered that since 2.6.30.4+ active FTP can not work +over NAT. The "cause" of the problem was a fix of unacknowledged data +detection with NAT (commit a3a9f79e361e864f0e9d75ebe2a0cb43d17c4272). +However, actually, that fix uncovered a long standing bug in TCP conntrack: +when NAT was enabled, we simply updated the max of the right edge of +the segments we have seen (td_end), by the offset NAT produced with +changing IP/port in the data. However, we did not update the other parameter +(td_maxend) which is affected by the NAT offset. Thus that could drift +away from the correct value and thus resulted breaking active FTP. + +The patch below fixes the issue by *not* updating the conntrack parameters +from NAT, but instead taking into account the NAT offsets in conntrack in a +consistent way. (Updating from NAT would be more harder and expensive because +it'd need to re-calculate parameters we already calculated in conntrack.) + +Signed-off-by: Jozsef Kadlecsik +Signed-off-by: Patrick McHardy +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + include/net/netfilter/nf_conntrack.h | 8 +--- + include/net/netfilter/nf_nat_helper.h | 4 ++ + net/ipv4/netfilter/nf_nat_core.c | 3 + + net/ipv4/netfilter/nf_nat_helper.c | 34 +++++++++++------ + net/netfilter/nf_conntrack_core.c | 8 ++++ + net/netfilter/nf_conntrack_proto_tcp.c | 64 +++++++++++++-------------------- + 6 files changed, 67 insertions(+), 54 deletions(-) + +--- a/include/net/netfilter/nf_conntrack.h ++++ b/include/net/netfilter/nf_conntrack.h +@@ -255,11 +255,9 @@ static inline bool nf_ct_kill(struct nf_ + } + + /* These are for NAT. Icky. */ +-/* Update TCP window tracking data when NAT mangles the packet */ +-extern void nf_conntrack_tcp_update(const struct sk_buff *skb, +- unsigned int dataoff, +- struct nf_conn *ct, int dir, +- s16 offset); ++extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, ++ u32 seq); + + /* Fake conntrack entry for untracked connections */ + extern struct nf_conn nf_conntrack_untracked; +--- a/include/net/netfilter/nf_nat_helper.h ++++ b/include/net/netfilter/nf_nat_helper.h +@@ -32,4 +32,8 @@ extern int (*nf_nat_seq_adjust_hook)(str + * to port ct->master->saved_proto. */ + extern void nf_nat_follow_master(struct nf_conn *ct, + struct nf_conntrack_expect *this); ++ ++extern s16 nf_nat_get_offset(const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, ++ u32 seq); + #endif +--- a/net/ipv4/netfilter/nf_nat_core.c ++++ b/net/ipv4/netfilter/nf_nat_core.c +@@ -750,6 +750,8 @@ static int __init nf_nat_init(void) + BUG_ON(nfnetlink_parse_nat_setup_hook != NULL); + rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, + nfnetlink_parse_nat_setup); ++ BUG_ON(nf_ct_nat_offset != NULL); ++ rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset); + return 0; + + cleanup_extend: +@@ -764,6 +766,7 @@ static void __exit nf_nat_cleanup(void) + nf_ct_extend_unregister(&nat_extend); + rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL); + rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL); ++ rcu_assign_pointer(nf_ct_nat_offset, NULL); + synchronize_net(); + } + +--- a/net/ipv4/netfilter/nf_nat_helper.c ++++ b/net/ipv4/netfilter/nf_nat_helper.c +@@ -73,6 +73,28 @@ adjust_tcp_sequence(u32 seq, + DUMP_OFFSET(this_way); + } + ++/* Get the offset value, for conntrack */ ++s16 nf_nat_get_offset(const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, ++ u32 seq) ++{ ++ struct nf_conn_nat *nat = nfct_nat(ct); ++ struct nf_nat_seq *this_way; ++ s16 offset; ++ ++ if (!nat) ++ return 0; ++ ++ this_way = &nat->seq[dir]; ++ spin_lock_bh(&nf_nat_seqofs_lock); ++ offset = after(seq, this_way->correction_pos) ++ ? this_way->offset_after : this_way->offset_before; ++ spin_unlock_bh(&nf_nat_seqofs_lock); ++ ++ return offset; ++} ++EXPORT_SYMBOL_GPL(nf_nat_get_offset); ++ + /* Frobs data inside this packet, which is linear. */ + static void mangle_contents(struct sk_buff *skb, + unsigned int dataoff, +@@ -189,11 +211,6 @@ nf_nat_mangle_tcp_packet(struct sk_buff + adjust_tcp_sequence(ntohl(tcph->seq), + (int)rep_len - (int)match_len, + ct, ctinfo); +- /* Tell TCP window tracking about seq change */ +- nf_conntrack_tcp_update(skb, ip_hdrlen(skb), +- ct, CTINFO2DIR(ctinfo), +- (int)rep_len - (int)match_len); +- + nf_conntrack_event_cache(IPCT_NATSEQADJ, ct); + } + return 1; +@@ -415,12 +432,7 @@ nf_nat_seq_adjust(struct sk_buff *skb, + tcph->seq = newseq; + tcph->ack_seq = newack; + +- if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo)) +- return 0; +- +- nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff); +- +- return 1; ++ return nf_nat_sack_adjust(skb, tcph, ct, ctinfo); + } + + /* Setup NAT on this expected conntrack so it follows master. */ +--- a/net/netfilter/nf_conntrack_core.c ++++ b/net/netfilter/nf_conntrack_core.c +@@ -1350,6 +1350,11 @@ err_stat: + return ret; + } + ++s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, ++ u32 seq); ++EXPORT_SYMBOL_GPL(nf_ct_nat_offset); ++ + int nf_conntrack_init(struct net *net) + { + int ret; +@@ -1367,6 +1372,9 @@ int nf_conntrack_init(struct net *net) + /* For use by REJECT target */ + rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach); + rcu_assign_pointer(nf_ct_destroy, destroy_conntrack); ++ ++ /* Howto get NAT offsets */ ++ rcu_assign_pointer(nf_ct_nat_offset, NULL); + } + return 0; + +--- a/net/netfilter/nf_conntrack_proto_tcp.c ++++ b/net/netfilter/nf_conntrack_proto_tcp.c +@@ -492,6 +492,21 @@ static void tcp_sack(const struct sk_buf + } + } + ++#ifdef CONFIG_NF_NAT_NEEDED ++static inline s16 nat_offset(const struct nf_conn *ct, ++ enum ip_conntrack_dir dir, ++ u32 seq) ++{ ++ typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset); ++ ++ return get_offset != NULL ? get_offset(ct, dir, seq) : 0; ++} ++#define NAT_OFFSET(pf, ct, dir, seq) \ ++ (pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0) ++#else ++#define NAT_OFFSET(pf, ct, dir, seq) 0 ++#endif ++ + static bool tcp_in_window(const struct nf_conn *ct, + struct ip_ct_tcp *state, + enum ip_conntrack_dir dir, +@@ -506,6 +521,7 @@ static bool tcp_in_window(const struct n + struct ip_ct_tcp_state *receiver = &state->seen[!dir]; + const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple; + __u32 seq, ack, sack, end, win, swin; ++ s16 receiver_offset; + bool res; + + /* +@@ -519,11 +535,16 @@ static bool tcp_in_window(const struct n + if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM) + tcp_sack(skb, dataoff, tcph, &sack); + ++ /* Take into account NAT sequence number mangling */ ++ receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1); ++ ack -= receiver_offset; ++ sack -= receiver_offset; ++ + pr_debug("tcp_in_window: START\n"); + pr_debug("tcp_in_window: "); + nf_ct_dump_tuple(tuple); +- pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n", +- seq, ack, sack, win, end); ++ pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", ++ seq, ack, receiver_offset, sack, receiver_offset, win, end); + pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " + "receiver end=%u maxend=%u maxwin=%u scale=%i\n", + sender->td_end, sender->td_maxend, sender->td_maxwin, +@@ -613,8 +634,8 @@ static bool tcp_in_window(const struct n + + pr_debug("tcp_in_window: "); + nf_ct_dump_tuple(tuple); +- pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n", +- seq, ack, sack, win, end); ++ pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", ++ seq, ack, receiver_offset, sack, receiver_offset, win, end); + pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " + "receiver end=%u maxend=%u maxwin=%u scale=%i\n", + sender->td_end, sender->td_maxend, sender->td_maxwin, +@@ -700,7 +721,7 @@ static bool tcp_in_window(const struct n + before(seq, sender->td_maxend + 1) ? + after(end, sender->td_end - receiver->td_maxwin - 1) ? + before(sack, receiver->td_end + 1) ? +- after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG" ++ after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG" + : "ACK is under the lower bound (possible overly delayed ACK)" + : "ACK is over the upper bound (ACKed data not seen yet)" + : "SEQ is under the lower bound (already ACKed data retransmitted)" +@@ -715,39 +736,6 @@ static bool tcp_in_window(const struct n + return res; + } + +-#ifdef CONFIG_NF_NAT_NEEDED +-/* Update sender->td_end after NAT successfully mangled the packet */ +-/* Caller must linearize skb at tcp header. */ +-void nf_conntrack_tcp_update(const struct sk_buff *skb, +- unsigned int dataoff, +- struct nf_conn *ct, int dir, +- s16 offset) +-{ +- const struct tcphdr *tcph = (const void *)skb->data + dataoff; +- const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir]; +- const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir]; +- __u32 end; +- +- end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph); +- +- spin_lock_bh(&ct->lock); +- /* +- * We have to worry for the ack in the reply packet only... +- */ +- if (ct->proto.tcp.seen[dir].td_end + offset == end) +- ct->proto.tcp.seen[dir].td_end = end; +- ct->proto.tcp.last_end = end; +- spin_unlock_bh(&ct->lock); +- pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i " +- "receiver end=%u maxend=%u maxwin=%u scale=%i\n", +- sender->td_end, sender->td_maxend, sender->td_maxwin, +- sender->td_scale, +- receiver->td_end, receiver->td_maxend, receiver->td_maxwin, +- receiver->td_scale); +-} +-EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update); +-#endif +- + #define TH_FIN 0x01 + #define TH_SYN 0x02 + #define TH_RST 0x04 diff --git a/queue-2.6.31/netfilter-xt_connlimit-fix-regression-caused-by-zero-family-value.patch b/queue-2.6.31/netfilter-xt_connlimit-fix-regression-caused-by-zero-family-value.patch new file mode 100644 index 00000000000..600bca13632 --- /dev/null +++ b/queue-2.6.31/netfilter-xt_connlimit-fix-regression-caused-by-zero-family-value.patch @@ -0,0 +1,62 @@ +From 539054a8fa5141c9a4e9ac6a86d249e3f2bdef45 Mon Sep 17 00:00:00 2001 +From: Jan Engelhardt +Date: Fri, 6 Nov 2009 18:08:32 -0800 +Subject: netfilter: xt_connlimit: fix regression caused by zero family value + +From: Jan Engelhardt + +commit 539054a8fa5141c9a4e9ac6a86d249e3f2bdef45 upstream. + +Commit v2.6.28-rc1~717^2~109^2~2 was slightly incomplete; not all +instances of par->match->family were changed to par->family. + +References: http://bugzilla.netfilter.org/show_bug.cgi?id=610 +Signed-off-by: Jan Engelhardt +Signed-off-by: Patrick McHardy +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + net/netfilter/xt_connlimit.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +--- a/net/netfilter/xt_connlimit.c ++++ b/net/netfilter/xt_connlimit.c +@@ -103,7 +103,7 @@ static int count_them(struct xt_connlimi + const struct nf_conntrack_tuple *tuple, + const union nf_inet_addr *addr, + const union nf_inet_addr *mask, +- const struct xt_match *match) ++ u_int8_t family) + { + const struct nf_conntrack_tuple_hash *found; + struct xt_connlimit_conn *conn; +@@ -113,8 +113,7 @@ static int count_them(struct xt_connlimi + bool addit = true; + int matches = 0; + +- +- if (match->family == NFPROTO_IPV6) ++ if (family == NFPROTO_IPV6) + hash = &data->iphash[connlimit_iphash6(addr, mask)]; + else + hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)]; +@@ -157,8 +156,7 @@ static int count_them(struct xt_connlimi + continue; + } + +- if (same_source_net(addr, mask, &conn->tuple.src.u3, +- match->family)) ++ if (same_source_net(addr, mask, &conn->tuple.src.u3, family)) + /* same source network -> be counted! */ + ++matches; + nf_ct_put(found_ct); +@@ -207,7 +205,7 @@ connlimit_mt(const struct sk_buff *skb, + + spin_lock_bh(&info->data->lock); + connections = count_them(info->data, tuple_ptr, &addr, +- &info->mask, par->match); ++ &info->mask, par->family); + spin_unlock_bh(&info->data->lock); + + if (connections < 0) { diff --git a/queue-2.6.31/pci-prevent-aer-driver-from-being-loaded-on-non-root-port-pcie-devices.patch b/queue-2.6.31/pci-prevent-aer-driver-from-being-loaded-on-non-root-port-pcie-devices.patch new file mode 100644 index 00000000000..0506fbb8a82 --- /dev/null +++ b/queue-2.6.31/pci-prevent-aer-driver-from-being-loaded-on-non-root-port-pcie-devices.patch @@ -0,0 +1,44 @@ +From 30fc24b5cbc55f9e6c686e2710cc812419bddc0c Mon Sep 17 00:00:00 2001 +From: Kenji Kaneshige +Date: Wed, 7 Oct 2009 09:28:56 -0700 +Subject: PCI: Prevent AER driver from being loaded on non-root port PCIE devices + +From: Kenji Kaneshige + +commit 30fc24b5cbc55f9e6c686e2710cc812419bddc0c upstream. + +A bug was seen on boards using a PLX 8518 switch device which advertises +AER on each of it's transparent bridges. The AER driver was loaded for +each bridge and this driver tried to access the AER source ID register +whenever an interrupt occured on the shared PCI INTX lines. The source +ID register does not exist on non root port PCIE device's which +advertise AER and trying to access this register causes a unsupported +request error on the bridge. Thus, when the next interrupt occurs, +another error is found and the non existent source ID register is +accessed again, and so it goes on. + +The result is a spammed dmesg with unsupported request PCI express +errors on the bridge device that the AER driver is loaded against. + +Reported-by: Malcolm Crossley +Signed-off-by: Kenji Kaneshige +Tested-by: Malcolm Crossley +Signed-off-by: Jesse Barnes +Cc: Jean Delvare +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/pcie/aer/aerdrv.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/pci/pcie/aer/aerdrv.c ++++ b/drivers/pci/pcie/aer/aerdrv.c +@@ -52,7 +52,7 @@ static struct pci_error_handlers aer_err + + static struct pcie_port_service_driver aerdriver = { + .name = "aer", +- .port_type = PCIE_ANY_PORT, ++ .port_type = PCIE_RC_PORT, + .service = PCIE_PORT_SERVICE_AER, + + .probe = aer_probe, diff --git a/queue-2.6.31/perf_event-adjust-frequency-and-unthrottle-for-non-group-leader-events.patch b/queue-2.6.31/perf_event-adjust-frequency-and-unthrottle-for-non-group-leader-events.patch new file mode 100644 index 00000000000..c9731a18f7d --- /dev/null +++ b/queue-2.6.31/perf_event-adjust-frequency-and-unthrottle-for-non-group-leader-events.patch @@ -0,0 +1,49 @@ +From 03541f8b69c058162e4cf9675ec9181e6a204d55 Mon Sep 17 00:00:00 2001 +From: Paul Mackerras +Date: Wed, 14 Oct 2009 16:58:03 +1100 +Subject: perf_event: Adjust frequency and unthrottle for non-group-leader events + +From: Paul Mackerras + +commit 03541f8b69c058162e4cf9675ec9181e6a204d55 upstream. + +The loop in perf_ctx_adjust_freq checks the frequency of sampling +event counters, and adjusts the event interval and unthrottles the +event if required, and resets the interrupt count for the event. +However, at present it only looks at group leaders. + +This means that a sampling event that is not a group leader will +eventually get throttled, once its interrupt count reaches +sysctl_perf_event_sample_rate/HZ --- and that is guaranteed to +happen, if the event is active for long enough, since the interrupt +count never gets reset. Once it is throttled it never gets +unthrottled, so it basically just stops working at that point. + +This fixes it by making perf_ctx_adjust_freq use ctx->event_list +rather than ctx->group_list. The existing spin_lock/spin_unlock +around the loop makes it unnecessary to put rcu_read_lock/ +rcu_read_unlock around the list_for_each_entry_rcu(). + +Reported-by: Mark W. Krentel +Signed-off-by: Paul Mackerras +Cc: Corey Ashford +Cc: Peter Zijlstra +LKML-Reference: <19157.26731.855609.165622@cargo.ozlabs.ibm.com> +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/perf_counter.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/perf_counter.c ++++ b/kernel/perf_counter.c +@@ -1363,7 +1363,7 @@ static void perf_ctx_adjust_freq(struct + u64 interrupts, freq; + + spin_lock(&ctx->lock); +- list_for_each_entry(counter, &ctx->counter_list, list_entry) { ++ list_for_each_entry_rcu(counter, &ctx->counter_list, event_entry) { + if (counter->state != PERF_COUNTER_STATE_ACTIVE) + continue; + diff --git a/queue-2.6.31/series b/queue-2.6.31/series index e7cad40dbd1..1c086b0564c 100644 --- a/queue-2.6.31/series +++ b/queue-2.6.31/series @@ -93,3 +93,27 @@ pxamci-call-mmc_remove_host-before-freeing-resources.patch param-don-t-complain-about-unused-module-parameters.patch modules-don-t-export-section-names-of-empty-sections-via-sysfs.patch md-revert-incorrect-fix-for-read-error-handling-in-raid1.patch +perf_event-adjust-frequency-and-unthrottle-for-non-group-leader-events.patch +hso-fix-soft-lockup.patch +block-use-after-free-bug-in-__blkdev_get.patch +hwmon-adt7475-fix-temperature-fault-flags.patch +hwmon-adt7475-cache-limits-for-60-seconds.patch +agp-intel-new-host-bridge-support.patch +netfilter-nf_nat-fix-nat-issue-in-2.6.30.4.patch +netfilter-xt_connlimit-fix-regression-caused-by-zero-family-value.patch +b43-fix-dma-tx-bounce-buffer-copying.patch +crypto-padlock-aes-use-the-correct-mask-when-checking-whether-copying-is-required.patch +sky2-set-carrier-off-in-probe.patch +ath5k-linear-pcdac-code-fixes.patch +i2c-fix-userspace_device-list-corruption.patch +acerhdf-fix-fan-control-for-aoa150-model.patch +drm-fb-fix-fbioget-put_vscreeninfo-pixel-clock-handling.patch +tty-of_serial-add-missing-ns16550a-id.patch +v4l-dvb-13255-gspca-m5602-s5k4aa-add-vflip-quirk-for-the-bruneinit-laptop.patch +v4l-dvb-13256-gspca-m5602-s5k4aa-add-another-msi-gx700-vflip-quirk.patch +v4l-dvb-13257-gspca-m5602-s5k4aa-add-vflip-for-fujitsu-amilo-xi-2528.patch +pci-prevent-aer-driver-from-being-loaded-on-non-root-port-pcie-devices.patch +acerhdf-additional-bios-versions.patch +acerhdf-return-temperature-in-milidegree-instead-of-degree.patch +input-keyboard-fix-braille-keyboard-keysym-generation.patch +isdn-hfc_usb-fix-read-buffer-overflow.patch diff --git a/queue-2.6.31/sky2-set-carrier-off-in-probe.patch b/queue-2.6.31/sky2-set-carrier-off-in-probe.patch new file mode 100644 index 00000000000..66cc109b2e8 --- /dev/null +++ b/queue-2.6.31/sky2-set-carrier-off-in-probe.patch @@ -0,0 +1,32 @@ +From 33cb7d33a1c36e07839d08a4d1a33bf6a0f70bba Mon Sep 17 00:00:00 2001 +From: Brandon Philips +Date: Thu, 29 Oct 2009 13:58:07 +0000 +Subject: sky2: set carrier off in probe + +From: Brandon Philips + +commit 33cb7d33a1c36e07839d08a4d1a33bf6a0f70bba upstream. + +Before bringing up a sky2 interface up ethtool reports +"Link detected: yes". Do as ixgbe does and netif_carrier_off() on +probe(). + +Signed-off-by: Brandon Philips +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/sky2.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/net/sky2.c ++++ b/drivers/net/sky2.c +@@ -4528,6 +4528,8 @@ static int __devinit sky2_probe(struct p + goto err_out_free_netdev; + } + ++ netif_carrier_off(dev); ++ + netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT); + + err = request_irq(pdev->irq, sky2_intr, diff --git a/queue-2.6.31/tty-of_serial-add-missing-ns16550a-id.patch b/queue-2.6.31/tty-of_serial-add-missing-ns16550a-id.patch new file mode 100644 index 00000000000..682384acb04 --- /dev/null +++ b/queue-2.6.31/tty-of_serial-add-missing-ns16550a-id.patch @@ -0,0 +1,33 @@ +From 16173c7c2d79da7eb89b41acfdebd74b130f4339 Mon Sep 17 00:00:00 2001 +From: Michal Simek +Date: Tue, 24 Nov 2009 10:22:41 +0000 +Subject: tty/of_serial: add missing ns16550a id + +From: Michal Simek + +commit 16173c7c2d79da7eb89b41acfdebd74b130f4339 upstream. + +Many boards have a bug-free ns16550 compatible serial port, which we should +register as PORT_16550A. This introduces a new value "ns16550a" for the +compatible property of of_serial to let a firmware choose that model instead +of using the crippled PORT_16550 mode. + +Reported-by: Alon Ziv +Signed-off-by: Michal Simek +Signed-off-by: Arnd Bergmann +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/serial/of_serial.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/serial/of_serial.c ++++ b/drivers/serial/of_serial.c +@@ -161,6 +161,7 @@ static int of_platform_serial_remove(str + static struct of_device_id __devinitdata of_platform_serial_table[] = { + { .type = "serial", .compatible = "ns8250", .data = (void *)PORT_8250, }, + { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, }, ++ { .type = "serial", .compatible = "ns16550a", .data = (void *)PORT_16550A, }, + { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, }, + { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, }, + { .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, }, diff --git a/queue-2.6.31/v4l-dvb-13255-gspca-m5602-s5k4aa-add-vflip-quirk-for-the-bruneinit-laptop.patch b/queue-2.6.31/v4l-dvb-13255-gspca-m5602-s5k4aa-add-vflip-quirk-for-the-bruneinit-laptop.patch new file mode 100644 index 00000000000..31af75d3adc --- /dev/null +++ b/queue-2.6.31/v4l-dvb-13255-gspca-m5602-s5k4aa-add-vflip-quirk-for-the-bruneinit-laptop.patch @@ -0,0 +1,38 @@ +From b6ef8836c1ff5199abd40cfba162052bc7e8af00 Mon Sep 17 00:00:00 2001 +From: Erik Andrén +Date: Sun, 27 Sep 2009 10:11:43 -0300 +Subject: V4L/DVB (13255): gspca - m5602-s5k4aa: Add vflip quirk for the Bruneinit laptop +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Erik Andrén + +commit b6ef8836c1ff5199abd40cfba162052bc7e8af00 upstream. + +Adds a vflip quirk for the Bruneinit laptop. Thanks to Jörg for the report + +Signed-off-by: Erik Andrén +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/video/gspca/m5602/m5602_s5k4aa.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c ++++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +@@ -35,6 +35,13 @@ static + const + struct dmi_system_id s5k4aa_vflip_dmi_table[] = { + { ++ .ident = "BRUNEINIT", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "BRUNENIT"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "BRUNENIT"), ++ DMI_MATCH(DMI_BOARD_VERSION, "00030D0000000001") ++ } ++ }, { + .ident = "Fujitsu-Siemens Amilo Xa 2528", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), diff --git a/queue-2.6.31/v4l-dvb-13256-gspca-m5602-s5k4aa-add-another-msi-gx700-vflip-quirk.patch b/queue-2.6.31/v4l-dvb-13256-gspca-m5602-s5k4aa-add-another-msi-gx700-vflip-quirk.patch new file mode 100644 index 00000000000..3bb56a41d44 --- /dev/null +++ b/queue-2.6.31/v4l-dvb-13256-gspca-m5602-s5k4aa-add-another-msi-gx700-vflip-quirk.patch @@ -0,0 +1,39 @@ +From 2339a1887dab469bb4bae56aa7eca3a5e05ecde7 Mon Sep 17 00:00:00 2001 +From: Erik Andrén +Date: Sun, 27 Sep 2009 10:20:21 -0300 +Subject: V4L/DVB (13256): gspca - m5602-s5k4aa: Add another MSI GX700 vflip quirk +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Erik Andrén + +commit 2339a1887dab469bb4bae56aa7eca3a5e05ecde7 upstream. + +Adds another vflip quirk for the MSI GX700. +Thanks to John Katzmaier for reporting. + +Signed-off-by: Erik Andrén +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/video/gspca/m5602/m5602_s5k4aa.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c ++++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +@@ -58,6 +58,13 @@ static + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"), + DMI_MATCH(DMI_PRODUCT_NAME, "GX700"), ++ DMI_MATCH(DMI_BIOS_DATE, "12/02/2008") ++ } ++ }, { ++ .ident = "MSI GX700", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "GX700"), + DMI_MATCH(DMI_BIOS_DATE, "07/26/2007") + } + }, { diff --git a/queue-2.6.31/v4l-dvb-13257-gspca-m5602-s5k4aa-add-vflip-for-fujitsu-amilo-xi-2528.patch b/queue-2.6.31/v4l-dvb-13257-gspca-m5602-s5k4aa-add-vflip-for-fujitsu-amilo-xi-2528.patch new file mode 100644 index 00000000000..00c90c07d74 --- /dev/null +++ b/queue-2.6.31/v4l-dvb-13257-gspca-m5602-s5k4aa-add-vflip-for-fujitsu-amilo-xi-2528.patch @@ -0,0 +1,34 @@ +From 81191f694cb507c49d3c7aa6238dcc0a83ad4001 Mon Sep 17 00:00:00 2001 +From: Erik Andrén +Date: Sat, 3 Oct 2009 10:01:41 -0300 +Subject: V4L/DVB (13257): gspca - m5602-s5k4aa: Add vflip for Fujitsu Amilo Xi 2528 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Erik Andrén + +commit 81191f694cb507c49d3c7aa6238dcc0a83ad4001 upstream. + +Adds a vflip quirk for the Fujitsu Amilo Xi 2528. Thanks to Evgeny for the report. + +Signed-off-by: Erik Andrén +Signed-off-by: Mauro Carvalho Chehab + +diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +index ef4ae68..a27afeb 100644 +--- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c ++++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +@@ -48,6 +48,12 @@ static + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528") + } + }, { ++ .ident = "Fujitsu-Siemens Amilo Xi 2528", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 2528") ++ } ++ }, { + .ident = "Fujitsu-Siemens Amilo Xi 2550", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),