linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [RFC] powerpc: experimental of serial port driver
@ 2006-12-07 20:40 Arnd Bergmann
  2006-12-08  4:43 ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 10+ messages in thread
From: Arnd Bergmann @ 2006-12-07 20:40 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: cbe-oss-dev

This can be used for serial ports that are connected to an
OF platform bus. This is independent of whether they also
get detected as legacy_serial devices during early boot,
because the serial core makes sure it handles multiple
registrations fine.

It should be generic enough to work for more than just
8250 style devices, but those are the only ones I tested
so far.

Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>

Index: linux-2.6/drivers/serial/Makefile
===================================================================
--- linux-2.6.orig/drivers/serial/Makefile
+++ linux-2.6/drivers/serial/Makefile
@@ -56,3 +56,4 @@ obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_se
 obj-$(CONFIG_SERIAL_SGI_IOC3) += ioc3_serial.o
 obj-$(CONFIG_SERIAL_ATMEL) += atmel_serial.o
 obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
+obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
Index: linux-2.6/drivers/serial/of_serial.c
===================================================================
--- /dev/null
+++ linux-2.6/drivers/serial/of_serial.c
@@ -0,0 +1,141 @@
+/*
+ *  Serial Port driver for Open Firmware platform devices
+ *
+ *    Copyright (C) 2006 Arnd Bergmann <arnd@arndb.de>, IBM Corp.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version
+ *  2 of the License, or (at your option) any later version.
+ *
+ */
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/serial_core.h>
+#include <linux/serial_8250.h>
+
+#include <asm/of_platform.h>
+#include <asm/prom.h>
+
+/*
+ * Fill a struct uart_port for a given device node
+ */
+static int __devinit of_platform_serial_setup(struct of_device *ofdev,
+					int type, struct uart_port *port)
+{
+	struct resource resource;
+	struct device_node *np = ofdev->node;
+	const unsigned int *clk, *spd;
+	int ret;
+
+	memset(port, 0, sizeof *port);
+	spd = get_property(np, "current-speed", NULL);
+	clk = get_property(np, "clock-frequency", NULL);
+	if (!clk) {
+		dev_warn(&ofdev->dev, "no clock-frequency property set\n");
+		return -ENODEV;
+	}
+
+	ret = of_address_to_resource(np, 0, &resource);
+	if (ret) {
+		dev_warn(&ofdev->dev, "invalid address\n");
+		return ret;
+	}
+
+	spin_lock_init(&port->lock);
+	port->mapbase = resource.start;
+	port->irq = irq_of_parse_and_map(np, 0);
+	port->iotype = UPIO_MEM;
+	port->type = type;
+	port->uartclk = *clk;
+	port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP;
+	port->dev = &ofdev->dev;
+/*	if (spd) // FIXME: how to set?
+		port->speed = spd;
+*/
+	return 0;
+}
+
+/*
+ * Try to register a serial port
+ */
+static int __devinit of_platform_serial_probe(struct of_device *ofdev,
+						const struct of_device_id *id)
+{
+	struct uart_port port;
+	int port_type;
+	int ret;
+
+	port_type = (unsigned long)id->data;
+	ret = of_platform_serial_setup(ofdev, port_type, &port);
+	if (ret)
+		goto out;
+
+	switch (port_type) {
+	case PORT_UNKNOWN:
+		dev_info(&ofdev->dev, "Unknown serial port found, "
+			"attempting to use 8250 driver\n");
+		/* fallthrough */
+	case PORT_8250 ... PORT_MAX_8250:
+		ret = serial8250_register_port(&port);
+		break;
+	default:
+		/* need to add code for these */
+		ret = -ENODEV;
+		break;
+	}
+	if (ret < 0)
+		goto out;
+
+	ofdev->dev.driver_data = (void *)(unsigned long)ret;
+	return 0;
+out:
+	irq_dispose_mapping(port.irq);
+	return ret;
+}
+
+/*
+ * Release a line
+ */
+static int of_platform_serial_remove(struct of_device *ofdev)
+{
+	int line = (unsigned long)ofdev->dev.driver_data;
+	serial8250_unregister_port(line);
+	return 0;
+}
+
+/*
+ * A few common types, add more as needed.
+ */
+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 = "ns16550",  .data = (void *)PORT_16550, },
+	{ .type = "serial", .compatible = "ns16750",  .data = (void *)PORT_16750, },
+	{ .type = "serial",			      .data = (void *)PORT_UNKNOWN, },
+	{ /* end of list */ },
+};
+
+static struct of_platform_driver __devinitdata of_platform_serial_driver = {
+	.owner = THIS_MODULE,
+	.name = "of_serial",
+	.probe = of_platform_serial_probe,
+	.remove = of_platform_serial_remove,
+	.match_table = of_platform_serial_table,
+};
+
+static int __init of_platform_serial_init(void)
+{
+	return of_register_platform_driver(&of_platform_serial_driver);
+}
+module_init(of_platform_serial_init);
+
+static void __exit of_platform_serial_exit(void)
+{
+	return of_unregister_platform_driver(&of_platform_serial_driver);
+};
+module_exit(of_platform_serial_exit);
+
+MODULE_AUTHOR("Arnd Bergmann <arnd@arndb.de>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Serial Port driver for Open Firmware platform devices");
Index: linux-2.6/drivers/serial/Kconfig
===================================================================
--- linux-2.6.orig/drivers/serial/Kconfig
+++ linux-2.6/drivers/serial/Kconfig
@@ -965,4 +965,14 @@ config SERIAL_NETX_CONSOLE
 	  If you have enabled the serial port on the Motorola IMX
 	  CPU you can make it the console by answering Y to this option.
 
