* [PATCH 1/6] PCI: add pci_common_swizzle() for INTx swizzling
2008-12-17 4:36 [PATCH 0/6] PCI: use common INTx swizzling loop Bjorn Helgaas
@ 2008-12-17 4:36 ` Bjorn Helgaas
2009-01-05 18:53 ` Jesse Barnes
2008-12-17 4:37 ` [PATCH 2/6] PCI: alpha: use generic INTx swizzle from PCI core Bjorn Helgaas
` (4 subsequent siblings)
5 siblings, 1 reply; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:36 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
This patch adds pci_common_swizzle(), which swizzles INTx values all the
way up to a root bridge.
This common implementation can replace several architecture-specific
ones. This should someday be combined with pci_get_interrupt_pin(),
but I left it separate for now to make reviewing easier.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
drivers/pci/pci.c | 20 ++++++++++++++++++++
include/linux/pci.h | 1 +
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 388a32a..6988089 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1369,6 +1369,26 @@ pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge)
}
/**
+ * pci_common_swizzle - swizzle INTx all the way to root bridge
+ * @dev: the PCI device
+ * @pinp: pointer to the INTx pin value (1=INTA, 2=INTB, 3=INTD, 4=INTD)
+ *
+ * Perform INTx swizzling for a device. This traverses through all PCI-to-PCI
+ * bridges all the way up to a PCI root bus.
+ */
+u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp)
+{
+ u8 pin = *pinp;
+
+ while (dev->bus->self) {
+ pin = pci_swizzle_interrupt_pin(dev, pin);
+ dev = dev->bus->self;
+ }
+ *pinp = pin;
+ return PCI_SLOT(dev->devfn);
+}
+
+/**
* pci_release_region - Release a PCI bar
* @pdev: PCI device whose resources were previously reserved by pci_request_region
* @bar: BAR to release
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 4be596f..e89d0b7 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -529,6 +529,7 @@ struct resource *pci_find_parent_resource(const struct pci_dev *dev,
struct resource *res);
u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin);
int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);
+u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp);
extern struct pci_dev *pci_dev_get(struct pci_dev *dev);
extern void pci_dev_put(struct pci_dev *dev);
extern void pci_remove_bus(struct pci_bus *b);
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH 1/6] PCI: add pci_common_swizzle() for INTx swizzling
2008-12-17 4:36 ` [PATCH 1/6] PCI: add pci_common_swizzle() for INTx swizzling Bjorn Helgaas
@ 2009-01-05 18:53 ` Jesse Barnes
2009-01-05 18:53 ` Jesse Barnes
0 siblings, 1 reply; 11+ messages in thread
From: Jesse Barnes @ 2009-01-05 18:53 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
On Tuesday, December 16, 2008 8:36 pm Bjorn Helgaas wrote:
> This patch adds pci_common_swizzle(), which swizzles INTx values all the
> way up to a root bridge.
>
> This common implementation can replace several architecture-specific
> ones. This should someday be combined with pci_get_interrupt_pin(),
> but I left it separate for now to make reviewing easier.
>
> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
We got acks from the arch maintainers on the previous series, so I'm assuming
these ones are ok too (please pipe up if not, they're in my linux-next queue).
Thanks,
--
Jesse Barnes, Intel Open Source Technology Center
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/6] PCI: add pci_common_swizzle() for INTx swizzling
2009-01-05 18:53 ` Jesse Barnes
@ 2009-01-05 18:53 ` Jesse Barnes
0 siblings, 0 replies; 11+ messages in thread
From: Jesse Barnes @ 2009-01-05 18:53 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
On Tuesday, December 16, 2008 8:36 pm Bjorn Helgaas wrote:
> This patch adds pci_common_swizzle(), which swizzles INTx values all the
> way up to a root bridge.
>
> This common implementation can replace several architecture-specific
> ones. This should someday be combined with pci_get_interrupt_pin(),
> but I left it separate for now to make reviewing easier.
>
> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
We got acks from the arch maintainers on the previous series, so I'm assuming
these ones are ok too (please pipe up if not, they're in my linux-next queue).
Thanks,
--
Jesse Barnes, Intel Open Source Technology Center
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/6] PCI: alpha: use generic INTx swizzle from PCI core
2008-12-17 4:36 [PATCH 0/6] PCI: use common INTx swizzling loop Bjorn Helgaas
2008-12-17 4:36 ` [PATCH 1/6] PCI: add pci_common_swizzle() for INTx swizzling Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
2008-12-17 4:37 ` [PATCH 3/6] PCI: arm: " Bjorn Helgaas
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Note that pci_common_swizzle() loops based on dev->bus->self, not
dev->bus->parent as the alpha common_swizzle() did. I think they
are equivalent for this purpose.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/alpha/kernel/pci.c | 18 ------------------
arch/alpha/kernel/pci_impl.h | 4 ++--
2 files changed, 2 insertions(+), 20 deletions(-)
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index b03d9f4..a3b9388 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -320,24 +320,6 @@ pcibios_update_irq(struct pci_dev *dev, int irq)
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
}
-/* Most Alphas have straight-forward swizzling needs. */
-
-u8 __init
-common_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- u8 pin = *pinp;
-
- while (dev->bus->parent) {
- pin = pci_swizzle_interrupt_pin(dev, pin);
- /* Move up the chain of bridges. */
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- /* The slot is the slot of the last bridge. */
- return PCI_SLOT(dev->devfn);
-}
-
void
pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
struct resource *res)
diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h
index 7336651..00edd04 100644
--- a/arch/alpha/kernel/pci_impl.h
+++ b/arch/alpha/kernel/pci_impl.h
@@ -107,7 +107,7 @@ struct pci_iommu_arena;
* Thus, each swizzle is ((pin-1) + (device#-4)) % 4
*
* pci_swizzle_interrupt_pin() swizzles for exactly one bridge. The routine
- * common_swizzle below handles multiple bridges. But there are a
+ * pci_common_swizzle() handles multiple bridges. But there are a
* couple boards that do strange things.
*/
@@ -179,7 +179,7 @@ extern int pci_probe_only;
extern unsigned long alpha_agpgart_size;
extern void common_init_pci(void);
-extern u8 common_swizzle(struct pci_dev *, u8 *);
+#define common_swizzle pci_common_swizzle
extern struct pci_controller *alloc_pci_controller(void);
extern struct resource *alloc_resource(void);
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 3/6] PCI: arm: use generic INTx swizzle from PCI core
2008-12-17 4:36 [PATCH 0/6] PCI: use common INTx swizzling loop Bjorn Helgaas
2008-12-17 4:36 ` [PATCH 1/6] PCI: add pci_common_swizzle() for INTx swizzling Bjorn Helgaas
2008-12-17 4:37 ` [PATCH 2/6] PCI: alpha: use generic INTx swizzle from PCI core Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
2008-12-17 4:37 ` [PATCH 4/6] PCI: mips: " Bjorn Helgaas
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/arm/include/asm/mach/pci.h | 2 +-
arch/arm/kernel/bios32.c | 27 ---------------------------
2 files changed, 1 insertions(+), 28 deletions(-)
diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h
index 32da1ae..a38bdc7 100644
--- a/arch/arm/include/asm/mach/pci.h
+++ b/arch/arm/include/asm/mach/pci.h
@@ -42,7 +42,7 @@ struct pci_sys_data {
/*
* This is the standard PCI-PCI bridge swizzling algorithm.
*/
-u8 pci_std_swizzle(struct pci_dev *dev, u8 *pinp);
+#define pci_std_swizzle pci_common_swizzle
/*
* Call this with your hw_pci struct to initialise the PCI system.
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index 5c5a0bc..8096819 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -480,33 +480,6 @@ EXPORT_SYMBOL(pcibios_bus_to_resource);
#endif
/*
- * This is the standard PCI-PCI bridge swizzling algorithm:
- *
- * Dev: 0 1 2 3
- * A A B C D
- * B B C D A
- * C C D A B
- * D D A B C
- * ^^^^^^^^^^ irq pin on bridge
- */
-u8 __devinit pci_std_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- int pin = *pinp;
-
- while (dev->bus->self) {
- pin = pci_swizzle_interrupt_pin(dev, pin);
- /*
- * move up the chain of bridges,
- * swizzling as we go.
- */
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- return PCI_SLOT(dev->devfn);
-}
-
-/*
* Swizzle the device pin each time we cross a bridge.
* This might update pin and returns the slot number.
*/
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 4/6] PCI: mips: use generic INTx swizzle from PCI core
2008-12-17 4:36 [PATCH 0/6] PCI: use common INTx swizzling loop Bjorn Helgaas
` (2 preceding siblings ...)
2008-12-17 4:37 ` [PATCH 3/6] PCI: arm: " Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
2008-12-17 4:37 ` [PATCH 5/6] PCI: sh: " Bjorn Helgaas
2008-12-17 4:37 ` [PATCH 6/6] PCI: x86/visws: " Bjorn Helgaas
5 siblings, 0 replies; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Note that pci_common_swizzle() loops based on dev->bus->self, not
dev->bus->parent as the mips common_swizzle() did. I think they
are equivalent for this purpose.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/mips/pci/pci.c | 17 +----------------
1 files changed, 1 insertions(+), 16 deletions(-)
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index fa63dc2..b0eb9e7 100644
--- a/arch/mips/pci/pci.c
+++ b/arch/mips/pci/pci.c
@@ -149,21 +149,6 @@ out:
"Skipping PCI bus scan due to resource conflict\n");
}
-static u8 __init common_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- u8 pin = *pinp;
-
- while (dev->bus->parent) {
- pin = pci_swizzle_interrupt_pin(dev, pin);
- /* Move up the chain of bridges. */
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- /* The slot is the slot of the last bridge. */
- return PCI_SLOT(dev->devfn);
-}
-
static int __init pcibios_init(void)
{
struct pci_controller *hose;
@@ -172,7 +157,7 @@ static int __init pcibios_init(void)
for (hose = hose_head; hose; hose = hose->next)
pcibios_scanbus(hose);
- pci_fixup_irqs(common_swizzle, pcibios_map_irq);
+ pci_fixup_irqs(pci_common_swizzle, pcibios_map_irq);
pci_initialized = 1;
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 5/6] PCI: sh: use generic INTx swizzle from PCI core
2008-12-17 4:36 [PATCH 0/6] PCI: use common INTx swizzling loop Bjorn Helgaas
` (3 preceding siblings ...)
2008-12-17 4:37 ` [PATCH 4/6] PCI: mips: " Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
2008-12-17 4:37 ` Bjorn Helgaas
2008-12-17 4:37 ` [PATCH 6/6] PCI: x86/visws: " Bjorn Helgaas
5 siblings, 1 reply; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Note that pci_common_swizzle() loops based on dev->bus->self, not
dev->bus->parent as the sh simple_swizzle() did. I think they
are equivalent for this purpose.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/sh/drivers/pci/pci.c | 17 +----------------
1 files changed, 1 insertions(+), 16 deletions(-)
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c
index aea3b6b..e36c7b8 100644
--- a/arch/sh/drivers/pci/pci.c
+++ b/arch/sh/drivers/pci/pci.c
@@ -21,21 +21,6 @@
#include <linux/init.h>
#include <asm/io.h>
-static u8 __init simple_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- u8 pin = *pinp;
-
- while (dev->bus->parent) {
- pin = pci_swizzle_interrupt_pin(dev, pin);
- /* Move up the chain of bridges. */
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- /* The slot is the slot of the last bridge. */
- return PCI_SLOT(dev->devfn);
-}
-
static int __init pcibios_init(void)
{
struct pci_channel *p;
@@ -56,7 +41,7 @@ static int __init pcibios_init(void)
busno = bus->subordinate + 1;
}
- pci_fixup_irqs(simple_swizzle, pcibios_map_platform_irq);
+ pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq);
return 0;
}
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 5/6] PCI: sh: use generic INTx swizzle from PCI core
2008-12-17 4:37 ` [PATCH 5/6] PCI: sh: " Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
0 siblings, 0 replies; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Note that pci_common_swizzle() loops based on dev->bus->self, not
dev->bus->parent as the sh simple_swizzle() did. I think they
are equivalent for this purpose.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/sh/drivers/pci/pci.c | 17 +----------------
1 files changed, 1 insertions(+), 16 deletions(-)
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c
index aea3b6b..e36c7b8 100644
--- a/arch/sh/drivers/pci/pci.c
+++ b/arch/sh/drivers/pci/pci.c
@@ -21,21 +21,6 @@
#include <linux/init.h>
#include <asm/io.h>
-static u8 __init simple_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- u8 pin = *pinp;
-
- while (dev->bus->parent) {
- pin = pci_swizzle_interrupt_pin(dev, pin);
- /* Move up the chain of bridges. */
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- /* The slot is the slot of the last bridge. */
- return PCI_SLOT(dev->devfn);
-}
-
static int __init pcibios_init(void)
{
struct pci_channel *p;
@@ -56,7 +41,7 @@ static int __init pcibios_init(void)
busno = bus->subordinate + 1;
}
- pci_fixup_irqs(simple_swizzle, pcibios_map_platform_irq);
+ pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq);
return 0;
}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 6/6] PCI: x86/visws: use generic INTx swizzle from PCI core
2008-12-17 4:36 [PATCH 0/6] PCI: use common INTx swizzling loop Bjorn Helgaas
` (4 preceding siblings ...)
2008-12-17 4:37 ` [PATCH 5/6] PCI: sh: " Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
2008-12-17 4:37 ` Bjorn Helgaas
5 siblings, 1 reply; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/x86/pci/visws.c | 15 +--------------
1 files changed, 1 insertions(+), 14 deletions(-)
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c
index 6b5ed3d..fd7b76f 100644
--- a/arch/x86/pci/visws.c
+++ b/arch/x86/pci/visws.c
@@ -25,19 +25,6 @@ static void pci_visws_disable_irq(struct pci_dev *dev) { }
unsigned int pci_bus0, pci_bus1;
-static u8 __init visws_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- u8 pin = *pinp;
-
- while (dev->bus->self) { /* Move up the chain of bridges. */
- pin = pci_swizzle_interrupt_pin(dev, pin);
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- return PCI_SLOT(dev->devfn);
-}
-
static int __init visws_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
int irq, bus = dev->bus->number;
@@ -102,7 +89,7 @@ int __init pci_visws_init(void)
raw_pci_ops = &pci_direct_conf1;
pci_scan_bus_with_sysdata(pci_bus0);
pci_scan_bus_with_sysdata(pci_bus1);
- pci_fixup_irqs(visws_swizzle, visws_map_irq);
+ pci_fixup_irqs(pci_common_swizzle, visws_map_irq);
pcibios_resource_survey();
return 0;
}
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 6/6] PCI: x86/visws: use generic INTx swizzle from PCI core
2008-12-17 4:37 ` [PATCH 6/6] PCI: x86/visws: " Bjorn Helgaas
@ 2008-12-17 4:37 ` Bjorn Helgaas
0 siblings, 0 replies; 11+ messages in thread
From: Bjorn Helgaas @ 2008-12-17 4:37 UTC (permalink / raw)
To: Jesse Barnes
Cc: linux-pci, linux-arch, Ivan Kokshaysky, Russell King,
Ralf Baechle, Paul Mundt, Thomas Gleixner, Ingo Molnar, hpa
Use the generic pci_common_swizzle() instead of arch-specific code.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/x86/pci/visws.c | 15 +--------------
1 files changed, 1 insertions(+), 14 deletions(-)
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c
index 6b5ed3d..fd7b76f 100644
--- a/arch/x86/pci/visws.c
+++ b/arch/x86/pci/visws.c
@@ -25,19 +25,6 @@ static void pci_visws_disable_irq(struct pci_dev *dev) { }
unsigned int pci_bus0, pci_bus1;
-static u8 __init visws_swizzle(struct pci_dev *dev, u8 *pinp)
-{
- u8 pin = *pinp;
-
- while (dev->bus->self) { /* Move up the chain of bridges. */
- pin = pci_swizzle_interrupt_pin(dev, pin);
- dev = dev->bus->self;
- }
- *pinp = pin;
-
- return PCI_SLOT(dev->devfn);
-}
-
static int __init visws_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{
int irq, bus = dev->bus->number;
@@ -102,7 +89,7 @@ int __init pci_visws_init(void)
raw_pci_ops = &pci_direct_conf1;
pci_scan_bus_with_sysdata(pci_bus0);
pci_scan_bus_with_sysdata(pci_bus1);
- pci_fixup_irqs(visws_swizzle, visws_map_irq);
+ pci_fixup_irqs(pci_common_swizzle, visws_map_irq);
pcibios_resource_survey();
return 0;
}
^ permalink raw reply related [flat|nested] 11+ messages in thread