xref: /openbmc/linux/include/scsi/fc/fc_fc2.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*a61127c2SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2f032c2f7SRobert Love /*
3f032c2f7SRobert Love  * Copyright(c) 2007 Intel Corporation. All rights reserved.
4f032c2f7SRobert Love  *
5f032c2f7SRobert Love  * Maintained at www.Open-FCoE.org
6f032c2f7SRobert Love  */
7f032c2f7SRobert Love 
8f032c2f7SRobert Love #ifndef _FC_FC2_H_
9f032c2f7SRobert Love #define _FC_FC2_H_
10f032c2f7SRobert Love 
11f032c2f7SRobert Love /*
12f032c2f7SRobert Love  * Fibre Channel Exchanges and Sequences.
13f032c2f7SRobert Love  */
14f032c2f7SRobert Love #ifndef PACKED
15f032c2f7SRobert Love #define PACKED  __attribute__ ((__packed__))
16f032c2f7SRobert Love #endif /* PACKED */
17f032c2f7SRobert Love 
18f032c2f7SRobert Love 
19f032c2f7SRobert Love /*
20f032c2f7SRobert Love  * Sequence Status Block.
21f032c2f7SRobert Love  * This format is set by the FC-FS standard and is sent over the wire.
22f032c2f7SRobert Love  * Note that the fields aren't all naturally aligned.
23f032c2f7SRobert Love  */
24f032c2f7SRobert Love struct fc_ssb {
25f032c2f7SRobert Love 	__u8	ssb_seq_id;		/* sequence ID */
26f032c2f7SRobert Love 	__u8	_ssb_resvd;
27f032c2f7SRobert Love 	__be16	ssb_low_seq_cnt;	/* lowest SEQ_CNT */
28f032c2f7SRobert Love 
29f032c2f7SRobert Love 	__be16	ssb_high_seq_cnt;	/* highest SEQ_CNT */
30f032c2f7SRobert Love 	__be16	ssb_s_stat;		/* sequence status flags */
31f032c2f7SRobert Love 
32f032c2f7SRobert Love 	__be16	ssb_err_seq_cnt;	/* error SEQ_CNT */
33f032c2f7SRobert Love 	__u8	ssb_fh_cs_ctl;		/* frame header CS_CTL */
34f032c2f7SRobert Love 	__be16	ssb_fh_ox_id;		/* frame header OX_ID */
35f032c2f7SRobert Love 	__be16	ssb_rx_id;		/* responder's exchange ID */
36f032c2f7SRobert Love 	__u8	_ssb_resvd2[2];
37f032c2f7SRobert Love } PACKED;
38f032c2f7SRobert Love 
39f032c2f7SRobert Love /*
40f032c2f7SRobert Love  * The SSB should be 17 bytes.  Since it's layout is somewhat strange,
41f032c2f7SRobert Love  * we define the size here so that code can ASSERT that the size comes out
42f032c2f7SRobert Love  * correct.
43f032c2f7SRobert Love  */
44f032c2f7SRobert Love #define FC_SSB_SIZE         17          /* length of fc_ssb for assert */
45f032c2f7SRobert Love 
46f032c2f7SRobert Love /*
47f032c2f7SRobert Love  * ssb_s_stat - flags from FC-FS-2 T11/1619-D Rev 0.90.
48f032c2f7SRobert Love  */
49f032c2f7SRobert Love #define SSB_ST_RESP         (1 << 15)   /* sequence responder */
50f032c2f7SRobert Love #define SSB_ST_ACTIVE       (1 << 14)   /* sequence is active */
51f032c2f7SRobert Love #define SSB_ST_ABNORMAL     (1 << 12)   /* abnormal ending condition */
52f032c2f7SRobert Love 
53f032c2f7SRobert Love #define SSB_ST_REQ_MASK     (3 << 10)   /* ACK, abort sequence condition */
54f032c2f7SRobert Love #define SSB_ST_REQ_CONT     (0 << 10)
55f032c2f7SRobert Love #define SSB_ST_REQ_ABORT    (1 << 10)
56f032c2f7SRobert Love #define SSB_ST_REQ_STOP     (2 << 10)
57f032c2f7SRobert Love #define SSB_ST_REQ_RETRANS  (3 << 10)
58f032c2f7SRobert Love 
59f032c2f7SRobert Love #define SSB_ST_ABTS         (1 << 9)    /* ABTS protocol completed */
60f032c2f7SRobert Love #define SSB_ST_RETRANS      (1 << 8)    /* retransmission completed */
61f032c2f7SRobert Love #define SSB_ST_TIMEOUT      (1 << 7)    /* sequence timed out by recipient */
62f032c2f7SRobert Love #define SSB_ST_P_RJT        (1 << 6)    /* P_RJT transmitted */
63f032c2f7SRobert Love 
64f032c2f7SRobert Love #define SSB_ST_CLASS_BIT    4           /* class of service field LSB */
65f032c2f7SRobert Love #define SSB_ST_CLASS_MASK   3           /* class of service mask */
66f032c2f7SRobert Love #define SSB_ST_ACK          (1 << 3)    /* ACK (EOFt or EOFdt) transmitted */
67f032c2f7SRobert Love 
68f032c2f7SRobert Love /*
69f032c2f7SRobert Love  * Exchange Status Block.
70f032c2f7SRobert Love  * This format is set by the FC-FS standard and is sent over the wire.
71f032c2f7SRobert Love  * Note that the fields aren't all naturally aligned.
72f032c2f7SRobert Love  */
73f032c2f7SRobert Love struct fc_esb {
74f032c2f7SRobert Love 	__u8	esb_cs_ctl;		/* CS_CTL for frame header */
75f032c2f7SRobert Love 	__be16	esb_ox_id;		/* originator exchange ID */
76f032c2f7SRobert Love 	__be16	esb_rx_id;		/* responder exchange ID */
77f032c2f7SRobert Love 	__be32	esb_orig_fid;		/* fabric ID of originator */
78f032c2f7SRobert Love 	__be32	esb_resp_fid;		/* fabric ID of responder */
79f032c2f7SRobert Love 	__be32	esb_e_stat;		/* status */
80f032c2f7SRobert Love 	__u8	_esb_resvd[4];
81f032c2f7SRobert Love 	__u8	esb_service_params[112]; /* TBD */
82f032c2f7SRobert Love 	__u8	esb_seq_status[8];	/* sequence statuses, 8 bytes each */
83a419aef8SJoe Perches } __attribute__((packed));
84f032c2f7SRobert Love 
85f032c2f7SRobert Love /*
86f032c2f7SRobert Love  * Define expected size for ASSERTs.
87f032c2f7SRobert Love  * See comments on FC_SSB_SIZE.
88f032c2f7SRobert Love  */
89f032c2f7SRobert Love #define FC_ESB_SIZE         (1 + 5*4 + 112 + 8)     /* expected size */
90f032c2f7SRobert Love 
91f032c2f7SRobert Love /*
92f032c2f7SRobert Love  * esb_e_stat - flags from FC-FS-2 T11/1619-D Rev 0.90.
93f032c2f7SRobert Love  */
94f032c2f7SRobert Love #define ESB_ST_RESP         (1 << 31)   /* responder to exchange */
95c1d45424SBart Van Assche #define ESB_ST_SEQ_INIT     (1 << 30)   /* port holds sequence initiative */
96f032c2f7SRobert Love #define ESB_ST_COMPLETE     (1 << 29)   /* exchange is complete */
97f032c2f7SRobert Love #define ESB_ST_ABNORMAL     (1 << 28)   /* abnormal ending condition */
98f032c2f7SRobert Love #define ESB_ST_REC_QUAL     (1 << 26)   /* recovery qualifier active */
99f032c2f7SRobert Love 
100f032c2f7SRobert Love #define ESB_ST_ERRP_BIT     24          /* LSB for error policy */
101f032c2f7SRobert Love #define ESB_ST_ERRP_MASK    (3 << 24)   /* mask for error policy */
102f032c2f7SRobert Love #define ESB_ST_ERRP_MULT    (0 << 24)   /* abort, discard multiple sequences */
103f032c2f7SRobert Love #define ESB_ST_ERRP_SING    (1 << 24)   /* abort, discard single sequence */
104f032c2f7SRobert Love #define ESB_ST_ERRP_INF     (2 << 24)   /* process with infinite buffers */
105f032c2f7SRobert Love #define ESB_ST_ERRP_IMM     (3 << 24)   /* discard mult. with immed. retran. */
106f032c2f7SRobert Love 
107f032c2f7SRobert Love #define ESB_ST_OX_ID_INVL   (1 << 23)   /* originator XID invalid */
108f032c2f7SRobert Love #define ESB_ST_RX_ID_INVL   (1 << 22)   /* responder XID invalid */
109f032c2f7SRobert Love #define ESB_ST_PRI_INUSE    (1 << 21)   /* priority / preemption in use */
110f032c2f7SRobert Love 
111f032c2f7SRobert Love #endif /* _FC_FC2_H_ */
112