+config SERIAL_OF_PLATFORM
+	tristate "Serial port on Open Firmware platform bus"
+	depends on PPC_OF
+	depends on SERIAL_8250
+	help
+	  If you have a PowerPC based system that has serial ports
+	  on a platform specific bus, you should enable this option.
+	  Currently, only 8250 compatible ports are supported, but
+	  others can easily be added.
+
 endmenu

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-07 20:40 [RFC] powerpc: experimental of serial port driver Arnd Bergmann
@ 2006-12-08  4:43 ` Benjamin Herrenschmidt
  2006-12-08 14:41   ` David Woodhouse
  0 siblings, 1 reply; 10+ messages in thread
From: Benjamin Herrenschmidt @ 2006-12-08  4:43 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linuxppc-dev, cbe-oss-dev

On Thu, 2006-12-07 at 21:40 +0100, Arnd Bergmann wrote:
> This can be used for serial ports that are connected to an
> OF platform bus. This is independent of whether they also
> get detected as legacy_serial devices during early boot,
> because the serial core makes sure it handles multiple
> registrations fine.
> 
> It should be generic enough to work for more than just
> 8250 style devices, but those are the only ones I tested
> so far.
> 
> Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>

I'd rather call it 8250_of.c and have it be specific to 8250's.

Ben.

