linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Work around negative s16 battery current on Acer
@ 2009-07-01 18:20 Hector Martin
  2009-07-01 18:27 ` Alexey Starikovskiy
  2009-07-01 18:29 ` Andrew Morton
  0 siblings, 2 replies; 8+ messages in thread
From: Hector Martin @ 2009-07-01 18:20 UTC (permalink / raw)
  To: Alexey Starikovskiy, Len Brown; +Cc: linux-acpi, Andrew Morton

[-- Attachment #1: Type: text/plain, Size: 836 bytes --]

My Acer Aspire 8930G laptop reports the battery current as a 16-bit
signed negative when it is charging. It also reports it as 0x10000 when
the current is 0. This patch adds a quirk for this which takes the
absolute value of the reported current cast to an s16. This is a DSDT
bug present in the latest BIOS revision (the EC register is 16 bits
signed and the DSDT attempts to take the 16-bit two's complement of
this, which works for discharge but not charge. It also breaks zero
values because a 32-bit register is used and the high bits aren't thrown
away).

I've enabled this for all Acer systems which report in mA units. This
should be safe since it won't break compliant systems unless they report
a current above 32A, which is insane.

-- 
Hector Martin (hector@marcansoft.com)
Public Key: http://www.marcansoft.com/marcan.asc


[-- Attachment #2: acpi-battery-acer-rate-quirk.patch --]
[-- Type: text/plain, Size: 1482 bytes --]

Signed-off-by: Hector Martin <hector@marcansoft.com>
--- linux/drivers/acpi/battery.c.old	2009-07-01 19:17:33.000000000 +0200
+++ linux/drivers/acpi/battery.c	2009-07-01 19:52:43.000000000 +0200
@@ -84,6 +84,10 @@
 
 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
 
+/* For buggy DSDTs that report negative 16-bit values for either charging
+ * or discharging and/or report 0 as 65536 due to bad math.
+ */
+#define QUIRK_SIGNED16_CURRENT 0x0001
 
 struct acpi_battery {
 	struct mutex lock;
@@ -111,6 +115,7 @@
 	int state;
 	int power_unit;
 	u8 alarm_present;
+	long quirks;
 };
 
 #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
@@ -387,6 +392,10 @@
 				 state_offsets, ARRAY_SIZE(state_offsets));
 	battery->update_time = jiffies;
 	kfree(buffer.pointer);
+
+	if (battery->quirks & QUIRK_SIGNED16_CURRENT)
+		battery->current_now = abs((s16)battery->current_now);
+
 	return result;
 }
 
@@ -492,6 +501,14 @@
 }
 #endif
 
+static void acpi_battery_quirks(struct acpi_battery *battery)
+{
+	battery->quirks = 0;
+	if (dmi_name_in_vendors("Acer") && battery->power_unit) {
+		battery->quirks |= QUIRK_SIGNED16_CURRENT;
+	}
+}
+
 static int acpi_battery_update(struct acpi_battery *battery)
 {
 	int result, old_present = acpi_battery_present(battery);
@@ -510,6 +527,7 @@
 		result = acpi_battery_get_info(battery);
 		if (result)
 			return result;
+		acpi_battery_quirks(battery);
 		acpi_battery_init_alarm(battery);
 	}
 #ifdef CONFIG_ACPI_SYSFS_POWER

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

* Re: [PATCH] Work around negative s16 battery current on Acer
  2009-07-01 18:20 [PATCH] Work around negative s16 battery current on Acer Hector Martin
@ 2009-07-01 18:27 ` Alexey Starikovskiy
  2009-07-01 18:29 ` Andrew Morton
  1 sibling, 0 replies; 8+ messages in thread
From: Alexey Starikovskiy @ 2009-07-01 18:27 UTC (permalink / raw)
  To: Hector Martin; +Cc: Len Brown, linux-acpi, Andrew Morton

