All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tudor Ambarus <tudor.ambarus@linaro.org>
To: broonie@kernel.org, andi.shyti@kernel.org, arnd@arndb.de
Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org,
	conor+dt@kernel.org, alim.akhtar@samsung.com,
	linux-spi@vger.kernel.org, linux-samsung-soc@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-arch@vger.kernel.org,
	andre.draszik@linaro.org, peter.griffin@linaro.org,
	semen.protsenko@linaro.org, kernel-team@android.com,
	willmcvicker@google.com, Tudor Ambarus <tudor.ambarus@linaro.org>
Subject: [PATCH v2 16/28] spi: s3c64xx: simplify s3c64xx_wait_for_pio()
Date: Thu, 25 Jan 2024 14:49:54 +0000	[thread overview]
Message-ID: <20240125145007.748295-17-tudor.ambarus@linaro.org> (raw)
In-Reply-To: <20240125145007.748295-1-tudor.ambarus@linaro.org>

s3c64xx_spi_transfer_one() makes sure that for PIO the xfer->len is
always smaller than the fifo size. Since we can't receive more that the
FIFO size, droop the loop handling, the code becomes less misleading.

Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
 drivers/spi/spi-s3c64xx.c | 75 +++++++++------------------------------
 1 file changed, 17 insertions(+), 58 deletions(-)

diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index d2dd28ff00c6..00a0878aeb80 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -485,26 +485,6 @@ static int s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd,
 	return 0;
 }
 
-static u32 s3c64xx_spi_wait_for_timeout(struct s3c64xx_spi_driver_data *sdd,
-					int timeout_ms)
-{
-	void __iomem *regs = sdd->regs;
-	unsigned long val = 1;
-	u32 status;
-	u32 max_fifo = FIFO_DEPTH(sdd);
-
-	if (timeout_ms)
-		val = msecs_to_loops(timeout_ms);
-
-	do {
-		status = readl(regs + S3C64XX_SPI_STATUS);
-	} while (FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status) < max_fifo &&
-		 --val);
-
-	/* return the actual received data length */
-	return FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status);
-}
-
 static int s3c64xx_wait_for_dma(struct s3c64xx_spi_driver_data *sdd,
 				struct spi_transfer *xfer)
 {
@@ -553,13 +533,11 @@ static int s3c64xx_wait_for_pio(struct s3c64xx_spi_driver_data *sdd,
 				struct spi_transfer *xfer, bool use_irq)
 {
 	void __iomem *regs = sdd->regs;
+	u8 *buf = xfer->rx_buf;
+	unsigned long time_us;
 	unsigned long val;
-	u32 status;
-	int loops;
-	u32 cpy_len;
-	u8 *buf;
+	u32 status, len;
 	int ms;
-	unsigned long time_us;
 
 	/* microsecs to xfer 'len' bytes @ 'cur_speed' */
 	time_us = (xfer->len * 8 * 1000 * 1000) / sdd->cur_speed;
@@ -582,48 +560,29 @@ static int s3c64xx_wait_for_pio(struct s3c64xx_spi_driver_data *sdd,
 		status = readl(regs + S3C64XX_SPI_STATUS);
 	} while (FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status) < xfer->len &&
 		 --val);
-
 	if (!val)
 		return -EIO;
 
 	/* If it was only Tx */
-	if (!xfer->rx_buf) {
+	if (!buf) {
 		sdd->state &= ~TXBUSY;
 		return 0;
 	}
 
-	/*
-	 * If the receive length is bigger than the controller fifo
-	 * size, calculate the loops and read the fifo as many times.
-	 * loops = length / max fifo size (calculated by using the
-	 * fifo mask).
-	 * For any size less than the fifo size the below code is
-	 * executed atleast once.
-	 */
-	loops = xfer->len / FIFO_DEPTH(sdd);
-	buf = xfer->rx_buf;
-	do {
-		/* wait for data to be received in the fifo */
-		cpy_len = s3c64xx_spi_wait_for_timeout(sdd,
-						       (loops ? ms : 0));
-
-		switch (sdd->cur_bpw) {
-		case 32:
-			ioread32_rep(regs + S3C64XX_SPI_RX_DATA,
-				     buf, cpy_len / 4);
-			break;
-		case 16:
-			ioread16_rep(regs + S3C64XX_SPI_RX_DATA,
-				     buf, cpy_len / 2);
-			break;
-		default:
-			ioread8_rep(regs + S3C64XX_SPI_RX_DATA,
-				    buf, cpy_len);
-			break;
-		}
+	len = FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status);
+
+	switch (sdd->cur_bpw) {
+	case 32:
+		ioread32_rep(regs + S3C64XX_SPI_RX_DATA, buf, len / 4);
+		break;
+	case 16:
+		ioread16_rep(regs + S3C64XX_SPI_RX_DATA, buf, len / 2);
+		break;
+	default:
+		ioread8_rep(regs + S3C64XX_SPI_RX_DATA, buf, len);
+		break;
+	}
 
-		buf = buf + cpy_len;
-	} while (loops--);
 	sdd->state &= ~RXBUSY;
 
 	return 0;
-- 
2.43.0.429.g432eaa2c6b-goog


WARNING: multiple messages have this Message-ID (diff)
From: Tudor Ambarus <tudor.ambarus@linaro.org>
To: broonie@kernel.org, andi.shyti@kernel.org, arnd@arndb.de
Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org,
	conor+dt@kernel.org, alim.akhtar@samsung.com,
	linux-spi@vger.kernel.org, linux-samsung-soc@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-arch@vger.kernel.org,
	andre.draszik@linaro.org, peter.griffin@linaro.org,
	semen.protsenko@linaro.org, kernel-team@android.com,
	willmcvicker@google.com, Tudor Ambarus <tudor.ambarus@linaro.org>
Subject: [PATCH v2 16/28] spi: s3c64xx: simplify s3c64xx_wait_for_pio()
Date: Thu, 25 Jan 2024 14:49:54 +0000	[thread overview]
Message-ID: <20240125145007.748295-17-tudor.ambarus@linaro.org> (raw)
In-Reply-To: <20240125145007.748295-1-tudor.ambarus@linaro.org>

s3c64xx_spi_transfer_one() makes sure that for PIO the xfer->len is
always smaller than the fifo size. Since we can't receive more that the
FIFO size, droop the loop handling, the code becomes less misleading.

Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
 drivers/spi/spi-s3c64xx.c | 75 +++++++++------------------------------
 1 file changed, 17 insertions(+), 58 deletions(-)

diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index d2dd28ff00c6..00a0878aeb80 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -485,26 +485,6 @@ static int s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd,
 	return 0;
 }
 
