All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: James Smart <james.smart@avagotech.com>, linux-scsi@vger.kernel.org
Subject: Re: [PATCH 11/17] lpfc: Use new FDMI speed definitions for 10G, 25G and 40G FCoE.
Date: Thu, 17 Dec 2015 09:32:19 +0100	[thread overview]
Message-ID: <56727313.6010301@suse.de> (raw)
In-Reply-To: <5671efc2.Tcr1T+jB8naNKSFQ%james.smart@avagotech.com>

On 12/17/2015 12:12 AM, James Smart wrote:
>
> Use new FDMI speed definitions for 10G, 25G and 40G FCoE.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
>   drivers/scsi/lpfc/lpfc_attr.c    |   2 +-
>   drivers/scsi/lpfc/lpfc_ct.c      | 146 ++++++++++++++++++++++++++-------------
>   drivers/scsi/lpfc/lpfc_els.c     |   3 +
>   drivers/scsi/lpfc/lpfc_hbadisc.c |  29 ++++----
>   drivers/scsi/lpfc/lpfc_hw4.h     |   1 +
>   drivers/scsi/lpfc/lpfc_init.c    |  95 ++++++++-----------------
>   drivers/scsi/lpfc/lpfc_scsi.c    |  10 +--
>   7 files changed, 150 insertions(+), 136 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
> index be40266..46b2a44 100644
> --- a/drivers/scsi/lpfc/lpfc_attr.c
> +++ b/drivers/scsi/lpfc/lpfc_attr.c
> @@ -5271,7 +5271,7 @@ lpfc_get_host_speed(struct Scsi_Host *shost)
>
>   	spin_lock_irq(shost->host_lock);
>
> -	if (lpfc_is_link_up(phba)) {
> +	if ((lpfc_is_link_up(phba)) && (!(phba->hba_flag & HBA_FCOE_MODE))) {
>   		switch(phba->fc_linkspeed) {
>   		case LPFC_LINK_SPEED_1GHZ:
>   			fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
> diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c
> index ac6e087..79e261d 100644
> --- a/drivers/scsi/lpfc/lpfc_ct.c
> +++ b/drivers/scsi/lpfc/lpfc_ct.c
> @@ -48,15 +48,26 @@
>   #include "lpfc_vport.h"
>   #include "lpfc_debugfs.h"
>
> -/* FDMI Port Speed definitions */
> -#define HBA_PORTSPEED_1GBIT		0x0001	/* 1 GBit/sec */
> -#define HBA_PORTSPEED_2GBIT		0x0002	/* 2 GBit/sec */
> -#define HBA_PORTSPEED_4GBIT		0x0008	/* 4 GBit/sec */
> -#define HBA_PORTSPEED_10GBIT		0x0004	/* 10 GBit/sec */
> -#define HBA_PORTSPEED_8GBIT		0x0010	/* 8 GBit/sec */
> -#define HBA_PORTSPEED_16GBIT		0x0020	/* 16 GBit/sec */
> -#define HBA_PORTSPEED_32GBIT		0x0040  /* 32 GBit/sec */
> -#define HBA_PORTSPEED_UNKNOWN		0x0800	/* Unknown */
> +/* FDMI Port Speed definitions - FC-GS-7 */
> +#define HBA_PORTSPEED_1GFC		0x00000001	/* 1G FC */
> +#define HBA_PORTSPEED_2GFC		0x00000002	/* 2G FC */
> +#define HBA_PORTSPEED_4GFC		0x00000008	/* 4G FC */
> +#define HBA_PORTSPEED_10GFC		0x00000004	/* 10G FC */
> +#define HBA_PORTSPEED_8GFC		0x00000010	/* 8G FC */
> +#define HBA_PORTSPEED_16GFC		0x00000020	/* 16G FC */
> +#define HBA_PORTSPEED_32GFC		0x00000040	/* 32G FC */
> +#define HBA_PORTSPEED_20GFC		0x00000080	/* 20G FC */
> +#define HBA_PORTSPEED_40GFC		0x00000100	/* 40G FC */
> +#define HBA_PORTSPEED_128GFC		0x00000200	/* 128G FC */
> +#define HBA_PORTSPEED_64GFC		0x00000400	/* 64G FC */
> +#define HBA_PORTSPEED_256GFC		0x00000800	/* 256G FC */
> +#define HBA_PORTSPEED_UNKNOWN		0x00008000	/* Unknown */
> +#define HBA_PORTSPEED_10GE		0x00010000	/* 10G E */
> +#define HBA_PORTSPEED_40GE		0x00020000	/* 40G E */
> +#define HBA_PORTSPEED_100GE		0x00040000	/* 100G E */
> +#define HBA_PORTSPEED_25GE		0x00080000	/* 25G E */
> +#define HBA_PORTSPEED_50GE		0x00100000	/* 50G E */
> +#define HBA_PORTSPEED_400GE		0x00200000	/* 400G E */
>
>   #define FOURBYTES	4
>
> @@ -1921,20 +1932,38 @@ lpfc_fdmi_port_attr_support_speed(struct lpfc_vport *vport,
>   	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
>
>   	ae->un.AttrInt = 0;
> -	if (phba->lmt & LMT_32Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_32GBIT;
> -	if (phba->lmt & LMT_16Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_16GBIT;
> -	if (phba->lmt & LMT_10Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_10GBIT;
> -	if (phba->lmt & LMT_8Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_8GBIT;
> -	if (phba->lmt & LMT_4Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_4GBIT;
> -	if (phba->lmt & LMT_2Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_2GBIT;
> -	if (phba->lmt & LMT_1Gb)
> -		ae->un.AttrInt |= HBA_PORTSPEED_1GBIT;
> +	if (!(phba->hba_flag & HBA_FCOE_MODE)) {
> +		if (phba->lmt & LMT_32Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_32GFC;
> +		if (phba->lmt & LMT_16Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_16GFC;
> +		if (phba->lmt & LMT_10Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_10GFC;
> +		if (phba->lmt & LMT_8Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_8GFC;
> +		if (phba->lmt & LMT_4Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_4GFC;
> +		if (phba->lmt & LMT_2Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_2GFC;
> +		if (phba->lmt & LMT_1Gb)
> +			ae->un.AttrInt |= HBA_PORTSPEED_1GFC;
> +	} else {
> +		/* FCoE links support only one speed */
> +		switch (phba->fc_linkspeed) {
> +		case LPFC_ASYNC_LINK_SPEED_10GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_10GE;
> +			break;
> +		case LPFC_ASYNC_LINK_SPEED_25GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_25GE;
> +			break;
> +		case LPFC_ASYNC_LINK_SPEED_40GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_40GE;
> +			break;
> +		case LPFC_ASYNC_LINK_SPEED_100GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_100GE;
> +			break;
> +		}
> +	}
>   	ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
>   	size = FOURBYTES + sizeof(uint32_t);
>   	ad->AttrLen = cpu_to_be16(size);
> @@ -1952,32 +1981,53 @@ lpfc_fdmi_port_attr_speed(struct lpfc_vport *vport,
>
>   	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
>
> -	switch (phba->fc_linkspeed) {
> -	case LPFC_LINK_SPEED_1GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_1GBIT;
> -		break;
> -	case LPFC_LINK_SPEED_2GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_2GBIT;
> -		break;
> -	case LPFC_LINK_SPEED_4GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_4GBIT;
> -		break;
> -	case LPFC_LINK_SPEED_8GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_8GBIT;
> -		break;
> -	case LPFC_LINK_SPEED_10GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_10GBIT;
> -		break;
> -	case LPFC_LINK_SPEED_16GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_16GBIT;
> -		break;
> -	case LPFC_LINK_SPEED_32GHZ:
> -		ae->un.AttrInt = HBA_PORTSPEED_32GBIT;
> -		break;
> -	default:
> -		ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
> -		break;
> +	if (!(phba->hba_flag & HBA_FCOE_MODE)) {
> +		switch (phba->fc_linkspeed) {
> +		case LPFC_LINK_SPEED_1GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_1GFC;
> +			break;
> +		case LPFC_LINK_SPEED_2GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_2GFC;
> +			break;
> +		case LPFC_LINK_SPEED_4GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_4GFC;
> +			break;
> +		case LPFC_LINK_SPEED_8GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_8GFC;
> +			break;
> +		case LPFC_LINK_SPEED_10GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_10GFC;
> +			break;
> +		case LPFC_LINK_SPEED_16GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_16GFC;
> +			break;
> +		case LPFC_LINK_SPEED_32GHZ:
> +			ae->un.AttrInt = HBA_PORTSPEED_32GFC;
> +			break;
> +		default:
> +			ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
> +			break;
> +		}
> +	} else {
> +		switch (phba->fc_linkspeed) {
> +		case LPFC_ASYNC_LINK_SPEED_10GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_10GE;
> +			break;
> +		case LPFC_ASYNC_LINK_SPEED_25GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_25GE;
> +			break;
> +		case LPFC_ASYNC_LINK_SPEED_40GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_40GE;
> +			break;
> +		case LPFC_ASYNC_LINK_SPEED_100GBPS:
> +			ae->un.AttrInt = HBA_PORTSPEED_100GE;
> +			break;
> +		default:
> +			ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
> +			break;
> +		}
>   	}
> +
>   	ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
>   	size = FOURBYTES + sizeof(uint32_t);
>   	ad->AttrLen = cpu_to_be16(size);
> diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
> index 817cdfc..273a1db 100644
> --- a/drivers/scsi/lpfc/lpfc_els.c
> +++ b/drivers/scsi/lpfc/lpfc_els.c
> @@ -4749,6 +4749,9 @@ lpfc_rdp_res_speed(struct fc_rdp_port_speed_desc *desc, struct lpfc_hba *phba)
>   	case LPFC_LINK_SPEED_16GHZ:
>   		rdp_speed = RDP_PS_16GB;
>   		break;
> +	case LPFC_LINK_SPEED_32GHZ:
> +		rdp_speed = RDP_PS_32GB;
> +		break;
>   	default:
>   		rdp_speed = RDP_PS_UNKNOWN;
>   		break;
Ah. So here is the missing 32G speed.

Should be moved into the 'Fix RDP Speed reporting' patch, no?

> diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
> index 97f5588..bc64926 100644
> --- a/drivers/scsi/lpfc/lpfc_hbadisc.c
> +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
> @@ -3037,19 +3037,22 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
>   	uint32_t fc_flags = 0;
>
>   	spin_lock_irq(&phba->hbalock);
> -	switch (bf_get(lpfc_mbx_read_top_link_spd, la)) {
> -	case LPFC_LINK_SPEED_1GHZ:
> -	case LPFC_LINK_SPEED_2GHZ:
> -	case LPFC_LINK_SPEED_4GHZ:
> -	case LPFC_LINK_SPEED_8GHZ:
> -	case LPFC_LINK_SPEED_10GHZ:
> -	case LPFC_LINK_SPEED_16GHZ:
> -	case LPFC_LINK_SPEED_32GHZ:
> -		phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la);
> -		break;
> -	default:
> -		phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN;
> -		break;
> +	phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la);
> +
> +	if (!(phba->hba_flag & HBA_FCOE_MODE)) {
> +		switch (bf_get(lpfc_mbx_read_top_link_spd, la)) {
> +		case LPFC_LINK_SPEED_1GHZ:
> +		case LPFC_LINK_SPEED_2GHZ:
> +		case LPFC_LINK_SPEED_4GHZ:
> +		case LPFC_LINK_SPEED_8GHZ:
> +		case LPFC_LINK_SPEED_10GHZ:
> +		case LPFC_LINK_SPEED_16GHZ:
> +		case LPFC_LINK_SPEED_32GHZ:
> +			break;
> +		default:
> +			phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN;
> +			break;
> +		}
>   	}
>
>   	if (phba->fc_topology &&
> diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
> index 33ec4fa..f13a76a 100644
> --- a/drivers/scsi/lpfc/lpfc_hw4.h
> +++ b/drivers/scsi/lpfc/lpfc_hw4.h
> @@ -3317,6 +3317,7 @@ struct lpfc_acqe_link {
>   #define LPFC_ASYNC_LINK_SPEED_20GBPS		0x5
>   #define LPFC_ASYNC_LINK_SPEED_25GBPS		0x6
>   #define LPFC_ASYNC_LINK_SPEED_40GBPS		0x7
> +#define LPFC_ASYNC_LINK_SPEED_100GBPS		0x8
>   #define lpfc_acqe_link_duplex_SHIFT		16
>   #define lpfc_acqe_link_duplex_MASK		0x000000FF
>   #define lpfc_acqe_link_duplex_WORD		word0
> diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
> index 0a54c6d..fdf750e 100644
> --- a/drivers/scsi/lpfc/lpfc_init.c
> +++ b/drivers/scsi/lpfc/lpfc_init.c
> @@ -3710,49 +3710,6 @@ lpfc_sli4_parse_latt_type(struct lpfc_hba *phba,
>   }
>
>   /**
> - * lpfc_sli4_parse_latt_link_speed - Parse sli4 link-attention link speed
> - * @phba: pointer to lpfc hba data structure.
> - * @acqe_link: pointer to the async link completion queue entry.
> - *
> - * This routine is to parse the SLI4 link-attention link speed and translate
> - * it into the base driver's link-attention link speed coding.
> - *
> - * Return: Link-attention link speed in terms of base driver's coding.
> - **/
> -static uint8_t
> -lpfc_sli4_parse_latt_link_speed(struct lpfc_hba *phba,
> -				struct lpfc_acqe_link *acqe_link)
> -{
> -	uint8_t link_speed;
> -
> -	switch (bf_get(lpfc_acqe_link_speed, acqe_link)) {
> -	case LPFC_ASYNC_LINK_SPEED_ZERO:
> -	case LPFC_ASYNC_LINK_SPEED_10MBPS:
> -	case LPFC_ASYNC_LINK_SPEED_100MBPS:
> -		link_speed = LPFC_LINK_SPEED_UNKNOWN;
> -		break;
> -	case LPFC_ASYNC_LINK_SPEED_1GBPS:
> -		link_speed = LPFC_LINK_SPEED_1GHZ;
> -		break;
> -	case LPFC_ASYNC_LINK_SPEED_10GBPS:
> -		link_speed = LPFC_LINK_SPEED_10GHZ;
> -		break;
> -	case LPFC_ASYNC_LINK_SPEED_20GBPS:
> -	case LPFC_ASYNC_LINK_SPEED_25GBPS:
> -	case LPFC_ASYNC_LINK_SPEED_40GBPS:
> -		link_speed = LPFC_LINK_SPEED_UNKNOWN;
> -		break;
> -	default:
> -		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> -				"0483 Invalid link-attention link speed: x%x\n",
> -				bf_get(lpfc_acqe_link_speed, acqe_link));
> -		link_speed = LPFC_LINK_SPEED_UNKNOWN;
> -		break;
> -	}
> -	return link_speed;
> -}
> -
> -/**
>    * lpfc_sli_port_speed_get - Get sli3 link speed code to link speed
>    * @phba: pointer to lpfc hba data structure.
>    *
> @@ -3768,27 +3725,35 @@ lpfc_sli_port_speed_get(struct lpfc_hba *phba)
>   	if (!lpfc_is_link_up(phba))
>   		return 0;
>
> -	switch (phba->fc_linkspeed) {
> -	case LPFC_LINK_SPEED_1GHZ:
> -		link_speed = 1000;
> -		break;
> -	case LPFC_LINK_SPEED_2GHZ:
> -		link_speed = 2000;
> -		break;
> -	case LPFC_LINK_SPEED_4GHZ:
> -		link_speed = 4000;
> -		break;
> -	case LPFC_LINK_SPEED_8GHZ:
> -		link_speed = 8000;
> -		break;
> -	case LPFC_LINK_SPEED_10GHZ:
> -		link_speed = 10000;
> -		break;
> -	case LPFC_LINK_SPEED_16GHZ:
> -		link_speed = 16000;
> -		break;
> -	default:
> -		link_speed = 0;
> +	if (phba->sli_rev <= LPFC_SLI_REV3) {
> +		switch (phba->fc_linkspeed) {
> +		case LPFC_LINK_SPEED_1GHZ:
> +			link_speed = 1000;
> +			break;
> +		case LPFC_LINK_SPEED_2GHZ:
> +			link_speed = 2000;
> +			break;
> +		case LPFC_LINK_SPEED_4GHZ:
> +			link_speed = 4000;
> +			break;
> +		case LPFC_LINK_SPEED_8GHZ:
> +			link_speed = 8000;
> +			break;
> +		case LPFC_LINK_SPEED_10GHZ:
> +			link_speed = 10000;
> +			break;
> +		case LPFC_LINK_SPEED_16GHZ:
> +			link_speed = 16000;
> +			break;
> +		default:
> +			link_speed = 0;
> +		}
> +	} else {
> +		if (phba->sli4_hba.link_state.logical_speed)
> +			link_speed =
> +			      phba->sli4_hba.link_state.logical_speed;
> +		else
> +			link_speed = phba->sli4_hba.link_state.speed;
>   	}
>   	return link_speed;
>   }
> @@ -3984,7 +3949,7 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba,
>   	la->eventTag = acqe_link->event_tag;
>   	bf_set(lpfc_mbx_read_top_att_type, la, att_type);
>   	bf_set(lpfc_mbx_read_top_link_spd, la,
> -	       lpfc_sli4_parse_latt_link_speed(phba, acqe_link));
> +	       (bf_get(lpfc_acqe_link_speed, acqe_link)));
>
>   	/* Fake the the following irrelvant fields */
>   	bf_set(lpfc_mbx_read_top_topology, la, LPFC_TOPOLOGY_PT_PT);
> diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
> index b2414da..9d20eab 100644
> --- a/drivers/scsi/lpfc/lpfc_scsi.c
> +++ b/drivers/scsi/lpfc/lpfc_scsi.c
> @@ -4461,15 +4461,7 @@ lpfc_info(struct Scsi_Host *host)
>   				 phba->Port);
>   		}
>   		len = strlen(lpfcinfobuf);
> -		if (phba->sli_rev <= LPFC_SLI_REV3) {
> -			link_speed = lpfc_sli_port_speed_get(phba);
> -		} else {
> -			if (phba->sli4_hba.link_state.logical_speed)
> -				link_speed =
> -				      phba->sli4_hba.link_state.logical_speed;
> -			else
> -				link_speed = phba->sli4_hba.link_state.speed;
> -		}
> +		link_speed = lpfc_sli_port_speed_get(phba);
>   		if (link_speed != 0)
>   			snprintf(lpfcinfobuf + len, 384-len,
>   				 " Logical Link Speed: %d Mbps", link_speed);
>
Remainder is okay.

Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		               zSeries & Storage
hare@suse.de			               +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2015-12-17  8:32 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-16 23:12 [PATCH 11/17] lpfc: Use new FDMI speed definitions for 10G, 25G and 40G FCoE James Smart
2015-12-17  8:32 ` Hannes Reinecke [this message]
2015-12-17 16:03   ` James Smart
2015-12-17 16:05     ` Hannes Reinecke

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=56727313.6010301@suse.de \
    --to=hare@suse.de \
    --cc=james.smart@avagotech.com \
    --cc=linux-scsi@vger.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.