All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleksij Rempel <linux@rempel-privat.de>
To: ath9k-devel@lists.ath9k.org
Subject: [ath9k-devel] [PATCH] ath9k_htc: check seq number instead of cmd id for timeout
Date: Mon, 06 Apr 2015 12:01:28 +0200	[thread overview]
Message-ID: <55225978.6050903@rempel-privat.de> (raw)
In-Reply-To: <552228AB.8060000@gmail.com>

Hi Kalle,

can you please apply this patch.

Am 06.04.2015 um 08:33 schrieb Fred Chou:
> Hi all,
> 
> May I have an update on the patch status please?
> 
> Thanks and regards,
> Fred
> 
> On 13/3/2015 4:32 PM, Fred Chou wrote:
>> From: Fred Chou <fred.chou.nd@gmail.com>
>>
>> As the driver may send multiple wmi commands with identical cmd id,
>> it is more robust to check seq number for timeout instead.
>>
>> Signed-off-by: Fred Chou <fred.chou.nd@gmail.com>
>> ---
>>  drivers/net/wireless/ath/ath9k/wmi.c | 12 ++++++------
>>  drivers/net/wireless/ath/ath9k/wmi.h |  2 +-
>>  2 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
>> index 65c8894..aba909f 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.c
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.c
>> @@ -224,7 +224,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
>>  
>>  	/* Check if there has been a timeout. */
>>  	spin_lock(&wmi->wmi_lock);
>> -	if (cmd_id != wmi->last_cmd_id) {
>> +	if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {
>>  		spin_unlock(&wmi->wmi_lock);
>>  		goto free_skb;
>>  	}
>> @@ -272,11 +272,16 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
>>  			       enum wmi_cmd_id cmd, u16 len)
>>  {
>>  	struct wmi_cmd_hdr *hdr;
>> +	unsigned long flags;
>>  
>>  	hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr));
>>  	hdr->command_id = cpu_to_be16(cmd);
>>  	hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
>>  
>> +	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> +	wmi->last_seq_id = wmi->tx_seq_id;
>> +	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> +
>>  	return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);
>>  }
>>  
>> @@ -292,7 +297,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	struct sk_buff *skb;
>>  	u8 *data;
>>  	int time_left, ret = 0;
>> -	unsigned long flags;
>>  
>>  	if (ah->ah_flags & AH_UNPLUGGED)
>>  		return 0;
>> @@ -320,10 +324,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	wmi->cmd_rsp_buf = rsp_buf;
>>  	wmi->cmd_rsp_len = rsp_len;
>>  
>> -	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> -	wmi->last_cmd_id = cmd_id;
>> -	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> -
>>  	ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
>>  	if (ret)
>>  		goto out;
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h
>> index 0db37f2..2aad6dc 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.h
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.h
>> @@ -143,7 +143,7 @@ struct wmi {
>>  	enum htc_endpoint_id ctrl_epid;
>>  	struct mutex op_mutex;
>>  	struct completion cmd_wait;
>> -	enum wmi_cmd_id last_cmd_id;
>> +	u16 last_seq_id;
>>  	struct sk_buff_head wmi_event_queue;
>>  	struct tasklet_struct wmi_event_tasklet;
>>  	u16 tx_seq_id;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Regards,
Oleksij

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 230 bytes
Desc: OpenPGP digital signature
Url : http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20150406/dc47342f/attachment.pgp 

WARNING: multiple messages have this Message-ID (diff)
From: Oleksij Rempel <linux@rempel-privat.de>
To: Fred Chou <fred.chou.nd@gmail.com>,
	ath9k-devel@qca.qualcomm.com, kvalo@codeaurora.org
Cc: linux-wireless@vger.kernel.org, ath9k-devel@lists.ath9k.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ath9k_htc: check seq number instead of cmd id for timeout
Date: Mon, 06 Apr 2015 12:01:28 +0200	[thread overview]
Message-ID: <55225978.6050903@rempel-privat.de> (raw)
In-Reply-To: <552228AB.8060000@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 3214 bytes --]

