--- /dev/null
+From 9e3a9d1ed8cc8db93e5c53e9a5b09065bd95de8b Mon Sep 17 00:00:00 2001
+From: Len Brown <len.brown@intel.com>
+Date: Fri, 6 Feb 2009 14:00:56 -0500
+Subject: ACPI: disable ACPI cleanly when bad RSDP found
+
+From: Len Brown <len.brown@intel.com>
+
+commit 9e3a9d1ed8cc8db93e5c53e9a5b09065bd95de8b upstream.
+
+When ACPI is disabled in the BIOS of this VIA C3 box,
+it invalidates the RSDP, which Linux notices:
+
+ACPI Error (tbxfroot-0218): A valid RSDP was not found [20080926]
+
+Bug Linux neglected to disable ACPI at that stage,
+and later scribbled on smp_found_config:
+
+ACPI: No APIC-table, disabling MPS
+
+But this box doesn't run well in legacy PIC mode,
+it needed IOAPIC mode to perform correctly:
+
+http://lkml.org/lkml/2009/2/5/39
+
+So exit ACPI mode cleanly when we first detect
+that it is hopeless.
+
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/tables.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/acpi/tables.c
++++ b/drivers/acpi/tables.c
+@@ -293,7 +293,12 @@ static void __init check_multiple_madt(v
+
+ int __init acpi_table_init(void)
+ {
+- acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
++ acpi_status status;
++
++ status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
++ if (ACPI_FAILURE(status))
++ return 1;
++
+ check_multiple_madt();
+ return 0;
+ }
--- /dev/null
+From f3b39f1393d5cebe56f43a584ef47efbebd2702c Mon Sep 17 00:00:00 2001
+From: Zhao Yakui <yakui.zhao@intel.com>
+Date: Mon, 2 Feb 2009 22:55:01 -0500
+Subject: ACPI: proc_dir_entry 'video/VGA' already registered
+
+From: Zhao Yakui <yakui.zhao@intel.com>
+
+commit f3b39f1393d5cebe56f43a584ef47efbebd2702c upstream.
+
+eliminate the duplicate the name of "VGA"
+
+http://bugzilla.kernel.org/show_bug.cgi?id=12514
+
+Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/video.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -1991,6 +1991,12 @@ static int acpi_video_bus_add(struct acp
+ device->pnp.bus_id[3] = '0' + instance;
+ instance ++;
+ }
++ /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
++ if (!strcmp(device->pnp.bus_id, "VGA")) {
++ if (instance)
++ device->pnp.bus_id[3] = '0' + instance;
++ instance++;
++ }
+
+ video->device = device;
+ strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
--- /dev/null
+From a2b7b01c072435b7832ab392167545a1b38cabc3 Mon Sep 17 00:00:00 2001
+From: Len Brown <len.brown@intel.com>
+Date: Wed, 28 Jan 2009 12:47:15 -0500
+Subject: ACPI: remove locking from PM1x_STS register reads
+
+From: Len Brown <len.brown@intel.com>
+
+commit a2b7b01c072435b7832ab392167545a1b38cabc3 upstream.
+
+PM1a_STS and PM1b_STS are twins that get OR'd together
+on reads, and all writes are repeated to both.
+
+The fields in PM1x_STS are single bits only,
+there are no multi-bit fields.
+
+So it is not necessary to lock PM1x_STS reads against
+writes because it is impossible to read an intermediate
+value of a single bit. It will either be 0 or 1,
+even if a write is in progress during the read.
+Reads are asynchronous to writes no matter if a lock
+is used or not.
+
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/processor_idle.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/acpi/processor_idle.c
++++ b/drivers/acpi/processor_idle.c
+@@ -446,7 +446,7 @@ static void acpi_processor_idle(void)
+
+ pr->power.bm_activity <<= diff;
+
+- acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
++ acpi_get_register_unlocked(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
+ if (bm_status) {
+ pr->power.bm_activity |= 0x1;
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
+@@ -1382,7 +1382,7 @@ static int acpi_idle_bm_check(void)
+ {
+ u32 bm_status = 0;
+
+- acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
++ acpi_get_register_unlocked(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
+ if (bm_status)
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
+ /*
--- /dev/null
+From 0a3db1cec5d476804185114ff5d1845aed3936b3 Mon Sep 17 00:00:00 2001
+From: Zhao Yakui <yakui.zhao@intel.com>
+Date: Mon, 2 Feb 2009 11:33:41 +0800
+Subject: ACPI: Skip the first two elements in the _BCL package
+
+From: Zhao Yakui <yakui.zhao@intel.com>
+
+commit 0a3db1cec5d476804185114ff5d1845aed3936b3 upstream.
+
+According to the Spec the first two elements in the _BCL package won't be
+
+regarded as the available brightness level. The first is the brightness when
+full power is connected to the box(It means that the AC adapter is plugged).
+The second is the brightness level when the box is on battery.
+ If the first two elements are still used while finding the next brightness
+level, it will fall back to the lowest level when keeping on pressing
+hotkey. (On some boxes the brightness will be changed twice when hotkey is
+pressed once. One is in the ACPI video driver. The other is changed by sys I/F.
+In the ACPI video driver the first two elements will be used while changing
+the brightness. But the first two elements is skipped while using sys I/F.
+In such case there exists the inconsistency).
+ So he first two elements had better be skipped while showing the available
+brightness or finding the next brightness level.
+
+http://bugzilla.kernel.org/show_bug.cgi?id=12450
+
+Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/video.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -1005,7 +1005,7 @@ acpi_video_device_brightness_seq_show(st
+ }
+
+ seq_printf(seq, "levels: ");
+- for (i = 0; i < dev->brightness->count; i++)
++ for (i = 2; i < dev->brightness->count; i++)
+ seq_printf(seq, " %d", dev->brightness->levels[i]);
+ seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);
+
+@@ -1044,7 +1044,7 @@ acpi_video_device_write_brightness(struc
+ return -EFAULT;
+
+ /* validate through the list of available levels */
+- for (i = 0; i < dev->brightness->count; i++)
++ for (i = 2; i < dev->brightness->count; i++)
+ if (level == dev->brightness->levels[i]) {
+ if (ACPI_SUCCESS
+ (acpi_video_device_lcd_set_level(dev, level)))
+@@ -1697,7 +1697,7 @@ acpi_video_get_next_level(struct acpi_vi
+ max = max_below = 0;
+ min = min_above = 255;
+ /* Find closest level to level_current */
+- for (i = 0; i < device->brightness->count; i++) {
++ for (i = 2; i < device->brightness->count; i++) {
+ l = device->brightness->levels[i];
+ if (abs(l - level_current) < abs(delta)) {
+ delta = l - level_current;
+@@ -1707,7 +1707,7 @@ acpi_video_get_next_level(struct acpi_vi
+ }
+ /* Ajust level_current to closest available level */
+ level_current += delta;
+- for (i = 0; i < device->brightness->count; i++) {
++ for (i = 2; i < device->brightness->count; i++) {
+ l = device->brightness->levels[i];
+ if (l < min)
+ min = l;
--- /dev/null
+From 386e4a8358239f90275e1f93d5ad11cdc93c6453 Mon Sep 17 00:00:00 2001
+From: Myron Stowe <myron.stowe@hp.com>
+Date: Fri, 30 Jan 2009 15:44:53 -0700
+Subject: ACPICA: Fix table entry truncation calculation
+
+From: Myron Stowe <myron.stowe@hp.com>
+
+commit 386e4a8358239f90275e1f93d5ad11cdc93c6453 upstream.
+
+During early boot, ACPI RSDT/XSDT table entries are gathered into the
+'initial_tables[]' array. This array is currently statically defined (see
+./drivers/acpi/tables.c). When there are more table entries than can be
+held in the 'initial_tables[]' array, the message "Truncating N table
+entries!" is output. As currently implemented, this message will always
+erroneously calculate N as 0.
+
+This patch fixes the calculation that determines how many table entries
+will be missing (truncated).
+
+This modification may be used under either the GPL or the BSD-style
+license used for Intel ACPI CA code.
+
+Signed-off-by: Myron Stowe <myron.stowe@hp.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/tables/tbutils.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+--- a/drivers/acpi/tables/tbutils.c
++++ b/drivers/acpi/tables/tbutils.c
+@@ -512,10 +512,9 @@ acpi_tb_parse_root_table(acpi_physical_a
+ if (ACPI_FAILURE(status)) {
+ ACPI_WARNING((AE_INFO,
+ "Truncating %u table entries!",
+- (unsigned)
+- (acpi_gbl_root_table_list.size -
+- acpi_gbl_root_table_list.
+- count)));
++ (unsigned) (table_count -
++ (acpi_gbl_root_table_list.
++ count - 2))));
+ break;
+ }
+ }
--- /dev/null
+From 78d70d48132ce4c678a95b771ffa1af4fb5a03ec Mon Sep 17 00:00:00 2001
+From: Michael Bramer <michael@debsupport.de>
+Date: Tue, 27 Jan 2009 11:51:16 +0000
+Subject: Add support for '8-port RS-232 MIC-3620 from advantech'
+
+From: Michael Bramer <michael@debsupport.de>
+
+commit 78d70d48132ce4c678a95b771ffa1af4fb5a03ec upstream.
+
+This Patch add the device information for the
+MIC-3620 8-port RS-232 cPCI card from Advantech Co. Ltd.
+
+Signed-off-by: Michael Bramer <grisu@deb-support.de>
+Signed-off-by: Alan Cox <number6@the-village.bc.nu>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/8250_pci.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -766,6 +766,8 @@ pci_default_setup(struct serial_private
+ #define PCI_SUBDEVICE_ID_OCTPRO422 0x0208
+ #define PCI_SUBDEVICE_ID_POCTAL232 0x0308
+ #define PCI_SUBDEVICE_ID_POCTAL422 0x0408
++#define PCI_VENDOR_ID_ADVANTECH 0x13fe
++#define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620
+
+ /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
+ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
+@@ -2132,6 +2134,10 @@ static int pciserial_resume_one(struct p
+ #endif
+
+ static struct pci_device_id serial_pci_tbl[] = {
++ /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
++ { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
++ PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
++ pbn_b2_8_921600 },
+ { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
+ PCI_SUBVENDOR_ID_CONNECT_TECH,
+ PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
--- /dev/null
+From 4a5a4c56b443a213fa9c2ad27984a8681a3d7087 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Fri, 6 Feb 2009 12:46:59 +0100
+Subject: ALSA: hda - Add missing COEF initialization for ALC887
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 4a5a4c56b443a213fa9c2ad27984a8681a3d7087 upstream.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_realtek.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -995,6 +995,7 @@ do_sku:
+ case 0x10ec0882:
+ case 0x10ec0883:
+ case 0x10ec0885:
++ case 0x10ec0887:
+ case 0x10ec0889:
+ snd_hda_codec_write(codec, 0x20, 0,
+ AC_VERB_SET_COEF_INDEX, 7);
--- /dev/null
+From c6e8f2daadc6d61a32b7486a1058c8f1f9baa499 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Fri, 6 Feb 2009 12:45:52 +0100
+Subject: ALSA: hda - Add missing initialization for ALC272
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit c6e8f2daadc6d61a32b7486a1058c8f1f9baa499 upstream.
+
+ALC272 needs EAPD for speaker outputs as well as other similar ALC
+codecs.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_realtek.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -967,6 +967,7 @@ do_sku:
+ case 0x10ec0267:
+ case 0x10ec0268:
+ case 0x10ec0269:
++ case 0x10ec0272:
+ case 0x10ec0660:
+ case 0x10ec0662:
+ case 0x10ec0663:
--- /dev/null
+From f67d8176ba9a3dbc33454cd67057184b2ef5ee31 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Wed, 4 Feb 2009 23:30:19 +0100
+Subject: ALSA: hda - Add quirk for FSC Amilo Xi2550
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit f67d8176ba9a3dbc33454cd67057184b2ef5ee31 upstream.
+
+Added model=fujisu-pi2515 for FSC Amilo Xi2550 with ALC883 codec.
+
+Refernece: Novell bnc#450979
+ https://bugzilla.novell.com/show_bug.cgi?id=450979
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_realtek.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -8463,6 +8463,8 @@ static struct snd_pci_quirk alc883_cfg_t
+ SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD),
+ SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
+ SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
++ SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550",
++ ALC883_FUJITSU_PI2515),
+ SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515),
+ SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
+ SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
--- /dev/null
+From 1021e2119eb33a990a2b9ff1410805dd9bdf7997 Mon Sep 17 00:00:00 2001
+From: Corentin Chary <corentincj@iksaif.net>
+Date: Tue, 20 Jan 2009 16:17:41 +0100
+Subject: asus_acpi: Add R1F support
+
+From: Corentin Chary <corentincj@iksaif.net>
+
+commit 1021e2119eb33a990a2b9ff1410805dd9bdf7997 upstream.
+
+Add R1F support
+
+Signed-off-by: Corentin Chary <corentincj@iksaif.net>
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/asus_acpi.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+--- a/drivers/acpi/asus_acpi.c
++++ b/drivers/acpi/asus_acpi.c
+@@ -143,6 +143,7 @@ struct asus_hotk {
+ S1300N, S5200N*/
+ A4S, /* Z81sp */
+ F3Sa, /* (Centrino) */
++ R1F,
+ END_MODEL
+ } model; /* Models currently supported */
+ u16 event_count[128]; /* Count for each event TODO make this better */
+@@ -420,7 +421,18 @@ static struct model_data model_conf[END_
+ .display_get = "\\ADVG",
+ .display_set = "SDSP",
+ },
+-
++ {
++ .name = "R1F",
++ .mt_bt_switch = "BLED",
++ .mt_mled = "MLED",
++ .mt_wled = "WLED",
++ .mt_lcd_switch = "\\Q10",
++ .lcd_status = "\\GP06",
++ .brightness_set = "SPLV",
++ .brightness_get = "GPLV",
++ .display_set = "SDSP",
++ .display_get = "\\INFB"
++ }
+ };
+
+ /* procdir we use */
+@@ -1165,6 +1177,8 @@ static int asus_model_match(char *model)
+ return W3V;
+ else if (strncmp(model, "W5A", 3) == 0)
+ return W5A;
++ else if (strncmp(model, "R1F", 3) == 0)
++ return R1F;
+ else if (strncmp(model, "A4S", 3) == 0)
+ return A4S;
+ else if (strncmp(model, "F3Sa", 4) == 0)
--- /dev/null
+From 2b190e76def5233c542f6025b4a133b1d4bd1a37 Mon Sep 17 00:00:00 2001
+From: Roel Kluin <roel.kluin@gmail.com>
+Date: Sat, 17 Jan 2009 15:51:27 +0100
+Subject: panasonic-laptop: fix X[ ARRAY_SIZE(X) ]
+
+From: Roel Kluin <roel.kluin@gmail.com>
+
+commit 2b190e76def5233c542f6025b4a133b1d4bd1a37 upstream.
+
+Ensure pcc->keymap[ ARRAY_SIZE(pcc->keymap) ] does not occur.
+
+Signed-off-by: Roel Kluin <roel.kluin@gmail.com>
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/misc/panasonic-laptop.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/misc/panasonic-laptop.c
++++ b/drivers/misc/panasonic-laptop.c
+@@ -515,7 +515,7 @@ static void acpi_pcc_generate_keyinput(s
+
+ hkey_num = result & 0xf;
+
+- if (hkey_num < 0 || hkey_num > ARRAY_SIZE(pcc->keymap)) {
++ if (hkey_num < 0 || hkey_num >= ARRAY_SIZE(pcc->keymap)) {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ "hotkey number out of range: %d\n",
+ hkey_num));
--- /dev/null
+From 3419c75e15f82c3ab09bd944fddbde72c9e4b3ea Mon Sep 17 00:00:00 2001
+From: Alex Chiang <achiang@hp.com>
+Date: Wed, 28 Jan 2009 14:59:18 -0700
+Subject: PCI: properly clean up ASPM link state on device remove
+
+From: Alex Chiang <achiang@hp.com>
+
+commit 3419c75e15f82c3ab09bd944fddbde72c9e4b3ea upstream.
+
+We only want to disable ASPM when the last function is removed from
+the parent's device list. We determine this by checking to see if
+the parent's device list is completely empty.
+
+Unfortunately, we never hit that code because the parent is considered
+an upstream port, and never had an ASPM link_state associated with it.
+
+The early check for !link_state causes us to return early, we never
+discover that our device list is empty, and thus we never remove the
+downstream ports' link_state nodes.
+
+Instead of checking to see if the parent's device list is empty, we can
+check to see if we are the last device on the list, and if so, then we
+know that we can clean up properly.
+
+Cc: Shaohua Li <shaohua.li@intel.com>
+Signed-off-by: Alex Chiang <achiang@hp.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/pcie/aspm.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -713,9 +713,9 @@ void pcie_aspm_exit_link_state(struct pc
+
+ /*
+ * All PCIe functions are in one slot, remove one function will remove
+- * the the whole slot, so just wait
++ * the whole slot, so just wait until we are the last function left.
+ */
+- if (!list_empty(&parent->subordinate->devices))
++ if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices))
+ goto out;
+
+ /* All functions are removed, so just disable ASPM for the link */
--- /dev/null
+From 97c44836cdec1ea713a15d84098a1a908157e68f Mon Sep 17 00:00:00 2001
+From: Timothy S. Nelson <wayland@wayland.id.au>
+Date: Fri, 30 Jan 2009 06:12:47 +1100
+Subject: PCI: return error on failure to read PCI ROMs
+
+From: Timothy S. Nelson <wayland@wayland.id.au>
+
+commit 97c44836cdec1ea713a15d84098a1a908157e68f upstream.
+
+This patch makes the ROM reading code return an error to user space if
+the size of the ROM read is equal to 0.
+
+The patch also emits a warnings if the contents of the ROM are invalid,
+and documents the effects of the "enable" file on ROM reading.
+
+Signed-off-by: Timothy S. Nelson <wayland@wayland.id.au>
+Acked-by: Alex Villacis-Lasso <a_villacis@palosanto.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ Documentation/filesystems/sysfs-pci.txt | 13 ++++++++++++-
+ arch/ia64/sn/kernel/io_acpi_init.c | 2 +-
+ arch/ia64/sn/kernel/io_init.c | 2 +-
+ drivers/pci/pci-sysfs.c | 4 ++--
+ drivers/pci/rom.c | 8 +++++---
+ include/linux/pci.h | 2 +-
+ 6 files changed, 22 insertions(+), 9 deletions(-)
+
+--- a/arch/ia64/sn/kernel/io_acpi_init.c
++++ b/arch/ia64/sn/kernel/io_acpi_init.c
+@@ -434,7 +434,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
+ size = pci_resource_len(dev, PCI_ROM_RESOURCE);
+ addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
+ size);
+- image_size = pci_get_rom_size(addr, size);
++ image_size = pci_get_rom_size(dev, addr, size);
+ dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
+ dev->resource[PCI_ROM_RESOURCE].end =
+ (unsigned long) addr + image_size - 1;
+--- a/arch/ia64/sn/kernel/io_init.c
++++ b/arch/ia64/sn/kernel/io_init.c
+@@ -269,7 +269,7 @@ sn_io_slot_fixup(struct pci_dev *dev)
+
+ rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
+ size + 1);
+- image_size = pci_get_rom_size(rom, size + 1);
++ image_size = pci_get_rom_size(dev, rom, size + 1);
+ dev->resource[PCI_ROM_RESOURCE].end =
+ dev->resource[PCI_ROM_RESOURCE].start +
+ image_size - 1;
+--- a/Documentation/filesystems/sysfs-pci.txt
++++ b/Documentation/filesystems/sysfs-pci.txt
+@@ -9,6 +9,7 @@ that support it. For example, a given b
+ | |-- class
+ | |-- config
+ | |-- device
++ | |-- enable
+ | |-- irq
+ | |-- local_cpus
+ | |-- resource
+@@ -32,6 +33,7 @@ files, each with their own function.
+ class PCI class (ascii, ro)
+ config PCI config space (binary, rw)
+ device PCI device (ascii, ro)
++ enable Whether the device is enabled (ascii, rw)
+ irq IRQ number (ascii, ro)
+ local_cpus nearby CPU mask (cpumask, ro)
+ resource PCI resource host addresses (ascii, ro)
+@@ -57,10 +59,19 @@ used to do actual device programming fro
+ don't support mmapping of certain resources, so be sure to check the return
+ value from any attempted mmap.
+
++The 'enable' file provides a counter that indicates how many times the device
++has been enabled. If the 'enable' file currently returns '4', and a '1' is
++echoed into it, it will then return '5'. Echoing a '0' into it will decrease
++the count. Even when it returns to 0, though, some of the initialisation
++may not be reversed.
++
+ The 'rom' file is special in that it provides read-only access to the device's
+ ROM file, if available. It's disabled by default, however, so applications
+ should write the string "1" to the file to enable it before attempting a read
+-call, and disable it following the access by writing "0" to the file.
++call, and disable it following the access by writing "0" to the file. Note
++that the device must be enabled for a rom read to return data succesfully.
++In the event a driver is not bound to the device, it can be enabled using the
++'enable' file, documented above.
+
+ Accessing legacy resources through sysfs
+ ----------------------------------------
+--- a/drivers/pci/pci-sysfs.c
++++ b/drivers/pci/pci-sysfs.c
+@@ -777,8 +777,8 @@ pci_read_rom(struct kobject *kobj, struc
+ return -EINVAL;
+
+ rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
+- if (!rom)
+- return 0;
++ if (!rom || !size)
++ return -EIO;
+
+ if (off >= size)
+ count = 0;
+--- a/drivers/pci/rom.c
++++ b/drivers/pci/rom.c
+@@ -63,7 +63,7 @@ void pci_disable_rom(struct pci_dev *pde
+ * The PCI window size could be much larger than the
+ * actual image size.
+ */
+-size_t pci_get_rom_size(void __iomem *rom, size_t size)
++size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
+ {
+ void __iomem *image;
+ int last_image;
+@@ -72,8 +72,10 @@ size_t pci_get_rom_size(void __iomem *ro
+ do {
+ void __iomem *pds;
+ /* Standard PCI ROMs start out with these bytes 55 AA */
+- if (readb(image) != 0x55)
++ if (readb(image) != 0x55) {
++ dev_err(&pdev->dev, "Invalid ROM contents\n");
+ break;
++ }
+ if (readb(image + 1) != 0xAA)
+ break;
+ /* get the PCI data structure and check its signature */
+@@ -159,7 +161,7 @@ void __iomem *pci_map_rom(struct pci_dev
+ * size is much larger than the actual size of the ROM.
+ * True size is important if the ROM is going to be copied.
+ */
+- *size = pci_get_rom_size(rom, *size);
++ *size = pci_get_rom_size(pdev, rom, *size);
+ return rom;
+ }
+
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -651,7 +651,7 @@ int pci_enable_rom(struct pci_dev *pdev)
+ void pci_disable_rom(struct pci_dev *pdev);
+ void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
+ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
+-size_t pci_get_rom_size(void __iomem *rom, size_t size);
++size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);
+
+ /* Power management related routines */
+ int pci_save_state(struct pci_dev *dev);
--- /dev/null
+From f01d1d546abb2f4028b5299092f529eefb01253a Mon Sep 17 00:00:00 2001
+From: Alexey Dobriyan <adobriyan@gmail.com>
+Date: Fri, 6 Feb 2009 00:30:05 +0300
+Subject: seq_file: fix big-enough lseek() + read()
+
+From: Alexey Dobriyan <adobriyan@gmail.com>
+
+commit f01d1d546abb2f4028b5299092f529eefb01253a upstream.
+
+lseek() further than length of the file will leave stale ->index
+(second-to-last during iteration). Next seq_read() will not notice
+that ->f_pos is big enough to return 0, but will print last item
+as if ->f_pos is pointing to it.
+
+Introduced in commit cb510b8172602a66467f3551b4be1911f5a7c8c2
+aka "seq_file: more atomicity in traverse()".
+
+Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+--- a/fs/seq_file.c
++++ b/fs/seq_file.c
+@@ -102,6 +102,7 @@ static int traverse(struct seq_file *m, loff_t offset)
+ p = m->op->next(m, p, &index);
+ }
+ m->op->stop(m, p);
++ m->index = index;
+ return error;
+
+ Eoverflow:
--- /dev/null
+From 33da8892a2f9e7d4b2d9a35fc80833ba2d2b1aa6 Mon Sep 17 00:00:00 2001
+From: Eric Biederman <ebiederm@xmission.com>
+Date: Wed, 4 Feb 2009 15:12:25 -0800
+Subject: seq_file: move traverse so it can be used from seq_read
+
+From: Eric Biederman <ebiederm@xmission.com>
+
+commit 33da8892a2f9e7d4b2d9a35fc80833ba2d2b1aa6 upstream.
+
+In 2.6.25 some /proc files were converted to use the seq_file
+infrastructure. But seq_files do not correctly support pread(), which
+broke some usersapce applications.
+
+To handle pread correctly we can't assume that f_pos is where we left it
+in seq_read. So move traverse() so that we can eventually use it in
+seq_read and do thus some day support pread().
+
+Signed-off-by: Eric Biederman <ebiederm@xmission.com>
+Cc: Paul Turner <pjt@google.com>
+Cc: Alexey Dobriyan <adobriyan@gmail.com>
+Cc: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/seq_file.c | 114 +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 57 insertions(+), 57 deletions(-)
+
+--- a/fs/seq_file.c
++++ b/fs/seq_file.c
+@@ -54,6 +54,63 @@ int seq_open(struct file *file, const st
+ }
+ EXPORT_SYMBOL(seq_open);
+
++static int traverse(struct seq_file *m, loff_t offset)
++{
++ loff_t pos = 0, index;
++ int error = 0;
++ void *p;
++
++ m->version = 0;
++ index = 0;
++ m->count = m->from = 0;
++ if (!offset) {
++ m->index = index;
++ return 0;
++ }
++ if (!m->buf) {
++ m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
++ if (!m->buf)
++ return -ENOMEM;
++ }
++ p = m->op->start(m, &index);
++ while (p) {
++ error = PTR_ERR(p);
++ if (IS_ERR(p))
++ break;
++ error = m->op->show(m, p);
++ if (error < 0)
++ break;
++ if (unlikely(error)) {
++ error = 0;
++ m->count = 0;
++ }
++ if (m->count == m->size)
++ goto Eoverflow;
++ if (pos + m->count > offset) {
++ m->from = offset - pos;
++ m->count -= m->from;
++ m->index = index;
++ break;
++ }
++ pos += m->count;
++ m->count = 0;
++ if (pos == offset) {
++ index++;
++ m->index = index;
++ break;
++ }
++ p = m->op->next(m, p, &index);
++ }
++ m->op->stop(m, p);
++ return error;
++
++Eoverflow:
++ m->op->stop(m, p);
++ kfree(m->buf);
++ m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
++ return !m->buf ? -ENOMEM : -EAGAIN;
++}
++
+ /**
+ * seq_read - ->read() method for sequential files.
+ * @file: the file to read from
+@@ -186,63 +243,6 @@ Efault:
+ }
+ EXPORT_SYMBOL(seq_read);
+
+-static int traverse(struct seq_file *m, loff_t offset)
+-{
+- loff_t pos = 0, index;
+- int error = 0;
+- void *p;
+-
+- m->version = 0;
+- index = 0;
+- m->count = m->from = 0;
+- if (!offset) {
+- m->index = index;
+- return 0;
+- }
+- if (!m->buf) {
+- m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
+- if (!m->buf)
+- return -ENOMEM;
+- }
+- p = m->op->start(m, &index);
+- while (p) {
+- error = PTR_ERR(p);
+- if (IS_ERR(p))
+- break;
+- error = m->op->show(m, p);
+- if (error < 0)
+- break;
+- if (unlikely(error)) {
+- error = 0;
+- m->count = 0;
+- }
+- if (m->count == m->size)
+- goto Eoverflow;
+- if (pos + m->count > offset) {
+- m->from = offset - pos;
+- m->count -= m->from;
+- m->index = index;
+- break;
+- }
+- pos += m->count;
+- m->count = 0;
+- if (pos == offset) {
+- index++;
+- m->index = index;
+- break;
+- }
+- p = m->op->next(m, p, &index);
+- }
+- m->op->stop(m, p);
+- return error;
+-
+-Eoverflow:
+- m->op->stop(m, p);
+- kfree(m->buf);
+- m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
+- return !m->buf ? -ENOMEM : -EAGAIN;
+-}
+-
+ /**
+ * seq_lseek - ->llseek() method for sequential files.
+ * @file: the file in question
--- /dev/null
+From 39aced68d664291db3324d0fcf0985ab5626aac2 Mon Sep 17 00:00:00 2001
+From: Niels de Vos <niels.devos@wincor-nixdorf.com>
+Date: Fri, 2 Jan 2009 13:46:58 +0000
+Subject: serial: set correct baud_base for Oxford Semiconductor Ltd EXSYS EX-41092 Dual 16950 Serial adapter
+
+From: Niels de Vos <niels.devos@wincor-nixdorf.com>
+
+commit 39aced68d664291db3324d0fcf0985ab5626aac2 upstream.
+
+The PCI-card identified as "Oxford Semiconductor Ltd EXSYS EX-41092 Dual
+16950 Serial adapter" is only usable with other devices (i.e. not the same
+card) after doing a "setserial /dev/ttyS<n> baud_base 115200". This
+baud_base should be default for this card.
+
+Signed-off-by: Niels de Vos <niels.devos@wincor-nixdorf.com>
+Signed-off-by: Alan Cox <alan@redhat.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/8250_pci.c | 3 +++
+ include/linux/pci_ids.h | 1 +
+ 2 files changed, 4 insertions(+)
+
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -2375,6 +2375,9 @@ static struct pci_device_id serial_pci_t
+ * For now just used the hex ID 0x950a.
+ */
+ { PCI_VENDOR_ID_OXSEMI, 0x950a,
++ PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL, 0, 0,
++ pbn_b0_2_115200 },
++ { PCI_VENDOR_ID_OXSEMI, 0x950a,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ pbn_b0_2_1130000 },
+ { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -1770,6 +1770,7 @@
+ #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081
+ #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082
+ #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050
++#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530
+
+ #define PCI_VENDOR_ID_RADISYS 0x1331
+
e1000-fix-pci-enable-to-honor-the-need_ioport-flag.patch
agp-intel-add-support-for-g41-chipset.patch
agp-intel-fix-broken-symbol-in-device-name.patch
+alsa-hda-add-quirk-for-fsc-amilo-xi2550.patch
+alsa-hda-add-missing-coef-initialization-for-alc887.patch
+alsa-hda-add-missing-initialization-for-alc272.patch
+asus_acpi-add-r1f-support.patch
+panasonic-laptop-fix-x.patch
+acpi-skip-the-first-two-elements-in-the-_bcl-package.patch
+acpi-remove-locking-from-pm1x_sts-register-reads.patch
+acpi-proc_dir_entry-video-vga-already-registered.patch
+acpi-disable-acpi-cleanly-when-bad-rsdp-found.patch
+acpica-fix-table-entry-truncation-calculation.patch
+pci-properly-clean-up-aspm-link-state-on-device-remove.patch
+pci-return-error-on-failure-to-read-pci-roms.patch
+seq_file-move-traverse-so-it-can-be-used-from-seq_read.patch
+seq_file-fix-big-enough-lseek-read.patch
+serial-set-correct-baud_base-for-oxford-semiconductor-ltd-exsys-ex-41092-dual-16950-serial-adapter.patch
+add-support-for-8-port-rs-232-mic-3620-from-advantech.patch