All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
@ 2016-10-07 23:09 James Smart
  2016-10-12  8:58 ` Christoph Hellwig
  0 siblings, 1 reply; 9+ messages in thread
From: James Smart @ 2016-10-07 23:09 UTC (permalink / raw)



nvme-fabrics: Add FC transport FC-NVME definitions:
- Formats for Cmd, Data, Rsp IUs
- Formats FC-4 LS definitions
- cmd_iu changed in T11. The 2 reserved words, previous at words
  2 and 3, were moved to after the sqe.
- Modifications from prior reviews:
-  FC-transport-specific error codes moved to include/linux/nvme.h
-  Removed 0x28 type declaration to include/uapi/scsi/fc/fc_fs.h
-  Removed Reject reasons and explanations. ELS values are to be used.

Signed-off-by: James Smart <james.smart at broadcom.com>
---
 include/linux/nvme-fc.h | 255 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 255 insertions(+)
 create mode 100644 include/linux/nvme-fc.h

diff --git a/include/linux/nvme-fc.h b/include/linux/nvme-fc.h
new file mode 100644
index 0000000..358d155
--- /dev/null
+++ b/include/linux/nvme-fc.h
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2016 Avago Technologies.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful.
+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
+ * THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
+ * See the GNU General Public License for more details, a copy of which
+ * can be found in the file COPYING included with this package
+ *
+ */
+
+/*
+ * This file contains definitions relative to FC-NVME r1.09
+ */
+
+#ifndef _NVME_FC_H
+#define _NVME_FC_H 1
+
+
+#define NVME_CMD_SCSI_ID		0xFD
+#define NVME_CMD_FC_ID			FC_TYPE_NVME
+
+/* FC-NVME Cmd IU Flags */
+#define FCNVME_CMD_FLAGS_DIRMASK	0x03
+#define FCNVME_CMD_FLAGS_WRITE		0x01
+#define FCNVME_CMD_FLAGS_READ		0x02
+
+struct nvme_fc_cmd_iu {
+	__u8			scsi_id;
+	__u8			fc_id;
+	__be16			iu_len;
+	__u8			rsvd4[3];
+	__u8			flags;
+	__be64			connection_id;
+	__be32			csn;
+	__be32			data_len;
+	struct nvme_command	sqe;
+	__be32			rsvd88[2];
+};
+
+#define NVME_FC_SIZEOF_ZEROS_RSP	12
+
+struct nvme_fc_ersp_iu {
+	__u8			rsvd0[2];
+	__be16			iu_len;
+	__be32			rsn;
+	__be32			rsvd8[2];
+	struct nvme_completion	cqe;
+	/* for now - no additional payload */
+};
+
+
+/* FC-NVME r1.03/16-119v0 NVME Link Services */
+enum {
+	FCNVME_LS_RSVD			= 0,
+	FCNVME_LS_RJT			= 1,
+	FCNVME_LS_ACC			= 2,
+	FCNVME_LS_CREATE_ASSOCIATION	= 3,
+	FCNVME_LS_CREATE_CONNECTION	= 4,
+	FCNVME_LS_DISCONNECT		= 5,
+};
+
+/* FC-NVME r1.03/16-119v0 NVME Link Service Descriptors */
+enum {
+	FCNVME_LSDESC_RSVD		= 0x0,
+	FCNVME_LSDESC_RQST		= 0x1,
+	FCNVME_LSDESC_RJT		= 0x2,
+	FCNVME_LSDESC_CREATE_ASSOC_CMD	= 0x3,
+	FCNVME_LSDESC_CREATE_CONN_CMD	= 0x4,
+	FCNVME_LSDESC_DISCONN_CMD	= 0x5,
+	FCNVME_LSDESC_CONN_ID		= 0x6,
+	FCNVME_LSDESC_ASSOC_ID		= 0x7,
+};
+
+
+/* ********** start of Link Service Descriptors ********** */
+
+
+/* fills in length of a descriptor. Struture minus descriptor header */
+#define FCNVME_LSDESC_LEN(lsdesc) \
+		cpu_to_be32(sizeof(lsdesc) - (2*(sizeof(u32))))
+
+struct fcnvme_ls_rqst_w0 {
+	u8	ls_cmd;			/* FCNVME_LS_xxx */
+	u8	zeros[3];
+};
+
+/* FCNVME_LSDESC_RQST */
+struct fcnvme_lsdesc_rqst {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	struct fcnvme_ls_rqst_w0	w0;
+	__be32	rsvd12;
+};
+
+
+
+
+/* FCNVME_LSDESC_RJT */
+struct fcnvme_lsdesc_rjt {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	u8	rsvd8;
+
+	/*
+	 * Reject reason and explanaction codes are generic
+	 * to ELs's from LS-3.
+	 */
+	u8	reason_code;
+	u8	reason_explanation;
+
+	u8	vendor;
+	__be32	rsvd12;
+};
+
+
+#define FCNVME_ASSOC_HOSTID_LEN		64
+#define FCNVME_ASSOC_HOSTNQN_LEN	256
+#define FCNVME_ASSOC_SUBNQN_LEN		256
+
+/* FCNVME_LSDESC_CREATE_ASSOC_CMD */
+struct fcnvme_lsdesc_cr_assoc_cmd {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	__be16	ersp_ratio;
+	__be16	rsvd10;
+	__be32	rsvd12[9];
+	__be16	cntlid;
+	__be16	sqsize;
+	__be32	rsvd52;
+	u8	hostid[FCNVME_ASSOC_HOSTID_LEN];
+	u8	hostnqn[FCNVME_ASSOC_HOSTNQN_LEN];
+	u8	subnqn[FCNVME_ASSOC_SUBNQN_LEN];
+	u8	rsvd632[384];
+};
+
+/* FCNVME_LSDESC_CREATE_CONN_CMD */
+struct fcnvme_lsdesc_cr_conn_cmd {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	__be16	ersp_ratio;
+	__be16	rsvd10;
+	__be32	rsvd12[9];
+	__be16	qid;
+	__be16	sqsize;
+	__be32  rsvd52;
+};
+
+/* Disconnect Scope Values */
+enum {
+	FCNVME_DISCONN_ASSOCIATION	= 0,
+	FCNVME_DISCONN_CONNECTION	= 1,
+};
+
+/* FCNVME_LSDESC_DISCONN_CMD */
+struct fcnvme_lsdesc_disconn_cmd {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	u8	rsvd8[3];
+	/* note: scope is really a 1 bit field */
+	u8	scope;			/* FCNVME_DISCONN_xxx */
+	__be32	rsvd12;
+	__be64	id;
+};
+
+/* FCNVME_LSDESC_CONN_ID */
+struct fcnvme_lsdesc_conn_id {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	__be64	connection_id;
+};
+
+/* FCNVME_LSDESC_ASSOC_ID */
+struct fcnvme_lsdesc_assoc_id {
+	__be32	desc_tag;		/* FCNVME_LSDESC_xxx */
+	__be32	desc_len;
+	__be64	association_id;
+};
+
+
+/* ********** start of Link Services ********** */
+
+
+/* FCNVME_LS_RJT */
+struct fcnvme_ls_rjt {
+	struct fcnvme_ls_rqst_w0		w0;
+	__be32					desc_list_len;
+	struct fcnvme_lsdesc_rqst		rqst;
+	struct fcnvme_lsdesc_rjt		rjt;
+};
+
+/* FCNVME_LS_ACC */
+struct fcnvme_ls_acc_hdr {
+	struct fcnvme_ls_rqst_w0		w0;
+	__be32					desc_list_len;
+	struct fcnvme_lsdesc_rqst		rqst;
+	/* Followed by cmd-specific ACC descriptors, see next definitions */
+};
+
+/* FCNVME_LS_CREATE_ASSOCIATION */
+struct fcnvme_ls_cr_assoc_rqst {
+	struct fcnvme_ls_rqst_w0		w0;
+	__be32					desc_list_len;
+	struct fcnvme_lsdesc_cr_assoc_cmd	assoc_cmd;
+};
+
+struct fcnvme_ls_cr_assoc_acc {
+	struct fcnvme_ls_acc_hdr		hdr;
+	struct fcnvme_lsdesc_assoc_id		associd;
+	struct fcnvme_lsdesc_conn_id		connectid;
+};
+
+
+/* FCNVME_LS_CREATE_CONNECTION */
+struct fcnvme_ls_cr_conn_rqst {
+	struct fcnvme_ls_rqst_w0		w0;
+	__be32					desc_list_len;
+	struct fcnvme_lsdesc_assoc_id		associd;
+	struct fcnvme_lsdesc_cr_conn_cmd	connect_cmd;
+};
+
+struct fcnvme_ls_cr_conn_acc {
+	struct fcnvme_ls_acc_hdr		hdr;
+	struct fcnvme_lsdesc_conn_id		connectid;
+};
+
+/* FCNVME_LS_DISCONNECT */
+struct fcnvme_ls_disconnect_rqst {
+	struct fcnvme_ls_rqst_w0		w0;
+	__be32					desc_list_len;
+	struct fcnvme_lsdesc_assoc_id		associd;
+	struct fcnvme_lsdesc_disconn_cmd	discon_cmd;
+};
+
+struct fcnvme_ls_disconnect_acc {
+	struct fcnvme_ls_acc_hdr		hdr;
+};
+
+
+/*
+ * Yet to be defined in FC-NVME:
+ */
+#define NVME_FC_CONNECT_TIMEOUT_SEC	2		/* 2 seconds */
+#define NVME_FC_LS_TIMEOUT_SEC		2		/* 2 seconds */
+#define NVME_FC_TGTOP_TIMEOUT_SEC	2		/* 2 seconds */
+
+
+#endif /* _NVME_FC_H */
+
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-07 23:09 [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions James Smart
@ 2016-10-12  8:58 ` Christoph Hellwig
  2016-10-12 18:53   ` James Smart
  2016-10-18 17:59   ` James Smart
  0 siblings, 2 replies; 9+ messages in thread
