From: Thierry Reding <thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Mikko Perttunen <cyndis-/1wQRMveznE@public.gmane.org>
Cc: "David S . Miller"
<davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>,
Giuseppe Cavallaro <peppe.cavallaro-qxv4g6HH51o@public.gmane.org>,
Alexandre Torgue <alexandre.torgue-qxv4g6HH51o@public.gmane.org>,
Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
Joao Pinto <Joao.Pinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>,
Alexandre Courbot
<gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 7/7] net: stmmac: dwc-qos: Add Tegra186 support
Date: Thu, 9 Mar 2017 21:00:30 +0100 [thread overview]
Message-ID: <20170309200030.GF5554@ulmo.ba.sec> (raw)
In-Reply-To: <c72dc23e-cdc3-8b89-3b7d-dce8d81d4ae0-/1wQRMveznE@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 5825 bytes --]
On Mon, Feb 27, 2017 at 01:46:01PM +0200, Mikko Perttunen wrote:
> On 23.02.2017 19:24, Thierry Reding wrote:
> > From: Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
> >
> > The NVIDIA Tegra186 SoC contains an instance of the Synopsys DWC
> > ethernet QOS IP core. The binding that it uses is slightly different
> > from existing ones because of the integration (clocks, resets, ...).
> >
> > Signed-off-by: Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
> > ---
> > .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c | 252 +++++++++++++++++++++
> > 1 file changed, 252 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
> > index 5071d3c15adc..54dfbdc48f6d 100644
> > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
> > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
> > @@ -14,6 +14,7 @@
> > #include <linux/clk.h>
> > #include <linux/clk-provider.h>
> > #include <linux/device.h>
> > +#include <linux/gpio/consumer.h>
> > #include <linux/ethtool.h>
> > #include <linux/io.h>
> > #include <linux/ioport.h>
> > @@ -22,10 +23,24 @@
> > #include <linux/of_net.h>
> > #include <linux/mfd/syscon.h>
> > #include <linux/platform_device.h>
> > +#include <linux/reset.h>
> > #include <linux/stmmac.h>
> >
> > #include "stmmac_platform.h"
> >
> > +struct tegra_eqos {
> > + struct device *dev;
> > + void __iomem *regs;
> > +
> > + struct reset_control *rst;
> > + struct clk *clk_master;
> > + struct clk *clk_slave;
> > + struct clk *clk_tx;
> > + struct clk *clk_rx;
> > +
> > + struct gpio_desc *reset;
> > +};
> > +
> > static int dwc_eth_dwmac_config_dt(struct platform_device *pdev,
> > struct plat_stmmacenet_data *plat_dat)
> > {
> > @@ -148,6 +163,237 @@ static int dwc_qos_remove(struct platform_device *pdev)
> > return 0;
> > }
> >
> > +#define SDMEMCOMPPADCTRL 0x8800
> > +#define SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD BIT(31)
> > +
> > +#define AUTO_CAL_CONFIG 0x8804
> > +#define AUTO_CAL_CONFIG_START BIT(31)
> > +#define AUTO_CAL_CONFIG_ENABLE BIT(29)
> > +
> > +#define AUTO_CAL_STATUS 0x880c
> > +#define AUTO_CAL_STATUS_ACTIVE BIT(31)
> > +
> > +static void tegra_eqos_fix_speed(void *priv, unsigned int speed)
> > +{
> > + struct tegra_eqos *eqos = priv;
> > + unsigned long rate = 125000000;
> > + bool needs_calibration = false;
> > + unsigned int i;
> > + u32 value;
> > +
> > + switch (speed) {
> > + case SPEED_1000:
> > + needs_calibration = true;
> > + rate = 125000000;
> > + break;
> > +
> > + case SPEED_100:
> > + needs_calibration = true;
> > + rate = 25000000;
> > + break;
> > +
> > + case SPEED_10:
> > + rate = 2500000;
> > + break;
> > +
> > + default:
> > + dev_err(eqos->dev, "invalid speed %u\n", speed);
> > + break;
> > + }
> > +
> > + if (needs_calibration) {
> > + /* calibrate */
> > + value = readl(eqos->regs + SDMEMCOMPPADCTRL);
> > + value |= SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD;
> > + writel(value, eqos->regs + SDMEMCOMPPADCTRL);
> > +
> > + udelay(1);
> > +
> > + value = readl(eqos->regs + AUTO_CAL_CONFIG);
> > + value |= AUTO_CAL_CONFIG_START | AUTO_CAL_CONFIG_ENABLE;
> > + writel(value, eqos->regs + AUTO_CAL_CONFIG);
> > +
> > + for (i = 0; i <= 10; i++) {
> > + value = readl(eqos->regs + AUTO_CAL_STATUS);
> > + if (value & AUTO_CAL_STATUS_ACTIVE)
> > + break;
> > +
> > + udelay(1);
> > + }
> > +
> > + if ((value & AUTO_CAL_STATUS_ACTIVE) == 0) {
> > + dev_err(eqos->dev, "calibration did not start\n");
> > + goto failed;
> > + }
> > +
> > + for (i = 0; i <= 10; i++) {
> > + value = readl(eqos->regs + AUTO_CAL_STATUS);
> > + if ((value & AUTO_CAL_STATUS_ACTIVE) == 0)
> > + break;
> > +
> > + udelay(20);
> > + }
> > +
> > + if (value & AUTO_CAL_STATUS_ACTIVE) {
> > + dev_err(eqos->dev, "calibration didn't finish\n");
> > + goto failed;
> > + }
>
> Could use readl_poll_timeout/readl_poll_timeout_atomic for these loops
> instead.
I had considered that, but the code ends up looking a lot uglier with
that. But since you and Joao both prefer it, I'll switch over to the I/O
poll helpers anyway.
>
> > +
> > + failed:
> > + value = readl(eqos->regs + SDMEMCOMPPADCTRL);
> > + value &= ~SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD;
> > + writel(value, eqos->regs + SDMEMCOMPPADCTRL);
> > + } else {
> > + value = readl(eqos->regs + AUTO_CAL_CONFIG);
> > + value &= ~AUTO_CAL_CONFIG_ENABLE;
> > + writel(value, eqos->regs + AUTO_CAL_CONFIG);
> > + }
> > +
> > + clk_set_rate(eqos->clk_tx, rate);
>
> Could check error code here, and for other clock ops too.
Done.
> > +}
> > +
> > +static int tegra_eqos_init(struct platform_device *pdev, void *priv)
> > +{
> > + struct tegra_eqos *eqos = priv;
> > + unsigned long rate;
> > + u32 value;
> > +
> > + rate = clk_get_rate(eqos->clk_slave);
> > +
> > + value = readl(eqos->regs + 0xdc);
>
> No point in reading the value when it is fully overwritten.
Good catch.
> > + value = (rate / 1000000) - 1;
> > + writel(value, eqos->regs + 0xdc);
>
> Please add a define for 0xdc.
Right, I must've overlooked that while cleaning up the patch. I've added
a GMAC_1US_TIC_COUNTER define for it.
> > @@ -245,6 +496,7 @@ static int dwc_eth_dwmac_remove(struct platform_device *pdev)
> >
> > static const struct of_device_id dwc_eth_dwmac_match[] = {
> > { .compatible = "snps,dwc-qos-ethernet-4.10", .data = &dwc_qos_data },
> > + { .compatible = "nvidia,tegra186-eqos", .data = &tegra_eqos_data},
>
> Missing space before '}'.
Good catch! Fixed.
Thanks,
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Thierry Reding <thierry.reding@gmail.com>
To: Mikko Perttunen <cyndis@kapsi.fi>
Cc: "David S . Miller" <davem@davemloft.net>,
Giuseppe Cavallaro <peppe.cavallaro@st.com>,
Alexandre Torgue <alexandre.torgue@st.com>,
Rob Herring <robh+dt@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Joao Pinto <Joao.Pinto@synopsys.com>,
Alexandre Courbot <gnurou@gmail.com>,
Jon Hunter <jonathanh@nvidia.com>,
netdev@vger.kernel.org, linux-tegra@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 7/7] net: stmmac: dwc-qos: Add Tegra186 support
Date: Thu, 9 Mar 2017 21:00:30 +0100 [thread overview]
Message-ID: <20170309200030.GF5554@ulmo.ba.sec> (raw)
In-Reply-To: <c72dc23e-cdc3-8b89-3b7d-dce8d81d4ae0@kapsi.fi>
[-- Attachment #1: Type: text/plain, Size: 5767 bytes --]
On Mon, Feb 27, 2017 at 01:46:01PM +0200, Mikko Perttunen wrote:
> On 23.02.2017 19:24, Thierry Reding wrote:
> > From: Thierry Reding <treding@nvidia.com>
> >
> > The NVIDIA Tegra186 SoC contains an instance of the Synopsys DWC
> > ethernet QOS IP core. The binding that it uses is slightly different
> > from existing ones because of the integration (clocks, resets, ...).
> >
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> > .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c | 252 +++++++++++++++++++++
> > 1 file changed, 252 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
> > index 5071d3c15adc..54dfbdc48f6d 100644
> > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
> > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
> > @@ -14,6 +14,7 @@
> > #include <linux/clk.h>
> > #include <linux/clk-provider.h>
> > #include <linux/device.h>
> > +#include <linux/gpio/consumer.h>
> > #include <linux/ethtool.h>
> > #include <linux/io.h>
> > #include <linux/ioport.h>
> > @@ -22,10 +23,24 @@
> > #include <linux/of_net.h>
> > #include <linux/mfd/syscon.h>
> > #include <linux/platform_device.h>
> > +#include <linux/reset.h>
> > #include <linux/stmmac.h>
> >
> > #include "stmmac_platform.h"
> >
> > +struct tegra_eqos {
> > + struct device *dev;
> > + void __iomem *regs;
> > +
> > + struct reset_control *rst;
> > + struct clk *clk_master;
> > + struct clk *clk_slave;
> > + struct clk *clk_tx;
> > + struct clk *clk_rx;
> > +
> > + struct gpio_desc *reset;
> > +};
> > +
> > static int dwc_eth_dwmac_config_dt(struct platform_device *pdev,
> > struct plat_stmmacenet_data *plat_dat)
> > {
> > @@ -148,6 +163,237 @@ static int dwc_qos_remove(struct platform_device *pdev)
> > return 0;
> > }
> >
> > +#define SDMEMCOMPPADCTRL 0x8800
> > +#define SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD BIT(31)
> > +
> > +#define AUTO_CAL_CONFIG 0x8804
> > +#define AUTO_CAL_CONFIG_START BIT(31)
> > +#define AUTO_CAL_CONFIG_ENABLE BIT(29)
> > +
> > +#define AUTO_CAL_STATUS 0x880c
> > +#define AUTO_CAL_STATUS_ACTIVE BIT(31)
> > +
> > +static void tegra_eqos_fix_speed(void *priv, unsigned int speed)
> > +{
> > + struct tegra_eqos *eqos = priv;
> > + unsigned long rate = 125000000;
> > + bool needs_calibration = false;
> > + unsigned int i;
> > + u32 value;
> > +
> > + switch (speed) {
> > + case SPEED_1000:
> > + needs_calibration = true;
> > + rate = 125000000;
> > + break;
> > +
> > + case SPEED_100:
> > + needs_calibration = true;
> > + rate = 25000000;
> > + break;
> > +
> > + case SPEED_10:
> > + rate = 2500000;
> > + break;
> > +
> > + default:
> > + dev_err(eqos->dev, "invalid speed %u\n", speed);
> > + break;
> > + }
> > +
> > + if (needs_calibration) {
> > + /* calibrate */
> > + value = readl(eqos->regs + SDMEMCOMPPADCTRL);
> > + value |= SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD;
> > + writel(value, eqos->regs + SDMEMCOMPPADCTRL);
> > +
> > + udelay(1);
> > +
> > + value = readl(eqos->regs + AUTO_CAL_CONFIG);
> > + value |= AUTO_CAL_CONFIG_START | AUTO_CAL_CONFIG_ENABLE;
> > + writel(value, eqos->regs + AUTO_CAL_CONFIG);
> > +
> > + for (i = 0; i <= 10; i++) {
> > + value = readl(eqos->regs + AUTO_CAL_STATUS);
> > + if (value & AUTO_CAL_STATUS_ACTIVE)
> > + break;
> > +
> > + udelay(1);
> > + }
> > +
> > + if ((value & AUTO_CAL_STATUS_ACTIVE) == 0) {
> > + dev_err(eqos->dev, "calibration did not start\n");
> > + goto failed;
> > + }
> > +
> > + for (i = 0; i <= 10; i++) {
> > + value = readl(eqos->regs + AUTO_CAL_STATUS);
> > + if ((value & AUTO_CAL_STATUS_ACTIVE) == 0)
> > + break;
> > +
> > + udelay(20);
> > + }
> > +
> > + if (value & AUTO_CAL_STATUS_ACTIVE) {
> > + dev_err(eqos->dev, "calibration didn't finish\n");
> > + goto failed;
> > + }
>
> Could use readl_poll_timeout/readl_poll_timeout_atomic for these loops
> instead.
I had considered that, but the code ends up looking a lot uglier with
that. But since you and Joao both prefer it, I'll switch over to the I/O
poll helpers anyway.
>
> > +
> > + failed:
> > + value = readl(eqos->regs + SDMEMCOMPPADCTRL);
> > + value &= ~SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD;
> > + writel(value, eqos->regs + SDMEMCOMPPADCTRL);
> > + } else {
> > + value = readl(eqos->regs + AUTO_CAL_CONFIG);
> > + value &= ~AUTO_CAL_CONFIG_ENABLE;
> > + writel(value, eqos->regs + AUTO_CAL_CONFIG);
> > + }
> > +
> > + clk_set_rate(eqos->clk_tx, rate);
>
> Could check error code here, and for other clock ops too.
Done.
> > +}
> > +
> > +static int tegra_eqos_init(struct platform_device *pdev, void *priv)
> > +{
> > + struct tegra_eqos *eqos = priv;
> > + unsigned long rate;
> > + u32 value;
> > +
> > + rate = clk_get_rate(eqos->clk_slave);
> > +
> > + value = readl(eqos->regs + 0xdc);
>
> No point in reading the value when it is fully overwritten.
Good catch.
> > + value = (rate / 1000000) - 1;
> > + writel(value, eqos->regs + 0xdc);
>
> Please add a define for 0xdc.
Right, I must've overlooked that while cleaning up the patch. I've added
a GMAC_1US_TIC_COUNTER define for it.
> > @@ -245,6 +496,7 @@ static int dwc_eth_dwmac_remove(struct platform_device *pdev)
> >
> > static const struct of_device_id dwc_eth_dwmac_match[] = {
> > { .compatible = "snps,dwc-qos-ethernet-4.10", .data = &dwc_qos_data },
> > + { .compatible = "nvidia,tegra186-eqos", .data = &tegra_eqos_data},
>
> Missing space before '}'.
Good catch! Fixed.
Thanks,
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2017-03-09 20:00 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-23 17:24 [PATCH 0/7] net: stmmac: Fixes and Tegra186 support Thierry Reding
2017-02-23 17:24 ` [PATCH 1/7] net: stmmac: Rename clk_ptp_ref clock to ptp_ref Thierry Reding
2017-02-23 17:24 ` [PATCH 2/7] net: stmmac: Balance PTP reference clock enable/disable Thierry Reding
[not found] ` <20170223172438.14770-3-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-02-27 9:31 ` Mikko Perttunen
2017-02-27 9:31 ` Mikko Perttunen
[not found] ` <53f18077-6a4d-339f-192e-287a1f889fb7-/1wQRMveznE@public.gmane.org>
2017-03-09 19:30 ` Thierry Reding
2017-03-09 19:30 ` Thierry Reding
2017-03-02 14:47 ` Joao Pinto
2017-03-02 14:47 ` Joao Pinto
2017-02-23 17:24 ` [PATCH 3/7] net: stmmac: Check for DMA mapping errors Thierry Reding
2017-02-27 9:37 ` Mikko Perttunen
[not found] ` <35dec9cd-65db-c62b-f35f-c90cf35b27f2-/1wQRMveznE@public.gmane.org>
2017-03-09 19:29 ` Thierry Reding
2017-03-09 19:29 ` Thierry Reding
2017-02-23 17:24 ` [PATCH 4/7] net: stmmac: Parse FIFO sizes from feature registers Thierry Reding
2017-02-27 9:51 ` Mikko Perttunen
2017-03-02 15:09 ` Joao Pinto
2017-03-02 15:09 ` Joao Pinto
[not found] ` <b74f9b19-4315-1349-88c0-b549a2f8ef5d-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>
2017-03-09 19:41 ` Thierry Reding
2017-03-09 19:41 ` Thierry Reding
2017-03-10 10:32 ` Joao Pinto
2017-03-10 10:32 ` Joao Pinto
2017-02-23 17:24 ` [PATCH 5/7] net: stmmac: Program RX queue size and flow control Thierry Reding
2017-02-27 10:09 ` Mikko Perttunen
[not found] ` <74ee5bff-8893-ebd4-bcf8-bb92c476f581-/1wQRMveznE@public.gmane.org>
2017-03-09 19:42 ` Thierry Reding
2017-03-09 19:42 ` Thierry Reding
[not found] ` <20170309194231.GD5554-EkSeR96xj6Pcmrwk2tT4+A@public.gmane.org>
2017-03-09 20:18 ` Stephen Warren
2017-03-09 20:18 ` Stephen Warren
[not found] ` <83aaa3b1-a2d4-8ddd-d31a-2fd6c653e3d1-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2017-03-09 20:44 ` Thierry Reding
2017-03-09 20:44 ` Thierry Reding
2017-03-02 15:15 ` Joao Pinto
2017-03-02 15:15 ` Joao Pinto
[not found] ` <ea26c03c-6ce0-ff66-dcb5-6f95cdf2caed-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>
2017-03-09 19:44 ` Thierry Reding
2017-03-09 19:44 ` Thierry Reding
[not found] ` <20170223172438.14770-1-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-02-23 17:24 ` [PATCH 6/7] net: stmmac: dwc-qos: Split out ->probe() and ->remove() Thierry Reding
2017-02-23 17:24 ` Thierry Reding
[not found] ` <20170223172438.14770-7-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-02-27 11:17 ` Mikko Perttunen
2017-02-27 11:17 ` Mikko Perttunen
2017-03-02 16:43 ` Joao Pinto
2017-03-02 16:43 ` Joao Pinto
2017-02-23 17:24 ` [PATCH 7/7] net: stmmac: dwc-qos: Add Tegra186 support Thierry Reding
2017-02-27 11:46 ` Mikko Perttunen
[not found] ` <c72dc23e-cdc3-8b89-3b7d-dce8d81d4ae0-/1wQRMveznE@public.gmane.org>
2017-03-09 20:00 ` Thierry Reding [this message]
2017-03-09 20:00 ` Thierry Reding
[not found] ` <20170223172438.14770-8-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-03-02 16:44 ` Joao Pinto
2017-03-02 16:44 ` Joao Pinto
2017-03-02 16:44 ` Joao Pinto
2017-02-23 17:57 ` [PATCH 0/7] net: stmmac: Fixes and " David Miller
[not found] ` <20170223.125705.464117483663954788.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2017-02-27 7:31 ` Thierry Reding
2017-02-27 7:31 ` Thierry Reding
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=20170309200030.GF5554@ulmo.ba.sec \
--to=thierry.reding-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=Joao.Pinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org \
--cc=alexandre.torgue-qxv4g6HH51o@public.gmane.org \
--cc=cyndis-/1wQRMveznE@public.gmane.org \
--cc=davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org \
--cc=gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=peppe.cavallaro-qxv4g6HH51o@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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.