All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mans Rullgard <mans@mansr.com>
To: Tejun Heo <tj@kernel.org>,
	linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Subject: [PATCH 3/3] ata: sata_dwc_460ex: get rid of global data
Date: Tue, 15 Dec 2015 23:25:34 +0000	[thread overview]
Message-ID: <1450221935-6034-3-git-send-email-mans@mansr.com> (raw)
In-Reply-To: <1450221935-6034-1-git-send-email-mans@mansr.com>

This moves all global data into the driver private struct, thus
permitting multiple devices of this type to be used.

Signed-off-by: Mans Rullgard <mans@mansr.com>
---
 drivers/ata/sata_dwc_460ex.c | 80 ++++++++++++++++++++------------------------
 1 file changed, 36 insertions(+), 44 deletions(-)

diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c
index d07aae1..919f870 100644
--- a/drivers/ata/sata_dwc_460ex.c
+++ b/drivers/ata/sata_dwc_460ex.c
@@ -146,6 +146,8 @@ struct sata_dwc_device {
 	struct ata_host		*host;
 	u8 __iomem		*reg_base;
 	struct sata_dwc_regs	*sata_dwc_regs;	/* DW Synopsys SATA specific */
+	u32			sactive_issued;
+	u32			sactive_queued;
 	struct phy		*phy;
 #ifdef CONFIG_SATA_DWC_OLD_DMA
 	struct dw_dma_chip	*dma;
@@ -190,14 +192,6 @@ enum {
 	SATA_DWC_DMA_PENDING_RX		= 2,
 };
 
-struct sata_dwc_host_priv {
-	void	__iomem	 *scr_addr_sstatus;
-	u32	sata_dwc_sactive_issued ;
-	u32	sata_dwc_sactive_queued ;
-};
-
-static struct sata_dwc_host_priv host_pvt;
-
 /*
  * Prototypes
  */
@@ -448,21 +442,22 @@ static int sata_dwc_scr_write(struct ata_link *link, unsigned int scr, u32 val)
 	return 0;
 }
 
-static u32 core_scr_read(unsigned int scr)
+static u32 core_scr_read(struct sata_dwc_device *hsdev, unsigned int scr)
 {
-	return in_le32(host_pvt.scr_addr_sstatus + (scr * 4));
+	return in_le32(hsdev->reg_base + SATA_DWC_SCR_OFFSET + (scr * 4));
 }
 
-static void core_scr_write(unsigned int scr, u32 val)
+static void core_scr_write(struct sata_dwc_device *hsdev, unsigned int scr,
+			   u32 val)
 {
-	out_le32(host_pvt.scr_addr_sstatus + (scr * 4), val);
+	out_le32(hsdev->reg_base + SATA_DWC_SCR_OFFSET + (scr * 4), val);
 }
 
-static void clear_serror(void)
+static void clear_serror(struct sata_dwc_device *hsdev)
 {
 	u32 val;
-	val = core_scr_read(SCR_ERROR);
-	core_scr_write(SCR_ERROR, val);
+	val = core_scr_read(hsdev, SCR_ERROR);
+	core_scr_write(hsdev, SCR_ERROR, val);
 }
 
 static void clear_interrupt_bit(struct sata_dwc_device *hsdev, u32 bit)
