1 /* 2 * This file is part of the Chelsio FCoE driver for Linux. 3 * 4 * Copyright (c) 2009-2010 Chelsio Communications, Inc. All rights reserved. 5 * 6 * This software is available to you under a choice of one of two 7 * licenses. You may choose to be licensed under the terms of the GNU 8 * General Public License (GPL) Version 2, available from the file 9 * COPYING in the main directory of this source tree, or the 10 * OpenIB.org BSD license below: 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above 17 * copyright notice, this list of conditions and the following 18 * disclaimer. 19 * 20 * - Redistributions in binary form must reproduce the above 21 * copyright notice, this list of conditions and the following 22 * disclaimer in the documentation and/or other materials 23 * provided with the distribution. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 * SOFTWARE. 33 */ 34 35 #ifndef _T4FW_API_STOR_H_ 36 #define _T4FW_API_STOR_H_ 37 38 39 /****************************************************************************** 40 * R E T U R N V A L U E S 41 ********************************/ 42 43 enum fw_fcoe_link_sub_op { 44 FCOE_LINK_DOWN = 0x0, 45 FCOE_LINK_UP = 0x1, 46 FCOE_LINK_COND = 0x2, 47 }; 48 49 enum fw_fcoe_link_status { 50 FCOE_LINKDOWN = 0x0, 51 FCOE_LINKUP = 0x1, 52 }; 53 54 enum fw_ofld_prot { 55 PROT_FCOE = 0x1, 56 PROT_ISCSI = 0x2, 57 }; 58 59 enum rport_type_fcoe { 60 FLOGI_VFPORT = 0x1, /* 0xfffffe */ 61 FDISC_VFPORT = 0x2, /* 0xfffffe */ 62 NS_VNPORT = 0x3, /* 0xfffffc */ 63 REG_FC4_VNPORT = 0x4, /* any FC4 type VN_PORT */ 64 REG_VNPORT = 0x5, /* 0xfffxxx - non FC4 port in switch */ 65 FDMI_VNPORT = 0x6, /* 0xfffffa */ 66 FAB_CTLR_VNPORT = 0x7, /* 0xfffffd */ 67 }; 68 69 enum event_cause_fcoe { 70 PLOGI_ACC_RCVD = 0x01, 71 PLOGI_RJT_RCVD = 0x02, 72 PLOGI_RCVD = 0x03, 73 PLOGO_RCVD = 0x04, 74 PRLI_ACC_RCVD = 0x05, 75 PRLI_RJT_RCVD = 0x06, 76 PRLI_RCVD = 0x07, 77 PRLO_RCVD = 0x08, 78 NPORT_ID_CHGD = 0x09, 79 FLOGO_RCVD = 0x0a, 80 CLR_VIRT_LNK_RCVD = 0x0b, 81 FLOGI_ACC_RCVD = 0x0c, 82 FLOGI_RJT_RCVD = 0x0d, 83 FDISC_ACC_RCVD = 0x0e, 84 FDISC_RJT_RCVD = 0x0f, 85 FLOGI_TMO_MAX_RETRY = 0x10, 86 IMPL_LOGO_ADISC_ACC = 0x11, 87 IMPL_LOGO_ADISC_RJT = 0x12, 88 IMPL_LOGO_ADISC_CNFLT = 0x13, 89 PRLI_TMO = 0x14, 90 ADISC_TMO = 0x15, 91 RSCN_DEV_LOST = 0x16, 92 SCR_ACC_RCVD = 0x17, 93 ADISC_RJT_RCVD = 0x18, 94 LOGO_SNT = 0x19, 95 PROTO_ERR_IMPL_LOGO = 0x1a, 96 }; 97 98 enum fcoe_cmn_type { 99 FCOE_ELS, 100 FCOE_CT, 101 FCOE_SCSI_CMD, 102 FCOE_UNSOL_ELS, 103 }; 104 105 enum fw_wr_stor_opcodes { 106 FW_RDEV_WR = 0x38, 107 FW_FCOE_ELS_CT_WR = 0x30, 108 FW_SCSI_WRITE_WR = 0x31, 109 FW_SCSI_READ_WR = 0x32, 110 FW_SCSI_CMD_WR = 0x33, 111 FW_SCSI_ABRT_CLS_WR = 0x34, 112 }; 113 114 struct fw_rdev_wr { 115 __be32 op_to_immdlen; 116 __be32 alloc_to_len16; 117 __be64 cookie; 118 u8 protocol; 119 u8 event_cause; 120 u8 cur_state; 121 u8 prev_state; 122 __be32 flags_to_assoc_flowid; 123 union rdev_entry { 124 struct fcoe_rdev_entry { 125 __be32 flowid; 126 u8 protocol; 127 u8 event_cause; 128 u8 flags; 129 u8 rjt_reason; 130 u8 cur_login_st; 131 u8 prev_login_st; 132 __be16 rcv_fr_sz; 133 u8 rd_xfer_rdy_to_rport_type; 134 u8 vft_to_qos; 135 u8 org_proc_assoc_to_acc_rsp_code; 136 u8 enh_disc_to_tgt; 137 u8 wwnn[8]; 138 u8 wwpn[8]; 139 __be16 iqid; 140 u8 fc_oui[3]; 141 u8 r_id[3]; 142 } fcoe_rdev; 143 struct iscsi_rdev_entry { 144 __be32 flowid; 145 u8 protocol; 146 u8 event_cause; 147 u8 flags; 148 u8 r3; 149 __be16 iscsi_opts; 150 __be16 tcp_opts; 151 __be16 ip_opts; 152 __be16 max_rcv_len; 153 __be16 max_snd_len; 154 __be16 first_brst_len; 155 __be16 max_brst_len; 156 __be16 r4; 157 __be16 def_time2wait; 158 __be16 def_time2ret; 159 __be16 nop_out_intrvl; 160 __be16 non_scsi_to; 161 __be16 isid; 162 __be16 tsid; 163 __be16 port; 164 __be16 tpgt; 165 u8 r5[6]; 166 __be16 iqid; 167 } iscsi_rdev; 168 } u; 169 }; 170 171 #define FW_RDEV_WR_FLOWID_GET(x) (((x) >> 8) & 0xfffff) 172 #define FW_RDEV_WR_ASSOC_FLOWID_GET(x) (((x) >> 0) & 0xfffff) 173 #define FW_RDEV_WR_RPORT_TYPE_GET(x) (((x) >> 0) & 0x1f) 174 #define FW_RDEV_WR_NPIV_GET(x) (((x) >> 6) & 0x1) 175 #define FW_RDEV_WR_CLASS_GET(x) (((x) >> 4) & 0x3) 176 #define FW_RDEV_WR_TASK_RETRY_ID_GET(x) (((x) >> 5) & 0x1) 177 #define FW_RDEV_WR_RETRY_GET(x) (((x) >> 4) & 0x1) 178 #define FW_RDEV_WR_CONF_CMPL_GET(x) (((x) >> 3) & 0x1) 179 #define FW_RDEV_WR_INI_GET(x) (((x) >> 1) & 0x1) 180 #define FW_RDEV_WR_TGT_GET(x) (((x) >> 0) & 0x1) 181 182 struct fw_fcoe_els_ct_wr { 183 __be32 op_immdlen; 184 __be32 flowid_len16; 185 u64 cookie; 186 __be16 iqid; 187 u8 tmo_val; 188 u8 els_ct_type; 189 u8 ctl_pri; 190 u8 cp_en_class; 191 __be16 xfer_cnt; 192 u8 fl_to_sp; 193 u8 l_id[3]; 194 u8 r5; 195 u8 r_id[3]; 196 __be64 rsp_dmaaddr; 197 __be32 rsp_dmalen; 198 __be32 r6; 199 }; 200 201 #define FW_FCOE_ELS_CT_WR_OPCODE(x) ((x) << 24) 202 #define FW_FCOE_ELS_CT_WR_OPCODE_GET(x) (((x) >> 24) & 0xff) 203 #define FW_FCOE_ELS_CT_WR_IMMDLEN(x) ((x) << 0) 204 #define FW_FCOE_ELS_CT_WR_IMMDLEN_GET(x) (((x) >> 0) & 0xff) 205 #define FW_FCOE_ELS_CT_WR_SP(x) ((x) << 0) 206 207 struct fw_scsi_write_wr { 208 __be32 op_immdlen; 209 __be32 flowid_len16; 210 u64 cookie; 211 __be16 iqid; 212 u8 tmo_val; 213 u8 use_xfer_cnt; 214 union fw_scsi_write_priv { 215 struct fcoe_write_priv { 216 u8 ctl_pri; 217 u8 cp_en_class; 218 u8 r3_lo[2]; 219 } fcoe; 220 struct iscsi_write_priv { 221 u8 r3[4]; 222 } iscsi; 223 } u; 224 __be32 xfer_cnt; 225 __be32 ini_xfer_cnt; 226 __be64 rsp_dmaaddr; 227 __be32 rsp_dmalen; 228 __be32 r4; 229 }; 230 231 #define FW_SCSI_WRITE_WR_IMMDLEN(x) ((x) << 0) 232 233 struct fw_scsi_read_wr { 234 __be32 op_immdlen; 235 __be32 flowid_len16; 236 u64 cookie; 237 __be16 iqid; 238 u8 tmo_val; 239 u8 use_xfer_cnt; 240 union fw_scsi_read_priv { 241 struct fcoe_read_priv { 242 u8 ctl_pri; 243 u8 cp_en_class; 244 u8 r3_lo[2]; 245 } fcoe; 246 struct iscsi_read_priv { 247 u8 r3[4]; 248 } iscsi; 249 } u; 250 __be32 xfer_cnt; 251 __be32 ini_xfer_cnt; 252 __be64 rsp_dmaaddr; 253 __be32 rsp_dmalen; 254 __be32 r4; 255 }; 256 257 #define FW_SCSI_READ_WR_IMMDLEN(x) ((x) << 0) 258 259 struct fw_scsi_cmd_wr { 260 __be32 op_immdlen; 261 __be32 flowid_len16; 262 u64 cookie; 263 __be16 iqid; 264 u8 tmo_val; 265 u8 r3; 266 union fw_scsi_cmd_priv { 267 struct fcoe_cmd_priv { 268 u8 ctl_pri; 269 u8 cp_en_class; 270 u8 r4_lo[2]; 271 } fcoe; 272 struct iscsi_cmd_priv { 273 u8 r4[4]; 274 } iscsi; 275 } u; 276 u8 r5[8]; 277 __be64 rsp_dmaaddr; 278 __be32 rsp_dmalen; 279 __be32 r6; 280 }; 281 282 #define FW_SCSI_CMD_WR_IMMDLEN(x) ((x) << 0) 283 284 #define SCSI_ABORT 0 285 #define SCSI_CLOSE 1 286 287 struct fw_scsi_abrt_cls_wr { 288 __be32 op_immdlen; 289 __be32 flowid_len16; 290 u64 cookie; 291 __be16 iqid; 292 u8 tmo_val; 293 u8 sub_opcode_to_chk_all_io; 294 u8 r3[4]; 295 u64 t_cookie; 296 }; 297 298 #define FW_SCSI_ABRT_CLS_WR_SUB_OPCODE(x) ((x) << 2) 299 #define FW_SCSI_ABRT_CLS_WR_SUB_OPCODE_GET(x) (((x) >> 2) & 0x3f) 300 #define FW_SCSI_ABRT_CLS_WR_CHK_ALL_IO(x) ((x) << 0) 301 302 enum fw_cmd_stor_opcodes { 303 FW_FCOE_RES_INFO_CMD = 0x31, 304 FW_FCOE_LINK_CMD = 0x32, 305 FW_FCOE_VNP_CMD = 0x33, 306 FW_FCOE_SPARAMS_CMD = 0x35, 307 FW_FCOE_STATS_CMD = 0x37, 308 FW_FCOE_FCF_CMD = 0x38, 309 }; 310 311 struct fw_fcoe_res_info_cmd { 312 __be32 op_to_read; 313 __be32 retval_len16; 314 __be16 e_d_tov; 315 __be16 r_a_tov_seq; 316 __be16 r_a_tov_els; 317 __be16 r_r_tov; 318 __be32 max_xchgs; 319 __be32 max_ssns; 320 __be32 used_xchgs; 321 __be32 used_ssns; 322 __be32 max_fcfs; 323 __be32 max_vnps; 324 __be32 used_fcfs; 325 __be32 used_vnps; 326 }; 327 328 struct fw_fcoe_link_cmd { 329 __be32 op_to_portid; 330 __be32 retval_len16; 331 __be32 sub_opcode_fcfi; 332 u8 r3; 333 u8 lstatus; 334 __be16 flags; 335 u8 r4; 336 u8 set_vlan; 337 __be16 vlan_id; 338 __be32 vnpi_pkd; 339 __be16 r6; 340 u8 phy_mac[6]; 341 u8 vnport_wwnn[8]; 342 u8 vnport_wwpn[8]; 343 }; 344 345 #define FW_FCOE_LINK_CMD_PORTID(x) ((x) << 0) 346 #define FW_FCOE_LINK_CMD_PORTID_GET(x) (((x) >> 0) & 0xf) 347 #define FW_FCOE_LINK_CMD_SUB_OPCODE(x) ((x) << 24U) 348 #define FW_FCOE_LINK_CMD_FCFI(x) ((x) << 0) 349 #define FW_FCOE_LINK_CMD_FCFI_GET(x) (((x) >> 0) & 0xffffff) 350 #define FW_FCOE_LINK_CMD_VNPI_GET(x) (((x) >> 0) & 0xfffff) 351 352 struct fw_fcoe_vnp_cmd { 353 __be32 op_to_fcfi; 354 __be32 alloc_to_len16; 355 __be32 gen_wwn_to_vnpi; 356 __be32 vf_id; 357 __be16 iqid; 358 u8 vnport_mac[6]; 359 u8 vnport_wwnn[8]; 360 u8 vnport_wwpn[8]; 361 u8 cmn_srv_parms[16]; 362 u8 clsp_word_0_1[8]; 363 }; 364 365 #define FW_FCOE_VNP_CMD_FCFI(x) ((x) << 0) 366 #define FW_FCOE_VNP_CMD_ALLOC (1U << 31) 367 #define FW_FCOE_VNP_CMD_FREE (1U << 30) 368 #define FW_FCOE_VNP_CMD_MODIFY (1U << 29) 369 #define FW_FCOE_VNP_CMD_GEN_WWN (1U << 22) 370 #define FW_FCOE_VNP_CMD_VFID_EN (1U << 20) 371 #define FW_FCOE_VNP_CMD_VNPI(x) ((x) << 0) 372 #define FW_FCOE_VNP_CMD_VNPI_GET(x) (((x) >> 0) & 0xfffff) 373 374 struct fw_fcoe_sparams_cmd { 375 __be32 op_to_portid; 376 __be32 retval_len16; 377 u8 r3[7]; 378 u8 cos; 379 u8 lport_wwnn[8]; 380 u8 lport_wwpn[8]; 381 u8 cmn_srv_parms[16]; 382 u8 cls_srv_parms[16]; 383 }; 384 385 #define FW_FCOE_SPARAMS_CMD_PORTID(x) ((x) << 0) 386 387 struct fw_fcoe_stats_cmd { 388 __be32 op_to_flowid; 389 __be32 free_to_len16; 390 union fw_fcoe_stats { 391 struct fw_fcoe_stats_ctl { 392 u8 nstats_port; 393 u8 port_valid_ix; 394 __be16 r6; 395 __be32 r7; 396 __be64 stat0; 397 __be64 stat1; 398 __be64 stat2; 399 __be64 stat3; 400 __be64 stat4; 401 __be64 stat5; 402 } ctl; 403 struct fw_fcoe_port_stats { 404 __be64 tx_bcast_bytes; 405 __be64 tx_bcast_frames; 406 __be64 tx_mcast_bytes; 407 __be64 tx_mcast_frames; 408 __be64 tx_ucast_bytes; 409 __be64 tx_ucast_frames; 410 __be64 tx_drop_frames; 411 __be64 tx_offload_bytes; 412 __be64 tx_offload_frames; 413 __be64 rx_bcast_bytes; 414 __be64 rx_bcast_frames; 415 __be64 rx_mcast_bytes; 416 __be64 rx_mcast_frames; 417 __be64 rx_ucast_bytes; 418 __be64 rx_ucast_frames; 419 __be64 rx_err_frames; 420 } port_stats; 421 struct fw_fcoe_fcf_stats { 422 __be32 fip_tx_bytes; 423 __be32 fip_tx_fr; 424 __be64 fcf_ka; 425 __be64 mcast_adv_rcvd; 426 __be16 ucast_adv_rcvd; 427 __be16 sol_sent; 428 __be16 vlan_req; 429 __be16 vlan_rpl; 430 __be16 clr_vlink; 431 __be16 link_down; 432 __be16 link_up; 433 __be16 logo; 434 __be16 flogi_req; 435 __be16 flogi_rpl; 436 __be16 fdisc_req; 437 __be16 fdisc_rpl; 438 __be16 fka_prd_chg; 439 __be16 fc_map_chg; 440 __be16 vfid_chg; 441 u8 no_fka_req; 442 u8 no_vnp; 443 } fcf_stats; 444 struct fw_fcoe_pcb_stats { 445 __be64 tx_bytes; 446 __be64 tx_frames; 447 __be64 rx_bytes; 448 __be64 rx_frames; 449 __be32 vnp_ka; 450 __be32 unsol_els_rcvd; 451 __be64 unsol_cmd_rcvd; 452 __be16 implicit_logo; 453 __be16 flogi_inv_sparm; 454 __be16 fdisc_inv_sparm; 455 __be16 flogi_rjt; 456 __be16 fdisc_rjt; 457 __be16 no_ssn; 458 __be16 mac_flt_fail; 459 __be16 inv_fr_rcvd; 460 } pcb_stats; 461 struct fw_fcoe_scb_stats { 462 __be64 tx_bytes; 463 __be64 tx_frames; 464 __be64 rx_bytes; 465 __be64 rx_frames; 466 __be32 host_abrt_req; 467 __be32 adap_auto_abrt; 468 __be32 adap_abrt_rsp; 469 __be32 host_ios_req; 470 __be16 ssn_offl_ios; 471 __be16 ssn_not_rdy_ios; 472 u8 rx_data_ddp_err; 473 u8 ddp_flt_set_err; 474 __be16 rx_data_fr_err; 475 u8 bad_st_abrt_req; 476 u8 no_io_abrt_req; 477 u8 abort_tmo; 478 u8 abort_tmo_2; 479 __be32 abort_req; 480 u8 no_ppod_res_tmo; 481 u8 bp_tmo; 482 u8 adap_auto_cls; 483 u8 no_io_cls_req; 484 __be32 host_cls_req; 485 __be64 unsol_cmd_rcvd; 486 __be32 plogi_req_rcvd; 487 __be32 prli_req_rcvd; 488 __be16 logo_req_rcvd; 489 __be16 prlo_req_rcvd; 490 __be16 plogi_rjt_rcvd; 491 __be16 prli_rjt_rcvd; 492 __be32 adisc_req_rcvd; 493 __be32 rscn_rcvd; 494 __be32 rrq_req_rcvd; 495 __be32 unsol_els_rcvd; 496 u8 adisc_rjt_rcvd; 497 u8 scr_rjt; 498 u8 ct_rjt; 499 u8 inval_bls_rcvd; 500 __be32 ba_rjt_rcvd; 501 } scb_stats; 502 } u; 503 }; 504 505 #define FW_FCOE_STATS_CMD_FLOWID(x) ((x) << 0) 506 #define FW_FCOE_STATS_CMD_FREE (1U << 30) 507 #define FW_FCOE_STATS_CMD_NSTATS(x) ((x) << 4) 508 #define FW_FCOE_STATS_CMD_PORT(x) ((x) << 0) 509 #define FW_FCOE_STATS_CMD_PORT_VALID (1U << 7) 510 #define FW_FCOE_STATS_CMD_IX(x) ((x) << 0) 511 512 struct fw_fcoe_fcf_cmd { 513 __be32 op_to_fcfi; 514 __be32 retval_len16; 515 __be16 priority_pkd; 516 u8 mac[6]; 517 u8 name_id[8]; 518 u8 fabric[8]; 519 __be16 vf_id; 520 __be16 max_fcoe_size; 521 u8 vlan_id; 522 u8 fc_map[3]; 523 __be32 fka_adv; 524 __be32 r6; 525 u8 r7_hi; 526 u8 fpma_to_portid; 527 u8 spma_mac[6]; 528 __be64 r8; 529 }; 530 531 #define FW_FCOE_FCF_CMD_FCFI(x) ((x) << 0) 532 #define FW_FCOE_FCF_CMD_FCFI_GET(x) (((x) >> 0) & 0xfffff) 533 #define FW_FCOE_FCF_CMD_PRIORITY_GET(x) (((x) >> 0) & 0xff) 534 #define FW_FCOE_FCF_CMD_FPMA_GET(x) (((x) >> 6) & 0x1) 535 #define FW_FCOE_FCF_CMD_SPMA_GET(x) (((x) >> 5) & 0x1) 536 #define FW_FCOE_FCF_CMD_LOGIN_GET(x) (((x) >> 4) & 0x1) 537 #define FW_FCOE_FCF_CMD_PORTID_GET(x) (((x) >> 0) & 0xf) 538 539 #endif /* _T4FW_API_STOR_H_ */ 540