From: Adrian Hunter <adrian.hunter@intel.com>
To: Dong Aisheng <dongas86@gmail.com>
Cc: Dong Aisheng <aisheng.dong@nxp.com>,
"linux-mmc@vger.kernel.org" <linux-mmc@vger.kernel.org>,
Ulf Hansson <ulf.hansson@linaro.org>,
Chris Ball <chris@printf.net>, Shawn Guo <shawnguo@kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
haibo.chen@nxp.com
Subject: Re: [PATCH 10/23] mmc: core: disable auto retune during card detection process
Date: Fri, 29 Apr 2016 09:54:13 +0300 [thread overview]
Message-ID: <57230515.9030602@intel.com> (raw)
In-Reply-To: <20160428132249.GB27560@shlinux2.ap.freescale.net>
On 28/04/16 16:22, Dong Aisheng wrote:
> On Thu, Apr 28, 2016 at 10:04:34AM +0300, Adrian Hunter wrote:
>> On 24/04/16 13:47, Dong Aisheng wrote:
>>> On Fri, Apr 22, 2016 at 8:48 PM, Adrian Hunter <adrian.hunter@intel.com> wrote:
>>>> On 15/04/16 20:29, Dong Aisheng wrote:
>>>>> During card detection process, mmc core may sends commands
>>>>> to detect if card is still exist in mmc_rescan for removable
>>>>> card which may trigger mmc retuning process after a bit time
>>>>> of runtime pm suspend.
>>>>> Obviously this retuning process is meaningless for card remove
>>>>> case, so we disable mmc_retune in mmc_detect_change() for it.
>>>>> For card insert case, the mmc_retune will be enabled normally
>>>>> in its card initialization process later in mmc_execute_tuning().
>>>>> So disable it at first has no side effection.
>>>>
>>>> We don't assume that the card has been removed, which is why we send
>>>> commands to find out if it is still there. If it is still there, this
>>>> change will have incorrectly disabled re-tuning.
>>>>
>>>
>>> Do you mean the 'fake' card remove interrupt like caused by glitch?
>>
>> Sure
>>
>>> Yes, if that the card is still exist and re-tuning is wrongly disabled.
>>>
>>> So we could re-enable re-tuning for this special case?
>>> Something like:
>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>>> index 41b1e76..e1990a8 100644
>>> --- a/drivers/mmc/core/core.c
>>> +++ b/drivers/mmc/core/core.c
>>> @@ -2607,6 +2607,8 @@ void mmc_rescan(struct work_struct *work)
>>>
>>> /* if there still is a card present, stop here */
>>> if (host->bus_ops != NULL) {
>>> + if (tuning_is_enabled_before())
>>> + mmc_retune_enable(host);
>>> mmc_bus_put(host);
>>> goto out;
>>> }
>>>
>>>
>>>> Do you have an actual problem with the way it works now?
>>>>
>>>
>>> No actual problems now.
>>
>> So let's not spend time on it.
>>
>>> I just observe a lot tuning commands keep sending although the card is already
>>> removed which seems a bit meaningless.
>>> And most tuning execution process is executed with sin_lock_irqsave, i'm not
>>> sure if the mass tuning commands may affect the system when CPU is busy.
>>> What do you think?
>>
>> sdhci spin lock is unlocked while waiting for tuning commands.
>>
>
> It's 40 commands continuously and only cmd transfer time is unlocked.
Not for sdhci_execute_tuning() it's not. Only one command is sent.
Currently we don't even send the CMD13 because we check card detect first.
I added prints for sdhci_execute_tuning and got this:
[ 255.536326] sdhci [sdhci_irq()]: *** mmc1 got interrupt: 0x00000080
[ 255.743653] mmc1: starting CMD13 arg 59b40000 flags 00000195
[ 255.750093] mmc1: sdhci_execute_tuning
[ 255.754358] mmc1: sdhci_execute_tuning: send command
[ 255.809638] sdhci: Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock
[ 255.824810] mmc1: req failed (CMD13): -123, retrying...
[ 255.832766] mmc1: req failed (CMD13): -123, retrying...
[ 255.840722] mmc1: req failed (CMD13): -123, retrying...
[ 255.848672] mmc1: req done (CMD13): -123: 00000000 00000000 00000000 00000000
[ 255.856773] mmc1: card remove detected
[ 255.861056] mmc1: card 59b4 removed
[ 255.872872] mmc1: clock 0Hz busmode 2 powermode 0 cs 0 Vdd 0 width 0 timing 0
>
> Hmm.. I can't sure it's no affection.
> e.g we did have customers reporting cd plug in/out causing jitters
> when system is busy playing audio or video.
> Maybe we need to do those tests.
>
> Anyway, what's your point to keep sending tuning commands after card
> is already removed?
Seems like a problem for your driver not the core. Why not check card detect
after the first error in esdhc_executing_tuning().
>
> Regards
> Dong Aisheng
>
>>>
>>> Regards
>>> Dong Aisheng
>>>
>>>>>
>>>>> CC: stable <stable@vger.kernel.org>
>>>>> Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
>>>>> ---
>>>>> drivers/mmc/core/core.c | 1 +
>>>>> 1 file changed, 1 insertion(+)
>>>>>
>>>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>>>>> index 52bfaf0..76d0802 100644
>>>>> --- a/drivers/mmc/core/core.c
>>>>> +++ b/drivers/mmc/core/core.c
>>>>> @@ -1888,6 +1888,7 @@ static void _mmc_detect_change(struct mmc_host *host, unsigned long delay,
>>>>> pm_wakeup_event(mmc_dev(host), 5000);
>>>>>
>>>>> host->detect_change = 1;
>>>>> + mmc_retune_disable(host);
>>>>> mmc_schedule_delayed_work(&host->detect, delay);
>>>>> }
>>>>>
>>>>>
>>>>
>>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
WARNING: multiple messages have this Message-ID (diff)
From: adrian.hunter@intel.com (Adrian Hunter)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 10/23] mmc: core: disable auto retune during card detection process
Date: Fri, 29 Apr 2016 09:54:13 +0300 [thread overview]
Message-ID: <57230515.9030602@intel.com> (raw)
In-Reply-To: <20160428132249.GB27560@shlinux2.ap.freescale.net>
On 28/04/16 16:22, Dong Aisheng wrote:
> On Thu, Apr 28, 2016 at 10:04:34AM +0300, Adrian Hunter wrote:
>> On 24/04/16 13:47, Dong Aisheng wrote:
>>> On Fri, Apr 22, 2016 at 8:48 PM, Adrian Hunter <adrian.hunter@intel.com> wrote:
>>>> On 15/04/16 20:29, Dong Aisheng wrote:
>>>>> During card detection process, mmc core may sends commands
>>>>> to detect if card is still exist in mmc_rescan for removable
>>>>> card which may trigger mmc retuning process after a bit time
>>>>> of runtime pm suspend.
>>>>> Obviously this retuning process is meaningless for card remove
>>>>> case, so we disable mmc_retune in mmc_detect_change() for it.
>>>>> For card insert case, the mmc_retune will be enabled normally
>>>>> in its card initialization process later in mmc_execute_tuning().
>>>>> So disable it at first has no side effection.
>>>>
>>>> We don't assume that the card has been removed, which is why we send
>>>> commands to find out if it is still there. If it is still there, this
>>>> change will have incorrectly disabled re-tuning.
>>>>
>>>
>>> Do you mean the 'fake' card remove interrupt like caused by glitch?
>>
>> Sure
>>
>>> Yes, if that the card is still exist and re-tuning is wrongly disabled.
>>>
>>> So we could re-enable re-tuning for this special case?
>>> Something like:
>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>>> index 41b1e76..e1990a8 100644
>>> --- a/drivers/mmc/core/core.c
>>> +++ b/drivers/mmc/core/core.c
>>> @@ -2607,6 +2607,8 @@ void mmc_rescan(struct work_struct *work)
>>>
>>> /* if there still is a card present, stop here */
>>> if (host->bus_ops != NULL) {
>>> + if (tuning_is_enabled_before())
>>> + mmc_retune_enable(host);
>>> mmc_bus_put(host);
>>> goto out;
>>> }
>>>
>>>
>>>> Do you have an actual problem with the way it works now?
>>>>
>>>
>>> No actual problems now.
>>
>> So let's not spend time on it.
>>
>>> I just observe a lot tuning commands keep sending although the card is already
>>> removed which seems a bit meaningless.
>>> And most tuning execution process is executed with sin_lock_irqsave, i'm not
>>> sure if the mass tuning commands may affect the system when CPU is busy.
>>> What do you think?
>>
>> sdhci spin lock is unlocked while waiting for tuning commands.
>>
>
> It's 40 commands continuously and only cmd transfer time is unlocked.
Not for sdhci_execute_tuning() it's not. Only one command is sent.
Currently we don't even send the CMD13 because we check card detect first.
I added prints for sdhci_execute_tuning and got this:
[ 255.536326] sdhci [sdhci_irq()]: *** mmc1 got interrupt: 0x00000080
[ 255.743653] mmc1: starting CMD13 arg 59b40000 flags 00000195
[ 255.750093] mmc1: sdhci_execute_tuning
[ 255.754358] mmc1: sdhci_execute_tuning: send command
[ 255.809638] sdhci: Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock
[ 255.824810] mmc1: req failed (CMD13): -123, retrying...
[ 255.832766] mmc1: req failed (CMD13): -123, retrying...
[ 255.840722] mmc1: req failed (CMD13): -123, retrying...
[ 255.848672] mmc1: req done (CMD13): -123: 00000000 00000000 00000000 00000000
[ 255.856773] mmc1: card remove detected
[ 255.861056] mmc1: card 59b4 removed
[ 255.872872] mmc1: clock 0Hz busmode 2 powermode 0 cs 0 Vdd 0 width 0 timing 0
>
> Hmm.. I can't sure it's no affection.
> e.g we did have customers reporting cd plug in/out causing jitters
> when system is busy playing audio or video.
> Maybe we need to do those tests.
>
> Anyway, what's your point to keep sending tuning commands after card
> is already removed?
Seems like a problem for your driver not the core. Why not check card detect
after the first error in esdhc_executing_tuning().
>
> Regards
> Dong Aisheng
>
>>>
>>> Regards
>>> Dong Aisheng
>>>
>>>>>
>>>>> CC: stable <stable@vger.kernel.org>
>>>>> Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
>>>>> ---
>>>>> drivers/mmc/core/core.c | 1 +
>>>>> 1 file changed, 1 insertion(+)
>>>>>
>>>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>>>>> index 52bfaf0..76d0802 100644
>>>>> --- a/drivers/mmc/core/core.c
>>>>> +++ b/drivers/mmc/core/core.c
>>>>> @@ -1888,6 +1888,7 @@ static void _mmc_detect_change(struct mmc_host *host, unsigned long delay,
>>>>> pm_wakeup_event(mmc_dev(host), 5000);
>>>>>
>>>>> host->detect_change = 1;
>>>>> + mmc_retune_disable(host);
>>>>> mmc_schedule_delayed_work(&host->detect, delay);
>>>>> }
>>>>>
>>>>>
>>>>
>>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majordomo at vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2016-04-29 6:58 UTC|newest]
Thread overview: 170+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-15 17:29 [PATCH 00/23] a few sdhci/imx clean up and fix patches Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 01/23] mmc: sdhci: removed unneeded function wrappers Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 10:27 ` Adrian Hunter
2016-04-22 10:27 ` Adrian Hunter
2016-05-10 6:32 ` Adrian Hunter
2016-05-10 6:32 ` Adrian Hunter
2016-05-10 9:46 ` Ulf Hansson
2016-05-10 9:46 ` Ulf Hansson
2016-04-15 17:29 ` [PATCH 02/23] mmc: sdhci: move sdhci_get_cd() forward to avoid declaration Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 10:27 ` Adrian Hunter
2016-04-22 10:27 ` Adrian Hunter
2016-04-24 9:17 ` Dong Aisheng
2016-04-24 9:17 ` Dong Aisheng
2016-04-27 20:26 ` Adrian Hunter
2016-04-27 20:26 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 03/23] mmc: core: fix a comment typo Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 10:28 ` Adrian Hunter
2016-04-22 10:28 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 04/23] mmc: sdhci: re-factor sdhci_start_signal_voltage() Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 11:43 ` Adrian Hunter
2016-04-22 11:43 ` Adrian Hunter
2016-04-24 9:14 ` Dong Aisheng
2016-04-24 9:14 ` Dong Aisheng
2016-04-27 20:26 ` Adrian Hunter
2016-04-27 20:26 ` Adrian Hunter
2016-04-28 3:09 ` Dong Aisheng
2016-04-28 3:09 ` Dong Aisheng
2016-04-28 6:39 ` Adrian Hunter
2016-04-28 6:39 ` Adrian Hunter
2016-04-28 7:15 ` Jaehoon Chung
2016-04-28 7:15 ` Jaehoon Chung
2016-04-28 7:44 ` Adrian Hunter
2016-04-28 7:44 ` Adrian Hunter
2016-04-28 8:30 ` Jaehoon Chung
2016-04-28 8:30 ` Jaehoon Chung
2016-04-28 14:09 ` Dong Aisheng
2016-04-28 14:09 ` Dong Aisheng
2016-04-28 23:06 ` Jaehoon Chung
2016-04-28 23:06 ` Jaehoon Chung
2016-04-28 13:14 ` Dong Aisheng
2016-04-28 13:14 ` Dong Aisheng
2016-04-28 13:36 ` Adrian Hunter
2016-04-28 13:36 ` Adrian Hunter
2016-04-28 14:28 ` Dong Aisheng
2016-04-28 14:28 ` Dong Aisheng
2016-04-29 7:32 ` Adrian Hunter
2016-04-29 7:32 ` Adrian Hunter
2016-04-29 7:57 ` Dong Aisheng
2016-04-29 7:57 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 05/23] mmc: core: mmc_regulator_set_vqmmc not return error if vqmmc/vmmc not exist Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 06/23] mmc: sdhci: using common mmc_regulator_set_vqmmc() Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 11:48 ` Adrian Hunter
2016-04-22 11:48 ` Adrian Hunter
2016-04-24 9:25 ` Dong Aisheng
2016-04-24 9:25 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 07/23] mmc: sdhci: check SDHCI_QUIRK2_NO_1_8_V when do voltage switch Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 12:30 ` Adrian Hunter
2016-04-22 12:30 ` Adrian Hunter
2016-04-24 9:56 ` Dong Aisheng
2016-04-24 9:56 ` Dong Aisheng
2016-04-27 20:27 ` Adrian Hunter
2016-04-27 20:27 ` Adrian Hunter
2016-04-28 13:24 ` Dong Aisheng
2016-04-28 13:24 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 08/23] mmc: sdhci: rename quirk SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 12:33 ` Adrian Hunter
2016-04-22 12:33 ` Adrian Hunter
2016-04-24 10:00 ` Dong Aisheng
2016-04-24 10:00 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 09/23] mmc: sdhci: fix incorrect get data interrupt during no data transfer Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 6:51 ` Adrian Hunter
2016-05-10 6:51 ` Adrian Hunter
2016-05-17 4:31 ` Ritesh Harjani
2016-05-17 4:31 ` Ritesh Harjani
2016-05-17 5:58 ` Adrian Hunter
2016-05-17 5:58 ` Adrian Hunter
2016-05-26 14:59 ` Ritesh Harjani
2016-05-26 14:59 ` Ritesh Harjani
2016-05-26 11:41 ` Dong Aisheng
2016-05-26 11:41 ` Dong Aisheng
2016-05-26 11:59 ` Adrian Hunter
2016-05-26 11:59 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 10/23] mmc: core: disable auto retune during card detection process Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-22 12:48 ` Adrian Hunter
2016-04-22 12:48 ` Adrian Hunter
2016-04-24 10:47 ` Dong Aisheng
2016-04-24 10:47 ` Dong Aisheng
2016-04-28 7:04 ` Adrian Hunter
2016-04-28 7:04 ` Adrian Hunter
2016-04-28 13:22 ` Dong Aisheng
2016-04-28 13:22 ` Dong Aisheng
2016-04-29 6:54 ` Adrian Hunter [this message]
2016-04-29 6:54 ` Adrian Hunter
2016-04-29 7:42 ` Dong Aisheng
2016-04-29 7:42 ` Dong Aisheng
2016-05-10 6:55 ` Adrian Hunter
2016-05-10 6:55 ` Adrian Hunter
2016-05-31 10:18 ` Dong Aisheng
2016-05-31 10:18 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 11/23] mmc: sdhci-esdhci-imx: remove SDHCI_QUIRK_BROKEN_TIMEOUT_VAL Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 9:30 ` Adrian Hunter
2016-05-10 9:30 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 12/23] mmc: sdhci-esdhc-imx: add esdhc specific suspend resume callback Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 9:35 ` Adrian Hunter
2016-05-10 9:35 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 13/23] mmc: sdhci-esdhc-imx: restore watermark level setting after resume Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 9:30 ` Adrian Hunter
2016-05-10 9:30 ` Adrian Hunter
2016-05-31 7:18 ` Dong Aisheng
2016-05-31 7:18 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 14/23] mmc: sdhci-esdhci-imx: disable DLL delay line settings explicitly Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 11:02 ` Adrian Hunter
2016-05-10 11:02 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 15/23] mmc: sdhci-esdhc-imx: support setting tuning start point Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 11:17 ` Adrian Hunter
2016-05-10 11:17 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 16/23] doc: dt: fsl-imx-esdhc: add set tuning start point binding Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 17/23] mmc: sdhci: add standard hw auto retuning support Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 8:35 ` Adrian Hunter
2016-05-10 8:35 ` Adrian Hunter
2016-05-26 12:11 ` Dong Aisheng
2016-05-26 12:11 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 18/23] mmc: sdhci-esdhc-imx: enable hw auto retuning for STD_TUNING Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 11:19 ` Adrian Hunter
2016-05-10 11:19 ` Adrian Hunter
2016-05-26 12:21 ` Dong Aisheng
2016-05-26 12:21 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 19/23] mmc: sdhci-esdhc-imx: enable hw auto retuning for MAN_TUNING Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 11:24 ` Adrian Hunter
2016-05-10 11:24 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 20/23] mmc: sdhci-esdhc-imx: fix strobe DLL lock wrong clock issue Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 12:03 ` Adrian Hunter
2016-05-10 12:03 ` Adrian Hunter
2016-05-26 11:47 ` Dong Aisheng
2016-05-26 11:47 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 21/23] mmc: sdhci-esdhc-imx: factor out hw related intialization into function Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 12:15 ` Adrian Hunter
2016-05-10 12:15 ` Adrian Hunter
2016-05-26 11:45 ` Dong Aisheng
2016-05-26 11:45 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 22/23] mmc: sdhci-esdhc-imx: move tuning static configuration into hwinit function Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 13:07 ` Adrian Hunter
2016-05-10 13:07 ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 23/23] mmc: sdhci-esdhc-imx: clear tuning bits during hwinit Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-05-10 13:10 ` Adrian Hunter
2016-05-10 13:10 ` Adrian Hunter
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=57230515.9030602@intel.com \
--to=adrian.hunter@intel.com \
--cc=aisheng.dong@nxp.com \
--cc=chris@printf.net \
--cc=dongas86@gmail.com \
--cc=haibo.chen@nxp.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-mmc@vger.kernel.org \
--cc=shawnguo@kernel.org \
--cc=ulf.hansson@linaro.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.