> Index: linux-2.6/drivers/serial/Makefile
> ===================================================================
> --- linux-2.6.orig/drivers/serial/Makefile
> +++ linux-2.6/drivers/serial/Makefile
> @@ -56,3 +56,4 @@ obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_se
>  obj-$(CONFIG_SERIAL_SGI_IOC3) += ioc3_serial.o
>  obj-$(CONFIG_SERIAL_ATMEL) += atmel_serial.o
>  obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
> +obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
> Index: linux-2.6/drivers/serial/of_serial.c
> ===================================================================
> --- /dev/null
> +++ linux-2.6/drivers/serial/of_serial.c
> @@ -0,0 +1,141 @@
> +/*
> + *  Serial Port driver for Open Firmware platform devices
> + *
> + *    Copyright (C) 2006 Arnd Bergmann <arnd@arndb.de>, IBM Corp.
> + *
> + *  This program is free software; you can redistribute it and/or
> + *  modify it under the terms of the GNU General Public License
> + *  as published by the Free Software Foundation; either version
> + *  2 of the License, or (at your option) any later version.
> + *
> + */
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/serial_core.h>
> +#include <linux/serial_8250.h>
> +
> +#include <asm/of_platform.h>
> +#include <asm/prom.h>
> +
> +/*
> + * Fill a struct uart_port for a given device node
> + */
> +static int __devinit of_platform_serial_setup(struct of_device *ofdev,
> +					int type, struct uart_port *port)
> +{
> +	struct resource resource;
> +	struct device_node *np = ofdev->node;
> +	const unsigned int *clk, *spd;
> +	int ret;
> +
> +	memset(port, 0, sizeof *port);
> +	spd = get_property(np, "current-speed", NULL);
> +	clk = get_property(np, "clock-frequency", NULL);
> +	if (!clk) {
> +		dev_warn(&ofdev->dev, "no clock-frequency property set\n");
> +		return -ENODEV;
> +	}
> +
> +	ret = of_address_to_resource(np, 0, &resource);
> +	if (ret) {
> +		dev_warn(&ofdev->dev, "invalid address\n");
> +		return ret;
> +	}
> +
> +	spin_lock_init(&port->lock);
> +	port->mapbase = resource.start;
> +	port->irq = irq_of_parse_and_map(np, 0);
> +	port->iotype = UPIO_MEM;
> +	port->type = type;
> +	port->uartclk = *clk;
> +	port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP;
> +	port->dev = &ofdev->dev;
> +/*	if (spd) // FIXME: how to set?
> +		port->speed = spd;
> +*/
> +	return 0;
> +}
> +
> +/*
> + * Try to register a serial port
> + */
> +static int __devinit of_platform_serial_probe(struct of_device *ofdev,
> +						const struct of_device_id *id)
> +{
> +	struct uart_port port;
> +	int port_type;
> +	int ret;
> +
> +	port_type = (unsigned long)id->data;
> +	ret = of_platform_serial_setup(ofdev, port_type, &port);
> +	if (ret)
> +		goto out;
> +
> +	switch (port_type) {
> +	case PORT_UNKNOWN:
> +		dev_info(&ofdev->dev, "Unknown serial port found, "
> +			"attempting to use 8250 driver\n");
> +		/* fallthrough */
> +	case PORT_8250 ... PORT_MAX_8250:
> +		ret = serial8250_register_port(&port);
> +		break;
> +	default:
> +		/* need to add code for these */
> +		ret = -ENODEV;
> +		break;
> +	}
> +	if (ret < 0)
> +		goto out;
> +
> +	ofdev->dev.driver_data = (void *)(unsigned long)ret;
> +	return 0;
> +out:
> +	irq_dispose_mapping(port.irq);
> +	return ret;
> +}
> +
> +/*
> + * Release a line
> + */
> +static int of_platform_serial_remove(struct of_device *ofdev)
> +{
> +	int line = (unsigned long)ofdev->dev.driver_data;
> +	serial8250_unregister_port(line);
> +	return 0;
> +}
> +
> +/*
> + * A few common types, add more as needed.
> + */
> +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 = "ns16550",  .data = (void *)PORT_16550, },
> +	{ .type = "serial", .compatible = "ns16750",  .data = (void *)PORT_16750, },
> +	{ .type = "serial",			      .data = (void *)PORT_UNKNOWN, },
> +	{ /* end of list */ },
> +};
> +
> +static struct of_platform_driver __devinitdata of_platform_serial_driver = {
> +	.owner = THIS_MODULE,
> +	.name = "of_serial",
> +	.probe = of_platform_serial_probe,
> +	.remove = of_platform_serial_remove,
> +	.match_table = of_platform_serial_table,
> +};
> +
> +static int __init of_platform_serial_init(void)
> +{
> +	return of_register_platform_driver(&of_platform_serial_driver);
> +}
> +module_init(of_platform_serial_init);
> +
> +static void __exit of_platform_serial_exit(void)
> +{
> +	return of_unregister_platform_driver(&of_platform_serial_driver);
> +};
> +module_exit(of_platform_serial_exit);
> +
> +MODULE_AUTHOR("Arnd Bergmann <arnd@arndb.de>");
> +MODULE_LICENSE("GPL");
> +MODULE_DESCRIPTION("Serial Port driver for Open Firmware platform devices");
> Index: linux-2.6/drivers/serial/Kconfig
> ===================================================================
> --- linux-2.6.orig/drivers/serial/Kconfig
> +++ linux-2.6/drivers/serial/Kconfig
> @@ -965,4 +965,14 @@ config SERIAL_NETX_CONSOLE
>  	  If you have enabled the serial port on the Motorola IMX
>  	  CPU you can make it the console by answering Y to this option.
>  
> +config SERIAL_OF_PLATFORM
> +	tristate "Serial port on Open Firmware platform bus"
> +	depends on PPC_OF
> +	depends on SERIAL_8250
> +	help
> +	  If you have a PowerPC based system that has serial ports
> +	  on a platform specific bus, you should enable this option.
> +	  Currently, only 8250 compatible ports are supported, but
> +	  others can easily be added.
> +
>  endmenu
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-08  4:43 ` Benjamin Herrenschmidt
@ 2006-12-08 14:41   ` David Woodhouse
  2006-12-08 15:12     ` Arnd Bergmann
  2006-12-08 20:50     ` Benjamin Herrenschmidt
  0 siblings, 2 replies; 10+ messages in thread