Hi Kalle,

can you please apply this patch.

Am 06.04.2015 um 08:33 schrieb Fred Chou:
> Hi all,
> 
> May I have an update on the patch status please?
> 
> Thanks and regards,
> Fred
> 
> On 13/3/2015 4:32 PM, Fred Chou wrote:
>> From: Fred Chou <fred.chou.nd@gmail.com>
>>
>> As the driver may send multiple wmi commands with identical cmd id,
>> it is more robust to check seq number for timeout instead.
>>
>> Signed-off-by: Fred Chou <fred.chou.nd@gmail.com>
>> ---
>>  drivers/net/wireless/ath/ath9k/wmi.c | 12 ++++++------
>>  drivers/net/wireless/ath/ath9k/wmi.h |  2 +-
>>  2 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
>> index 65c8894..aba909f 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.c
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.c
>> @@ -224,7 +224,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
>>  
>>  	/* Check if there has been a timeout. */
>>  	spin_lock(&wmi->wmi_lock);
>> -	if (cmd_id != wmi->last_cmd_id) {
>> +	if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {
>>  		spin_unlock(&wmi->wmi_lock);
>>  		goto free_skb;
>>  	}
>> @@ -272,11 +272,16 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
>>  			       enum wmi_cmd_id cmd, u16 len)
>>  {
>>  	struct wmi_cmd_hdr *hdr;
>> +	unsigned long flags;
>>  
>>  	hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr));
>>  	hdr->command_id = cpu_to_be16(cmd);
>>  	hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
>>  
>> +	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> +	wmi->last_seq_id = wmi->tx_seq_id;
>> +	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> +
>>  	return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);
>>  }
>>  
>> @@ -292,7 +297,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	struct sk_buff *skb;
>>  	u8 *data;
>>  	int time_left, ret = 0;
>> -	unsigned long flags;
>>  
>>  	if (ah->ah_flags & AH_UNPLUGGED)
>>  		return 0;
>> @@ -320,10 +324,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	wmi->cmd_rsp_buf = rsp_buf;
>>  	wmi->cmd_rsp_len = rsp_len;
>>  
>> -	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> -	wmi->last_cmd_id = cmd_id;
>> -	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> -
>>  	ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
>>  	if (ret)
>>  		goto out;
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h
>> index 0db37f2..2aad6dc 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.h
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.h
>> @@ -143,7 +143,7 @@ struct wmi {
>>  	enum htc_endpoint_id ctrl_epid;
>>  	struct mutex op_mutex;
>>  	struct completion cmd_wait;
>> -	enum wmi_cmd_id last_cmd_id;
>> +	u16 last_seq_id;
>>  	struct sk_buff_head wmi_event_queue;
>>  	struct tasklet_struct wmi_event_tasklet;
>>  	u16 tx_seq_id;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Regards,
Oleksij


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 230 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Oleksij Rempel <linux@rempel-privat.de>
To: Fred Chou <fred.chou.nd@gmail.com>,
	ath9k-devel@qca.qualcomm.com, kvalo@codeaurora.org
Cc: linux-wireless@vger.kernel.org, ath9k-devel@venema.h4ckr.net,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ath9k_htc: check seq number instead of cmd id for timeout
Date: Mon, 06 Apr 2015 12:01:28 +0200	[thread overview]
Message-ID: <55225978.6050903@rempel-privat.de> (raw)
In-Reply-To: <552228AB.8060000@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 3214 bytes --]

Hi Kalle,

can you please apply this patch.

Am 06.04.2015 um 08:33 schrieb Fred Chou:
> Hi all,
> 
> May I have an update on the patch status please?
> 
> Thanks and regards,
> Fred
> 
> On 13/3/2015 4:32 PM, Fred Chou wrote:
>> From: Fred Chou <fred.chou.nd@gmail.com>
>>
>> As the driver may send multiple wmi commands with identical cmd id,
>> it is more robust to check seq number for timeout instead.
>>
>> Signed-off-by: Fred Chou <fred.chou.nd@gmail.com>
>> ---
>>  drivers/net/wireless/ath/ath9k/wmi.c | 12 ++++++------
>>  drivers/net/wireless/ath/ath9k/wmi.h |  2 +-
>>  2 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
>> index 65c8894..aba909f 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.c
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.c
>> @@ -224,7 +224,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
>>  
>>  	/* Check if there has been a timeout. */
>>  	spin_lock(&wmi->wmi_lock);
>> -	if (cmd_id != wmi->last_cmd_id) {
>> +	if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {
>>  		spin_unlock(&wmi->wmi_lock);
>>  		goto free_skb;
>>  	}
>> @@ -272,11 +272,16 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
>>  			       enum wmi_cmd_id cmd, u16 len)
>>  {
>>  	struct wmi_cmd_hdr *hdr;
>> +	unsigned long flags;
>>  
>>  	hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr));
>>  	hdr->command_id = cpu_to_be16(cmd);
>>  	hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
>>  
>> +	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> +	wmi->last_seq_id = wmi->tx_seq_id;
>> +	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> +
>>  	return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);
>>  }
>>  
>> @@ -292,7 +297,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	struct sk_buff *skb;
>>  	u8 *data;
>>  	int time_left, ret = 0;
>> -	unsigned long flags;
>>  
>>  	if (ah->ah_flags & AH_UNPLUGGED)
>>  		return 0;
>> @@ -320,10 +324,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	wmi->cmd_rsp_buf = rsp_buf;
>>  	wmi->cmd_rsp_len = rsp_len;
>>  
>> -	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> -	wmi->last_cmd_id = cmd_id;
>> -	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> -
>>  	ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
>>  	if (ret)
>>  		goto out;
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h
>> index 0db37f2..2aad6dc 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.h
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.h
>> @@ -143,7 +143,7 @@ struct wmi {
>>  	enum htc_endpoint_id ctrl_epid;
>>  	struct mutex op_mutex;
>>  	struct completion cmd_wait;
>> -	enum wmi_cmd_id last_cmd_id;
>> +	u16 last_seq_id;
>>  	struct sk_buff_head wmi_event_queue;
>>  	struct tasklet_struct wmi_event_tasklet;
>>  	u16 tx_seq_id;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Regards,
Oleksij


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 230 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Oleksij Rempel <linux-YEK0n+YFykbzxQdaRaTXBw@public.gmane.org>
To: Fred Chou <fred.chou.nd-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	ath9k-devel-A+ZNKFmMK5xy9aJCnZT0Uw@public.gmane.org,
	kvalo-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	ath9k-devel-xDcbHBWguxHbcTqmT+pZeQ@public.gmane.org,
	netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] ath9k_htc: check seq number instead of cmd id for timeout
Date: Mon, 06 Apr 2015 12:01:28 +0200	[thread overview]
Message-ID: <55225978.6050903@rempel-privat.de> (raw)
In-Reply-To: <552228AB.8060000-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 3298 bytes --]

Hi Kalle,

can you please apply this patch.