@@ -489,7 +484,7 @@ static void sata_dwc_error_intr(struct ata_port *ap,
 
 	ata_ehi_clear_desc(ehi);
 
-	serror = core_scr_read(SCR_ERROR);
+	serror = core_scr_read(hsdev, SCR_ERROR);
 	status = ap->ops->sff_check_status(ap);
 
 	tag = ap->link.active_tag;
@@ -500,7 +495,7 @@ static void sata_dwc_error_intr(struct ata_port *ap,
 		hsdevp->dma_pending[tag], hsdevp->cmd_issued[tag]);
 
 	/* Clear error register and interrupt bit */
-	clear_serror();
+	clear_serror(hsdev);
 	clear_interrupt_bit(hsdev, SATA_DWC_INTPR_ERR);
 
 	/* This is the only error happening now.  TODO check for exact error */
@@ -539,7 +534,7 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
 	int handled, num_processed, port = 0;
 	uint intpr, sactive, sactive2, tag_mask;
 	struct sata_dwc_device_port *hsdevp;
-	host_pvt.sata_dwc_sactive_issued = 0;
+	hsdev->sactive_issued = 0;
 
 	spin_lock_irqsave(&host->lock, flags);
 
@@ -568,7 +563,7 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
 		if (hsdevp->cmd_issued[tag] != SATA_DWC_CMD_ISSUED_PEND)
 			dev_warn(ap->dev, "CMD tag=%d not pending?\n", tag);
 
-		host_pvt.sata_dwc_sactive_issued |= qcmd_tag_to_mask(tag);
+		hsdev->sactive_issued |= qcmd_tag_to_mask(tag);
 
 		qc = ata_qc_from_tag(ap, tag);
 		/*
@@ -582,11 +577,11 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
 		handled = 1;
 		goto DONE;
 	}
-	sactive = core_scr_read(SCR_ACTIVE);
-	tag_mask = (host_pvt.sata_dwc_sactive_issued | sactive) ^ sactive;
+	sactive = core_scr_read(hsdev, SCR_ACTIVE);
+	tag_mask = (hsdev->sactive_issued | sactive) ^ sactive;
 
 	/* If no sactive issued and tag_mask is zero then this is not NCQ */
-	if (host_pvt.sata_dwc_sactive_issued == 0 && tag_mask == 0) {
+	if (hsdev->sactive_issued == 0 && tag_mask == 0) {
 		if (ap->link.active_tag == ATA_TAG_POISON)
 			tag = 0;
 		else
@@ -656,22 +651,19 @@ DRVSTILLBUSY:
 	 */
 
 	 /* process completed commands */
-	sactive = core_scr_read(SCR_ACTIVE);
-	tag_mask = (host_pvt.sata_dwc_sactive_issued | sactive) ^ sactive;
+	sactive = core_scr_read(hsdev, SCR_ACTIVE);
+	tag_mask = (hsdev->sactive_issued | sactive) ^ sactive;
 
-	if (sactive != 0 || (host_pvt.sata_dwc_sactive_issued) > 1 || \
-							tag_mask > 1) {
+	if (sactive != 0 || hsdev->sactive_issued > 1 ||  tag_mask > 1) {
 		dev_dbg(ap->dev,
 			"%s NCQ:sactive=0x%08x  sactive_issued=0x%08x tag_mask=0x%08x\n",
-			__func__, sactive, host_pvt.sata_dwc_sactive_issued,
-			tag_mask);
+			__func__, sactive, hsdev->sactive_issued, tag_mask);
 	}
 
-	if ((tag_mask | (host_pvt.sata_dwc_sactive_issued)) != \
-					(host_pvt.sata_dwc_sactive_issued)) {
+	if ((tag_mask | hsdev->sactive_issued) != hsdev->sactive_issued) {
 		dev_warn(ap->dev,
-			 "Bad tag mask?  sactive=0x%08x (host_pvt.sata_dwc_sactive_issued)=0x%08x  tag_mask=0x%08x\n",
-			 sactive, host_pvt.sata_dwc_sactive_issued, tag_mask);
+			 "Bad tag mask?  sactive=0x%08x sactive_issued=0x%08x  tag_mask=0x%08x\n",
+			 sactive, hsdev->sactive_issued, tag_mask);
 	}
 
 	/* read just to clear ... not bad if currently still busy */
@@ -733,7 +725,7 @@ STILLBUSY:
 	 * we were processing --we read status as part of processing a completed
 	 * command).
 	 */
-	sactive2 = core_scr_read(SCR_ACTIVE);
+	sactive2 = core_scr_read(hsdev, SCR_ACTIVE);
 	if (sactive2 != sactive) {
 		dev_dbg(ap->dev,
 			"More completed - sactive=0x%x sactive2=0x%x\n",
@@ -819,8 +811,9 @@ static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc,
 	u8 status = 0;
 	u32 mask = 0x0;
 	u8 tag = qc->tag;
+	struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
 	struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
-	host_pvt.sata_dwc_sactive_queued = 0;
+	hsdev->sactive_queued = 0;
 	dev_dbg(ap->dev, "%s checkstatus? %x\n", __func__, check_status);
 
 	if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX)
@@ -833,10 +826,8 @@ static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc,
 
 	/* clear active bit */
 	mask = (~(qcmd_tag_to_mask(tag)));
-	host_pvt.sata_dwc_sactive_queued = (host_pvt.sata_dwc_sactive_queued) \
-						& mask;
-	host_pvt.sata_dwc_sactive_issued = (host_pvt.sata_dwc_sactive_issued) \
-						& mask;
+	hsdev->sactive_queued = hsdev->sactive_queued & mask;
+	hsdev->sactive_issued = hsdev->sactive_issued & mask;
 	ata_qc_complete(qc);
 	return 0;
 }
@@ -961,7 +952,7 @@ static int sata_dwc_port_start(struct ata_port *ap)
 	}
 
 	/* Clear any error bits before libata starts issuing commands */
-	clear_serror();
+	clear_serror(hsdev);
 	ap->private_data = hsdevp;
 	dev_dbg(ap->dev, "%s: done\n", __func__);
 	return 0;
@@ -999,6 +990,7 @@ static void sata_dwc_exec_command_by_tag(struct ata_port *ap,
 {
 	unsigned long flags;
 	struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
+	struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
 
 	dev_dbg(ap->dev, "%s cmd(0x%02x): %s tag=%d\n", __func__, tf->command,
 		ata_get_cmd_descript(tf->command), tag);
@@ -1012,7 +1004,7 @@ static void sata_dwc_exec_command_by_tag(struct ata_port *ap,
 	 * managed SError register for the disk needs to be done before the
 	 * task file is loaded.
 	 */
-	clear_serror();
+	clear_serror(hsdev);
 	ata_sff_exec_command(ap, tf);
 }
 
@@ -1065,7 +1057,7 @@ static void sata_dwc_bmdma_start_by_tag(struct ata_queued_cmd *qc, u8 tag)
 	sata_dwc_tf_dump(ap, &qc->tf);
 
 	if (start_dma) {
-		reg = core_scr_read(SCR_ERROR);
+		reg = core_scr_read(hsdev, SCR_ERROR);
 		if (reg & SATA_DWC_SERROR_ERR_BITS) {
 			dev_err(ap->dev, "%s: ****** SError=0x%08x ******\n",
 				__func__, reg);
@@ -1128,6 +1120,7 @@ static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
 	u32 sactive;
 	u8 tag = qc->tag;
 	struct ata_port *ap = qc->ap;
+	struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
 
 #ifdef DEBUG_NCQ
 	if (qc->tag > 0 || ap->link.sactive > 1)
@@ -1144,9 +1137,9 @@ static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
 	sata_dwc_qc_prep_by_tag(qc, tag);
 
 	if (ata_is_ncq(qc->tf.protocol)) {
-		sactive = core_scr_read(SCR_ACTIVE);
+		sactive = core_scr_read(hsdev, SCR_ACTIVE);
 		sactive |= (0x00000001 << tag);
-		core_scr_write(SCR_ACTIVE, sactive);
+		core_scr_write(hsdev, SCR_ACTIVE, sactive);
 
 		dev_dbg(qc->ap->dev,
 			"%s: tag=%d ap->link.sactive = 0x%08x sactive=0x%08x\n",
@@ -1289,7 +1282,6 @@ static int sata_dwc_probe(struct platform_device *ofdev)
 	/* Setup port */
 	host->ports[0]->ioaddr.cmd_addr = base;
 	host->ports[0]->ioaddr.scr_addr = base + SATA_DWC_SCR_OFFSET;
-	host_pvt.scr_addr_sstatus = base + SATA_DWC_SCR_OFFSET;
 	sata_dwc_setup_port(&host->ports[0]->ioaddr, (unsigned long)base);
 
 	/* Read the ID and Version Registers */
-- 
2.6.3

  parent reply	other threads:[~2015-12-15 23:25 UTC|newest]

Thread overview: 154+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-15 23:25 [PATCH 1/3] ata: sata_dwc_460ex: use "dmas" DT property to find dma channel Mans Rullgard
2015-12-15 23:25 ` [PATCH 2/3] ata: sata_dwc_460ex: add phy support Mans Rullgard
2015-12-16 11:14   ` Sergei Shtylyov
2015-12-16 11:24     ` Måns Rullgård
2015-12-15 23:25 ` Mans Rullgard [this message]
2015-12-17 15:06   ` [PATCH 3/3] ata: sata_dwc_460ex: get rid of global data Andy Shevchenko
2015-12-17 15:19     ` Måns Rullgård
2015-12-17 15:37       ` Andy Shevchenko
2015-12-17 15:57         ` Måns Rullgård
2015-12-15 23:34 ` [PATCH 1/3] ata: sata_dwc_460ex: use "dmas" DT property to find dma channel Måns Rullgård
2015-12-17 14:59   ` Andy Shevchenko
2015-12-17 15:13     ` Måns Rullgård
2015-12-17 15:55       ` Andy Shevchenko
2015-12-17 16:04         ` Måns Rullgård
2015-12-17 16:53           ` Andy Shevchenko
2015-12-17 17:57             ` Julian Margetson
2015-12-17 17:59               ` Måns Rullgård
     [not found]                 ` <567302E8.5050303@candw.ms>
2015-12-17 18:51                   ` Måns Rullgård
     [not found]                     ` <5673061A.4070700@candw.ms>
2015-12-17 19:53                       ` Måns Rullgård
     [not found]                         ` <56732C04.9040100@candw.ms>
2015-12-18  0:06                           ` Måns Rullgård
2015-12-18  0:59                             ` Julian Margetson
2015-12-18  1:38                               ` Måns Rullgård
2015-12-18 11:48                             ` Julian Margetson
2015-12-18 12:04                               ` Måns Rullgård
2015-12-18 12:23                                 ` Andy Shevchenko
2015-12-18 12:49                                   ` Måns Rullgård
     [not found]                                     ` <5674271B.9090308@candw.ms>
2015-12-18 17:18                                       ` Måns Rullgård
2015-12-18 18:48                                         ` Andy Shevchenko
     [not found]                                         ` <56745BA4.1090607@candw.ms>
2015-12-18 22:33                                           ` Måns Rullgård
2015-12-18 22:49                                             ` Julian Margetson
2015-12-18 23:16                                               ` Måns Rullgård
2015-12-19  2:34                                                 ` Andy Shevchenko
2015-12-19 11:39                                                   ` Julian Margetson
2015-12-19 15:40                                                     ` Måns Rullgård
2015-12-19 15:40                                                       ` Måns Rullgård
     [not found]                                                       ` <567585CD.9080105@candw.ms>
2015-12-19 16:39                                                         ` Måns Rullgård
2015-12-19 16:39                                                           ` Måns Rullgård
2015-12-19 16:56                                                       ` Andy Shevchenko
2015-12-19 17:05                                                         ` Måns Rullgård
2015-12-19 17:05                                                           ` Måns Rullgård
2015-12-19 17:09                                                           ` Julian Margetson
2015-12-19 17:11                                                             ` Andy Shevchenko
2015-12-19 17:19                                                             ` Måns Rullgård
2015-12-19 17:19                                                               ` Måns Rullgård
2015-12-19 18:56                                                               ` Julian Margetson
2015-12-19 19:07                                                                 ` Måns Rullgård
2015-12-19 19:07                                                                   ` Måns Rullgård
2015-12-19 20:16                                                                   ` Julian Margetson
2015-12-19 20:39                                                                     ` Andy Shevchenko
2015-12-19 20:41                                                                       ` Måns Rullgård
2015-12-19 20:41                                                                         ` Måns Rullgård
2015-12-19 20:48                                                                         ` Julian Margetson
2015-12-19 20:55                                                                         ` Julian Margetson
2015-12-20 17:11                                                                           ` Måns Rullgård
2015-12-20 17:11                                                                             ` Måns Rullgård
2015-12-20 17:41                                                                             ` Andy Shevchenko
2015-12-20 17:54                                                                               ` Måns Rullgård
2015-12-20 17:54                                                                                 ` Måns Rullgård
2015-12-20 17:44                                                                             ` Julian Margetson
2015-12-20 18:49                                                                               ` Måns Rullgård
2015-12-20 18:49                                                                                 ` Måns Rullgård
2015-12-20 20:17                                                                                 ` Andy Shevchenko
2015-12-20 20:55                                                                                   ` Andy Shevchenko
2015-12-21  1:19                                                                                     ` Måns Rullgård
2015-12-21  1:19                                                                                       ` Måns Rullgård
2015-12-21 19:08                                                                                       ` Andy Shevchenko
2015-12-21 19:27                                                                                         ` Måns Rullgård
2015-12-21 19:27                                                                                           ` Måns Rullgård
2015-12-21 20:54                                                                                           ` Andy Shevchenko
2015-12-21 21:06                                                                                             ` Måns Rullgård
2015-12-21 21:06                                                                                               ` Måns Rullgård
2015-12-22  0:08                                                                                             ` Måns Rullgård
2015-12-22  0:08                                                                                               ` Måns Rullgård
2015-12-22 10:58                                                                                               ` Andy Shevchenko
2016-01-06 16:26                                                                                                 ` Måns Rullgård
2016-01-06 16:26                                                                                                   ` Måns Rullgård
2016-01-06 17:36                                                                                                   ` Andy Shevchenko
2016-01-07  9:34                                                                                                     ` Andy Shevchenko
2016-01-07 18:32                                                                                                       ` Måns Rullgård
2016-01-07 18:32                                                                                                         ` Måns Rullgård
2016-01-08  8:57                                                                                                         ` Andy Shevchenko
2016-01-08 10:57                                                                                                           ` Måns Rullgård
2016-01-08 10:57                                                                                                             ` Måns Rullgård
2016-01-20 18:50                                                                                                           ` Måns Rullgård
2016-01-20 18:50                                                                                                             ` Måns Rullgård
2016-01-20 19:23                                                                                                             ` Andy Shevchenko
2016-01-20 19:24                                                                                                               ` Måns Rullgård
2016-01-20 19:24                                                                                                                 ` Måns Rullgård
2016-01-20 19:38                                                                                                                 ` Andy Shevchenko
2016-01-20 19:46                                                                                                                   ` Måns Rullgård
2016-01-20 19:46                                                                                                                     ` Måns Rullgård
2016-01-20 19:51                                                                                                                     ` Andy Shevchenko
2016-01-20 20:07                                                                                                                       ` Måns Rullgård
2016-01-20 20:07                                                                                                                         ` Måns Rullgård
2016-01-22 10:04                                                                                                                         ` Andy Shevchenko
2016-01-22 11:13                                                                                                                           ` Måns Rullgård
2016-01-22 11:13                                                                                                                             ` Måns Rullgård
2016-01-22 11:56                                                                                                                             ` Andy Shevchenko
2016-01-22 12:05                                                                                                                               ` Måns Rullgård
2016-01-22 12:05                                                                                                                                 ` Måns Rullgård
2016-01-22 12:15                                                                                                                                 ` Andy Shevchenko
2015-12-21 16:48                                                                                     ` Andy Shevchenko
2015-12-21 17:20                                                                                       ` Julian Margetson
2015-12-21 17:26                                                                                       ` Julian Margetson
2015-12-21 17:55                                                                                         ` Andy Shevchenko
2015-12-21 18:23                                                                                           ` Julian Margetson
2015-12-21 18:27                                                                                             ` Måns Rullgård
2015-12-21 18:27                                                                                               ` Måns Rullgård
2015-12-21 19:08                                                                                               ` Julian Margetson
2015-12-21 19:19                                                                                               ` Julian Margetson
2015-12-21 19:27                                                                                                 ` Måns Rullgård
2015-12-21 19:27                                                                                                   ` Måns Rullgård
2015-12-21 19:47                                                                                                   ` Julian Margetson
2015-12-21 20:25                                                                                                 ` Andy Shevchenko
2015-12-21 20:29                                                                                                   ` Julian Margetson
2016-01-22 10:07                                                                                                     ` Andy Shevchenko
2015-12-21 20:33                                                                                                   ` Måns Rullgård
2015-12-21 20:33                                                                                                     ` Måns Rullgård
2015-12-21 18:25                                                                                           ` Måns Rullgård
2015-12-21 18:25                                                                                             ` Måns Rullgård
2015-12-21  0:47                                                                                   ` Måns Rullgård
2015-12-21  0:47                                                                                     ` Måns Rullgård
2015-12-21  0:53                                                                                     ` Måns Rullgård
2015-12-21  0:53                                                                                       ` Måns Rullgård
2015-12-21  0:58                                                                                   ` Måns Rullgård
2015-12-21  0:58                                                                                     ` Måns Rullgård
2015-12-21  8:40                                                                                     ` Andy Shevchenko
2015-12-21 12:15                                                                                       ` Måns Rullgård
2015-12-21 12:15                                                                                         ` Måns Rullgård
2015-12-21 17:24                                                                                         ` Andy Shevchenko
2015-12-21 18:16                                                                                           ` Måns Rullgård
2015-12-21 18:16                                                                                             ` Måns Rullgård
2015-12-21 19:23                                                                                             ` Andy Shevchenko
2015-12-21 19:50                                                                                               ` Måns Rullgård
2015-12-21 19:50                                                                                                 ` Måns Rullgård
     [not found]                                                                                       ` <5677D447.40906@candw.ms>
2015-12-21 12:16                                                                                         ` Måns Rullgård
2015-12-21 12:16                                                                                           ` Måns Rullgård
2015-12-21 13:18                                                                                           ` Julian Margetson
2015-12-21 13:24                                                                                             ` Måns Rullgård
2015-12-21 13:24                                                                                               ` Måns Rullgård
2015-12-21 14:40                                                                                               ` Julian Margetson
2015-12-21 15:24                                                                                                 ` Måns Rullgård
2015-12-21 15:24                                                                                                   ` Måns Rullgård
2015-12-21 16:44                                                                                                   ` Andy Shevchenko
2015-12-21 18:19                                                                                                     ` Måns Rullgård
2015-12-21 18:19                                                                                                       ` Måns Rullgård
2015-12-18 12:33                                 ` Julian Margetson
2015-12-18 12:38                                   ` Andy Shevchenko
2015-12-18 12:45                                   ` Måns Rullgård
     [not found]                                     ` <56740F9F.5020500@candw.ms>
2015-12-18 14:24                                       ` Andy Shevchenko
2015-12-18 14:27                                       ` Måns Rullgård
2015-12-18 10:08                           ` Andy Shevchenko
2015-12-18 11:24                             ` Måns Rullgård
2015-12-17 14:58 ` Andy Shevchenko

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=1450221935-6034-3-git-send-email-mans@mansr.com \
    --to=mans@mansr.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tj@kernel.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.