From: David Woodhouse @ 2006-12-08 14:41 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, cbe-oss-dev, Arnd Bergmann

On Fri, 2006-12-08 at 15:43 +1100, Benjamin Herrenschmidt wrote:
> I'd rather call it 8250_of.c and have it be specific to 8250's.

Didn't we already do that once?

-- 
dwmw2

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-08 14:41   ` David Woodhouse
@ 2006-12-08 15:12     ` Arnd Bergmann
  2006-12-08 20:50       ` Benjamin Herrenschmidt
  2006-12-08 20:50     ` Benjamin Herrenschmidt
  1 sibling, 1 reply; 10+ messages in thread
From: Arnd Bergmann @ 2006-12-08 15:12 UTC (permalink / raw)
  To: David Woodhouse; +Cc: cbe-oss-dev, linuxppc-dev

On Friday 08 December 2006 15:41, David Woodhouse wrote:
> On Fri, 2006-12-08 at 15:43 +1100, Benjamin Herrenschmidt wrote:
> > I'd rather call it 8250_of.c and have it be specific to 8250's.
> 
> Didn't we already do that once?
> 
You submitted a patch once to create a file with the same name,
but different intend, see
http://ozlabs.org/pipermail/linuxppc-dev/2005-August/019464.html

I can't tell if it was ever merged, but it doesn't look like it.
My driver is only meaningful for platforms that use the new style
of_platform_device autoprobing. It will make the serial ports
show up correctly in sysfs, even if they were not detected by
the legacy_serial code we use for 8250 style console ports. This
should be the same thing we do for 8250 PCI ports when the
8250_pci driver.

	Arnd <><

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-08 14:41   ` David Woodhouse
  2006-12-08 15:12     ` Arnd Bergmann
@ 2006-12-08 20:50     ` Benjamin Herrenschmidt
  1 sibling, 0 replies; 10+ messages in thread
From: Benjamin Herrenschmidt @ 2006-12-08 20:50 UTC (permalink / raw)
  To: David Woodhouse; +Cc: linuxppc-dev, cbe-oss-dev, Arnd Bergmann

On Fri, 2006-12-08 at 14:41 +0000, David Woodhouse wrote:
> On Fri, 2006-12-08 at 15:43 +1100, Benjamin Herrenschmidt wrote:
> > I'd rather call it 8250_of.c and have it be specific to 8250's.
> 
> Didn't we already do that once?

Not really, right now, we use a platform driver (though it should work,
again, I'm not completely sure why we need that at all).

legacy_serial.c should be detecting all 8250 type ports at boot, init
them, setup a udbg console for them, and later on, register them as
platform devices with the 8250 driver. The problem right now is that the
code in there will only do that for known busses, which doesn't include
opb. So we should just fix it for opb and things should work.

Ben.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-08 15:12     ` Arnd Bergmann
@ 2006-12-08 20:50       ` Benjamin Herrenschmidt
  2006-12-08 23:42         ` Arnd Bergmann
  0 siblings, 1 reply; 10+ messages in thread
From: Benjamin Herrenschmidt @ 2006-12-08 20:50 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linuxppc-dev, David Woodhouse, cbe-oss-dev


> I can't tell if it was ever merged, but it doesn't look like it.
> My driver is only meaningful for platforms that use the new style
> of_platform_device autoprobing. It will make the serial ports
> show up correctly in sysfs, even if they were not detected by
> the legacy_serial code we use for 8250 style console ports. This
> should be the same thing we do for 8250 PCI ports when the
> 8250_pci driver.

We sill need to fixup legacy_serial to detect them on opb right ?

Ben.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-08 20:50       ` Benjamin Herrenschmidt
@ 2006-12-08 23:42         ` Arnd Bergmann
  2006-12-09  2:13           ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 10+ messages in thread