From: Christoph Hellwig @ 2016-10-12  8:58 UTC (permalink / raw)


On Fri, Oct 07, 2016@04:09:04PM -0700, James Smart wrote:
> 
> nvme-fabrics: Add FC transport FC-NVME definitions:

FYI, all the patches seem to have this duplicate of the subject in
the mail body.

> - cmd_iu changed in T11. The 2 reserved words, previous at words
>   2 and 3, were moved to after the sqe.
> - Modifications from prior reviews:
> -  FC-transport-specific error codes moved to include/linux/nvme.h
> -  Removed 0x28 type declaration to include/uapi/scsi/fc/fc_fs.h
> -  Removed Reject reasons and explanations. ELS values are to be used.

This should go either into the cover letter, or below the "---" line
so that it doesn't show up in the commit message.

> +/* fills in length of a descriptor. Struture minus descriptor header */
> +#define FCNVME_LSDESC_LEN(lsdesc) \
> +		cpu_to_be32(sizeof(lsdesc) - (2*(sizeof(u32))))

Make this an inline function and use spaces between the operators,
please.


Except for these nitpicks the patch looks fine to me:

Reviewed-by: Christoph Hellwig <hch at lst.de>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-12  8:58 ` Christoph Hellwig
@ 2016-10-12 18:53   ` James Smart
  2016-10-13  9:15     ` Christoph Hellwig
  2016-10-18 17:59   ` James Smart
  1 sibling, 1 reply; 9+ messages in thread
