public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	"Alan Stern" <stern@rowland.harvard.edu>,
	"Dâniel Fraga" <fragabr@gmail.com>,
	"Javier Marcet" <jmarcet@gmail.com>,
	"Andrey Rahmatullin" <wrar@wrar.name>,
	"Oleksij Rempel" <bug-track@fisher-privat.net>,
	"Pavel Pisa" <pisa@cmp.felk.cvut.cz>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
Subject: [ 037/108] PCI: EHCI: fix crash during suspend on ASUS computers
Date: Mon, 23 Jul 2012 02:07:28 +0100	[thread overview]
Message-ID: <20120723010657.115433023@decadent.org.uk> (raw)
In-Reply-To: <20120723010651.408577075@decadent.org.uk>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 6566 bytes --]

3.2-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Alan Stern <stern@rowland.harvard.edu>

commit dbf0e4c7257f8d684ec1a3c919853464293de66e upstream.

Quite a few ASUS computers experience a nasty problem, related to the
EHCI controllers, when going into system suspend.  It was observed
that the problem didn't occur if the controllers were not put into the
D3 power state before starting the suspend, and commit
151b61284776be2d6f02d48c23c3625678960b97 (USB: EHCI: fix crash during
suspend on ASUS computers) was created to do this.

It turned out this approach messed up other computers that didn't have
the problem -- it prevented USB wakeup from working.  Consequently
commit c2fb8a3fa25513de8fedb38509b1f15a5bbee47b (USB: add
NO_D3_DURING_SLEEP flag and revert 151b61284776be2) was merged; it
reverted the earlier commit and added a whitelist of known good board
names.

Now we know the actual cause of the problem.  Thanks to AceLan Kao for
tracking it down.

According to him, an engineer at ASUS explained that some of their
BIOSes contain a bug that was added in an attempt to work around a
problem in early versions of Windows.  When the computer goes into S3
suspend, the BIOS tries to verify that the EHCI controllers were first
quiesced by the OS.  Nothing's wrong with this, but the BIOS does it
by checking that the PCI COMMAND registers contain 0 without checking
the controllers' power state.  If the register isn't 0, the BIOS
assumes the controller needs to be quiesced and tries to do so.  This
involves making various MMIO accesses to the controller, which don't
work very well if the controller is already in D3.  The end result is
a system hang or memory corruption.

Since the value in the PCI COMMAND register doesn't matter once the
controller has been suspended, and since the value will be restored
anyway when the controller is resumed, we can work around the BIOS bug
simply by setting the register to 0 during system suspend.  This patch
(as1590) does so and also reverts the second commit mentioned above,
which is now unnecessary.

In theory we could do this for every PCI device.  However to avoid
introducing new problems, the patch restricts itself to EHCI host
controllers.

Finally the affected systems can suspend with USB wakeup working
properly.

Reference: https://bugzilla.kernel.org/show_bug.cgi?id=37632
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=42728
Based-on-patch-by: AceLan Kao <acelan.kao@canonical.com>
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Tested-by: Dâniel Fraga <fragabr@gmail.com>
Tested-by: Javier Marcet <jmarcet@gmail.com>
Tested-by: Andrey Rahmatullin <wrar@wrar.name>
Tested-by: Oleksij Rempel <bug-track@fisher-privat.net>
Tested-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
 drivers/pci/pci-driver.c |   12 ++++++++++++
 drivers/pci/pci.c        |    5 -----
 drivers/pci/quirks.c     |   26 --------------------------
 include/linux/pci.h      |    2 --
 4 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index bf0cee6..099f46c 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -748,6 +748,18 @@ static int pci_pm_suspend_noirq(struct device *dev)
 
 	pci_pm_set_unknown_state(pci_dev);
 
+	/*
+	 * Some BIOSes from ASUS have a bug: If a USB EHCI host controller's
+	 * PCI COMMAND register isn't 0, the BIOS assumes that the controller
+	 * hasn't been quiesced and tries to turn it off.  If the controller
+	 * is already in D3, this can hang or cause memory corruption.
+	 *
+	 * Since the value of the COMMAND register doesn't matter once the
+	 * device has been suspended, we can safely set it to 0 here.
+	 */
+	if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
+		pci_write_config_word(pci_dev, PCI_COMMAND, 0);
+
 	return 0;
 }
 
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 77cb54a..447e834 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1744,11 +1744,6 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
 	if (target_state == PCI_POWER_ERROR)
 		return -EIO;
 