-static u32 s3c64xx_spi_wait_for_timeout(struct s3c64xx_spi_driver_data *sdd,
-					int timeout_ms)
-{
-	void __iomem *regs = sdd->regs;
-	unsigned long val = 1;
-	u32 status;
-	u32 max_fifo = FIFO_DEPTH(sdd);
-
-	if (timeout_ms)
-		val = msecs_to_loops(timeout_ms);
-
-	do {
-		status = readl(regs + S3C64XX_SPI_STATUS);
-	} while (FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status) < max_fifo &&
-		 --val);
-
-	/* return the actual received data length */
-	return FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status);
-}
-
 static int s3c64xx_wait_for_dma(struct s3c64xx_spi_driver_data *sdd,
 				struct spi_transfer *xfer)
 {
@@ -553,13 +533,11 @@ static int s3c64xx_wait_for_pio(struct s3c64xx_spi_driver_data *sdd,
 				struct spi_transfer *xfer, bool use_irq)
 {
 	void __iomem *regs = sdd->regs;
+	u8 *buf = xfer->rx_buf;
+	unsigned long time_us;
 	unsigned long val;
-	u32 status;
-	int loops;
-	u32 cpy_len;
-	u8 *buf;
+	u32 status, len;
 	int ms;
-	unsigned long time_us;
 
 	/* microsecs to xfer 'len' bytes @ 'cur_speed' */
 	time_us = (xfer->len * 8 * 1000 * 1000) / sdd->cur_speed;
@@ -582,48 +560,29 @@ static int s3c64xx_wait_for_pio(struct s3c64xx_spi_driver_data *sdd,
 		status = readl(regs + S3C64XX_SPI_STATUS);
 	} while (FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status) < xfer->len &&
 		 --val);
-
 	if (!val)
 		return -EIO;
 
 	/* If it was only Tx */
-	if (!xfer->rx_buf) {
+	if (!buf) {
 		sdd->state &= ~TXBUSY;
 		return 0;
 	}
 
-	/*
-	 * If the receive length is bigger than the controller fifo
-	 * size, calculate the loops and read the fifo as many times.
-	 * loops = length / max fifo size (calculated by using the
-	 * fifo mask).
-	 * For any size less than the fifo size the below code is
-	 * executed atleast once.
-	 */
-	loops = xfer->len / FIFO_DEPTH(sdd);
-	buf = xfer->rx_buf;
-	do {
-		/* wait for data to be received in the fifo */
-		cpy_len = s3c64xx_spi_wait_for_timeout(sdd,
-						       (loops ? ms : 0));
-
-		switch (sdd->cur_bpw) {
-		case 32:
-			ioread32_rep(regs + S3C64XX_SPI_RX_DATA,
-				     buf, cpy_len / 4);
-			break;
-		case 16:
-			ioread16_rep(regs + S3C64XX_SPI_RX_DATA,
-				     buf, cpy_len / 2);
-			break;
-		default:
-			ioread8_rep(regs + S3C64XX_SPI_RX_DATA,
-				    buf, cpy_len);
-			break;
-		}
+	len = FIELD_GET(S3C64XX_SPI_ST_RX_FIFO_LVL, status);
+
+	switch (sdd->cur_bpw) {
+	case 32:
+		ioread32_rep(regs + S3C64XX_SPI_RX_DATA, buf, len / 4);
+		break;
+	case 16:
+		ioread16_rep(regs + S3C64XX_SPI_RX_DATA, buf, len / 2);
+		break;
+	default:
+		ioread8_rep(regs + S3C64XX_SPI_RX_DATA, buf, len);
+		break;
+	}
 
-		buf = buf + cpy_len;
-	} while (loops--);
 	sdd->state &= ~RXBUSY;
 
 	return 0;
-- 
2.43.0.429.g432eaa2c6b-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2024-01-25 14:50 UTC|newest]

Thread overview: 154+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-25 14:49 [PATCH v2 00/28] spi: s3c64xx: winter cleanup and gs101 support Tudor Ambarus
2024-01-25 14:49 ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 01/28] spi: s3c64xx: explicitly include <linux/io.h> Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 18:58   ` Sam Protsenko
2024-01-25 18:58     ` Sam Protsenko
2024-01-26 14:40     ` Tudor Ambarus
2024-01-26 14:40       ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 02/28] spi: s3c64xx: explicitly include <linux/bits.h> Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 03/28] spi: s3c64xx: avoid possible negative array index Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 18:50   ` Sam Protsenko
2024-01-25 18:50     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 04/28] spi: dt-bindings: samsung: add google,gs101-spi compatible Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 05/28] spi: dt-bindings: samsung: add samsung,spi-fifosize property Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 16:16   ` Mark Brown
2024-01-25 16:16     ` Mark Brown
2024-01-25 16:38     ` Tudor Ambarus
2024-01-25 16:38       ` Tudor Ambarus
2024-01-25 17:26       ` Mark Brown
2024-01-25 17:26         ` Mark Brown
2024-01-25 17:30         ` Tudor Ambarus
2024-01-25 17:30           ` Tudor Ambarus
2024-01-25 17:45           ` Mark Brown
2024-01-25 17:45             ` Mark Brown
2024-01-25 19:01             ` Tudor Ambarus
2024-01-25 19:01               ` Tudor Ambarus
2024-01-30 22:25               ` Rob Herring
2024-01-30 22:25                 ` Rob Herring
2024-02-05  9:42                 ` Tudor Ambarus
2024-02-05  9:42                   ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 06/28] spi: s3c64xx: sort headers alphabetically Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 07/28] spi: s3c64xx: remove unneeded (void *) casts in of_match_table Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 19:04   ` Sam Protsenko
2024-01-25 19:04     ` Sam Protsenko
2024-01-26  8:24     ` Tudor Ambarus
2024-01-26  8:24       ` Tudor Ambarus
2024-01-26 19:40       ` Sam Protsenko
2024-01-26 19:40         ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 08/28] spi: s3c64xx: remove else after return Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 09/28] spi: s3c64xx: use bitfield access macros Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 19:50   ` Sam Protsenko
2024-01-25 19:50     ` Sam Protsenko
2024-01-26  8:49     ` Tudor Ambarus
2024-01-26  8:49       ` Tudor Ambarus
2024-01-26 19:55       ` Sam Protsenko
2024-01-26 19:55         ` Sam Protsenko
2024-01-26 16:01     ` Tudor Ambarus
2024-01-26 16:01       ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 10/28] spi: s3c64xx: use full mask for {RX, TX}_FIFO_LVL Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:03   ` Sam Protsenko
2024-01-25 20:03     ` Sam Protsenko
2024-01-25 21:48     ` Mark Brown
2024-01-25 21:48       ` Mark Brown
2024-01-26  8:51       ` Tudor Ambarus
2024-01-26  8:51         ` Tudor Ambarus
2024-01-26  8:12     ` Tudor Ambarus
2024-01-26  8:12       ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 11/28] spi: s3c64xx: move common code outside if else Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:09   ` Sam Protsenko
2024-01-25 20:09     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 12/28] spi: s3c64xx: check return code of dmaengine_slave_config() Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:19   ` Sam Protsenko
2024-01-25 20:19     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 13/28] spi: s3c64xx: propagate the dma_submit_error() error code Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:23   ` Sam Protsenko
2024-01-25 20:23     ` Sam Protsenko
2024-01-26  7:42     ` Tudor Ambarus
2024-01-26  7:42       ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 14/28] spi: s3c64xx: rename prepare_dma() to s3c64xx_prepare_dma() Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:24   ` Sam Protsenko
2024-01-25 20:24     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 15/28] spi: s3c64xx: return ETIMEDOUT for wait_for_completion_timeout() Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:30   ` Sam Protsenko
2024-01-25 20:30     ` Sam Protsenko
2024-01-25 14:49 ` Tudor Ambarus [this message]
2024-01-25 14:49   ` [PATCH v2 16/28] spi: s3c64xx: simplify s3c64xx_wait_for_pio() Tudor Ambarus
2024-01-25 20:43   ` Sam Protsenko
2024-01-25 20:43     ` Sam Protsenko
2024-01-26  7:56     ` Tudor Ambarus
2024-01-26  7:56       ` Tudor Ambarus
2024-01-26 19:31       ` Sam Protsenko
2024-01-26 19:31         ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 17/28] spi: s3c64xx: drop blank line between declarations Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:38   ` Sam Protsenko
2024-01-25 20:38     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 18/28] spi: s3c64xx: fix typo, s/configuartion/configuration Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:39   ` Sam Protsenko
2024-01-25 20:39     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 19/28] spi: s3c64xx: downgrade dev_warn to dev_dbg for optional dt props Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 20:40   ` Sam Protsenko
2024-01-25 20:40     ` Sam Protsenko
2024-01-25 14:49 ` [PATCH v2 20/28] spi: s3c64xx: add support for inferring fifosize from the compatible Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 14:49 ` [PATCH v2 21/28] spi: s3c64xx: infer " Tudor Ambarus
2024-01-25 14:49   ` Tudor Ambarus
2024-01-25 17:18   ` Mark Brown
2024-01-25 17:18     ` Mark Brown
2024-01-25 18:44     ` Tudor Ambarus
2024-01-25 18:44       ` Tudor Ambarus
2024-01-25 22:28   ` Sam Protsenko
2024-01-25 22:28     ` Sam Protsenko
2024-01-26  7:27     ` Tudor Ambarus
2024-01-26  7:27       ` Tudor Ambarus
2024-01-25 14:50 ` [PATCH v2 22/28] spi: s3c64xx: drop dependency on of_alias where possible Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus
2024-01-25 14:50 ` [PATCH v2 23/28] spi: s3c64xx: retrieve the FIFO size from the device tree Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus
2024-01-25 17:33   ` Mark Brown
2024-01-25 17:33     ` Mark Brown
2024-01-26 19:23     ` Sam Protsenko
2024-01-26 19:23       ` Sam Protsenko
2024-01-26 20:16       ` Arnd Bergmann
2024-01-26 20:16         ` Arnd Bergmann
2024-01-26 20:20         ` Sam Protsenko
2024-01-26 20:20           ` Sam Protsenko
2024-02-05  9:54           ` Tudor Ambarus
2024-02-05  9:54             ` Tudor Ambarus
2024-01-26 21:19         ` Mark Brown
2024-01-26 21:19           ` Mark Brown
2024-01-25 14:50 ` [PATCH v2 24/28] spi: s3c64xx: mark fifo_lvl_mask as deprecated Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus
2024-01-25 14:50 ` [PATCH v2 25/28] asm-generic/io.h: add iowrite{8,16}_32 accessors Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus
2024-01-25 17:41   ` Mark Brown
2024-01-25 17:41     ` Mark Brown
2024-01-25 21:23   ` Arnd Bergmann
2024-01-25 21:23     ` Arnd Bergmann
2024-01-26  7:21     ` Tudor Ambarus
2024-01-26  7:21       ` Tudor Ambarus
2024-01-25 14:50 ` [PATCH v2 26/28] spi: s3c64xx: add iowrite{8,16}_32_rep accessors Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus
2024-01-25 14:50 ` [PATCH v2 27/28] spi: s3c64xx: add support for google,gs101-spi Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus
2024-01-25 20:45   ` Sam Protsenko
2024-01-25 20:45     ` Sam Protsenko
2024-01-25 14:50 ` [PATCH v2 28/28] MAINTAINERS: add Tudor Ambarus as R for the samsung SPI driver Tudor Ambarus
2024-01-25 14:50   ` Tudor Ambarus

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=20240125145007.748295-17-tudor.ambarus@linaro.org \
    --to=tudor.ambarus@linaro.org \
    --cc=alim.akhtar@samsung.com \
    --cc=andi.shyti@kernel.org \
    --cc=andre.draszik@linaro.org \
    --cc=arnd@arndb.de \
    --cc=broonie@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=kernel-team@android.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=peter.griffin@linaro.org \
    --cc=robh+dt@kernel.org \
    --cc=semen.protsenko@linaro.org \
    --cc=willmcvicker@google.com \
    /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.