Hector Martin пишет:
> My Acer Aspire 8930G laptop reports the battery current as a 16-bit
> signed negative when it is charging. It also reports it as 0x10000 when
> the current is 0. This patch adds a quirk for this which takes the
> absolute value of the reported current cast to an s16. This is a DSDT
> bug present in the latest BIOS revision (the EC register is 16 bits
> signed and the DSDT attempts to take the 16-bit two's complement of
> this, which works for discharge but not charge. It also breaks zero
> values because a 32-bit register is used and the high bits aren't thrown
> away).
> 
> I've enabled this for all Acer systems which report in mA units. This
> should be safe since it won't break compliant systems unless they report
> a current above 32A, which is insane.
> 
> 
Could you please use bitfields? Please take a look at drivers/acpi/ec.c as an example.

Thanks,
Alex.
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH] Work around negative s16 battery current on Acer
  2009-07-01 18:20 [PATCH] Work around negative s16 battery current on Acer Hector Martin
  2009-07-01 18:27 ` Alexey Starikovskiy
@ 2009-07-01 18:29 ` Andrew Morton
  2009-07-01 18:38   ` Alexey Starikovskiy
  2009-07-02  3:51   ` Hector Martin
  1 sibling, 2 replies; 8+ messages in thread
From: Andrew Morton @ 2009-07-01 18:29 UTC (permalink / raw)
  To: Hector Martin; +Cc: astarikovskiy, lenb, linux-acpi

On Wed, 01 Jul 2009 20:20:41 +0200
Hector Martin <hector@marcansoft.com> wrote:

> My Acer Aspire 8930G laptop reports the battery current as a 16-bit
> signed negative when it is charging. It also reports it as 0x10000 when
> the current is 0. This patch adds a quirk for this which takes the
> absolute value of the reported current cast to an s16. This is a DSDT
> bug present in the latest BIOS revision (the EC register is 16 bits
> signed and the DSDT attempts to take the 16-bit two's complement of
> this, which works for discharge but not charge. It also breaks zero
> values because a 32-bit register is used and the high bits aren't thrown
> away).
> 
> I've enabled this for all Acer systems which report in mA units. This
> should be safe since it won't break compliant systems unless they report
> a current above 32A, which is insane.
> 
>
> ...
>
> +++ a/drivers/acpi/battery.c
> @@ -85,6 +85,10 @@ static const struct acpi_device_id batte
>  
>  MODULE_DEVICE_TABLE(acpi, battery_device_ids);
>  
> +/* For buggy DSDTs that report negative 16-bit values for either charging
> + * or discharging and/or report 0 as 65536 due to bad math.
> + */
> +#define QUIRK_SIGNED16_CURRENT 0x0001
>  
>  struct acpi_battery {
>  	struct mutex lock;
> @@ -112,6 +116,7 @@ struct acpi_battery {
>  	int state;
>  	int power_unit;
>  	u8 alarm_present;
> +	long quirks;
>  };
>  
>  #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
> @@ -390,6 +395,10 @@ static int acpi_battery_get_state(struct
>  				 state_offsets, ARRAY_SIZE(state_offsets));
>  	battery->update_time = jiffies;
>  	kfree(buffer.pointer);
> +
> +	if (battery->quirks & QUIRK_SIGNED16_CURRENT)
> +		battery->current_now = abs((s16)battery->current_now);
> +
>  	return result;

acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
kernel version are you patching here?


Also, I wonder if we need a quirk.  Is a "negative" value _ever_
correct?  If not, could we do the negation unconditionally?


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

* Re: [PATCH] Work around negative s16 battery current on Acer
  2009-07-01 18:29 ` Andrew Morton
@ 2009-07-01 18:38   ` Alexey Starikovskiy
  2009-07-01 20:19     ` Hector Martin
  2009-07-02  3:51   ` Hector Martin
  1 sibling, 1 reply; 8+ messages in thread
From: Alexey Starikovskiy @ 2009-07-01 18:38 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Hector Martin, lenb, linux-acpi

Andrew Morton пишет:
> On Wed, 01 Jul 2009 20:20:41 +0200
> Hector Martin <hector@marcansoft.com> wrote:
> 
>> My Acer Aspire 8930G laptop reports the battery current as a 16-bit
>> signed negative when it is charging. It also reports it as 0x10000 when
>> the current is 0. This patch adds a quirk for this which takes the
>> absolute value of the reported current cast to an s16. This is a DSDT
>> bug present in the latest BIOS revision (the EC register is 16 bits
>> signed and the DSDT attempts to take the 16-bit two's complement of
>> this, which works for discharge but not charge. It also breaks zero
>> values because a 32-bit register is used and the high bits aren't thrown
>> away).
>>
>> I've enabled this for all Acer systems which report in mA units. This
>> should be safe since it won't break compliant systems unless they report
>> a current above 32A, which is insane.
>>
>>
>> ...
>>
>> +++ a/drivers/acpi/battery.c
>> @@ -85,6 +85,10 @@ static const struct acpi_device_id batte
>>  
>>  MODULE_DEVICE_TABLE(acpi, battery_device_ids);
>>  
>> +/* For buggy DSDTs that report negative 16-bit values for either charging
>> + * or discharging and/or report 0 as 65536 due to bad math.
>> + */
>> +#define QUIRK_SIGNED16_CURRENT 0x0001
>>  
>>  struct acpi_battery {
>>  	struct mutex lock;
>> @@ -112,6 +116,7 @@ struct acpi_battery {
>>  	int state;
>>  	int power_unit;
>>  	u8 alarm_present;
>> +	long quirks;
>>  };
>>  
>>  #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
>> @@ -390,6 +395,10 @@ static int acpi_battery_get_state(struct
>>  				 state_offsets, ARRAY_SIZE(state_offsets));
>>  	battery->update_time = jiffies;
>>  	kfree(buffer.pointer);
>> +
>> +	if (battery->quirks & QUIRK_SIGNED16_CURRENT)
>> +		battery->current_now = abs((s16)battery->current_now);
>> +
>>  	return result;
> 
> acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
> kernel version are you patching here?
> 
> 
> Also, I wonder if we need a quirk.  Is a "negative" value _ever_
> correct?  If not, could we do the negation unconditionally?
> 
The problem is that the variable is s64 and not "negative" value is related to s16 portion of it.
It's possible to do this only for "current" mode, in "power" mode values of "negative" s16 range may be valid positive values.

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH] Work around negative s16 battery current on Acer
  2009-07-01 18:38   ` Alexey Starikovskiy
@ 2009-07-01 20:19     ` Hector Martin
  0 siblings, 0 replies; 8+ messages in thread
From: Hector Martin @ 2009-07-01 20:19 UTC (permalink / raw)
  To: Alexey Starikovskiy; +Cc: Andrew Morton, lenb, linux-acpi

[-- Attachment #1: Type: text/plain, Size: 1964 bytes --]

Alexey Starikovskiy wrote:
> Andrew Morton пишет:
>> On Wed, 01 Jul 2009 20:20:41 +0200
>> acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
>> kernel version are you patching here?

2.6.29. Guess I got unlucky.

>> Also, I wonder if we need a quirk.  Is a "negative" value _ever_
>> correct?  If not, could we do the negation unconditionally?

> The problem is that the variable is s64 and not "negative" value is
> related to s16 portion of it.
> It's possible to do this only for "current" mode, in "power" mode values
> of "negative" s16 range may be valid positive values.

Exactly. This is why I further qualified the quirk so it operates for
Acer machines in current (mA) mode only. Currents >32767mA are insane,
but powers >32767mW are not.

The value is nominally a signed 32-bit int as follows:
>=0: charge current
-1: unknown

(The spec defines this in unsigned terms but the result is the same).

The problem here is that my laptop erroneously reports charging currents
as (65536 - current). Interpreting this as a signed 16-bit int yields
the correct signed value, which can then be abs()ed.

The only addition that I'd imagine might make sense would be to check
for current_now != -1 before applying the 16-bit trick, since 32-bit
signed -1 is a valid value that means "unknown current". This does not
conflict with 16-bit -1 because the 16-bits are not sign-extended so
-1mA reports as 65535, not -1. Attached new patch with this change.

For reference, the DSDT does something like this:

s32 current_now;

current_now = (EC_BAT_CURRENT_HIGH<<8) | EC_BAT_CURRENT_LOW;
current_now = (0xFFFF - current_now) + 1;

The "homebrew" two's complement negation attempts to make discharge
currents positive but also makes charge currents negative. It's also
completely wrong for 32-bit quantities, which is what we're dealing with
here.


-- 
Hector Martin (hector@marcansoft.com)
Public Key: http://www.marcansoft.com/marcan.asc


[-- Attachment #2: acpi-battery-acer-rate-quirk.patch --]
[-- Type: text/plain, Size: 1514 bytes --]

Signed-off-by: Hector Martin <hector@marcansoft.com>
--- linux/drivers/acpi/battery.c.old	2009-07-01 19:17:33.000000000 +0200
+++ linux/drivers/acpi/battery.c	2009-07-01 19:52:43.000000000 +0200
@@ -84,6 +84,10 @@
 
 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
 
+/* For buggy DSDTs that report negative 16-bit values for either charging
+ * or discharging and/or report 0 as 65536 due to bad math.
+ */
+#define QUIRK_SIGNED16_CURRENT 0x0001
 
 struct acpi_battery {
 	struct mutex lock;
@@ -111,6 +115,7 @@
 	int state;
 	int power_unit;
 	u8 alarm_present;
+	long quirks;
 };
 
 #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
@@ -387,6 +392,10 @@
 				 state_offsets, ARRAY_SIZE(state_offsets));
 	battery->update_time = jiffies;
 	kfree(buffer.pointer);
+
+	if ((battery->quirks & QUIRK_SIGNED16_CURRENT) && battery->current_now != -1)
+		battery->current_now = abs((s16)battery->current_now);
+
 	return result;
 }
 
@@ -492,6 +501,14 @@
 }
 #endif
 