From: Arnd Bergmann @ 2006-12-08 23:42 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: David Woodhouse, cbe-oss-dev

On Friday 08 December 2006 21:50, Benjamin Herrenschmidt wrote:
> We sill need to fixup legacy_serial to detect them on opb right ?

Yes, I have another patch for that. Currently, the port registers
as compatible="ns16750", which is different from all the others
in legacy_serial. Do you think it should be 
compatible="nc16750\0ns16550" instead, so we can use the same
as the others? It actually _is_ compatible to 16550 anyway.

	Arnd <><

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-08 23:42         ` Arnd Bergmann
@ 2006-12-09  2:13           ` Benjamin Herrenschmidt
  2006-12-09 16:44             ` Sergei Shtylyov
  0 siblings, 1 reply; 10+ messages in thread
From: Benjamin Herrenschmidt @ 2006-12-09  2:13 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: linuxppc-dev, David Woodhouse, cbe-oss-dev

On Sat, 2006-12-09 at 00:42 +0100, Arnd Bergmann wrote:
> On Friday 08 December 2006 21:50, Benjamin Herrenschmidt wrote:
> > We sill need to fixup legacy_serial to detect them on opb right ?
> 
> Yes, I have another patch for that. Currently, the port registers
> as compatible="ns16750", which is different from all the others
> in legacy_serial. Do you think it should be 
> compatible="nc16750\0ns16550" instead, so we can use the same
> as the others? It actually _is_ compatible to 16550 anyway.

Both strings then.

Ben.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-09  2:13           ` Benjamin Herrenschmidt
@ 2006-12-09 16:44             ` Sergei Shtylyov
  2006-12-09 17:39               ` David Woodhouse
  0 siblings, 1 reply; 10+ messages in thread
From: Sergei Shtylyov @ 2006-12-09 16:44 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: linuxppc-dev, David Woodhouse, cbe-oss-dev, Arnd Bergmann

Hello.

Benjamin Herrenschmidt wrote:

>>>We sill need to fixup legacy_serial to detect them on opb right ?

>>Yes, I have another patch for that. Currently, the port registers
>>as compatible="ns16750", which is different from all the others
>>in legacy_serial. Do you think it should be 
>>compatible="nc16750\0ns16550" instead, so we can use the same
>>as the others? It actually _is_ compatible to 16550 anyway.

> Both strings then.

    Then it should be something like "nc16750\0ns16550\0ns16450\08250".

> Ben.

WBR, Sergei

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] powerpc: experimental of serial port driver
  2006-12-09 16:44             ` Sergei Shtylyov
@ 2006-12-09 17:39               ` David Woodhouse
  0 siblings, 0 replies; 10+ messages in thread
From: David Woodhouse @ 2006-12-09 17:39 UTC (permalink / raw)
  To: Sergei Shtylyov; +Cc: cbe-oss-dev, Arnd Bergmann, linuxppc-dev

On Sat, 2006-12-09 at 19:44 +0300, Sergei Shtylyov wrote:
> Then it should be something like "nc16750\0ns16550\0ns16450\08250". 

Those aren't particularly interesting distinctions -- they're dead easy
to probe for. The really interesting one is the type of SuperIO chip
it's compatible with -- which specifies how you get baud rates above
115200. For some chips (SMSC iirc) you have a 'magic multiplier'; by
setting the divisor to 0x8001 or 0x8002 you get 230400/460800 baud resp.
For NatSemi type chips you have baud rate divisors in an alternate bank,
and you get a higher baud_base if you use those but if you use the
registers in bank zero it reverts to 115200, etc. 

-- 
dwmw2

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2006-12-09 17:39 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-07 20:40 [RFC] powerpc: experimental of serial port driver Arnd Bergmann
2006-12-08  4:43 ` Benjamin Herrenschmidt
2006-12-08 14:41   ` David Woodhouse
2006-12-08 15:12     ` Arnd Bergmann
2006-12-08 20:50       ` Benjamin Herrenschmidt
2006-12-08 23:42         ` Arnd Bergmann
2006-12-09  2:13           ` Benjamin Herrenschmidt
2006-12-09 16:44             ` Sergei Shtylyov
2006-12-09 17:39               ` David Woodhouse
2006-12-08 20:50     ` Benjamin Herrenschmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).