3.0 patches
diff --git a/queue-3.0/ide-disk-fix-request-requeuing.patch b/queue-3.0/ide-disk-fix-request-requeuing.patch
new file mode 100644
index 0000000..13b2644
--- /dev/null
+++ b/queue-3.0/ide-disk-fix-request-requeuing.patch
@@ -0,0 +1,47 @@
+From 2c8fc867602e385fd2abe76da0b6bda8ed907547 Mon Sep 17 00:00:00 2001
+From: Borislav Petkov <bp@alien8.de>
+Date: Mon, 3 Oct 2011 14:28:18 -0400
+Subject: ide-disk: Fix request requeuing
+
+From: Borislav Petkov <bp@alien8.de>
+
+commit 2c8fc867602e385fd2abe76da0b6bda8ed907547 upstream.
+
+Simon Kirby reported that on his RAID setup with idedisk underneath
+the box OOMs after a couple of days of runtime. Running with
+CONFIG_DEBUG_KMEMLEAK pointed to idedisk_prep_fn() which unconditionally
+allocates an ide_cmd struct. However, ide_requeue_and_plug() can be
+called more than once per request, either from the request issue or the
+IRQ handler path and do blk_peek_request() ends up in idedisk_prep_fn()
+repeatedly, allocating a struct ide_cmd everytime and "forgetting" the
+previous pointer.
+
+Make sure the code reuses the old allocated chunk.
+
+Reported-and-tested-by: Simon Kirby <sim@hostway.ca>
+Link: http://marc.info/?l=linux-kernel&m=131667641517919
+Link: http://lkml.kernel.org/r/20110922072643.GA27232@hostway.ca
+Signed-off-by: Borislav Petkov <bp@alien8.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/ide/ide-disk.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/ide/ide-disk.c
++++ b/drivers/ide/ide-disk.c
+@@ -435,7 +435,12 @@ static int idedisk_prep_fn(struct reques
+ 	if (!(rq->cmd_flags & REQ_FLUSH))
+ 		return BLKPREP_OK;
+ 
+-	cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
++	if (rq->special) {
++		cmd = rq->special;
++		memset(cmd, 0, sizeof(*cmd));
++	} else {
++		cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
++	}
+ 
+ 	/* FIXME: map struct ide_taskfile on rq->cmd[] */
+ 	BUG_ON(cmd == NULL);
diff --git a/queue-3.0/pci-don-t-crash-when-reading-mpss-from-root-complex.patch b/queue-3.0/pci-don-t-crash-when-reading-mpss-from-root-complex.patch
new file mode 100644
index 0000000..9fcb7fd
--- /dev/null
+++ b/queue-3.0/pci-don-t-crash-when-reading-mpss-from-root-complex.patch
@@ -0,0 +1,41 @@
+From 1a4b1a41b8a3d5256019854e851beed063b34344 Mon Sep 17 00:00:00 2001
+From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Date: Tue, 13 Sep 2011 15:16:33 -0300
+Subject: pci: Don't crash when reading mpss from root complex
+
+From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+
+commit 1a4b1a41b8a3d5256019854e851beed063b34344 upstream.
+
+In pcie_find_smpss(), we have the following statement:
+
+ 	if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) ||
+	    dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT))
+
+The problem is that at least on my machine, this gets called for the
+root complex (virtual P2P bridge), and dev->bus->self is NULL since
+the parent bus for this is not itself anchor to a PCI device.
+
+This adds the necessary NULL check.
+
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Acked-by: Jon Mason <mason@myri.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/probe.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -1352,7 +1352,8 @@ static int pcie_find_smpss(struct pci_de
+ 	 * will occur as normal.
+ 	 */
+ 	if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) ||
+-	    dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT))
++	     (dev->bus->self &&
++	      dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT)))
+ 		*smpss = 0;
+ 
+ 	if (*smpss > dev->pcie_mpss)
diff --git a/queue-3.0/pci-export-pcie_bus_configure_settings-symbol.patch b/queue-3.0/pci-export-pcie_bus_configure_settings-symbol.patch
new file mode 100644
index 0000000..1812baf
--- /dev/null
+++ b/queue-3.0/pci-export-pcie_bus_configure_settings-symbol.patch
@@ -0,0 +1,31 @@
+From debc3b778508f59696ff188f0feca271dcbfa7d9 Mon Sep 17 00:00:00 2001
+From: Jon Mason <mason@myri.com>
+Date: Tue, 2 Aug 2011 00:01:18 -0500
+Subject: PCI: export pcie_bus_configure_settings symbol
+
+From: Jon Mason <mason@myri.com>
+
+commit debc3b778508f59696ff188f0feca271dcbfa7d9 upstream.
+
+pcie_bus_configure_settings needs to be exported if the PCI hotplug
+driver is being compiled as a module.
+
+Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
+Signed-off-by: Jon Mason <mason@myri.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/probe.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -1471,6 +1471,7 @@ void pcie_bus_configure_settings(struct
+ 	pcie_bus_configure_set(bus->self, &smpss);
+ 	pci_walk_bus(bus, pcie_bus_configure_set, &smpss);
+ }
++EXPORT_SYMBOL_GPL(pcie_bus_configure_settings);
+ 
+ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
+ {
diff --git a/queue-3.0/pci-remove-mrrs-modification-from-mps-setting-code.patch b/queue-3.0/pci-remove-mrrs-modification-from-mps-setting-code.patch
new file mode 100644
index 0000000..7c0f5cd
--- /dev/null
+++ b/queue-3.0/pci-remove-mrrs-modification-from-mps-setting-code.patch
@@ -0,0 +1,117 @@
+From ed2888e906b56769b4ffabb9c577190438aa68b8 Mon Sep 17 00:00:00 2001
+From: Jon Mason <mason@myri.com>
+Date: Thu, 8 Sep 2011 16:41:18 -0500
+Subject: PCI: Remove MRRS modification from MPS setting code
+
+From: Jon Mason <mason@myri.com>
+
+commit ed2888e906b56769b4ffabb9c577190438aa68b8 upstream.
+
+Modifying the Maximum Read Request Size to 0 (value of 128Bytes) has
+massive negative ramifications on some devices.  Without knowing which
+devices have this issue, do not modify from the default value when
+walking the PCI-E bus in pcie_bus_safe mode.  Also, make pcie_bus_safe
+the default procedure.
+
+Tested-by: Sven Schnelle <svens@stackframe.org>
+Tested-by: Simon Kirby <sim@hostway.ca>
+Tested-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
+Reported-and-tested-by: Eric Dumazet <eric.dumazet@gmail.com>
+Reported-and-tested-by: Niels Ole Salscheider <niels_ole@salscheider-online.de>
+References: https://bugzilla.kernel.org/show_bug.cgi?id=42162
+Signed-off-by: Jon Mason <mason@myri.com>
+Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/pci.c   |    2 +-
+ drivers/pci/probe.c |   45 ++++++++++++++++++++++++---------------------
+ 2 files changed, 25 insertions(+), 22 deletions(-)
+
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -77,7 +77,7 @@ unsigned long pci_cardbus_mem_size = DEF
+ unsigned long pci_hotplug_io_size  = DEFAULT_HOTPLUG_IO_SIZE;
+ unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE;
+ 
+-enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_PERFORMANCE;
++enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_SAFE;
+ 
+ /*
+  * The default CLS is used if arch didn't set CLS explicitly and not
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -1397,34 +1397,37 @@ static void pcie_write_mps(struct pci_de
+ 
+ static void pcie_write_mrrs(struct pci_dev *dev, int mps)
+ {
+-	int rc, mrrs;
+-
+-	if (pcie_bus_config == PCIE_BUS_PERFORMANCE) {
+-		int dev_mpss = 128 << dev->pcie_mpss;
+-
+-		/* For Max performance, the MRRS must be set to the largest
+-		 * supported value.  However, it cannot be configured larger
+-		 * than the MPS the device or the bus can support.  This assumes
+-		 * that the largest MRRS available on the device cannot be
+-		 * smaller than the device MPSS.
+-		 */
+-		mrrs = mps < dev_mpss ? mps : dev_mpss;
+-	} else
+-		/* In the "safe" case, configure the MRRS for fairness on the
+-		 * bus by making all devices have the same size
+-		 */
+-		mrrs = mps;
++	int rc, mrrs, dev_mpss;
+ 
++	/* In the "safe" case, do not configure the MRRS.  There appear to be
++	 * issues with setting MRRS to 0 on a number of devices.
++	 */
++
++	if (pcie_bus_config != PCIE_BUS_PERFORMANCE)
++		return;
++
++	dev_mpss = 128 << dev->pcie_mpss;
++
++	/* For Max performance, the MRRS must be set to the largest supported
++	 * value.  However, it cannot be configured larger than the MPS the
++	 * device or the bus can support.  This assumes that the largest MRRS
++	 * available on the device cannot be smaller than the device MPSS.
++	 */
++	mrrs = min(mps, dev_mpss);
+ 
+ 	/* MRRS is a R/W register.  Invalid values can be written, but a
+-	 * subsiquent read will verify if the value is acceptable or not.
++	 * subsequent read will verify if the value is acceptable or not.
+ 	 * If the MRRS value provided is not acceptable (e.g., too large),
+ 	 * shrink the value until it is acceptable to the HW.
+  	 */
+ 	while (mrrs != pcie_get_readrq(dev) && mrrs >= 128) {
++		dev_warn(&dev->dev, "Attempting to modify the PCI-E MRRS value"
++			 " to %d.  If any issues are encountered, please try "
++			 "running with pci=pcie_bus_safe\n", mrrs);
+ 		rc = pcie_set_readrq(dev, mrrs);
+ 		if (rc)
+-			dev_err(&dev->dev, "Failed attempting to set the MRRS\n");
++			dev_err(&dev->dev,
++				"Failed attempting to set the MRRS\n");
+ 
+ 		mrrs /= 2;
+ 	}
+@@ -1437,13 +1440,13 @@ static int pcie_bus_configure_set(struct
+ 	if (!pci_is_pcie(dev))
+ 		return 0;
+ 
+-	dev_info(&dev->dev, "Dev MPS %d MPSS %d MRRS %d\n",
++	dev_dbg(&dev->dev, "Dev MPS %d MPSS %d MRRS %d\n",
+ 		 pcie_get_mps(dev), 128<<dev->pcie_mpss, pcie_get_readrq(dev));
+ 
+ 	pcie_write_mps(dev, mps);
+ 	pcie_write_mrrs(dev, mps);
+ 
+-	dev_info(&dev->dev, "Dev MPS %d MPSS %d MRRS %d\n",
++	dev_dbg(&dev->dev, "Dev MPS %d MPSS %d MRRS %d\n",
+ 		 pcie_get_mps(dev), 128<<dev->pcie_mpss, pcie_get_readrq(dev));
+ 
+ 	return 0;
diff --git a/queue-3.0/pci-series b/queue-3.0/pci-series
new file mode 100644
index 0000000..2d8d8ad
--- /dev/null
+++ b/queue-3.0/pci-series
@@ -0,0 +1,4 @@
+pci-set-pci-e-max-payload-size-on-fabric.patch
+pci-export-pcie_bus_configure_settings-symbol.patch
+pci-remove-mrrs-modification-from-mps-setting-code.patch
+pci-don-t-crash-when-reading-mpss-from-root-complex.patch
diff --git a/queue-3.0/pci-set-pci-e-max-payload-size-on-fabric.patch b/queue-3.0/pci-set-pci-e-max-payload-size-on-fabric.patch
new file mode 100644
index 0000000..6ca45f3
--- /dev/null
+++ b/queue-3.0/pci-set-pci-e-max-payload-size-on-fabric.patch
@@ -0,0 +1,445 @@
+From b03e7495a862b028294f59fc87286d6d78ee7fa1 Mon Sep 17 00:00:00 2001
+From: Jon Mason <mason@myri.com>
+Date: Wed, 20 Jul 2011 15:20:54 -0500
+Subject: PCI: Set PCI-E Max Payload Size on fabric
+
+From: Jon Mason <mason@myri.com>
+
+commit b03e7495a862b028294f59fc87286d6d78ee7fa1 upstream.
+
+On a given PCI-E fabric, each device, bridge, and root port can have a
+different PCI-E maximum payload size.  There is a sizable performance
+boost for having the largest possible maximum payload size on each PCI-E
+device.  However, if improperly configured, fatal bus errors can occur.
+Thus, it is important to ensure that PCI-E payloads sends by a device
+are never larger than the MPS setting of all devices on the way to the
+destination.
+
+This can be achieved two ways:
+
+- A conservative approach is to use the smallest common denominator of
+  the entire tree below a root complex for every device on that fabric.
+
+This means for example that having a 128 bytes MPS USB controller on one
+leg of a switch will dramatically reduce performances of a video card or
+10GE adapter on another leg of that same switch.
+
+It also means that any hierarchy supporting hotplug slots (including
+expresscard or thunderbolt I suppose, dbl check that) will have to be
+entirely clamped to 128 bytes since we cannot predict what will be
+plugged into those slots, and we cannot change the MPS on a "live"
+system.
+
+- A more optimal way is possible, if it falls within a couple of
+  constraints:
+* The top-level host bridge will never generate packets larger than the
+  smallest TLP (or if it can be controlled independently from its MPS at
+  least)
+* The device will never generate packets larger than MPS (which can be
+  configured via MRRS)
+* No support of direct PCI-E <-> PCI-E transfers between devices without
+  some additional code to specifically deal with that case
+
+Then we can use an approach that basically ignores downstream requests
+and focuses exclusively on upstream requests. In that case, all we need
+to care about is that a device MPS is no larger than its parent MPS,
+which allows us to keep all switches/bridges to the max MPS supported by
+their parent and eventually the PHB.
+
+In this case, your USB controller would no longer "starve" your 10GE
+Ethernet and your hotplug slots won't affect your global MPS.
+Additionally, the hotplugged devices themselves can be configured to a
+larger MPS up to the value configured in the hotplug bridge.
+
+To choose between the two available options, two PCI kernel boot args
+have been added to the PCI calls.  "pcie_bus_safe" will provide the
+former behavior, while "pcie_bus_perf" will perform the latter behavior.
+By default, the latter behavior is used.
+
+NOTE: due to the location of the enablement, each arch will need to add
+calls to this function.  This patch only enables x86.
+
+This patch includes a number of changes recommended by Benjamin
+Herrenschmidt.
+
+Tested-by: Jordan_Hargrave@dell.com
+Signed-off-by: Jon Mason <mason@myri.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/pci/acpi.c              |    9 ++
+ drivers/pci/hotplug/pcihp_slot.c |   45 ------------
+ drivers/pci/pci.c                |   67 ++++++++++++++++++
+ drivers/pci/probe.c              |  145 +++++++++++++++++++++++++++++++++++++++
+ include/linux/pci.h              |   15 +++-
+ 5 files changed, 236 insertions(+), 45 deletions(-)
+
+--- a/arch/x86/pci/acpi.c
++++ b/arch/x86/pci/acpi.c
+@@ -361,6 +361,15 @@ struct pci_bus * __devinit pci_acpi_scan
+ 		}
+ 	}
+ 
++	/* After the PCI-E bus has been walked and all devices discovered,
++	 * configure any settings of the fabric that might be necessary.
++	 */
++	if (bus) {
++		struct pci_bus *child;
++		list_for_each_entry(child, &bus->children, node)
++			pcie_bus_configure_settings(child, child->self->pcie_mpss);
++	}
++
+ 	if (!bus)
+ 		kfree(sd);
+ 
+--- a/drivers/pci/hotplug/pcihp_slot.c
++++ b/drivers/pci/hotplug/pcihp_slot.c
+@@ -158,47 +158,6 @@ static void program_hpp_type2(struct pci
+ 	 */
+ }
+ 
+-/* Program PCIE MaxPayload setting on device: ensure parent maxpayload <= device */
+-static int pci_set_payload(struct pci_dev *dev)
+-{
+-       int pos, ppos;
+-       u16 pctl, psz;
+-       u16 dctl, dsz, dcap, dmax;
+-       struct pci_dev *parent;
+-
+-       parent = dev->bus->self;
+-       pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
+-       if (!pos)
+-               return 0;
+-
+-       /* Read Device MaxPayload capability and setting */
+-       pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &dctl);
+-       pci_read_config_word(dev, pos + PCI_EXP_DEVCAP, &dcap);
+-       dsz = (dctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5;
+-       dmax = (dcap & PCI_EXP_DEVCAP_PAYLOAD);
+-
+-       /* Read Parent MaxPayload setting */
+-       ppos = pci_find_capability(parent, PCI_CAP_ID_EXP);
+-       if (!ppos)
+-               return 0;
+-       pci_read_config_word(parent, ppos + PCI_EXP_DEVCTL, &pctl);
+-       psz = (pctl &  PCI_EXP_DEVCTL_PAYLOAD) >> 5;
+-
+-       /* If parent payload > device max payload -> error
+-        * If parent payload > device payload -> set speed
+-        * If parent payload <= device payload -> do nothing
+-        */
+-       if (psz > dmax)
+-               return -1;
+-       else if (psz > dsz) {
+-               dev_info(&dev->dev, "Setting MaxPayload to %d\n", 128 << psz);
+-               pci_write_config_word(dev, pos + PCI_EXP_DEVCTL,
+-                                     (dctl & ~PCI_EXP_DEVCTL_PAYLOAD) +
+-                                     (psz << 5));
+-       }
+-       return 0;
+-}
+-
+ void pci_configure_slot(struct pci_dev *dev)
+ {
+ 	struct pci_dev *cdev;
+@@ -210,9 +169,7 @@ void pci_configure_slot(struct pci_dev *
+ 			(dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)))
+ 		return;
+ 
+-       ret = pci_set_payload(dev);
+-       if (ret)
+-               dev_warn(&dev->dev, "could not set device max payload\n");
++	pcie_bus_configure_settings(dev->bus, dev->bus->self->pcie_mpss);
+ 
+ 	memset(&hpp, 0, sizeof(hpp));
+ 	ret = pci_get_hp_params(dev, &hpp);
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -77,6 +77,8 @@ unsigned long pci_cardbus_mem_size = DEF
+ unsigned long pci_hotplug_io_size  = DEFAULT_HOTPLUG_IO_SIZE;
+ unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE;
+ 
++enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_PERFORMANCE;
++
+ /*
+  * The default CLS is used if arch didn't set CLS explicitly and not
+  * all pci devices agree on the same value.  Arch can override either
+@@ -3223,6 +3225,67 @@ out:
+ EXPORT_SYMBOL(pcie_set_readrq);
+ 
+ /**
++ * pcie_get_mps - get PCI Express maximum payload size
++ * @dev: PCI device to query
++ *
++ * Returns maximum payload size in bytes
++ *    or appropriate error value.
++ */
++int pcie_get_mps(struct pci_dev *dev)
++{
++	int ret, cap;
++	u16 ctl;
++
++	cap = pci_pcie_cap(dev);
++	if (!cap)
++		return -EINVAL;
++
++	ret = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl);
++	if (!ret)
++		ret = 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5);
++
++	return ret;
++}
++
++/**
++ * pcie_set_mps - set PCI Express maximum payload size
++ * @dev: PCI device to query
++ * @rq: maximum payload size in bytes
++ *    valid values are 128, 256, 512, 1024, 2048, 4096
++ *
++ * If possible sets maximum payload size
++ */
++int pcie_set_mps(struct pci_dev *dev, int mps)
++{
++	int cap, err = -EINVAL;
++	u16 ctl, v;
++
++	if (mps < 128 || mps > 4096 || !is_power_of_2(mps))
++		goto out;
++
++	v = ffs(mps) - 8;
++	if (v > dev->pcie_mpss)
++		goto out;
++	v <<= 5;
++
++	cap = pci_pcie_cap(dev);
++	if (!cap)
++		goto out;
++
++	err = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl);
++	if (err)
++		goto out;
++
++	if ((ctl & PCI_EXP_DEVCTL_PAYLOAD) != v) {
++		ctl &= ~PCI_EXP_DEVCTL_PAYLOAD;
++		ctl |= v;
++		err = pci_write_config_word(dev, cap + PCI_EXP_DEVCTL, ctl);
++	}
++out:
++	return err;
++}
++
++/**
+  * pci_select_bars - Make BAR mask from the type of resource
+  * @dev: the PCI device for which BAR mask is made
+  * @flags: resource type mask to be selected
+@@ -3505,6 +3568,10 @@ static int __init pci_setup(char *str)
+ 				pci_hotplug_io_size = memparse(str + 9, &str);
+ 			} else if (!strncmp(str, "hpmemsize=", 10)) {
+ 				pci_hotplug_mem_size = memparse(str + 10, &str);
++			} else if (!strncmp(str, "pcie_bus_safe", 13)) {
++				pcie_bus_config = PCIE_BUS_SAFE;
++			} else if (!strncmp(str, "pcie_bus_perf", 13)) {
++				pcie_bus_config = PCIE_BUS_PERFORMANCE;
+ 			} else {
+ 				printk(KERN_ERR "PCI: Unknown option `%s'\n",
+ 						str);
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -860,6 +860,8 @@ void set_pcie_port_type(struct pci_dev *
+ 	pdev->pcie_cap = pos;
+ 	pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
+ 	pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
++	pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, &reg16);
++	pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
+ }
+ 
+ void set_pcie_hotplug_bridge(struct pci_dev *pdev)
+@@ -1327,6 +1329,149 @@ int pci_scan_slot(struct pci_bus *bus, i
+ 	return nr;
+ }
+ 
++static int pcie_find_smpss(struct pci_dev *dev, void *data)
++{
++	u8 *smpss = data;
++
++	if (!pci_is_pcie(dev))
++		return 0;
++
++	/* For PCIE hotplug enabled slots not connected directly to a
++	 * PCI-E root port, there can be problems when hotplugging
++	 * devices.  This is due to the possibility of hotplugging a
++	 * device into the fabric with a smaller MPS that the devices
++	 * currently running have configured.  Modifying the MPS on the
++	 * running devices could cause a fatal bus error due to an
++	 * incoming frame being larger than the newly configured MPS.
++	 * To work around this, the MPS for the entire fabric must be
++	 * set to the minimum size.  Any devices hotplugged into this
++	 * fabric will have the minimum MPS set.  If the PCI hotplug
++	 * slot is directly connected to the root port and there are not
++	 * other devices on the fabric (which seems to be the most
++	 * common case), then this is not an issue and MPS discovery
++	 * will occur as normal.
++	 */
++	if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) ||
++	    dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT))
++		*smpss = 0;
++
++	if (*smpss > dev->pcie_mpss)
++		*smpss = dev->pcie_mpss;
++
++	return 0;
++}
++
++static void pcie_write_mps(struct pci_dev *dev, int mps)
++{
++	int rc, dev_mpss;
++
++	dev_mpss = 128 << dev->pcie_mpss;
++
++	if (pcie_bus_config == PCIE_BUS_PERFORMANCE) {
++		if (dev->bus->self) {
++			dev_dbg(&dev->bus->dev, "Bus MPSS %d\n",
++				128 << dev->bus->self->pcie_mpss);
++
++			/* For "MPS Force Max", the assumption is made that
++			 * downstream communication will never be larger than
++			 * the MRRS.  So, the MPS only needs to be configured
++			 * for the upstream communication.  This being the case,
++			 * walk from the top down and set the MPS of the child
++			 * to that of the parent bus.
++			 */
++			mps = 128 << dev->bus->self->pcie_mpss;
++			if (mps > dev_mpss)
++				dev_warn(&dev->dev, "MPS configured higher than"
++					 " maximum supported by the device.  If"
++					 " a bus issue occurs, try running with"
++					 " pci=pcie_bus_safe.\n");
++		}
++
++		dev->pcie_mpss = ffs(mps) - 8;
++	}
++
++	rc = pcie_set_mps(dev, mps);
++	if (rc)
++		dev_err(&dev->dev, "Failed attempting to set the MPS\n");
++}
++
++static void pcie_write_mrrs(struct pci_dev *dev, int mps)
++{
++	int rc, mrrs;
++
++	if (pcie_bus_config == PCIE_BUS_PERFORMANCE) {
++		int dev_mpss = 128 << dev->pcie_mpss;
++
++		/* For Max performance, the MRRS must be set to the largest
++		 * supported value.  However, it cannot be configured larger
++		 * than the MPS the device or the bus can support.  This assumes
++		 * that the largest MRRS available on the device cannot be
++		 * smaller than the device MPSS.
++		 */
++		mrrs = mps < dev_mpss ? mps : dev_mpss;
++	} else
++		/* In the "safe" case, configure the MRRS for fairness on the
++		 * bus by making all devices have the same size
++		 */
++		mrrs = mps;
++
++
++	/* MRRS is a R/W register.  Invalid values can be written, but a
++	 * subsiquent read will verify if the value is acceptable or not.
++	 * If the MRRS value provided is not acceptable (e.g., too large),
++	 * shrink the value until it is acceptable to the HW.
++ 	 */
++	while (mrrs != pcie_get_readrq(dev) && mrrs >= 128) {
++		rc = pcie_set_readrq(dev, mrrs);
++		if (rc)
++			dev_err(&dev->dev, "Failed attempting to set the MRRS\n");
++
++		mrrs /= 2;
++	}
++}
++
++static int pcie_bus_configure_set(struct pci_dev *dev, void *data)
++{
++	int mps = 128 << *(u8 *)data;
++
++	if (!pci_is_pcie(dev))
++		return 0;
++
++	dev_info(&dev->dev, "Dev MPS %d MPSS %d MRRS %d\n",
++		 pcie_get_mps(dev), 128<<dev->pcie_mpss, pcie_get_readrq(dev));
++
++	pcie_write_mps(dev, mps);
++	pcie_write_mrrs(dev, mps);
++
++	dev_info(&dev->dev, "Dev MPS %d MPSS %d MRRS %d\n",
++		 pcie_get_mps(dev), 128<<dev->pcie_mpss, pcie_get_readrq(dev));
++
++	return 0;
++}
++
++/* pcie_bus_configure_mps requires that pci_walk_bus work in a top-down,
++ * parents then children fashion.  If this changes, then this code will not
++ * work as designed.
++ */
++void pcie_bus_configure_settings(struct pci_bus *bus, u8 mpss)
++{
++	u8 smpss = mpss;
++
++	if (!bus->self)
++		return;
++
++	if (!pci_is_pcie(bus->self))
++		return;
++
++	if (pcie_bus_config == PCIE_BUS_SAFE) {
++		pcie_find_smpss(bus->self, &smpss);
++		pci_walk_bus(bus, pcie_find_smpss, &smpss);
++	}
++
++	pcie_bus_configure_set(bus->self, &smpss);
++	pci_walk_bus(bus, pcie_bus_configure_set, &smpss);
++}
++
+ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
+ {
+ 	unsigned int devfn, pass, max = bus->secondary;
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -251,7 +251,8 @@ struct pci_dev {
+ 	u8		revision;	/* PCI revision, low byte of class word */
+ 	u8		hdr_type;	/* PCI header type (`multi' flag masked out) */
+ 	u8		pcie_cap;	/* PCI-E capability offset */
+-	u8		pcie_type;	/* PCI-E device/port type */
++	u8		pcie_type:4;	/* PCI-E device/port type */
++	u8		pcie_mpss:3;	/* PCI-E Max Payload Size Supported */
+ 	u8		rom_base_reg;	/* which config register controls the ROM */
+ 	u8		pin;  		/* which interrupt pin this device uses */
+ 
+@@ -617,6 +618,16 @@ struct pci_driver {
+ /* these external functions are only available when PCI support is enabled */
+ #ifdef CONFIG_PCI
+ 
++extern void pcie_bus_configure_settings(struct pci_bus *bus, u8 smpss);
++
++enum pcie_bus_config_types {
++	PCIE_BUS_PERFORMANCE,
++	PCIE_BUS_SAFE,
++	PCIE_BUS_PEER2PEER,
++};
++
++extern enum pcie_bus_config_types pcie_bus_config;
++
+ extern struct bus_type pci_bus_type;
+ 
+ /* Do NOT directly access these two variables, unless you are arch specific pci
+@@ -796,6 +807,8 @@ int pcix_get_mmrbc(struct pci_dev *dev);
+ int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc);
+ int pcie_get_readrq(struct pci_dev *dev);
+ int pcie_set_readrq(struct pci_dev *dev, int rq);
++int pcie_get_mps(struct pci_dev *dev);
++int pcie_set_mps(struct pci_dev *dev, int mps);
+ int __pci_reset_function(struct pci_dev *dev);
+ int pci_reset_function(struct pci_dev *dev);
+ void pci_update_resource(struct pci_dev *dev, int resno);
diff --git a/queue-3.0/sched-fix-up-wchan-borkage.patch b/queue-3.0/sched-fix-up-wchan-borkage.patch
new file mode 100644
index 0000000..bc7eff7
--- /dev/null
+++ b/queue-3.0/sched-fix-up-wchan-borkage.patch
@@ -0,0 +1,35 @@
+From 6ebbe7a07b3bc40b168d2afc569a6543c020d2e3 Mon Sep 17 00:00:00 2001
+From: Simon Kirby <sim@hostway.ca>
+Date: Thu, 22 Sep 2011 17:03:46 -0700
+Subject: sched: Fix up wchan borkage
+
+From: Simon Kirby <sim@hostway.ca>
+
+commit 6ebbe7a07b3bc40b168d2afc569a6543c020d2e3 upstream.
+
+Commit c259e01a1ec ("sched: Separate the scheduler entry for
+preemption") contained a boo-boo wrecking wchan output. It forgot to
+put the new schedule() function in the __sched section and thereby
+doesn't get properly ignored for things like wchan.
+
+Tested-by: Simon Kirby <sim@hostway.ca>
+Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Link: http://lkml.kernel.org/r/20110923000346.GA25425@hostway.ca
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/sched.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -4335,7 +4335,7 @@ static inline void sched_submit_work(str
+ 		blk_schedule_flush_plug(tsk);
+ }
+ 
+-asmlinkage void schedule(void)
++asmlinkage void __sched schedule(void)
+ {
+ 	struct task_struct *tsk = current;
+ 
diff --git a/queue-3.0/sched-rt-migrate-equal-priority-tasks-to-available-cpus.patch b/queue-3.0/sched-rt-migrate-equal-priority-tasks-to-available-cpus.patch
new file mode 100644
index 0000000..4f3aba4
--- /dev/null
+++ b/queue-3.0/sched-rt-migrate-equal-priority-tasks-to-available-cpus.patch
@@ -0,0 +1,57 @@
+From 3be209a8e22cedafc1b6945608b7bb8d9887ab61 Mon Sep 17 00:00:00 2001
+From: Shawn Bohrer <sbohrer@rgmadvisors.com>
+Date: Mon, 12 Sep 2011 09:28:04 -0500
+Subject: sched/rt: Migrate equal priority tasks to available CPUs
+
+From: Shawn Bohrer <sbohrer@rgmadvisors.com>
+
+commit 3be209a8e22cedafc1b6945608b7bb8d9887ab61 upstream.
+
+Commit 43fa5460fe60dea5c610490a1d263415419c60f6 ("sched: Try not to
+migrate higher priority RT tasks") also introduced a change in behavior
+which keeps RT tasks on the same CPU if there is an equal priority RT
+task currently running even if there are empty CPUs available.
+
+This can cause unnecessary wakeup latencies, and can prevent the
+scheduler from balancing all RT tasks across available CPUs.
+
+This change causes an RT task to search for a new CPU if an equal
+priority RT task is already running on wakeup.  Lower priority tasks
+will still have to wait on higher priority tasks, but the system should
+still balance out because there is always the possibility that if there
+are both a high and low priority RT tasks on a given CPU that the high
+priority task could wakeup while the low priority task is running and
+force it to search for a better runqueue.
+
+Signed-off-by: Shawn Bohrer <sbohrer@rgmadvisors.com>
+Acked-by: Steven Rostedt <rostedt@goodmis.org>
+Tested-by: Steven Rostedt <rostedt@goodmis.org>
+Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Link: http://lkml.kernel.org/r/1315837684-18733-1-git-send-email-sbohrer@rgmadvisors.com
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/sched_rt.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/kernel/sched_rt.c
++++ b/kernel/sched_rt.c
+@@ -1038,7 +1038,7 @@ select_task_rq_rt(struct task_struct *p,
+ 	 */
+ 	if (curr && unlikely(rt_task(curr)) &&
+ 	    (curr->rt.nr_cpus_allowed < 2 ||
+-	     curr->prio < p->prio) &&
++	     curr->prio <= p->prio) &&
+ 	    (p->rt.nr_cpus_allowed > 1)) {
+ 		int target = find_lowest_rq(p);
+ 
+@@ -1569,7 +1569,7 @@ static void task_woken_rt(struct rq *rq,
+ 	    p->rt.nr_cpus_allowed > 1 &&
+ 	    rt_task(rq->curr) &&
+ 	    (rq->curr->rt.nr_cpus_allowed < 2 ||
+-	     rq->curr->prio < p->prio))
++	     rq->curr->prio <= p->prio))
+ 		push_rt_tasks(rq);
+ }
+ 
diff --git a/queue-3.0/series b/queue-3.0/series
new file mode 100644
index 0000000..bd2b856
--- /dev/null
+++ b/queue-3.0/series
@@ -0,0 +1,9 @@
+pci-set-pci-e-max-payload-size-on-fabric.patch
+pci-export-pcie_bus_configure_settings-symbol.patch
+pci-remove-mrrs-modification-from-mps-setting-code.patch
+pci-don-t-crash-when-reading-mpss-from-root-complex.patch
+sparc64-force-the-execute-bit-in-openfirmware-s-translation-entries.patch
+
+sched-rt-migrate-equal-priority-tasks-to-available-cpus.patch
+sched-fix-up-wchan-borkage.patch
+ide-disk-fix-request-requeuing.patch
diff --git a/queue-3.0/sparc64-force-the-execute-bit-in-openfirmware-s-translation-entries.patch b/queue-3.0/sparc64-force-the-execute-bit-in-openfirmware-s-translation-entries.patch
new file mode 100644
index 0000000..19527e0
--- /dev/null
+++ b/queue-3.0/sparc64-force-the-execute-bit-in-openfirmware-s-translation-entries.patch
@@ -0,0 +1,58 @@
+From f4142cba4e4065a416e78ade905bea29ff3930e6 Mon Sep 17 00:00:00 2001
+From: "David S. Miller" <davem@davemloft.net>
+Date: Thu, 29 Sep 2011 12:18:59 -0700
+Subject: sparc64: Force the execute bit in OpenFirmware's translation entries.
+Status: RO
+Content-Length: 1822
+Lines: 48
+
+From: "David S. Miller" <davem@davemloft.net>
+
+In the OF 'translations' property, the template TTEs in the mappings
+never specify the executable bit.  This is the case even though some
+of these mappings are for OF's code segment.
+
+Therefore, we need to force the execute bit on in every mapping.
+
+This problem can only really trigger on Niagara/sun4v machines and the
+history behind this is a little complicated.
+
+Previous to sun4v, the sun4u TTE entries lacked a hardware execute
+permission bit.  So OF didn't have to ever worry about setting
+anything to handle executable pages.  Any valid TTE loaded into the
+I-TLB would be respected by the chip.
+
+But sun4v Niagara chips have a real hardware enforced executable bit
+in their TTEs.  So it has to be set or else the I-TLB throws an
+instruction access exception with type code 6 (protection violation).
+
+We've been extremely fortunate to not get bitten by this in the past.
+
+The best I can tell is that the OF's mappings for it's executable code
+were mapped using permanent locked mappings on sun4v in the past.
+Therefore, the fact that we didn't have the exec bit set in the OF
+translations we would use did not matter in practice.
+
+Thanks to Greg Onufer for helping me track this down.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/sparc/mm/init_64.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/arch/sparc/mm/init_64.c
++++ b/arch/sparc/mm/init_64.c
+@@ -511,6 +511,11 @@ static void __init read_obp_translations
+ 		for (i = 0; i < prom_trans_ents; i++)
+ 			prom_trans[i].data &= ~0x0003fe0000000000UL;
+ 	}
++
++	/* Force execute bit on.  */
++	for (i = 0; i < prom_trans_ents; i++)
++		prom_trans[i].data |= (tlb_type == hypervisor ?
++				       _PAGE_EXEC_4V : _PAGE_EXEC_4U);
+ }
+ 
+ static void __init hypervisor_tlb_lock(unsigned long vaddr,