+static void acpi_battery_quirks(struct acpi_battery *battery)
+{
+	battery->quirks = 0;
+	if (dmi_name_in_vendors("Acer") && battery->power_unit) {
+		battery->quirks |= QUIRK_SIGNED16_CURRENT;
+	}
+}
+
 static int acpi_battery_update(struct acpi_battery *battery)
 {
 	int result, old_present = acpi_battery_present(battery);
@@ -510,6 +527,7 @@
 		result = acpi_battery_get_info(battery);
 		if (result)
 			return result;
+		acpi_battery_quirks(battery);
 		acpi_battery_init_alarm(battery);
 	}
 #ifdef CONFIG_ACPI_SYSFS_POWER

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

* Re: [PATCH] Work around negative s16 battery current on Acer
  2009-07-01 18:29 ` Andrew Morton
  2009-07-01 18:38   ` Alexey Starikovskiy
@ 2009-07-02  3:51   ` Hector Martin
  2009-07-02 22:56     ` Andrew Morton
  1 sibling, 1 reply; 8+ messages in thread
From: Hector Martin @ 2009-07-02  3:51 UTC (permalink / raw)
  To: Andrew Morton; +Cc: astarikovskiy, lenb, linux-acpi

[-- Attachment #1: Type: text/plain, Size: 301 bytes --]

Andrew Morton wrote:
> acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
> kernel version are you patching here?

Updated patch for 2.6.30 attached. current_now got renamed to rate_now.

-- 
Hector Martin (hector@marcansoft.com)
Public Key: http://www.marcansoft.com/marcan.asc


[-- Attachment #2: acpi-battery-acer-rate-quirk2.patch --]
[-- Type: text/plain, Size: 1740 bytes --]

Signed-off-by: Hector Martin <hector@marcansoft.com">
--- linux-2.6.30-gentoo-r1/drivers/acpi/battery.c.old	2009-07-02 04:04:52.000000000 +0200
+++ linux-2.6.30-gentoo-r1/drivers/acpi/battery.c	2009-07-02 04:07:20.000000000 +0200
@@ -85,6 +85,10 @@ static const struct acpi_device_id batte
 
 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
 
+/* For buggy DSDTs that report negative 16-bit values for either charging
+ * or discharging current and/or report 0 as 65536 due to bad math.
+ */
+#define QUIRK_SIGNED16_CURRENT 0x0001
 
 struct acpi_battery {
 	struct mutex lock;
@@ -112,6 +116,7 @@ struct acpi_battery {
 	int state;
 	int power_unit;
 	u8 alarm_present;
+	long quirks;
 };
 
 #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
@@ -390,6 +395,11 @@ static int acpi_battery_get_state(struct
 				 state_offsets, ARRAY_SIZE(state_offsets));
 	battery->update_time = jiffies;
 	kfree(buffer.pointer);
+
+	if ((battery->quirks & QUIRK_SIGNED16_CURRENT) &&
+	    battery->rate_now != -1)
+		battery->rate_now = abs((s16)battery->rate_now);
+
 	return result;
 }
 
@@ -495,6 +505,14 @@ static void sysfs_remove_battery(struct 
 }
 #endif
 
+static void acpi_battery_quirks(struct acpi_battery *battery)
+{
+	battery->quirks = 0;
+	if (dmi_name_in_vendors("Acer") && battery->power_unit) {
+		battery->quirks |= QUIRK_SIGNED16_CURRENT;
+	}
+}
+
 static int acpi_battery_update(struct acpi_battery *battery)
 {
 	int result, old_present = acpi_battery_present(battery);
@@ -513,6 +531,7 @@ static int acpi_battery_update(struct ac
 		result = acpi_battery_get_info(battery);
 		if (result)
 			return result;
+		acpi_battery_quirks(battery);
 		acpi_battery_init_alarm(battery);
 	}
 #ifdef CONFIG_ACPI_SYSFS_POWER

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

* Re: [PATCH] Work around negative s16 battery current on Acer
  2009-07-02  3:51   ` Hector Martin
@ 2009-07-02 22:56     ` Andrew Morton
  2009-07-02 23:46       ` [PATCH] Work around negative s16 battery current on Acer (take 3) Hector Martin
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Morton @ 2009-07-02 22:56 UTC (permalink / raw)
  To: Hector Martin; +Cc: astarikovskiy, lenb, linux-acpi

On Thu, 02 Jul 2009 05:51:56 +0200
Hector Martin <hector@marcansoft.com> wrote:

> Andrew Morton wrote:
> > acpi_battery has no field `current_now' in 2.6.30 or 2.6.31-rc1.  Which
> > kernel version are you patching here?
> 
> Updated patch for 2.6.30 attached. current_now got renamed to rate_now.

The patch has no changelog.

We could go fishing through the mailing list to find the original
changelog, but perhaps it is no longer accurate.  Or we could type in a
new changelog but that also has accuracy problems.

So please always resend the full changelog (possibly after revising it)
with each version of a patch.


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

* Re: [PATCH] Work around negative s16 battery current on Acer (take 3)
  2009-07-02 22:56     ` Andrew Morton
@ 2009-07-02 23:46       ` Hector Martin
  0 siblings, 0 replies; 8+ messages in thread
From: Hector Martin @ 2009-07-02 23:46 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Alexey Starikovskiy, Len Brown, linux-acpi

Andrew Morton wrote:
> So please always resend the full changelog (possibly after revising 
> it) with each version of a patch.
Trying again then. Hope I nailed the right Thunderbird options this time
for optimal patch submission.


Acer Aspire 8930G laptops (and possibly others) report the battery
current as a 16-bit signed negative when it is charging. It also reports
it as 0x10000 when the current is 0. This patch adds a quirk for this
which takes the absolute value of the reported current cast to an s16.
This is a DSDT bug present in the latest BIOS revision (the EC register
is 16 bits signed and the DSDT attempts to take the 16-bit two's
complement of this, which works for discharge but not charge. It also
breaks zero values because a 32-bit register is used and the high bits
aren't thrown away).

I've enabled this for all Acer systems which report in mA units. This
should be safe since it won't break compliant systems unless they report
a current above 32A, which is insane. The patch also detects the valid
32-bit value -1, which indicates unknown status, and does not attempt
the fix in that case (note that this does not conflict with 16-bit -1,
which is 65535 as read normally and gets translated to 1mA).

Signed-off-by: Hector Martin <hector@marcansoft.com>
--- linux-2.6.30/drivers/acpi/battery.c.old	2009-07-02 04:04:52.000000000 +0200
+++ linux-2.6.30/drivers/acpi/battery.c	2009-07-02 04:07:20.000000000 +0200
@@ -85,6 +85,10 @@ static const struct acpi_device_id batte
 
 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
 
+/* For buggy DSDTs that report negative 16-bit values for either charging
+ * or discharging current and/or report 0 as 65536 due to bad math.
+ */
+#define QUIRK_SIGNED16_CURRENT 0x0001
 
 struct acpi_battery {
 	struct mutex lock;
@@ -112,6 +116,7 @@ struct acpi_battery {
 	int state;
 	int power_unit;
 	u8 alarm_present;
+	long quirks;
 };
 
 #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
@@ -390,6 +395,11 @@ static int acpi_battery_get_state(struct
 				 state_offsets, ARRAY_SIZE(state_offsets));
 	battery->update_time = jiffies;
 	kfree(buffer.pointer);
+
+	if ((battery->quirks & QUIRK_SIGNED16_CURRENT) &&
+	    battery->rate_now != -1)
+		battery->rate_now = abs((s16)battery->rate_now);
+
 	return result;
 }
 
@@ -495,6 +505,14 @@ static void sysfs_remove_battery(struct 
 }
 #endif
 
+static void acpi_battery_quirks(struct acpi_battery *battery)
+{
+	battery->quirks = 0;
+	if (dmi_name_in_vendors("Acer") && battery->power_unit) {
+		battery->quirks |= QUIRK_SIGNED16_CURRENT;
+	}
+}
+
 static int acpi_battery_update(struct acpi_battery *battery)
 {
 	int result, old_present = acpi_battery_present(battery);
@@ -513,6 +531,7 @@ static int acpi_battery_update(struct ac
 		result = acpi_battery_get_info(battery);
 		if (result)
 			return result;
+		acpi_battery_quirks(battery);
 		acpi_battery_init_alarm(battery);
 	}
 #ifdef CONFIG_ACPI_SYSFS_POWER



-- 
Hector Martin (hector@marcansoft.com)
Public Key: http://www.marcansoft.com/marcan.asc


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

end of thread, other threads:[~2009-07-02 23:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-01 18:20 [PATCH] Work around negative s16 battery current on Acer Hector Martin
2009-07-01 18:27 ` Alexey Starikovskiy
2009-07-01 18:29 ` Andrew Morton
2009-07-01 18:38   ` Alexey Starikovskiy
2009-07-01 20:19     ` Hector Martin
2009-07-02  3:51   ` Hector Martin
2009-07-02 22:56     ` Andrew Morton
2009-07-02 23:46       ` [PATCH] Work around negative s16 battery current on Acer (take 3) Hector Martin

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).