From: James Smart @ 2016-10-12 18:53 UTC (permalink / raw)




On 10/12/2016 1:58 AM, Christoph Hellwig wrote:
> On Fri, Oct 07, 2016@04:09:04PM -0700, James Smart wrote:
>> nvme-fabrics: Add FC transport FC-NVME definitions:
> FYI, all the patches seem to have this duplicate of the subject in
> the mail body.

I'm surprised. I'll look at it.

>
>> - cmd_iu changed in T11. The 2 reserved words, previous at words
>>    2 and 3, were moved to after the sqe.
>> - Modifications from prior reviews:
>> -  FC-transport-specific error codes moved to include/linux/nvme.h
>> -  Removed 0x28 type declaration to include/uapi/scsi/fc/fc_fs.h
>> -  Removed Reject reasons and explanations. ELS values are to be used.
> This should go either into the cover letter, or below the "---" line
> so that it doesn't show up in the commit message.

Ok - help my style. I assumed deltas to original patch made sense to 
itemize. As they are specific to this one file I thought it made sense 
to be in the commit message for this patch. I have no problem moving it 
to the cover letter. Just not sure what the criteria is for one place vs 
another.

>
>> +/* fills in length of a descriptor. Struture minus descriptor header */
>> +#define FCNVME_LSDESC_LEN(lsdesc) \
>> +		cpu_to_be32(sizeof(lsdesc) - (2*(sizeof(u32))))
> Make this an inline function and use spaces between the operators,
> please.

Np.

-- james

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-12 18:53   ` James Smart
@ 2016-10-13  9:15     ` Christoph Hellwig
  0 siblings, 0 replies; 9+ messages in thread
From: Christoph Hellwig @ 2016-10-13  9:15 UTC (permalink / raw)


On Wed, Oct 12, 2016@11:53:29AM -0700, James Smart wrote:
> Ok - help my style. I assumed deltas to original patch made sense to
> itemize. As they are specific to this one file I thought it made sense to be
> in the commit message for this patch. I have no problem moving it to the
> cover letter. Just not sure what the criteria is for one place vs another.

If you want to keep them in this patch that's not as usual but okay as
well.  But in that case move it under the '---' marker, so that git-am
won't pick it up.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-12  8:58 ` Christoph Hellwig
  2016-10-12 18:53   ` James Smart
@ 2016-10-18 17:59   ` James Smart
  2016-10-18 19:49     ` Jon Derrick
  1 sibling, 1 reply; 9+ messages in thread
From: James Smart @ 2016-10-18 17:59 UTC (permalink / raw)




On 10/12/2016 1:58 AM, Christoph Hellwig wrote:
>
>> +/* fills in length of a descriptor. Struture minus descriptor header */
>> +#define FCNVME_LSDESC_LEN(lsdesc) \
>> +		cpu_to_be32(sizeof(lsdesc) - (2*(sizeof(u32))))
> Make this an inline function and use spaces between the operators,
> please.
>

Christoph,

This can't be an inline - the "lsdesc" field is a type declaration 
("struct x") and varies. That's the purpose of the define: so it can be 
applied to different structures- e.g. FCNVME_LSDESC_LEN(struct foo) and 
FCNVME_LSDESC_LEN(struct bar)

I'll adjust for the spacing, but will leave as a define.

-- james

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-18 17:59   ` James Smart
@ 2016-10-18 19:49     ` Jon Derrick
  2016-10-18 22:20       ` James Smart
  0 siblings, 1 reply; 9+ messages in thread
From: Jon Derrick @ 2016-10-18 19:49 UTC (permalink / raw)


Hi James,

Fair warning, I don't really deal with the fabrics part of our driver,
and I don't see where your macro is actually used.

On Tue, Oct 18, 2016@10:59:43AM -0700, James Smart wrote:
> 
> 
> On 10/12/2016 1:58 AM, Christoph Hellwig wrote:
> >
> >>+/* fills in length of a descriptor. Struture minus descriptor header */
> >>+#define FCNVME_LSDESC_LEN(lsdesc) \
> >>+		cpu_to_be32(sizeof(lsdesc) - (2*(sizeof(u32))))
> >Make this an inline function and use spaces between the operators,
> >please.
> >
> 
> Christoph,
> 
> This can't be an inline - the "lsdesc" field is a type declaration ("struct
> x") and varies. That's the purpose of the define: so it can be applied to
> different structures- e.g. FCNVME_LSDESC_LEN(struct foo) and
> FCNVME_LSDESC_LEN(struct bar)

How about:
static inline __be32 fcnvme_lsdesc_len(size_t lsdesc_sz)
{
	return cpu_to_be32(lsdesc_sz - 2 * sizeof(u32));
}