-	/* Some devices mustn't be in D3 during system sleep */
-	if (target_state == PCI_D3hot &&
-			(dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP))
-		return 0;
-
 	pci_enable_wake(dev, target_state, device_may_wakeup(&dev->dev));
 
 	error = pci_set_power_state(dev, target_state);
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 194b243a..2a75216 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -2929,32 +2929,6 @@ static void __devinit disable_igfx_irq(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
 
-/*
- * The Intel 6 Series/C200 Series chipset's EHCI controllers on many
- * ASUS motherboards will cause memory corruption or a system crash
- * if they are in D3 while the system is put into S3 sleep.
- */
-static void __devinit asus_ehci_no_d3(struct pci_dev *dev)
-{
-	const char *sys_info;
-	static const char good_Asus_board[] = "P8Z68-V";
-
-	if (dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP)
-		return;
-	if (dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK)
-		return;
-	sys_info = dmi_get_system_info(DMI_BOARD_NAME);
-	if (sys_info && memcmp(sys_info, good_Asus_board,
-			sizeof(good_Asus_board) - 1) == 0)
-		return;
-
-	dev_info(&dev->dev, "broken D3 during system sleep on ASUS\n");
-	dev->dev_flags |= PCI_DEV_FLAGS_NO_D3_DURING_SLEEP;
-	device_set_wakeup_capable(&dev->dev, false);
-}
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c26, asus_ehci_no_d3);
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c2d, asus_ehci_no_d3);
-
 static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
 			  struct pci_fixup *end)
 {
diff --git a/include/linux/pci.h b/include/linux/pci.h
index fefb4e1..d8c379d 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -176,8 +176,6 @@ enum pci_dev_flags {
 	PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2,
 	/* Provide indication device is assigned by a Virtual Machine Manager */
 	PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,
-	/* Device causes system crash if in D3 during S3 sleep */
-	PCI_DEV_FLAGS_NO_D3_DURING_SLEEP = (__force pci_dev_flags_t) 8,
 };
 
 enum pci_irq_reroute_variant {



  parent reply	other threads:[~2012-07-23  1:44 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-23  1:06 [ 000/108] 3.2.24-stable review Ben Hutchings
2012-07-23  1:06 ` [ 001/108] samsung-laptop: make the dmi check less strict Ben Hutchings
2012-07-23  1:06 ` [ 002/108] raid5: delayed stripe fix Ben Hutchings
2012-07-23  1:06 ` [ 003/108] tcp: drop SYN+FIN messages Ben Hutchings
2012-07-23  1:06 ` [ 004/108] tg3: Apply short DMA frag workaround to 5906 Ben Hutchings
2012-07-23  1:06 ` [ 005/108] rtl8187: ->brightness_set can not sleep Ben Hutchings
2012-07-23  1:06 ` [ 006/108] net/wireless: ipw2x00: add supported cipher suites to wiphy initialization Ben Hutchings
2012-07-23  1:06 ` [ 007/108] drm/i915: do not enable RC6p on Sandy Bridge Ben Hutchings
2012-07-23  1:06 ` [ 008/108] drm/i915: fix operator precedence when enabling RC6p Ben Hutchings
2012-07-23  1:07 ` [ 009/108] kbuild: do not check for ancient modutils tools Ben Hutchings
2012-07-23  1:07 ` [ 010/108] brcmsmac: "INTERMEDIATE but not AMPDU" only when tracing Ben Hutchings
2012-07-23  1:07 ` [ 011/108] NFSv4: Rate limit the state manager for lock reclaim warning messages Ben Hutchings
2012-07-23  1:07 ` [ 012/108] ext4: Report max_batch_time option correctly Ben Hutchings
2012-07-23  1:07 ` [ 013/108] hugepages: fix use after free bug in "quota" handling Ben Hutchings
2012-07-23  1:07 ` [ 014/108] NFSv4: Reduce the footprint of the idmapper Ben Hutchings
2012-07-23  1:07 ` [ 015/108] NFSv4: Further reduce " Ben Hutchings
2012-07-23  1:07 ` [ 016/108] macvtap: zerocopy: fix offset calculation when building skb Ben Hutchings
2012-07-23  1:07 ` [ 017/108] macvtap: zerocopy: fix truesize underestimation Ben Hutchings
2012-07-23  1:07 ` [ 018/108] macvtap: zerocopy: put page when fail to get all requested user pages Ben Hutchings
2012-07-23  1:07 ` [ 019/108] macvtap: zerocopy: set SKBTX_DEV_ZEROCOPY only when skb is built successfully Ben Hutchings
2012-07-23  1:07 ` [ 020/108] macvtap: zerocopy: validate vectors before building skb Ben Hutchings
2012-07-23  1:07 ` [ 021/108] KVM: Fix buffer overflow in kvm_set_irq() Ben Hutchings
2012-07-23  1:07 ` [ 022/108] scsi: Silence unnecessary warnings about ioctl to partition Ben Hutchings
2012-07-23  7:31   ` Paolo Bonzini
2012-07-23  1:07 ` [ 023/108] epoll: clear the tfile_check_list on -ELOOP Ben Hutchings
2012-07-23  1:07 ` [ 024/108] iommu/amd: Fix missing iommu_shutdown initialization in passthrough mode Ben Hutchings
2012-07-23  1:07 ` [ 025/108] iommu/amd: Initialize dma_ops for hotplug and sriov devices Ben Hutchings
2012-07-23  1:07 ` [ 026/108] usb: Add support for root hub port status CAS Ben Hutchings
2012-07-23  1:07 ` [ 027/108] gpiolib: wm8994: Pay attention to the value set when enabling as output Ben Hutchings
2012-07-23  1:07 ` [ 028/108] sched/nohz: Rewrite and fix load-avg computation -- again Ben Hutchings
2012-07-24 14:06   ` Ben Hutchings
2012-07-26 21:25     ` Peter Zijlstra
2012-07-26 22:01       ` Ben Hutchings
2012-07-26 22:02         ` Peter Zijlstra
2012-07-23  1:07 ` [ 029/108] USB: option: add ZTE MF60 Ben Hutchings
2012-07-23  1:07 ` [ 030/108] USB: option: Add MEDIATEK product ids Ben Hutchings
2012-07-23  1:07 ` [ 031/108] USB: cdc-wdm: fix lockup on error in wdm_read Ben Hutchings
2012-07-23  1:07 ` [ 032/108] mtd: nandsim: dont open code a do_div helper Ben Hutchings
2012-07-23  1:07 ` [ 033/108] [media] dvb-core: Release semaphore on error path dvb_register_device() Ben Hutchings
2012-07-23  1:07 ` [ 034/108] hwspinlock/core: use global ID to register hwspinlocks on multiple devices Ben Hutchings
2012-07-23  1:07 ` [ 035/108] [SCSI] libsas: fix taskfile corruption in sas_ata_qc_fill_rtf Ben Hutchings
2012-07-23  1:07 ` [ 036/108] md/raid1: fix use-after-free bug in RAID1 data-check code Ben Hutchings
2012-07-23  1:07 ` Ben Hutchings [this message]
2012-07-23  1:07 ` [ 038/108] memory hotplug: fix invalid memory access caused by stale kswapd pointer Ben Hutchings
2012-07-23  1:07 ` [ 039/108] ocfs2: fix NULL pointer dereference in __ocfs2_change_file_space() Ben Hutchings
2012-07-23  1:07 ` [ 040/108] mm, thp: abort compaction if migration page cannot be charged to memcg Ben Hutchings
2012-07-23  1:07 ` [ 041/108] drivers/rtc/rtc-mxc.c: fix irq enabled interrupts warning Ben Hutchings
2012-07-23  1:07 ` [ 042/108] fs: ramfs: file-nommu: add SetPageUptodate() Ben Hutchings
2012-07-23  1:07 ` [ 043/108] cpufreq / ACPI: Fix not loading acpi-cpufreq driver regression Ben Hutchings
2012-07-23  1:07 ` [ 044/108] hwmon: (it87) Preserve configuration register bits on init Ben Hutchings
2012-07-23  1:07 ` [ 045/108] ARM: SAMSUNG: fix race in s3c_adc_start for ADC Ben Hutchings
2012-07-23  1:07 ` [ 046/108] block: fix infinite loop in __getblk_slow Ben Hutchings
2012-07-23  1:07 ` [ 047/108] Remove easily user-triggerable BUG from generic_setlease Ben Hutchings
2012-07-23  1:07 ` [ 048/108] NFC: Export nfc.h to userland Ben Hutchings
2012-07-23  1:07 ` [ 049/108] PM / Hibernate: Hibernate/thaw fixes/improvements Ben Hutchings
2012-07-23  1:07 ` [ 050/108] cfg80211: check iface combinations only when iface is running Ben Hutchings
2012-07-23  1:07 ` [ 051/108] intel_ips: blacklist HP ProBook laptops Ben Hutchings
2012-07-23  1:07 ` [ 052/108] atl1c: fix issue of transmit queue 0 timed out Ben Hutchings
2012-07-23  1:07 ` [ 053/108] rt2x00usb: fix indexes ordering on RX queue kick Ben Hutchings
2012-07-23  1:07 ` [ 054/108] iwlegacy: always monitor for stuck queues Ben Hutchings
2012-07-23  1:07 ` [ 055/108] iwlegacy: dont mess up the SCD when removing a key Ben Hutchings
2012-07-23  1:07 ` [ 056/108] e1000e: Correct link check logic for 82571 serdes Ben Hutchings
2012-07-23  1:07 ` [ 057/108] tcm_fc: Fix crash seen with aborts and large reads Ben Hutchings
2012-07-23  1:07 ` [ 058/108] fifo: Do not restart open() if it already found a partner Ben Hutchings
2012-07-23  1:07 ` [ 059/108] target: Clean up returning errors in PR handling code Ben Hutchings
2012-07-23  1:07 ` [ 060/108] target: Fix range calculation in WRITE SAME emulation when num blocks == 0 Ben Hutchings
2012-07-23  1:07 ` [ 061/108] cifs: on CONFIG_HIGHMEM machines, limit the rsize/wsize to the kmap space Ben Hutchings
2012-07-23  1:07 ` [ 062/108] cifs: always update the inode cache with the results from a FIND_* Ben Hutchings
2012-07-23  1:07 ` [ 063/108] mm: fix lost kswapd wakeup in kswapd_stop() Ben Hutchings
2012-07-23  1:07 ` [ 064/108] md: avoid crash when stopping md array races with closing other open fds Ben Hutchings
2012-07-23  1:07 ` [ 065/108] md/raid1: close some possible races on write errors during resync Ben Hutchings
2012-07-23  1:07 ` [ 066/108] MIPS: Properly align the .data..init_task section Ben Hutchings
2012-07-23  1:07 ` [ 067/108] UBIFS: fix a bug in empty space fix-up Ben Hutchings
2012-07-23  1:07 ` [ 068/108] ore: Fix NFS crash by supporting any unaligned RAID IO Ben Hutchings
2012-07-23  1:08 ` [ 069/108] ore: Remove support of partial IO request (NFS crash) Ben Hutchings
2012-07-23  1:08 ` [ 070/108] pnfs-obj: dont leak objio_state if ore_write/read fails Ben Hutchings
2012-07-23  1:08 ` [ 071/108] pnfs-obj: Fix __r4w_get_page when offset is beyond i_size Ben Hutchings
2012-07-23  1:08 ` [ 072/108] dm raid1: fix crash with mirror recovery and discard Ben Hutchings
2012-07-23  1:08 ` [ 073/108] dm raid1: set discard_zeroes_data_unsupported Ben Hutchings
2012-07-23  1:08 ` [ 074/108] ntp: Fix leap-second hrtimer livelock Ben Hutchings
2012-07-23  1:08 ` [ 075/108] ntp: Correct TAI offset during leap second Ben Hutchings
2012-07-23  1:08 ` [ 076/108] timekeeping: Fix CLOCK_MONOTONIC inconsistency during leapsecond Ben Hutchings
2012-07-23  1:08 ` [ 077/108] time: Move common updates to a function Ben Hutchings
2012-07-23  1:08 ` [ 078/108] hrtimer: Provide clock_was_set_delayed() Ben Hutchings
2012-07-23  1:08 ` [ 079/108] timekeeping: Fix leapsecond triggered load spike issue Ben Hutchings
2012-07-23  1:08 ` [ 080/108] timekeeping: Maintain ktime_t based offsets for hrtimers Ben Hutchings
2012-07-23  1:08 ` [ 081/108] hrtimers: Move lock held region in hrtimer_interrupt() Ben Hutchings
2012-07-23  1:08 ` [ 082/108] timekeeping: Provide hrtimer update function Ben Hutchings
2012-07-23  1:08 ` [ 083/108] hrtimer: Update hrtimer base offsets each hrtimer_interrupt Ben Hutchings
2012-07-23  1:08 ` [ 084/108] timekeeping: Add missing update call in timekeeping_resume() Ben Hutchings
2012-07-23  1:08 ` [ 085/108] powerpc: Fix wrong divisor in usecs_to_cputime Ben Hutchings
2012-07-23  1:08 ` [ 086/108] vhost: dont forget to schedule() Ben Hutchings
2012-07-23  1:08 ` [ 087/108] r8169: call netif_napi_del at errpaths and at driver unload Ben Hutchings
2012-07-23  1:08 ` [ 088/108] bnx2x: fix checksum validation Ben Hutchings
2012-07-23  1:08 ` [ 089/108] bnx2x: fix panic when TX ring is full Ben Hutchings
2012-07-23  1:08 ` [ 090/108] net: remove skb_orphan_try() Ben Hutchings
2012-07-23  1:08 ` [ 091/108] ACPI: Make acpi_skip_timer_override cover all source_irq==0 cases Ben Hutchings
2012-07-23  1:08 ` [ 092/108] ACPI: Remove one board specific WARN when ignoring timer overriding Ben Hutchings
2012-07-23  1:08 ` [ 093/108] ACPI: Add a quirk for "AMILO PRO V2030" to ignore the " Ben Hutchings
2012-07-23  1:08 ` [ 094/108] ACPI, x86: fix Dell M6600 ACPI reboot regression via DMI Ben Hutchings
2012-07-23  1:08 ` [ 095/108] ACPI sysfs.c strlen fix Ben Hutchings
2012-07-23  1:08 ` [ 096/108] eCryptfs: Gracefully refuse miscdev file ops on inherited/passed files Ben Hutchings
2012-07-23  1:08 ` [ 097/108] eCryptfs: Fix lockdep warning in miscdev operations Ben Hutchings
2012-07-23  1:08 ` [ 098/108] eCryptfs: Properly check for O_RDONLY flag before doing privileged open Ben Hutchings
2012-07-23  1:08 ` [ 099/108] ACPI / PM: Make acpi_pm_device_sleep_state() follow the specification Ben Hutchings
2012-07-23  1:08 ` [ 100/108] ipheth: add support for iPad Ben Hutchings
2012-07-23  1:08 ` [ 101/108] stmmac: Fix for nfs hang on multiple reboot Ben Hutchings
2012-07-23  1:08 ` [ 102/108] bonding: debugfs and network namespaces are incompatible Ben Hutchings
2012-07-23  1:08 ` [ 103/108] bonding: Manage /proc/net/bonding/ entries from the netdev events Ben Hutchings
2012-07-23  1:08 ` [ 104/108] Input: bcm5974 - Add support for 2012 MacBook Pro Retina Ben Hutchings
2012-07-23  1:08 ` [ 105/108] Input: xpad - handle all variations of Mad Catz Beat Pad Ben Hutchings
2012-07-23  1:08 ` [ 106/108] Input: xpad - add signature for Razer Onza Tournament Edition Ben Hutchings
2012-07-23  1:08 ` [ 107/108] Input: xpad - add Andamiro Pump It Up pad Ben Hutchings
2012-07-23  1:08 ` [ 108/108] HID: add support for 2012 MacBook Pro Retina Ben Hutchings
2012-07-23  1:51 ` [ 000/108] 3.2.24-stable review Ben Hutchings
     [not found] ` <CAD9gYJKwrcovmGcDJoCMAzQF=zfT2jnk9ghctejWAX1R5ifB=w@mail.gmail.com>
2012-07-30  1:37   ` Ben Hutchings

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120723010657.115433023@decadent.org.uk \
    --to=ben@decadent.org.uk \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=bhelgaas@google.com \
    --cc=bug-track@fisher-privat.net \
    --cc=fragabr@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jmarcet@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pisa@cmp.felk.cvut.cz \
    --cc=rjw@sisk.pl \
    --cc=stable@vger.kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=torvalds@linux-foundation.org \
    --cc=wrar@wrar.name \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox