|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | +/* |
| 3 | + * Copyright 2008 Cisco Systems, Inc. All rights reserved. |
| 4 | + * Copyright 2007 Nuova Systems, Inc. All rights reserved. |
| 5 | + */ |
| 6 | + |
| 7 | +#ifndef _FDLS_FC_H_ |
| 8 | +#define _FDLS_FC_H_ |
| 9 | + |
| 10 | +/* This file contains the declarations for FC fabric services |
| 11 | + * and target discovery |
| 12 | + * |
| 13 | + * Request and Response for |
| 14 | + * 1. FLOGI |
| 15 | + * 2. PLOGI to Fabric Controller |
| 16 | + * 3. GPN_ID, GPN_FT |
| 17 | + * 4. RSCN |
| 18 | + * 5. PLOGI to Target |
| 19 | + * 6. PRLI to Target |
| 20 | + */ |
| 21 | + |
| 22 | +#include <scsi/scsi.h> |
| 23 | +#include <scsi/fc/fc_els.h> |
| 24 | +#include <uapi/scsi/fc/fc_fs.h> |
| 25 | +#include <uapi/scsi/fc/fc_ns.h> |
| 26 | +#include <uapi/scsi/fc/fc_gs.h> |
| 27 | +#include <uapi/linux/if_ether.h> |
| 28 | +#include <scsi/fc/fc_ms.h> |
| 29 | +#include <linux/minmax.h> |
| 30 | +#include <linux/if_ether.h> |
| 31 | +#include <scsi/fc/fc_encaps.h> |
| 32 | +#include <scsi/fc/fc_fcoe.h> |
| 33 | + |
| 34 | +#define FDLS_MIN_FRAMES (32) |
| 35 | +#define FDLS_MIN_FRAME_ELEM (4) |
| 36 | +#define FNIC_FCP_SP_RD_XRDY_DIS 0x00000002 |
| 37 | +#define FNIC_FCP_SP_TARGET 0x00000010 |
| 38 | +#define FNIC_FCP_SP_INITIATOR 0x00000020 |
| 39 | +#define FNIC_FCP_SP_CONF_CMPL 0x00000080 |
| 40 | +#define FNIC_FCP_SP_RETRY 0x00000100 |
| 41 | + |
| 42 | +#define FNIC_FC_CONCUR_SEQS (0xFF) |
| 43 | +#define FNIC_FC_RO_INFO (0x1F) |
| 44 | + |
| 45 | +/* Little Endian */ |
| 46 | +#define FNIC_UNASSIGNED_OXID (0xffff) |
| 47 | +#define FNIC_UNASSIGNED_RXID (0xffff) |
| 48 | +#define FNIC_ELS_REQ_FCTL (0x000029) |
| 49 | +#define FNIC_ELS_REP_FCTL (0x000099) |
| 50 | + |
| 51 | +#define FNIC_FCP_RSP_FCTL (0x000099) |
| 52 | +#define FNIC_REQ_ABTS_FCTL (0x000009) |
| 53 | + |
| 54 | +#define FNIC_FC_PH_VER_HI (0x20) |
| 55 | +#define FNIC_FC_PH_VER_LO (0x20) |
| 56 | +#define FNIC_FC_PH_VER (0x2020) |
| 57 | +#define FNIC_FC_B2B_CREDIT (0x0A) |
| 58 | +#define FNIC_FC_B2B_RDF_SZ (0x0800) |
| 59 | + |
| 60 | +#define FNIC_LOGI_RDF_SIZE(_logi) ((_logi).fl_csp.sp_bb_data) |
| 61 | +#define FNIC_LOGI_R_A_TOV(_logi) ((_logi).fl_csp.sp_r_a_tov) |
| 62 | +#define FNIC_LOGI_E_D_TOV(_logi) ((_logi).fl_csp.sp_e_d_tov) |
| 63 | +#define FNIC_LOGI_FEATURES(_logi) (be16_to_cpu((_logi).fl_csp.sp_features)) |
| 64 | +#define FNIC_LOGI_PORT_NAME(_logi) ((_logi).fl_wwpn) |
| 65 | +#define FNIC_LOGI_NODE_NAME(_logi) ((_logi).fl_wwnn) |
| 66 | + |
| 67 | +#define FNIC_LOGI_SET_RDF_SIZE(_logi, _rdf_size) \ |
| 68 | + (FNIC_LOGI_RDF_SIZE(_logi) = cpu_to_be16(_rdf_size)) |
| 69 | +#define FNIC_LOGI_SET_E_D_TOV(_logi, _e_d_tov) \ |
| 70 | + (FNIC_LOGI_E_D_TOV(_logi) = cpu_to_be32(_e_d_tov)) |
| 71 | +#define FNIC_LOGI_SET_R_A_TOV(_logi, _r_a_tov) \ |
| 72 | + (FNIC_LOGI_R_A_TOV(_logi) = cpu_to_be32(_r_a_tov)) |
| 73 | + |
| 74 | +#define FNIC_STD_SET_S_ID(_fchdr, _sid) memcpy((_fchdr).fh_s_id, _sid, 3) |
| 75 | +#define FNIC_STD_SET_D_ID(_fchdr, _did) memcpy((_fchdr).fh_d_id, _did, 3) |
| 76 | +#define FNIC_STD_SET_OX_ID(_fchdr, _oxid) ((_fchdr).fh_ox_id = cpu_to_be16(_oxid)) |
| 77 | +#define FNIC_STD_SET_RX_ID(_fchdr, _rxid) ((_fchdr).fh_rx_id = cpu_to_be16(_rxid)) |
| 78 | + |
| 79 | +#define FNIC_STD_SET_R_CTL(_fchdr, _rctl) ((_fchdr).fh_r_ctl = _rctl) |
| 80 | +#define FNIC_STD_SET_TYPE(_fchdr, _type) ((_fchdr).fh_type = _type) |
| 81 | +#define FNIC_STD_SET_F_CTL(_fchdr, _fctl) \ |
| 82 | + put_unaligned_be24(_fctl, &((_fchdr).fh_f_ctl)) |
| 83 | + |
| 84 | +#define FNIC_STD_SET_NPORT_NAME(_ptr, _wwpn) put_unaligned_be64(_wwpn, _ptr) |
| 85 | +#define FNIC_STD_SET_NODE_NAME(_ptr, _wwnn) put_unaligned_be64(_wwnn, _ptr) |
| 86 | +#define FNIC_STD_SET_PORT_ID(__req, __portid) \ |
| 87 | + memcpy(__req.fr_fid.fp_fid, __portid, 3) |
| 88 | +#define FNIC_STD_SET_PORT_NAME(_req, _pName) \ |
| 89 | + (put_unaligned_be64(_pName, &_req.fr_wwn)) |
| 90 | + |
| 91 | +#define FNIC_STD_GET_OX_ID(_fchdr) (be16_to_cpu((_fchdr)->fh_ox_id)) |
| 92 | +#define FNIC_STD_GET_RX_ID(_fchdr) (be16_to_cpu((_fchdr)->fh_rx_id)) |
| 93 | +#define FNIC_STD_GET_S_ID(_fchdr) ((_fchdr)->fh_s_id) |
| 94 | +#define FNIC_STD_GET_D_ID(_fchdr) ((_fchdr)->fh_d_id) |
| 95 | +#define FNIC_STD_GET_TYPE(_fchdr) ((_fchdr)->fh_type) |
| 96 | +#define FNIC_STD_GET_F_CTL(_fchdr) ((_fchdr)->fh_f_ctl) |
| 97 | +#define FNIC_STD_GET_R_CTL(_fchdr) ((_fchdr)->fh_r_ctl) |
| 98 | + |
| 99 | +#define FNIC_STD_GET_FC_CT_CMD(__fcct_hdr) (be16_to_cpu(__fcct_hdr->ct_cmd)) |
| 100 | + |
| 101 | +#define FNIC_FCOE_MAX_FRAME_SZ (2048) |
| 102 | +#define FNIC_FCOE_MIN_FRAME_SZ (280) |
| 103 | +#define FNIC_FC_MAX_PAYLOAD_LEN (2048) |
| 104 | +#define FNIC_MIN_DATA_FIELD_SIZE (256) |
| 105 | + |
| 106 | +#define FNIC_FC_EDTOV_NSEC (0x400) |
| 107 | +#define FNIC_NSEC_TO_MSEC (0x1000000) |
| 108 | +#define FCP_PRLI_FUNC_TARGET (0x0010) |
| 109 | + |
| 110 | +#define FNIC_FC_R_CTL_SOLICITED_DATA (0x21) |
| 111 | +#define FNIC_FC_F_CTL_LAST_END_SEQ (0x98) |
| 112 | +#define FNIC_FC_F_CTL_LAST_END_SEQ_INT (0x99) |
| 113 | +#define FNIC_FC_F_CTL_FIRST_LAST_SEQINIT (0x29) |
| 114 | +#define FNIC_FC_R_CTL_FC4_SCTL (0x03) |
| 115 | +#define FNIC_FC_CS_CTL (0x00) |
| 116 | + |
| 117 | +#define FNIC_FC_FRAME_UNSOLICITED(_fchdr) \ |
| 118 | + (_fchdr->fh_r_ctl == FC_RCTL_ELS_REQ) |
| 119 | +#define FNIC_FC_FRAME_SOLICITED_DATA(_fchdr) \ |
| 120 | + (_fchdr->fh_r_ctl == FNIC_FC_R_CTL_SOLICITED_DATA) |
| 121 | +#define FNIC_FC_FRAME_SOLICITED_CTRL_REPLY(_fchdr) \ |
| 122 | + (_fchdr->fh_r_ctl == FC_RCTL_ELS_REP) |
| 123 | +#define FNIC_FC_FRAME_FCTL_LAST_END_SEQ(_fchdr) \ |
| 124 | + (_fchdr->fh_f_ctl[0] == FNIC_FC_F_CTL_LAST_END_SEQ) |
| 125 | +#define FNIC_FC_FRAME_FCTL_LAST_END_SEQ_INT(_fchdr) \ |
| 126 | + (_fchdr->fh_f_ctl[0] == FNIC_FC_F_CTL_LAST_END_SEQ_INT) |
| 127 | +#define FNIC_FC_FRAME_FCTL_FIRST_LAST_SEQINIT(_fchdr) \ |
| 128 | + (_fchdr->fh_f_ctl[0] == FNIC_FC_F_CTL_FIRST_LAST_SEQINIT) |
| 129 | +#define FNIC_FC_FRAME_FC4_SCTL(_fchdr) \ |
| 130 | + (_fchdr->fh_r_ctl == FNIC_FC_R_CTL_FC4_SCTL) |
| 131 | +#define FNIC_FC_FRAME_TYPE_BLS(_fchdr) (_fchdr->fh_type == FC_TYPE_BLS) |
| 132 | +#define FNIC_FC_FRAME_TYPE_ELS(_fchdr) (_fchdr->fh_type == FC_TYPE_ELS) |
| 133 | +#define FNIC_FC_FRAME_TYPE_FC_GS(_fchdr) (_fchdr->fh_type == FC_TYPE_CT) |
| 134 | +#define FNIC_FC_FRAME_CS_CTL(_fchdr) (_fchdr->fh_cs_ctl == FNIC_FC_CS_CTL) |
| 135 | + |
| 136 | +#define FNIC_FC_C3_RDF (0xfff) |
| 137 | +#define FNIC_FC_PLOGI_RSP_RDF(_plogi_rsp) \ |
| 138 | + (min(_plogi_rsp->u.csp_plogi.b2b_rdf_size, \ |
| 139 | + (_plogi_rsp->spc3[4] & FNIC_FC_C3_RDF))) |
| 140 | +#define FNIC_FC_PLOGI_RSP_CONCUR_SEQ(_plogi_rsp) \ |
| 141 | + (min((uint16_t) (be16_to_cpu(_plogi_rsp->els.fl_csp.sp_tot_seq)), \ |
| 142 | + (uint16_t) (be16_to_cpu(_plogi_rsp->els.fl_cssp[2].cp_con_seq) & 0xff))) |
| 143 | + |
| 144 | +/* FLOGI/PLOGI struct */ |
| 145 | +struct fc_std_flogi { |
| 146 | + struct fc_frame_header fchdr; |
| 147 | + struct fc_els_flogi els; |
| 148 | +} __packed; |
| 149 | + |
| 150 | +struct fc_std_els_acc_rsp { |
| 151 | + struct fc_frame_header fchdr; |
| 152 | + struct fc_els_ls_acc acc; |
| 153 | +} __packed; |
| 154 | + |
| 155 | +struct fc_std_els_rjt_rsp { |
| 156 | + struct fc_frame_header fchdr; |
| 157 | + struct fc_els_ls_rjt rej; |
| 158 | +} __packed; |
| 159 | + |
| 160 | +struct fc_std_els_adisc { |
| 161 | + struct fc_frame_header fchdr; |
| 162 | + struct fc_els_adisc els; |
| 163 | +} __packed; |
| 164 | + |
| 165 | +struct fc_std_rls_acc { |
| 166 | + struct fc_frame_header fchdr; |
| 167 | + struct fc_els_rls_resp els; |
| 168 | +} __packed; |
| 169 | + |
| 170 | +struct fc_std_abts_ba_acc { |
| 171 | + struct fc_frame_header fchdr; |
| 172 | + struct fc_ba_acc acc; |
| 173 | +} __packed; |
| 174 | + |
| 175 | +struct fc_std_abts_ba_rjt { |
| 176 | + struct fc_frame_header fchdr; |
| 177 | + struct fc_ba_rjt rjt; |
| 178 | +} __packed; |
| 179 | + |
| 180 | +struct fc_std_els_prli { |
| 181 | + struct fc_frame_header fchdr; |
| 182 | + struct fc_els_prli els_prli; |
| 183 | + struct fc_els_spp sp; |
| 184 | +} __packed; |
| 185 | + |
| 186 | +struct fc_std_rpn_id { |
| 187 | + struct fc_frame_header fchdr; |
| 188 | + struct fc_ct_hdr fc_std_ct_hdr; |
| 189 | + struct fc_ns_rn_id rpn_id; |
| 190 | +} __packed; |
| 191 | + |
| 192 | +struct fc_std_fdmi_rhba { |
| 193 | + struct fc_frame_header fchdr; |
| 194 | + struct fc_ct_hdr fc_std_ct_hdr; |
| 195 | + struct fc_fdmi_rhba rhba; |
| 196 | +} __packed; |
| 197 | + |
| 198 | +struct fc_std_fdmi_rpa { |
| 199 | + struct fc_frame_header fchdr; |
| 200 | + struct fc_ct_hdr fc_std_ct_hdr; |
| 201 | + struct fc_fdmi_rpa rpa; |
| 202 | +} __packed; |
| 203 | + |
| 204 | +struct fc_std_rft_id { |
| 205 | + struct fc_frame_header fchdr; |
| 206 | + struct fc_ct_hdr fc_std_ct_hdr; |
| 207 | + struct fc_ns_rft_id rft_id; |
| 208 | +} __packed; |
| 209 | + |
| 210 | +struct fc_std_rff_id { |
| 211 | + struct fc_frame_header fchdr; |
| 212 | + struct fc_ct_hdr fc_std_ct_hdr; |
| 213 | + struct fc_ns_rff_id rff_id; |
| 214 | +} __packed; |
| 215 | + |
| 216 | +struct fc_std_gpn_ft { |
| 217 | + struct fc_frame_header fchdr; |
| 218 | + struct fc_ct_hdr fc_std_ct_hdr; |
| 219 | + struct fc_ns_gid_ft gpn_ft; |
| 220 | +} __packed; |
| 221 | + |
| 222 | +/* Accept CT_IU for GPN_FT */ |
| 223 | +struct fc_gpn_ft_rsp_iu { |
| 224 | + uint8_t ctrl; |
| 225 | + uint8_t fcid[3]; |
| 226 | + uint32_t rsvd; |
| 227 | + __be64 wwpn; |
| 228 | +} __packed; |
| 229 | + |
| 230 | +struct fc_std_rls { |
| 231 | + struct fc_frame_header fchdr; |
| 232 | + struct fc_els_rls els; |
| 233 | +} __packed; |
| 234 | + |
| 235 | +struct fc_std_scr { |
| 236 | + struct fc_frame_header fchdr; |
| 237 | + struct fc_els_scr scr; |
| 238 | +} __packed; |
| 239 | + |
| 240 | +struct fc_std_rscn { |
| 241 | + struct fc_frame_header fchdr; |
| 242 | + struct fc_els_rscn els; |
| 243 | +} __packed; |
| 244 | + |
| 245 | +struct fc_std_logo { |
| 246 | + struct fc_frame_header fchdr; |
| 247 | + struct fc_els_logo els; |
| 248 | +} __packed; |
| 249 | + |
| 250 | +#define FNIC_ETH_FCOE_HDRS_OFFSET \ |
| 251 | + (sizeof(struct ethhdr) + sizeof(struct fcoe_hdr)) |
| 252 | + |
| 253 | +#endif /* _FDLS_FC_H */ |
0 commit comments