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