DPDK patches and discussions
 help / color / mirror / Atom feed
From: Shreyansh Jain <shreyansh.jain@nxp.com>
To: "ferruh.yigit@intel.com" <ferruh.yigit@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>, Shreyansh Jain <shreyansh.jain@nxp.com>
Subject: [dpdk-dev] [PATCH v2 2/3] drivers: update MC firmware version for FSLMC bus
Date: Thu, 4 Apr 2019 07:23:24 +0000	[thread overview]
Message-ID: <20190404072335.24555-3-shreyansh.jain@nxp.com> (raw)
Message-ID: <20190404072324.AKh6PaPmpmvcKq1esxjPCmOaU6yO-kQLJO11B-s-LKc@z> (raw)
In-Reply-To: <20190404072335.24555-1-shreyansh.jain@nxp.com>

MC firmware is the core component of FSLMC bus and DPAA2 devices.
Prior to this patch, MC firmware supported 10.10.x version. This
patch bumps the min supported version to 10.14.x.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 drivers/bus/fslmc/mc/fsl_dpmng.h    |  2 +-
 drivers/net/dpaa2/dpaa2_ethdev.c    |  1 +
 drivers/net/dpaa2/mc/dpni.c         | 13 ++++-
 drivers/net/dpaa2/mc/fsl_dpni.h     | 84 ++++++++++++++++++++++-------
 drivers/net/dpaa2/mc/fsl_dpni_cmd.h | 40 ++++++++++----
 5 files changed, 109 insertions(+), 31 deletions(-)

diff --git a/drivers/bus/fslmc/mc/fsl_dpmng.h b/drivers/bus/fslmc/mc/fsl_dpmng.h
index 8559bef87..bef2ef095 100644
--- a/drivers/bus/fslmc/mc/fsl_dpmng.h
+++ b/drivers/bus/fslmc/mc/fsl_dpmng.h
@@ -18,7 +18,7 @@ struct fsl_mc_io;
  * Management Complex firmware version information
  */
 #define MC_VER_MAJOR 10
-#define MC_VER_MINOR 10
+#define MC_VER_MINOR 14
 
 /**
  * struct mc_version
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 3fbc82977..98ef8a5f5 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -665,6 +665,7 @@ dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
 					 DPNI_CONG_OPT_WRITE_MEM_ON_ENTER |
 					 DPNI_CONG_OPT_WRITE_MEM_ON_EXIT |
 					 DPNI_CONG_OPT_COHERENT_WRITE;
+		cong_notif_cfg.cg_point = DPNI_CP_QUEUE;
 
 		ret = dpni_set_congestion_notification(dpni, CMD_PRI_LOW,
 						       priv->token,
diff --git a/drivers/net/dpaa2/mc/dpni.c b/drivers/net/dpaa2/mc/dpni.c
index 6c12a0ae1..362cd476f 100644
--- a/drivers/net/dpaa2/mc/dpni.c
+++ b/drivers/net/dpaa2/mc/dpni.c
@@ -125,6 +125,7 @@ int dpni_create(struct fsl_mc_io *mc_io,
 	cmd_params->vlan_filter_entries =  cfg->vlan_filter_entries;
 	cmd_params->qos_entries = cfg->qos_entries;
 	cmd_params->fs_entries = cpu_to_le16(cfg->fs_entries);
+	cmd_params->num_cgs = cfg->num_cgs;
 
 	/* send command to mc*/
 	err = mc_send_command(mc_io, &cmd);
@@ -593,6 +594,7 @@ int dpni_get_attributes(struct fsl_mc_io *mc_io,
 	attr->qos_key_size = rsp_params->qos_key_size;
 	attr->fs_key_size = rsp_params->fs_key_size;
 	attr->wriop_version = le16_to_cpu(rsp_params->wriop_version);
+	attr->num_cgs = rsp_params->num_cgs;
 
 	return 0;
 }
@@ -1800,6 +1802,8 @@ int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
 	cmd_params = (struct dpni_cmd_set_congestion_notification *)cmd.params;
 	cmd_params->qtype = qtype;
 	cmd_params->tc = tc_id;
+	cmd_params->congestion_point = cfg->cg_point;
+	cmd_params->cgid = (uint8_t)cfg->cgid;
 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
 	cmd_params->dest_priority = cfg->dest_cfg.priority;
@@ -1850,6 +1854,8 @@ int dpni_get_congestion_notification(struct fsl_mc_io *mc_io,
 	cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params;
 	cmd_params->qtype = qtype;
 	cmd_params->tc = tc_id;
+	cmd_params->congestion_point = cfg->cg_point;
+	cmd_params->cgid = cfg->cgid;
 
 	/* send command to mc*/
 	err = mc_send_command(mc_io, &cmd);
@@ -1949,6 +1955,7 @@ int dpni_set_queue(struct fsl_mc_io *mc_io,
 		       queue->destination.hold_active);
 	cmd_params->flc = cpu_to_le64(queue->flc.value);
 	cmd_params->user_context = cpu_to_le64(queue->user_context);
+	cmd_params->cgid = queue->cgid;
 
 	/* send command to mc */
 	return mc_send_command(mc_io, &cmd);
@@ -2010,6 +2017,10 @@ int dpni_get_queue(struct fsl_mc_io *mc_io,
 	queue->user_context = le64_to_cpu(rsp_params->user_context);
 	qid->fqid = le32_to_cpu(rsp_params->fqid);
 	qid->qdbin = le16_to_cpu(rsp_params->qdbin);
+	if (dpni_get_field(rsp_params->flags, CGID_VALID))
+		queue->cgid = rsp_params->cgid;
+	else
+		queue->cgid = -1;
 
 	return 0;
 }
@@ -2031,7 +2042,7 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io,
 			uint32_t cmd_flags,
 			uint16_t token,
 			uint8_t page,
-			uint8_t param,
+			uint16_t param,
 			union dpni_statistics *stat)
 {
 	struct mc_command cmd = { 0 };
diff --git a/drivers/net/dpaa2/mc/fsl_dpni.h b/drivers/net/dpaa2/mc/fsl_dpni.h
index aecdc8d1f..8b1cfbac7 100644
--- a/drivers/net/dpaa2/mc/fsl_dpni.h
+++ b/drivers/net/dpaa2/mc/fsl_dpni.h
@@ -91,6 +91,10 @@ struct fsl_mc_io;
  * All Tx traffic classes will use a single sender (ignore num_queueus for tx)
  */
 #define DPNI_OPT_SINGLE_SENDER			0x000100
+/**
+ * Define a custom number of congestion groups
+ */
+#define DPNI_OPT_CUSTOM_CG				0x000200
 
 int dpni_open(struct fsl_mc_io *mc_io,
 	      uint32_t cmd_flags,
@@ -172,6 +176,7 @@ struct dpni_cfg {
 	uint8_t  num_tcs;
 	uint8_t  num_rx_tcs;
 	uint8_t  qos_entries;
+	uint8_t  num_cgs;
 };
 
 int dpni_create(struct fsl_mc_io *mc_io,
@@ -326,6 +331,7 @@ struct dpni_attr {
 	uint8_t  qos_key_size;
 	uint8_t  fs_key_size;
 	uint16_t wriop_version;
+	uint8_t  num_cgs;
 };
 
 int dpni_get_attributes(struct fsl_mc_io *mc_io,
@@ -638,6 +644,36 @@ union dpni_statistics {
  */
 #define DPNI_LINK_OPT_PFC_PAUSE	0x0000000000000010ULL
 
+/**
+ * Advertise 10MB full duplex
+ */
+#define DPNI_ADVERTISED_10BASET_FULL           0x0000000000000001ULL
+/**
+ * Advertise 100MB full duplex
+ */
+#define DPNI_ADVERTISED_100BASET_FULL          0x0000000000000002ULL
+/**
+ * Advertise 1GB full duplex
+ */
+#define DPNI_ADVERTISED_1000BASET_FULL         0x0000000000000004ULL
+/**
+ * Advertise auto-negotiation enable
+ */
+#define DPNI_ADVERTISED_AUTONEG                0x0000000000000008ULL
+/**
+ * Advertise 10GB full duplex
+ */
+#define DPNI_ADVERTISED_10000BASET_FULL        0x0000000000000010ULL
+/**
+ * Advertise 2.5GB full duplex
+ */
+#define DPNI_ADVERTISED_2500BASEX_FULL         0x0000000000000020ULL
+/**
+ * Advertise 5GB full duplex
+ */
+#define DPNI_ADVERTISED_5000BASET_FULL         0x0000000000000040ULL
+
+
 /**
  * struct - Structure representing DPNI link configuration
  * @rate: Rate
@@ -668,7 +704,7 @@ struct dpni_link_state {
 	uint32_t rate;
 	uint64_t options;
 	int up;
-	int     state_valid;
+	int state_valid;
 	uint64_t supported;
 	uint64_t advertising;
 };
@@ -850,7 +886,6 @@ enum dpni_congestion_unit {
 	DPNI_CONGESTION_UNIT_FRAMES
 };
 
-
 /**
  * enum dpni_dest - DPNI destination types
  * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
@@ -924,6 +959,25 @@ struct dpni_dest_cfg {
  */
 #define DPNI_CONG_OPT_FLOW_CONTROL	0x00000040
 
+/**
+ * enum dpni_congestion_point - Structure representing congestion point
+ * @DPNI_CP_QUEUE:	Set congestion per queue, identified by QUEUE_TYPE, TC
+ *			and QUEUE_INDEX
+ * @DPNI_CP_GROUP:	Set congestion per queue group. Depending on options
+ *			used to define the DPNI this can be either per
+ *			TC (default) or per interface
+ *			(DPNI_OPT_SHARED_CONGESTION set at DPNI create).
+ *			QUEUE_INDEX is ignored if this type is used.
+ * @DPNI_CP_CONGESTION_GROUP: Set per congestion group id. This will work
+ *		only if the DPNI is created with  DPNI_OPT_CUSTOM_CG option
+ */
+
+enum dpni_congestion_point {
+	DPNI_CP_QUEUE,
+	DPNI_CP_GROUP,
+	DPNI_CP_CONGESTION_GROUP,
+};
+
 /**
  * struct dpni_congestion_notification_cfg - congestion notification
  *		configuration
@@ -937,6 +991,8 @@ struct dpni_dest_cfg {
  *	contained in 'options'
  * @dest_cfg: CSCN can be send to either DPIO or DPCON WQ channel
  * @notification_mode: Mask of available options; use 'DPNI_CONG_OPT_<X>' values
+ * @cg_point: Congestion point settings
+ * @cgid: id of the congestion group. The index is relative to dpni.
  */
 
 struct dpni_congestion_notification_cfg {
@@ -947,6 +1003,8 @@ struct dpni_congestion_notification_cfg {
 	uint64_t message_iova;
 	struct dpni_dest_cfg dest_cfg;
 	uint16_t notification_mode;
+	enum dpni_congestion_point cg_point;
+	int cgid;
 };
 
 int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
@@ -1016,6 +1074,7 @@ int dpni_get_congestion_notification(struct fsl_mc_io *mc_io,
  *      FD[OFFSET].
  *      For more details check the Frame Descriptor section in the
  *      hardware documentation.
+ *@cgid :indicate the cgid to set relative to dpni
  */
 struct dpni_queue {
 	struct {
@@ -1029,6 +1088,7 @@ struct dpni_queue {
 		uint64_t value;
 		char stash_control;
 	} flc;
+	int cgid;
 };
 
 /**
@@ -1218,6 +1278,9 @@ int dpni_get_api_version(struct fsl_mc_io *mc_io,
  */
 #define DPNI_QUEUE_OPT_HOLD_ACTIVE	0x00000008
 
+#define DPNI_QUEUE_OPT_SET_CGID				0x00000040
+#define DPNI_QUEUE_OPT_CLEAR_CGID			0x00000080
+
 int dpni_set_queue(struct fsl_mc_io *mc_io,
 		   uint32_t cmd_flags,
 		   uint16_t token,
@@ -1240,28 +1303,13 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io,
 			uint32_t cmd_flags,
 			uint16_t token,
 			uint8_t page,
-			uint8_t param,
+			uint16_t param,
 			union dpni_statistics *stat);
 
 int dpni_reset_statistics(struct fsl_mc_io *mc_io,
 			  uint32_t cmd_flags,
 			  uint16_t token);
 
-/**
- * enum dpni_congestion_point - Structure representing congestion point
- * @DPNI_CP_QUEUE:	Set taildrop per queue, identified by QUEUE_TYPE, TC and
- *				QUEUE_INDEX
- * @DPNI_CP_GROUP:	Set taildrop per queue group. Depending on options used
- *				to define the DPNI this can be either per
- *				TC (default) or per interface
- *				(DPNI_OPT_SHARED_CONGESTION set at DPNI create).
- *				QUEUE_INDEX is ignored if this type is used.
- */
-enum dpni_congestion_point {
-	DPNI_CP_QUEUE,
-	DPNI_CP_GROUP,
-};
-
 /**
  * struct dpni_taildrop - Structure representing the taildrop
  * @enable:	Indicates whether the taildrop is active or not.
diff --git a/drivers/net/dpaa2/mc/fsl_dpni_cmd.h b/drivers/net/dpaa2/mc/fsl_dpni_cmd.h
index 9116e417e..5effbb300 100644
--- a/drivers/net/dpaa2/mc/fsl_dpni_cmd.h
+++ b/drivers/net/dpaa2/mc/fsl_dpni_cmd.h
@@ -9,7 +9,7 @@
 
 /* DPNI Version */
 #define DPNI_VER_MAJOR				7
-#define DPNI_VER_MINOR				8
+#define DPNI_VER_MINOR				9
 
 #define DPNI_CMD_BASE_VERSION			1
 #define DPNI_CMD_VERSION_2			2
@@ -23,13 +23,13 @@
 /* Command IDs */
 #define DPNI_CMDID_OPEN				DPNI_CMD(0x801)
 #define DPNI_CMDID_CLOSE			DPNI_CMD(0x800)
-#define DPNI_CMDID_CREATE			DPNI_CMD_V2(0x901)
+#define DPNI_CMDID_CREATE			DPNI_CMD_V3(0x901)
 #define DPNI_CMDID_DESTROY			DPNI_CMD(0x981)
 #define DPNI_CMDID_GET_API_VERSION		DPNI_CMD(0xa01)
 
 #define DPNI_CMDID_ENABLE			DPNI_CMD(0x002)
 #define DPNI_CMDID_DISABLE			DPNI_CMD(0x003)
-#define DPNI_CMDID_GET_ATTR			DPNI_CMD_V2(0x004)
+#define DPNI_CMDID_GET_ATTR			DPNI_CMD_V3(0x004)
 #define DPNI_CMDID_RESET			DPNI_CMD(0x005)
 #define DPNI_CMDID_IS_ENABLED			DPNI_CMD(0x006)
 
@@ -77,10 +77,10 @@
 #define DPNI_CMDID_REMOVE_FS_ENT		DPNI_CMD(0x245)
 #define DPNI_CMDID_CLR_FS_ENT			DPNI_CMD(0x246)
 
-#define DPNI_CMDID_GET_STATISTICS		DPNI_CMD_V2(0x25D)
+#define DPNI_CMDID_GET_STATISTICS		DPNI_CMD_V3(0x25D)
 #define DPNI_CMDID_RESET_STATISTICS		DPNI_CMD(0x25E)
-#define DPNI_CMDID_GET_QUEUE			DPNI_CMD(0x25F)
-#define DPNI_CMDID_SET_QUEUE			DPNI_CMD(0x260)
+#define DPNI_CMDID_GET_QUEUE			DPNI_CMD_V2(0x25F)
+#define DPNI_CMDID_SET_QUEUE			DPNI_CMD_V2(0x260)
 #define DPNI_CMDID_GET_TAILDROP			DPNI_CMD_V2(0x261)
 #define DPNI_CMDID_SET_TAILDROP			DPNI_CMD_V2(0x262)
 
@@ -89,8 +89,8 @@
 #define DPNI_CMDID_GET_BUFFER_LAYOUT		DPNI_CMD_V2(0x264)
 #define DPNI_CMDID_SET_BUFFER_LAYOUT		DPNI_CMD_V2(0x265)
 
-#define DPNI_CMDID_SET_CONGESTION_NOTIFICATION	DPNI_CMD(0x267)
-#define DPNI_CMDID_GET_CONGESTION_NOTIFICATION	DPNI_CMD(0x268)
+#define DPNI_CMDID_SET_CONGESTION_NOTIFICATION	DPNI_CMD_V2(0x267)
+#define DPNI_CMDID_GET_CONGESTION_NOTIFICATION	DPNI_CMD_V2(0x268)
 #define DPNI_CMDID_SET_EARLY_DROP		DPNI_CMD_V2(0x269)
 #define DPNI_CMDID_GET_EARLY_DROP		DPNI_CMD_V2(0x26A)
 #define DPNI_CMDID_GET_OFFLOAD			DPNI_CMD(0x26B)
@@ -131,6 +131,8 @@ struct dpni_cmd_create {
 	uint8_t pad3;
 	uint16_t fs_entries;
 	uint8_t num_rx_tcs;
+	uint8_t pad4;
+	uint8_t num_cgs;
 };
 
 struct dpni_cmd_destroy {
@@ -222,6 +224,7 @@ struct dpni_rsp_get_attr {
 	uint8_t qos_key_size;
 	uint8_t fs_key_size;
 	uint16_t wriop_version;
+	uint8_t num_cgs;
 };
 
 #define DPNI_ERROR_ACTION_SHIFT		0
@@ -315,7 +318,7 @@ struct dpni_rsp_get_tx_data_offset {
 
 struct dpni_cmd_get_statistics {
 	uint8_t page_number;
-	uint8_t param;
+	uint16_t param;
 };
 
 struct dpni_rsp_get_statistics {
@@ -464,6 +467,8 @@ struct dpni_cmd_get_queue {
 
 #define DPNI_DEST_TYPE_SHIFT		0
 #define DPNI_DEST_TYPE_SIZE		4
+#define DPNI_CGID_VALID_SHIFT		5
+#define DPNI_CGID_VALID_SIZE		1
 #define DPNI_STASH_CTRL_SHIFT		6
 #define DPNI_STASH_CTRL_SIZE		1
 #define DPNI_HOLD_ACTIVE_SHIFT		7
@@ -476,7 +481,9 @@ struct dpni_rsp_get_queue {
 	uint32_t dest_id;
 	uint16_t pad1;
 	uint8_t dest_prio;
-	/* From LSB: dest_type:4, pad:2, flc_stash_ctrl:1, hold_active:1 */
+	/* From LSB:
+	 * dest_type:4, pad:1, cgid_valid:1, flc_stash_ctrl:1, hold_active:1
+	 */
 	uint8_t flags;
 	/* response word 2 */
 	uint64_t flc;
@@ -485,6 +492,9 @@ struct dpni_rsp_get_queue {
 	/* response word 4 */
 	uint32_t fqid;
 	uint16_t qdbin;
+	uint16_t pad2;
+	/* response word 5*/
+	uint8_t cgid;
 };
 
 struct dpni_cmd_set_queue {
@@ -503,6 +513,8 @@ struct dpni_cmd_set_queue {
 	uint64_t flc;
 	/* cmd word 3 */
 	uint64_t user_context;
+	/* cmd word 4 */
+	uint8_t cgid;
 };
 
 #define DPNI_DISCARD_ON_MISS_SHIFT	0
@@ -655,7 +667,10 @@ struct dpni_tx_confirmation_mode {
 struct dpni_cmd_set_congestion_notification {
 	uint8_t qtype;
 	uint8_t tc;
-	uint8_t pad[6];
+	uint8_t pad;
+	uint8_t congestion_point;
+	uint8_t cgid;
+	uint8_t pad2[3];
 	uint32_t dest_id;
 	uint16_t notification_mode;
 	uint8_t dest_priority;
@@ -670,6 +685,9 @@ struct dpni_cmd_set_congestion_notification {
 struct dpni_cmd_get_congestion_notification {
 	uint8_t qtype;
 	uint8_t tc;
+	uint8_t pad;
+	uint8_t congestion_point;
+	uint8_t cgid;
 };
 
 struct dpni_rsp_get_congestion_notification {
-- 
2.19.1


  parent reply	other threads:[~2019-04-04  7:23 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-03 14:23 [dpdk-dev] [PATCH 0/3] Update FSLMC bus firmware Shreyansh Jain
2019-04-03 14:23 ` Shreyansh Jain
2019-04-03 14:23 ` [dpdk-dev] [PATCH 1/3] bus/fslmc: cleanup unused firmware code Shreyansh Jain
2019-04-03 14:23   ` Shreyansh Jain
2019-04-03 14:23 ` [dpdk-dev] [PATCH 2/3] drivers: update MC firmware version for FSLMC bus Shreyansh Jain
2019-04-03 14:23   ` Shreyansh Jain
2019-04-03 14:23 ` [dpdk-dev] [PATCH 3/3] doc: bump SDK support version for dpaa2 Shreyansh Jain
2019-04-03 14:23   ` Shreyansh Jain
2019-04-04  7:23 ` [dpdk-dev] [PATCH v2 0/3] Update FSLMC bus firmware Shreyansh Jain
2019-04-04  7:23   ` Shreyansh Jain
2019-04-04  7:23   ` [dpdk-dev] [PATCH v2 1/3] bus/fslmc: cleanup unused firmware code Shreyansh Jain
2019-04-04  7:23     ` Shreyansh Jain
2019-04-04 21:29     ` Ferruh Yigit
2019-04-04 21:29       ` Ferruh Yigit
2019-04-04 21:43       ` Thomas Monjalon
2019-04-04 21:43         ` Thomas Monjalon
2019-04-05 11:19         ` Shreyansh Jain
2019-04-05 11:19           ` Shreyansh Jain
2019-04-05 11:37           ` Ferruh Yigit
2019-04-05 11:37             ` Ferruh Yigit
2019-04-05 11:38           ` Shreyansh Jain
2019-04-05 11:38             ` Shreyansh Jain
2019-04-05 12:35             ` Thomas Monjalon
2019-04-05 12:35               ` Thomas Monjalon
2019-04-05 12:58               ` Shreyansh Jain
2019-04-05 12:58                 ` Shreyansh Jain
2019-04-04  7:23   ` Shreyansh Jain [this message]
2019-04-04  7:23     ` [dpdk-dev] [PATCH v2 2/3] drivers: update MC firmware version for FSLMC bus Shreyansh Jain
2019-04-04  7:23   ` [dpdk-dev] [PATCH v2 3/3] doc: bump SDK support version for dpaa2 Shreyansh Jain
2019-04-04  7:23     ` Shreyansh Jain
2019-04-04 21:08   ` [dpdk-dev] [PATCH v2 0/3] Update FSLMC bus firmware Thomas Monjalon
2019-04-04 21:08     ` Thomas Monjalon

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=20190404072335.24555-3-shreyansh.jain@nxp.com \
    --to=shreyansh.jain@nxp.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).