foo = fcnvme_lsdesc_len(sizeof(struct bar));

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-18 19:49     ` Jon Derrick
@ 2016-10-18 22:20       ` James Smart
  2016-10-18 23:32         ` Jon Derrick
  0 siblings, 1 reply; 9+ messages in thread
From: James Smart @ 2016-10-18 22:20 UTC (permalink / raw)




On 10/18/2016 12:49 PM, Jon Derrick wrote:
> Hi James,
>
> Fair warning, I don't really deal with the fabrics part of our driver,
> and I don't see where your macro is actually used.

Its in the new FC transport files (host and target) that are added in 
subsequent patches. Wouldn't be used elsewhere.

>
> On Tue, Oct 18, 2016@10:59:43AM -0700, James Smart wrote:
> How about:
> static inline __be32 fcnvme_lsdesc_len(size_t lsdesc_sz)
> {
> 	return cpu_to_be32(lsdesc_sz - 2 * sizeof(u32));
> }
>
> foo = fcnvme_lsdesc_len(sizeof(struct bar));

Yes - that would work.

What is the rule for when it should be a macro vs an inline ?   It makes 
sense to me to be an inline if you want to strongly check the type of an 
argument, but something simple like this, it's not so clear.  If I 
didn't have the "cpu_to_be32" part, I'd abandon the inline and the macro 
and code it directly.

-- james

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-18 22:20       ` James Smart
@ 2016-10-18 23:32         ` Jon Derrick
  2016-10-19 12:52           ` Christoph Hellwig
  0 siblings, 1 reply; 9+ messages in thread
From: Jon Derrick @ 2016-10-18 23:32 UTC (permalink / raw)


> >On Tue, Oct 18, 2016@10:59:43AM -0700, James Smart wrote:
> >How about:
> >static inline __be32 fcnvme_lsdesc_len(size_t lsdesc_sz)
> >{
> >	return cpu_to_be32(lsdesc_sz - 2 * sizeof(u32));
> >}
> >
> >foo = fcnvme_lsdesc_len(sizeof(struct bar));
> 
> Yes - that would work.
> 
> What is the rule for when it should be a macro vs an inline ?   It makes
> sense to me to be an inline if you want to strongly check the type of an
> argument, but something simple like this, it's not so clear.  If I didn't
> have the "cpu_to_be32" part, I'd abandon the inline and the macro and code
> it directly.
In this case they will both provide the same error checking, due to
cpu_to_be32 returning type __be32. The only difference is that one adds
a macro and the other adds a function, and if we ever need to add some
caveats to the logic it will be simpler with the function. That and the
coding style dictates that all things being equal, we should still
prefer inline. Those are my only rationales in this case.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions
  2016-10-18 23:32         ` Jon Derrick
@ 2016-10-19 12:52           ` Christoph Hellwig
  0 siblings, 0 replies; 9+ messages in thread
From: Christoph Hellwig @ 2016-10-19 12:52 UTC (permalink / raw)


On Tue, Oct 18, 2016@05:32:24PM -0600, Jon Derrick wrote:
> > What is the rule for when it should be a macro vs an inline ?   It makes
> > sense to me to be an inline if you want to strongly check the type of an
> > argument, but something simple like this, it's not so clear.  If I didn't
> > have the "cpu_to_be32" part, I'd abandon the inline and the macro and code
> > it directly.
> In this case they will both provide the same error checking, due to
> cpu_to_be32 returning type __be32. The only difference is that one adds
> a macro and the other adds a function, and if we ever need to add some
> caveats to the logic it will be simpler with the function. That and the
> coding style dictates that all things being equal, we should still
> prefer inline. Those are my only rationales in this case.

I generally prefer to avoid macros that make grepping hard.  But
I don't want to bikeshed too much over this this - I'd prefer Jon's
variant, but I'm not going to NAK the series over this helper.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-10-19 12:52 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-07 23:09 [PATCH 3/7 v2] nvme-fabrics: Add FC transport FC-NVME definitions James Smart
2016-10-12  8:58 ` Christoph Hellwig
2016-10-12 18:53   ` James Smart
2016-10-13  9:15     ` Christoph Hellwig
2016-10-18 17:59   ` James Smart
2016-10-18 19:49     ` Jon Derrick
2016-10-18 22:20       ` James Smart
2016-10-18 23:32         ` Jon Derrick
2016-10-19 12:52           ` Christoph Hellwig

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.