Am 06.04.2015 um 08:33 schrieb Fred Chou:
> Hi all,
> 
> May I have an update on the patch status please?
> 
> Thanks and regards,
> Fred
> 
> On 13/3/2015 4:32 PM, Fred Chou wrote:
>> From: Fred Chou <fred.chou.nd-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>>
>> As the driver may send multiple wmi commands with identical cmd id,
>> it is more robust to check seq number for timeout instead.
>>
>> Signed-off-by: Fred Chou <fred.chou.nd-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>> ---
>>  drivers/net/wireless/ath/ath9k/wmi.c | 12 ++++++------
>>  drivers/net/wireless/ath/ath9k/wmi.h |  2 +-
>>  2 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
>> index 65c8894..aba909f 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.c
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.c
>> @@ -224,7 +224,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
>>  
>>  	/* Check if there has been a timeout. */
>>  	spin_lock(&wmi->wmi_lock);
>> -	if (cmd_id != wmi->last_cmd_id) {
>> +	if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {
>>  		spin_unlock(&wmi->wmi_lock);
>>  		goto free_skb;
>>  	}
>> @@ -272,11 +272,16 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
>>  			       enum wmi_cmd_id cmd, u16 len)
>>  {
>>  	struct wmi_cmd_hdr *hdr;
>> +	unsigned long flags;
>>  
>>  	hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr));
>>  	hdr->command_id = cpu_to_be16(cmd);
>>  	hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
>>  
>> +	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> +	wmi->last_seq_id = wmi->tx_seq_id;
>> +	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> +
>>  	return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);
>>  }
>>  
>> @@ -292,7 +297,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	struct sk_buff *skb;
>>  	u8 *data;
>>  	int time_left, ret = 0;
>> -	unsigned long flags;
>>  
>>  	if (ah->ah_flags & AH_UNPLUGGED)
>>  		return 0;
>> @@ -320,10 +324,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
>>  	wmi->cmd_rsp_buf = rsp_buf;
>>  	wmi->cmd_rsp_len = rsp_len;
>>  
>> -	spin_lock_irqsave(&wmi->wmi_lock, flags);
>> -	wmi->last_cmd_id = cmd_id;
>> -	spin_unlock_irqrestore(&wmi->wmi_lock, flags);
>> -
>>  	ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
>>  	if (ret)
>>  		goto out;
>> diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h
>> index 0db37f2..2aad6dc 100644
>> --- a/drivers/net/wireless/ath/ath9k/wmi.h
>> +++ b/drivers/net/wireless/ath/ath9k/wmi.h
>> @@ -143,7 +143,7 @@ struct wmi {
>>  	enum htc_endpoint_id ctrl_epid;
>>  	struct mutex op_mutex;
>>  	struct completion cmd_wait;
>> -	enum wmi_cmd_id last_cmd_id;
>> +	u16 last_seq_id;
>>  	struct sk_buff_head wmi_event_queue;
>>  	struct tasklet_struct wmi_event_tasklet;
>>  	u16 tx_seq_id;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Regards,
Oleksij


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 230 bytes --]

  reply	other threads:[~2015-04-06 10:01 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-13  8:32 [ath9k-devel] [PATCH] ath9k_htc: check seq number instead of cmd id for timeout Fred Chou
2015-03-13  8:32 ` Fred Chou
2015-03-13  8:32 ` Fred Chou
2015-03-15  6:48 ` [ath9k-devel] " Oleksij Rempel
2015-03-15  6:48   ` Oleksij Rempel
2015-03-15  6:48   ` Oleksij Rempel
2015-03-15  6:48   ` Oleksij Rempel
2015-03-16  4:41   ` [ath9k-devel] " Fred Chou
2015-03-16  4:41     ` Fred Chou
2015-03-16  4:41     ` Fred Chou
2015-04-06  6:33 ` [ath9k-devel] " Fred Chou
2015-04-06  6:33   ` Fred Chou
2015-04-06  6:33   ` Fred Chou
2015-04-06 10:01   ` Oleksij Rempel [this message]
2015-04-06 10:01     ` Oleksij Rempel
2015-04-06 10:01     ` Oleksij Rempel
2015-04-06 10:01     ` Oleksij Rempel
2015-04-07 17:08 ` [ath9k-devel] " Kalle Valo
2015-04-07 17:08   ` Kalle Valo
2015-04-07 17:08   ` Kalle Valo

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=55225978.6050903@rempel-privat.de \
    --to=linux@rempel-privat.de \
    --cc=ath9k-devel@lists.ath9k.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.