1 /* 2 * Copyright 2017 Broadcom. All Rights Reserved. 3 * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License version 2 7 * as published by the Free Software Foundation. The full GNU General 8 * Public License is included in this distribution in the file called COPYING. 9 * 10 * Contact Information: 11 * linux-drivers@broadcom.com 12 * 13 */ 14 15 #ifndef BEISCSI_CMDS_H 16 #define BEISCSI_CMDS_H 17 18 /** 19 * The driver sends configuration and managements command requests to the 20 * firmware in the BE. These requests are communicated to the processor 21 * using Work Request Blocks (WRBs) submitted to the MCC-WRB ring or via one 22 * WRB inside a MAILBOX. 23 * The commands are serviced by the ARM processor in the OneConnect's MPU. 24 */ 25 struct be_sge { 26 __le32 pa_lo; 27 __le32 pa_hi; 28 __le32 len; 29 }; 30 31 struct be_mcc_wrb { 32 u32 emb_sgecnt_special; /* dword 0 */ 33 /* bits 0 - embedded */ 34 /* bits 1 - 2 reserved */ 35 /* bits 3 - 7 sge count */ 36 /* bits 8 - 23 reserved */ 37 /* bits 24 - 31 special */ 38 #define MCC_WRB_EMBEDDED_MASK 1 39 #define MCC_WRB_SGE_CNT_SHIFT 3 40 #define MCC_WRB_SGE_CNT_MASK 0x1F 41 u32 payload_length; /* dword 1 */ 42 u32 tag0; /* dword 2 */ 43 u32 tag1; /* dword 3 */ 44 u32 rsvd; /* dword 4 */ 45 union { 46 #define EMBED_MBX_MAX_PAYLOAD_SIZE 220 47 u8 embedded_payload[236]; /* used by embedded cmds */ 48 struct be_sge sgl[19]; /* used by non-embedded cmds */ 49 } payload; 50 }; 51 52 #define CQE_FLAGS_VALID_MASK (1 << 31) 53 #define CQE_FLAGS_ASYNC_MASK (1 << 30) 54 #define CQE_FLAGS_COMPLETED_MASK (1 << 28) 55 #define CQE_FLAGS_CONSUMED_MASK (1 << 27) 56 57 /* Completion Status */ 58 #define MCC_STATUS_SUCCESS 0x0 59 #define MCC_STATUS_FAILED 0x1 60 #define MCC_STATUS_ILLEGAL_REQUEST 0x2 61 #define MCC_STATUS_ILLEGAL_FIELD 0x3 62 #define MCC_STATUS_INSUFFICIENT_BUFFER 0x4 63 #define MCC_STATUS_INVALID_LENGTH 0x74 64 65 #define CQE_STATUS_COMPL_MASK 0xFFFF 66 #define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */ 67 #define CQE_STATUS_EXTD_MASK 0xFFFF 68 #define CQE_STATUS_EXTD_SHIFT 16 /* bits 31 - 16 */ 69 #define CQE_STATUS_ADDL_MASK 0xFF00 70 #define CQE_STATUS_ADDL_SHIFT 8 71 #define CQE_STATUS_MASK 0xFF 72 #define CQE_STATUS_WRB_MASK 0xFF0000 73 #define CQE_STATUS_WRB_SHIFT 16 74 75 #define BEISCSI_HOST_MBX_TIMEOUT (110 * 1000) 76 #define BEISCSI_FW_MBX_TIMEOUT 100 77 78 /* MBOX Command VER */ 79 #define MBX_CMD_VER1 0x01 80 #define MBX_CMD_VER2 0x02 81 82 struct be_mcc_compl { 83 u32 status; /* dword 0 */ 84 u32 tag0; /* dword 1 */ 85 u32 tag1; /* dword 2 */ 86 u32 flags; /* dword 3 */ 87 }; 88 89 /********* Mailbox door bell *************/ 90 /** 91 * Used for driver communication with the FW. 92 * The software must write this register twice to post any command. First, 93 * it writes the register with hi=1 and the upper bits of the physical address 94 * for the MAILBOX structure. Software must poll the ready bit until this 95 * is acknowledged. Then, sotware writes the register with hi=0 with the lower 96 * bits in the address. It must poll the ready bit until the command is 97 * complete. Upon completion, the MAILBOX will contain a valid completion 98 * queue entry. 99 */ 100 #define MPU_MAILBOX_DB_OFFSET 0x160 101 #define MPU_MAILBOX_DB_RDY_MASK 0x1 /* bit 0 */ 102 #define MPU_MAILBOX_DB_HI_MASK 0x2 /* bit 1 */ 103 104 /********** MPU semphore: used for SH & BE ******************/ 105 #define SLIPORT_SOFTRESET_OFFSET 0x5c /* CSR BAR offset */ 106 #define SLIPORT_SEMAPHORE_OFFSET_BEx 0xac /* CSR BAR offset */ 107 #define SLIPORT_SEMAPHORE_OFFSET_SH 0x94 /* PCI-CFG offset */ 108 #define POST_STAGE_MASK 0x0000FFFF 109 #define POST_ERROR_BIT 0x80000000 110 #define POST_ERR_RECOVERY_CODE_MASK 0xF000 111 112 /* Soft Reset register masks */ 113 #define SLIPORT_SOFTRESET_SR_MASK 0x00000080 /* SR bit */ 114 115 /* MPU semphore POST stage values */ 116 #define POST_STAGE_AWAITING_HOST_RDY 0x1 /* FW awaiting goahead from host */ 117 #define POST_STAGE_HOST_RDY 0x2 /* Host has given go-ahed to FW */ 118 #define POST_STAGE_BE_RESET 0x3 /* Host wants to reset chip */ 119 #define POST_STAGE_ARMFW_RDY 0xC000 /* FW is done with POST */ 120 #define POST_STAGE_RECOVERABLE_ERR 0xE000 /* Recoverable err detected */ 121 122 /********** MCC door bell ************/ 123 #define DB_MCCQ_OFFSET 0x140 124 #define DB_MCCQ_RING_ID_MASK 0xFFFF /* bits 0 - 15 */ 125 /* Number of entries posted */ 126 #define DB_MCCQ_NUM_POSTED_SHIFT 16 /* bits 16 - 29 */ 127 128 /** 129 * When the async bit of mcc_compl is set, the last 4 bytes of 130 * mcc_compl is interpreted as follows: 131 */ 132 #define ASYNC_TRAILER_EVENT_CODE_SHIFT 8 /* bits 8 - 15 */ 133 #define ASYNC_TRAILER_EVENT_CODE_MASK 0xFF 134 #define ASYNC_EVENT_CODE_LINK_STATE 0x1 135 #define ASYNC_EVENT_CODE_ISCSI 0x4 136 #define ASYNC_EVENT_CODE_SLI 0x11 137 138 #define ASYNC_TRAILER_EVENT_TYPE_SHIFT 16 /* bits 16 - 23 */ 139 #define ASYNC_TRAILER_EVENT_TYPE_MASK 0xFF 140 141 /* iSCSI events */ 142 #define ASYNC_EVENT_NEW_ISCSI_TGT_DISC 0x4 143 #define ASYNC_EVENT_NEW_ISCSI_CONN 0x5 144 #define ASYNC_EVENT_NEW_TCP_CONN 0x7 145 146 /* SLI events */ 147 #define ASYNC_SLI_EVENT_TYPE_MISCONFIGURED 0x9 148 #define ASYNC_SLI_LINK_EFFECT_VALID(le) (le & 0x80) 149 #define ASYNC_SLI_LINK_EFFECT_SEV(le) ((le >> 1) & 0x03) 150 #define ASYNC_SLI_LINK_EFFECT_STATE(le) (le & 0x01) 151 152 struct be_async_event_trailer { 153 u32 code; 154 }; 155 156 enum { 157 ASYNC_EVENT_LINK_DOWN = 0x0, 158 ASYNC_EVENT_LINK_UP = 0x1, 159 }; 160 161 /** 162 * When the event code of an async trailer is link-state, the mcc_compl 163 * must be interpreted as follows 164 */ 165 struct be_async_event_link_state { 166 u8 physical_port; 167 u8 port_link_status; 168 /** 169 * ASYNC_EVENT_LINK_DOWN 0x0 170 * ASYNC_EVENT_LINK_UP 0x1 171 * ASYNC_EVENT_LINK_LOGICAL_DOWN 0x2 172 * ASYNC_EVENT_LINK_LOGICAL_UP 0x3 173 */ 174 #define BE_ASYNC_LINK_UP_MASK 0x01 175 u8 port_duplex; 176 u8 port_speed; 177 /* BE2ISCSI_LINK_SPEED_ZERO 0x00 - no link */ 178 #define BE2ISCSI_LINK_SPEED_10MBPS 0x01 179 #define BE2ISCSI_LINK_SPEED_100MBPS 0x02 180 #define BE2ISCSI_LINK_SPEED_1GBPS 0x03 181 #define BE2ISCSI_LINK_SPEED_10GBPS 0x04 182 #define BE2ISCSI_LINK_SPEED_25GBPS 0x06 183 #define BE2ISCSI_LINK_SPEED_40GBPS 0x07 184 u8 port_fault; 185 u8 event_reason; 186 u16 qos_link_speed; 187 u32 event_tag; 188 struct be_async_event_trailer trailer; 189 } __packed; 190 191 /** 192 * When async-trailer is SLI event, mcc_compl is interpreted as 193 */ 194 struct be_async_event_sli { 195 u32 event_data1; 196 u32 event_data2; 197 u32 reserved; 198 u32 trailer; 199 } __packed; 200 201 struct be_mcc_mailbox { 202 struct be_mcc_wrb wrb; 203 struct be_mcc_compl compl; 204 }; 205 206 /* Type of subsystems supported by FW */ 207 #define CMD_SUBSYSTEM_COMMON 0x1 208 #define CMD_SUBSYSTEM_ISCSI 0x2 209 #define CMD_SUBSYSTEM_ETH 0x3 210 #define CMD_SUBSYSTEM_ISCSI_INI 0x6 211 #define CMD_COMMON_TCP_UPLOAD 0x1 212 213 /** 214 * List of common opcodes subsystem CMD_SUBSYSTEM_COMMON 215 * These opcodes are unique for each subsystem defined above 216 */ 217 #define OPCODE_COMMON_CQ_CREATE 12 218 #define OPCODE_COMMON_EQ_CREATE 13 219 #define OPCODE_COMMON_MCC_CREATE 21 220 #define OPCODE_COMMON_MCC_CREATE_EXT 90 221 #define OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS 24 222 #define OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS 25 223 #define OPCODE_COMMON_GET_CNTL_ATTRIBUTES 32 224 #define OPCODE_COMMON_GET_FW_VERSION 35 225 #define OPCODE_COMMON_MODIFY_EQ_DELAY 41 226 #define OPCODE_COMMON_FIRMWARE_CONFIG 42 227 #define OPCODE_COMMON_MCC_DESTROY 53 228 #define OPCODE_COMMON_CQ_DESTROY 54 229 #define OPCODE_COMMON_EQ_DESTROY 55 230 #define OPCODE_COMMON_QUERY_FIRMWARE_CONFIG 58 231 #define OPCODE_COMMON_FUNCTION_RESET 61 232 #define OPCODE_COMMON_GET_PORT_NAME 77 233 #define OPCODE_COMMON_SET_HOST_DATA 93 234 #define OPCODE_COMMON_SET_FEATURES 191 235 236 /** 237 * LIST of opcodes that are common between Initiator and Target 238 * used by CMD_SUBSYSTEM_ISCSI 239 * These opcodes are unique for each subsystem defined above 240 */ 241 #define OPCODE_COMMON_ISCSI_CFG_POST_SGL_PAGES 2 242 #define OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES 3 243 #define OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG 7 244 #define OPCODE_COMMON_ISCSI_NTWK_SET_VLAN 14 245 #define OPCODE_COMMON_ISCSI_NTWK_CONFIG_STATELESS_IP_ADDR 17 246 #define OPCODE_COMMON_ISCSI_NTWK_REL_STATELESS_IP_ADDR 18 247 #define OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR 21 248 #define OPCODE_COMMON_ISCSI_NTWK_GET_DEFAULT_GATEWAY 22 249 #define OPCODE_COMMON_ISCSI_NTWK_MODIFY_DEFAULT_GATEWAY 23 250 #define OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID 24 251 #define OPCODE_COMMON_ISCSI_NTWK_GET_IF_INFO 25 252 #define OPCODE_COMMON_ISCSI_SET_FRAGNUM_BITS_FOR_SGL_CRA 61 253 #define OPCODE_COMMON_ISCSI_DEFQ_CREATE 64 254 #define OPCODE_COMMON_ISCSI_DEFQ_DESTROY 65 255 #define OPCODE_COMMON_ISCSI_WRBQ_CREATE 66 256 #define OPCODE_COMMON_ISCSI_WRBQ_DESTROY 67 257 258 struct be_cmd_req_hdr { 259 u8 opcode; /* dword 0 */ 260 u8 subsystem; /* dword 0 */ 261 u8 port_number; /* dword 0 */ 262 u8 domain; /* dword 0 */ 263 u32 timeout; /* dword 1 */ 264 u32 request_length; /* dword 2 */ 265 u8 version; /* dword 3 */ 266 u8 rsvd0[3]; /* dword 3 */ 267 }; 268 269 struct be_cmd_resp_hdr { 270 u32 info; /* dword 0 */ 271 u32 status; /* dword 1 */ 272 u32 response_length; /* dword 2 */ 273 u32 actual_resp_len; /* dword 3 */ 274 }; 275 276 struct phys_addr { 277 u32 lo; 278 u32 hi; 279 }; 280 281 struct virt_addr { 282 u32 lo; 283 u32 hi; 284 }; 285 /************************** 286 * BE Command definitions * 287 **************************/ 288 289 /** 290 * Pseudo amap definition in which each bit of the actual structure is defined 291 * as a byte - used to calculate offset/shift/mask of each field 292 */ 293 struct amap_eq_context { 294 u8 cidx[13]; /* dword 0 */ 295 u8 rsvd0[3]; /* dword 0 */ 296 u8 epidx[13]; /* dword 0 */ 297 u8 valid; /* dword 0 */ 298 u8 rsvd1; /* dword 0 */ 299 u8 size; /* dword 0 */ 300 u8 pidx[13]; /* dword 1 */ 301 u8 rsvd2[3]; /* dword 1 */ 302 u8 pd[10]; /* dword 1 */ 303 u8 count[3]; /* dword 1 */ 304 u8 solevent; /* dword 1 */ 305 u8 stalled; /* dword 1 */ 306 u8 armed; /* dword 1 */ 307 u8 rsvd3[4]; /* dword 2 */ 308 u8 func[8]; /* dword 2 */ 309 u8 rsvd4; /* dword 2 */ 310 u8 delaymult[10]; /* dword 2 */ 311 u8 rsvd5[2]; /* dword 2 */ 312 u8 phase[2]; /* dword 2 */ 313 u8 nodelay; /* dword 2 */ 314 u8 rsvd6[4]; /* dword 2 */ 315 u8 rsvd7[32]; /* dword 3 */ 316 } __packed; 317 318 struct be_cmd_req_eq_create { 319 struct be_cmd_req_hdr hdr; /* dw[4] */ 320 u16 num_pages; /* sword */ 321 u16 rsvd0; /* sword */ 322 u8 context[sizeof(struct amap_eq_context) / 8]; /* dw[4] */ 323 struct phys_addr pages[8]; 324 } __packed; 325 326 struct be_cmd_resp_eq_create { 327 struct be_cmd_resp_hdr resp_hdr; 328 u16 eq_id; /* sword */ 329 u16 rsvd0; /* sword */ 330 } __packed; 331 332 struct be_set_eqd { 333 u32 eq_id; 334 u32 phase; 335 u32 delay_multiplier; 336 } __packed; 337 338 struct mgmt_chap_format { 339 u32 flags; 340 u8 intr_chap_name[256]; 341 u8 intr_secret[16]; 342 u8 target_chap_name[256]; 343 u8 target_secret[16]; 344 u16 intr_chap_name_length; 345 u16 intr_secret_length; 346 u16 target_chap_name_length; 347 u16 target_secret_length; 348 } __packed; 349 350 struct mgmt_auth_method_format { 351 u8 auth_method_type; 352 u8 padding[3]; 353 struct mgmt_chap_format chap; 354 } __packed; 355 356 struct be_cmd_req_logout_fw_sess { 357 struct be_cmd_req_hdr hdr; /* dw[4] */ 358 uint32_t session_handle; 359 } __packed; 360 361 struct be_cmd_resp_logout_fw_sess { 362 struct be_cmd_resp_hdr hdr; /* dw[4] */ 363 uint32_t session_status; 364 #define BE_SESS_STATUS_CLOSE 0x20 365 } __packed; 366 367 struct mgmt_conn_login_options { 368 u8 flags; 369 u8 header_digest; 370 u8 data_digest; 371 u8 rsvd0; 372 u32 max_recv_datasegment_len_ini; 373 u32 max_recv_datasegment_len_tgt; 374 u32 tcp_mss; 375 u32 tcp_window_size; 376 struct mgmt_auth_method_format auth_data; 377 } __packed; 378 379 struct ip_addr_format { 380 u16 size_of_structure; 381 u8 reserved; 382 u8 ip_type; 383 #define BEISCSI_IP_TYPE_V4 0x1 384 #define BEISCSI_IP_TYPE_STATIC_V4 0x3 385 #define BEISCSI_IP_TYPE_DHCP_V4 0x5 386 /* type v4 values < type v6 values */ 387 #define BEISCSI_IP_TYPE_V6 0x10 388 #define BEISCSI_IP_TYPE_ROUTABLE_V6 0x30 389 #define BEISCSI_IP_TYPE_LINK_LOCAL_V6 0x50 390 #define BEISCSI_IP_TYPE_AUTO_V6 0x90 391 u8 addr[16]; 392 u32 rsvd0; 393 } __packed; 394 395 struct mgmt_conn_info { 396 u32 connection_handle; 397 u32 connection_status; 398 u16 src_port; 399 u16 dest_port; 400 u16 dest_port_redirected; 401 u16 cid; 402 u32 estimated_throughput; 403 struct ip_addr_format src_ipaddr; 404 struct ip_addr_format dest_ipaddr; 405 struct ip_addr_format dest_ipaddr_redirected; 406 struct mgmt_conn_login_options negotiated_login_options; 407 } __packed; 408 409 struct mgmt_session_login_options { 410 u8 flags; 411 u8 error_recovery_level; 412 u16 rsvd0; 413 u32 first_burst_length; 414 u32 max_burst_length; 415 u16 max_connections; 416 u16 max_outstanding_r2t; 417 u16 default_time2wait; 418 u16 default_time2retain; 419 } __packed; 420 421 struct mgmt_session_info { 422 u32 session_handle; 423 u32 status; 424 u8 isid[6]; 425 u16 tsih; 426 u32 session_flags; 427 u16 conn_count; 428 u16 pad; 429 u8 target_name[224]; 430 u8 initiator_iscsiname[224]; 431 struct mgmt_session_login_options negotiated_login_options; 432 struct mgmt_conn_info conn_list[1]; 433 } __packed; 434 435 struct be_cmd_get_session_req { 436 struct be_cmd_req_hdr hdr; 437 u32 session_handle; 438 } __packed; 439 440 struct be_cmd_get_session_resp { 441 struct be_cmd_resp_hdr hdr; 442 struct mgmt_session_info session_info; 443 } __packed; 444 445 struct mac_addr { 446 u16 size_of_structure; 447 u8 addr[ETH_ALEN]; 448 } __packed; 449 450 struct be_cmd_get_boot_target_req { 451 struct be_cmd_req_hdr hdr; 452 } __packed; 453 454 struct be_cmd_get_boot_target_resp { 455 struct be_cmd_resp_hdr hdr; 456 u32 boot_session_count; 457 u32 boot_session_handle; 458 /** 459 * FW returns 0xffffffff if it couldn't establish connection with 460 * configured boot target. 461 */ 462 #define BE_BOOT_INVALID_SHANDLE 0xffffffff 463 }; 464 465 struct be_cmd_reopen_session_req { 466 struct be_cmd_req_hdr hdr; 467 #define BE_REOPEN_ALL_SESSIONS 0x00 468 #define BE_REOPEN_BOOT_SESSIONS 0x01 469 #define BE_REOPEN_A_SESSION 0x02 470 u16 reopen_type; 471 u16 rsvd; 472 u32 session_handle; 473 } __packed; 474 475 struct be_cmd_reopen_session_resp { 476 struct be_cmd_resp_hdr hdr; 477 u32 rsvd; 478 u32 session_handle; 479 } __packed; 480 481 482 struct be_cmd_mac_query_req { 483 struct be_cmd_req_hdr hdr; 484 u8 type; 485 u8 permanent; 486 u16 if_id; 487 } __packed; 488 489 struct be_cmd_get_mac_resp { 490 struct be_cmd_resp_hdr hdr; 491 struct mac_addr mac; 492 }; 493 494 struct be_ip_addr_subnet_format { 495 u16 size_of_structure; 496 u8 ip_type; 497 u8 ipv6_prefix_length; 498 u8 addr[16]; 499 u8 subnet_mask[16]; 500 u32 rsvd0; 501 } __packed; 502 503 struct be_cmd_get_if_info_req { 504 struct be_cmd_req_hdr hdr; 505 u32 interface_hndl; 506 u32 ip_type; 507 } __packed; 508 509 struct be_cmd_get_if_info_resp { 510 struct be_cmd_req_hdr hdr; 511 u32 interface_hndl; 512 u32 vlan_priority; 513 u32 ip_addr_count; 514 u32 dhcp_state; 515 struct be_ip_addr_subnet_format ip_addr; 516 } __packed; 517 518 struct be_ip_addr_record { 519 u32 action; 520 u32 interface_hndl; 521 struct be_ip_addr_subnet_format ip_addr; 522 u32 status; 523 } __packed; 524 525 struct be_ip_addr_record_params { 526 u32 record_entry_count; 527 struct be_ip_addr_record ip_record; 528 } __packed; 529 530 struct be_cmd_set_ip_addr_req { 531 struct be_cmd_req_hdr hdr; 532 struct be_ip_addr_record_params ip_params; 533 } __packed; 534 535 536 struct be_cmd_set_dhcp_req { 537 struct be_cmd_req_hdr hdr; 538 u32 interface_hndl; 539 u32 ip_type; 540 u32 flags; 541 u32 retry_count; 542 } __packed; 543 544 struct be_cmd_rel_dhcp_req { 545 struct be_cmd_req_hdr hdr; 546 u32 interface_hndl; 547 u32 ip_type; 548 } __packed; 549 550 struct be_cmd_set_def_gateway_req { 551 struct be_cmd_req_hdr hdr; 552 u32 action; 553 struct ip_addr_format ip_addr; 554 } __packed; 555 556 struct be_cmd_get_def_gateway_req { 557 struct be_cmd_req_hdr hdr; 558 u32 ip_type; 559 } __packed; 560 561 struct be_cmd_get_def_gateway_resp { 562 struct be_cmd_req_hdr hdr; 563 struct ip_addr_format ip_addr; 564 } __packed; 565 566 #define BEISCSI_VLAN_DISABLE 0xFFFF 567 struct be_cmd_set_vlan_req { 568 struct be_cmd_req_hdr hdr; 569 u32 interface_hndl; 570 u32 vlan_priority; 571 } __packed; 572 /******************** Create CQ ***************************/ 573 /** 574 * Pseudo amap definition in which each bit of the actual structure is defined 575 * as a byte - used to calculate offset/shift/mask of each field 576 */ 577 struct amap_cq_context { 578 u8 cidx[11]; /* dword 0 */ 579 u8 rsvd0; /* dword 0 */ 580 u8 coalescwm[2]; /* dword 0 */ 581 u8 nodelay; /* dword 0 */ 582 u8 epidx[11]; /* dword 0 */ 583 u8 rsvd1; /* dword 0 */ 584 u8 count[2]; /* dword 0 */ 585 u8 valid; /* dword 0 */ 586 u8 solevent; /* dword 0 */ 587 u8 eventable; /* dword 0 */ 588 u8 pidx[11]; /* dword 1 */ 589 u8 rsvd2; /* dword 1 */ 590 u8 pd[10]; /* dword 1 */ 591 u8 eqid[8]; /* dword 1 */ 592 u8 stalled; /* dword 1 */ 593 u8 armed; /* dword 1 */ 594 u8 rsvd3[4]; /* dword 2 */ 595 u8 func[8]; /* dword 2 */ 596 u8 rsvd4[20]; /* dword 2 */ 597 u8 rsvd5[32]; /* dword 3 */ 598 } __packed; 599 600 struct amap_cq_context_v2 { 601 u8 rsvd0[12]; /* dword 0 */ 602 u8 coalescwm[2]; /* dword 0 */ 603 u8 nodelay; /* dword 0 */ 604 u8 rsvd1[12]; /* dword 0 */ 605 u8 count[2]; /* dword 0 */ 606 u8 valid; /* dword 0 */ 607 u8 rsvd2; /* dword 0 */ 608 u8 eventable; /* dword 0 */ 609 u8 eqid[16]; /* dword 1 */ 610 u8 rsvd3[15]; /* dword 1 */ 611 u8 armed; /* dword 1 */ 612 u8 cqecount[16];/* dword 2 */ 613 u8 rsvd4[16]; /* dword 2 */ 614 u8 rsvd5[32]; /* dword 3 */ 615 }; 616 617 struct be_cmd_req_cq_create { 618 struct be_cmd_req_hdr hdr; 619 u16 num_pages; 620 u8 page_size; 621 u8 rsvd0; 622 u8 context[sizeof(struct amap_cq_context) / 8]; 623 struct phys_addr pages[4]; 624 } __packed; 625 626 struct be_cmd_resp_cq_create { 627 struct be_cmd_resp_hdr hdr; 628 u16 cq_id; 629 u16 rsvd0; 630 } __packed; 631 632 /******************** Create MCCQ ***************************/ 633 /** 634 * Pseudo amap definition in which each bit of the actual structure is defined 635 * as a byte - used to calculate offset/shift/mask of each field 636 */ 637 struct amap_mcc_context { 638 u8 con_index[14]; 639 u8 rsvd0[2]; 640 u8 ring_size[4]; 641 u8 fetch_wrb; 642 u8 fetch_r2t; 643 u8 cq_id[10]; 644 u8 prod_index[14]; 645 u8 fid[8]; 646 u8 pdid[9]; 647 u8 valid; 648 u8 rsvd1[32]; 649 u8 rsvd2[32]; 650 } __packed; 651 652 struct be_cmd_req_mcc_create_ext { 653 struct be_cmd_req_hdr hdr; 654 u16 num_pages; 655 u16 rsvd0; 656 u32 async_evt_bitmap; 657 u8 context[sizeof(struct amap_mcc_context) / 8]; 658 struct phys_addr pages[8]; 659 } __packed; 660 661 struct be_cmd_resp_mcc_create { 662 struct be_cmd_resp_hdr hdr; 663 u16 id; 664 u16 rsvd0; 665 } __packed; 666 667 /******************** Q Destroy ***************************/ 668 /* Type of Queue to be destroyed */ 669 enum { 670 QTYPE_EQ = 1, 671 QTYPE_CQ, 672 QTYPE_MCCQ, 673 QTYPE_WRBQ, 674 QTYPE_DPDUQ, 675 QTYPE_SGL 676 }; 677 678 struct be_cmd_req_q_destroy { 679 struct be_cmd_req_hdr hdr; 680 u16 id; 681 u16 bypass_flush; /* valid only for rx q destroy */ 682 } __packed; 683 684 struct macaddr { 685 u8 byte[ETH_ALEN]; 686 }; 687 688 struct be_cmd_req_mcast_mac_config { 689 struct be_cmd_req_hdr hdr; 690 u16 num_mac; 691 u8 promiscuous; 692 u8 interface_id; 693 struct macaddr mac[32]; 694 } __packed; 695 696 static inline void *embedded_payload(struct be_mcc_wrb *wrb) 697 { 698 return wrb->payload.embedded_payload; 699 } 700 701 static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb) 702 { 703 return &wrb->payload.sgl[0]; 704 } 705 706 /******************** Modify EQ Delay *******************/ 707 struct be_cmd_req_modify_eq_delay { 708 struct be_cmd_req_hdr hdr; 709 __le32 num_eq; 710 struct { 711 __le32 eq_id; 712 __le32 phase; 713 __le32 delay_multiplier; 714 } delay[MAX_CPUS]; 715 } __packed; 716 717 /******************** Get MAC ADDR *******************/ 718 719 struct be_cmd_get_nic_conf_resp { 720 struct be_cmd_resp_hdr hdr; 721 u32 nic_port_count; 722 u32 speed; 723 u32 max_speed; 724 u32 link_state; 725 u32 max_frame_size; 726 u16 size_of_structure; 727 u8 mac_address[ETH_ALEN]; 728 } __packed; 729 730 /******************** Get HBA NAME *******************/ 731 732 struct be_cmd_hba_name { 733 struct be_cmd_req_hdr hdr; 734 u16 flags; 735 u16 rsvd0; 736 u8 initiator_name[ISCSI_NAME_LEN]; 737 #define BE_INI_ALIAS_LEN 32 738 u8 initiator_alias[BE_INI_ALIAS_LEN]; 739 } __packed; 740 741 /******************** COMMON SET HOST DATA *******************/ 742 #define BE_CMD_SET_HOST_PARAM_ID 0x2 743 #define BE_CMD_MAX_DRV_VERSION 0x30 744 struct be_sethost_req { 745 u32 param_id; 746 u32 param_len; 747 u32 param_data[32]; 748 }; 749 750 struct be_sethost_resp { 751 u32 rsvd0; 752 }; 753 754 struct be_cmd_set_host_data { 755 union { 756 struct be_cmd_req_hdr req_hdr; 757 struct be_cmd_resp_hdr resp_hdr; 758 } h; 759 union { 760 struct be_sethost_req req; 761 struct be_sethost_resp resp; 762 } param; 763 } __packed; 764 765 /******************** COMMON SET Features *******************/ 766 #define BE_CMD_SET_FEATURE_UER 0x10 767 #define BE_CMD_UER_SUPP_BIT 0x1 768 struct be_uer_req { 769 u32 uer; 770 u32 rsvd; 771 }; 772 773 struct be_uer_resp { 774 u32 uer; 775 u16 ue2rp; 776 u16 ue2sr; 777 }; 778 779 struct be_cmd_set_features { 780 union { 781 struct be_cmd_req_hdr req_hdr; 782 struct be_cmd_resp_hdr resp_hdr; 783 } h; 784 u32 feature; 785 u32 param_len; 786 union { 787 struct be_uer_req req; 788 struct be_uer_resp resp; 789 u32 rsvd[2]; 790 } param; 791 } __packed; 792 793 int beiscsi_cmd_function_reset(struct beiscsi_hba *phba); 794 795 int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load); 796 797 int beiscsi_check_fw_rdy(struct beiscsi_hba *phba); 798 799 int beiscsi_init_sliport(struct beiscsi_hba *phba); 800 801 int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num); 802 803 int beiscsi_detect_ue(struct beiscsi_hba *phba); 804 805 int beiscsi_detect_tpe(struct beiscsi_hba *phba); 806 807 int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl, 808 struct be_queue_info *eq, int eq_delay); 809 810 int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl, 811 struct be_queue_info *cq, struct be_queue_info *eq, 812 bool sol_evts, bool no_delay, 813 int num_cqe_dma_coalesce); 814 815 int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, 816 int type); 817 int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba, 818 struct be_queue_info *mccq, 819 struct be_queue_info *cq); 820 821 void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag); 822 823 int beiscsi_modify_eq_delay(struct beiscsi_hba *phba, struct be_set_eqd *, 824 int num); 825 int beiscsi_mccq_compl_wait(struct beiscsi_hba *phba, 826 unsigned int tag, 827 struct be_mcc_wrb **wrb, 828 struct be_dma_mem *mbx_cmd_mem); 829 int __beiscsi_mcc_compl_status(struct beiscsi_hba *phba, 830 unsigned int tag, 831 struct be_mcc_wrb **wrb, 832 struct be_dma_mem *mbx_cmd_mem); 833 struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem); 834 void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag); 835 struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba, 836 unsigned int *ref_tag); 837 void beiscsi_process_async_event(struct beiscsi_hba *phba, 838 struct be_mcc_compl *compl); 839 int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl, 840 struct be_mcc_compl *compl); 841 842 int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl, 843 struct be_queue_info *cq, 844 struct be_queue_info *dq, int length, 845 int entry_size, uint8_t is_header, 846 uint8_t ulp_num); 847 848 int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl, 849 struct be_dma_mem *q_mem); 850 851 int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl); 852 853 int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl, 854 struct be_dma_mem *q_mem, u32 page_offset, 855 u32 num_pages); 856 857 int be_cmd_wrbq_create(struct be_ctrl_info *ctrl, struct be_dma_mem *q_mem, 858 struct be_queue_info *wrbq, 859 struct hwi_wrb_context *pwrb_context, 860 uint8_t ulp_num); 861 862 /* Configuration Functions */ 863 int be_cmd_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag); 864 865 int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl, 866 struct beiscsi_hba *phba); 867 868 int beiscsi_get_fw_config(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba); 869 870 int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba); 871 872 int beiscsi_set_uer_feature(struct beiscsi_hba *phba); 873 int beiscsi_set_host_data(struct beiscsi_hba *phba); 874 875 struct be_default_pdu_context { 876 u32 dw[4]; 877 } __packed; 878 879 struct amap_be_default_pdu_context { 880 u8 dbuf_cindex[13]; /* dword 0 */ 881 u8 rsvd0[3]; /* dword 0 */ 882 u8 ring_size[4]; /* dword 0 */ 883 u8 ring_state[4]; /* dword 0 */ 884 u8 rsvd1[8]; /* dword 0 */ 885 u8 dbuf_pindex[13]; /* dword 1 */ 886 u8 rsvd2; /* dword 1 */ 887 u8 pci_func_id[8]; /* dword 1 */ 888 u8 rx_pdid[9]; /* dword 1 */ 889 u8 rx_pdid_valid; /* dword 1 */ 890 u8 default_buffer_size[16]; /* dword 2 */ 891 u8 cq_id_recv[10]; /* dword 2 */ 892 u8 rx_pdid_not_valid; /* dword 2 */ 893 u8 rsvd3[5]; /* dword 2 */ 894 u8 rsvd4[32]; /* dword 3 */ 895 } __packed; 896 897 struct amap_default_pdu_context_ext { 898 u8 rsvd0[16]; /* dword 0 */ 899 u8 ring_size[4]; /* dword 0 */ 900 u8 rsvd1[12]; /* dword 0 */ 901 u8 rsvd2[22]; /* dword 1 */ 902 u8 rx_pdid[9]; /* dword 1 */ 903 u8 rx_pdid_valid; /* dword 1 */ 904 u8 default_buffer_size[16]; /* dword 2 */ 905 u8 cq_id_recv[16]; /* dword 2 */ 906 u8 rsvd3[32]; /* dword 3 */ 907 } __packed; 908 909 struct be_defq_create_req { 910 struct be_cmd_req_hdr hdr; 911 u16 num_pages; 912 u8 ulp_num; 913 #define BEISCSI_DUAL_ULP_AWARE_BIT 0 /* Byte 3 - Bit 0 */ 914 #define BEISCSI_BIND_Q_TO_ULP_BIT 1 /* Byte 3 - Bit 1 */ 915 u8 dua_feature; 916 struct be_default_pdu_context context; 917 struct phys_addr pages[8]; 918 } __packed; 919 920 struct be_defq_create_resp { 921 struct be_cmd_req_hdr hdr; 922 u16 id; 923 u8 rsvd0; 924 u8 ulp_num; 925 u32 doorbell_offset; 926 u16 register_set; 927 u16 doorbell_format; 928 } __packed; 929 930 struct be_post_template_pages_req { 931 struct be_cmd_req_hdr hdr; 932 u16 num_pages; 933 #define BEISCSI_TEMPLATE_HDR_TYPE_ISCSI 0x1 934 u16 type; 935 struct phys_addr scratch_pa; 936 struct virt_addr scratch_va; 937 struct virt_addr pages_va; 938 struct phys_addr pages[16]; 939 } __packed; 940 941 struct be_remove_template_pages_req { 942 struct be_cmd_req_hdr hdr; 943 u16 type; 944 u16 rsvd0; 945 } __packed; 946 947 struct be_post_sgl_pages_req { 948 struct be_cmd_req_hdr hdr; 949 u16 num_pages; 950 u16 page_offset; 951 u32 rsvd0; 952 struct phys_addr pages[26]; 953 u32 rsvd1; 954 } __packed; 955 956 struct be_wrbq_create_req { 957 struct be_cmd_req_hdr hdr; 958 u16 num_pages; 959 u8 ulp_num; 960 u8 dua_feature; 961 struct phys_addr pages[8]; 962 } __packed; 963 964 struct be_wrbq_create_resp { 965 struct be_cmd_resp_hdr resp_hdr; 966 u16 cid; 967 u8 rsvd0; 968 u8 ulp_num; 969 u32 doorbell_offset; 970 u16 register_set; 971 u16 doorbell_format; 972 } __packed; 973 974 #define SOL_CID_MASK 0x0000FFC0 975 #define SOL_CODE_MASK 0x0000003F 976 #define SOL_WRB_INDEX_MASK 0x00FF0000 977 #define SOL_CMD_WND_MASK 0xFF000000 978 #define SOL_RES_CNT_MASK 0x7FFFFFFF 979 #define SOL_EXP_CMD_SN_MASK 0xFFFFFFFF 980 #define SOL_HW_STS_MASK 0x000000FF 981 #define SOL_STS_MASK 0x0000FF00 982 #define SOL_RESP_MASK 0x00FF0000 983 #define SOL_FLAGS_MASK 0x7F000000 984 #define SOL_S_MASK 0x80000000 985 986 struct sol_cqe { 987 u32 dw[4]; 988 }; 989 990 struct amap_sol_cqe { 991 u8 hw_sts[8]; /* dword 0 */ 992 u8 i_sts[8]; /* dword 0 */ 993 u8 i_resp[8]; /* dword 0 */ 994 u8 i_flags[7]; /* dword 0 */ 995 u8 s; /* dword 0 */ 996 u8 i_exp_cmd_sn[32]; /* dword 1 */ 997 u8 code[6]; /* dword 2 */ 998 u8 cid[10]; /* dword 2 */ 999 u8 wrb_index[8]; /* dword 2 */ 1000 u8 i_cmd_wnd[8]; /* dword 2 */ 1001 u8 i_res_cnt[31]; /* dword 3 */ 1002 u8 valid; /* dword 3 */ 1003 } __packed; 1004 1005 #define SOL_ICD_INDEX_MASK 0x0003FFC0 1006 struct amap_sol_cqe_ring { 1007 u8 hw_sts[8]; /* dword 0 */ 1008 u8 i_sts[8]; /* dword 0 */ 1009 u8 i_resp[8]; /* dword 0 */ 1010 u8 i_flags[7]; /* dword 0 */ 1011 u8 s; /* dword 0 */ 1012 u8 i_exp_cmd_sn[32]; /* dword 1 */ 1013 u8 code[6]; /* dword 2 */ 1014 u8 icd_index[12]; /* dword 2 */ 1015 u8 rsvd[6]; /* dword 2 */ 1016 u8 i_cmd_wnd[8]; /* dword 2 */ 1017 u8 i_res_cnt[31]; /* dword 3 */ 1018 u8 valid; /* dword 3 */ 1019 } __packed; 1020 1021 struct amap_sol_cqe_v2 { 1022 u8 hw_sts[8]; /* dword 0 */ 1023 u8 i_sts[8]; /* dword 0 */ 1024 u8 wrb_index[16]; /* dword 0 */ 1025 u8 i_exp_cmd_sn[32]; /* dword 1 */ 1026 u8 code[6]; /* dword 2 */ 1027 u8 cmd_cmpl; /* dword 2 */ 1028 u8 rsvd0; /* dword 2 */ 1029 u8 i_cmd_wnd[8]; /* dword 2 */ 1030 u8 cid[13]; /* dword 2 */ 1031 u8 u; /* dword 2 */ 1032 u8 o; /* dword 2 */ 1033 u8 s; /* dword 2 */ 1034 u8 i_res_cnt[31]; /* dword 3 */ 1035 u8 valid; /* dword 3 */ 1036 } __packed; 1037 1038 struct common_sol_cqe { 1039 u32 exp_cmdsn; 1040 u32 res_cnt; 1041 u16 wrb_index; 1042 u16 cid; 1043 u8 hw_sts; 1044 u8 cmd_wnd; 1045 u8 res_flag; /* the s feild of structure */ 1046 u8 i_resp; /* for skh if cmd_complete is set then i_sts is response */ 1047 u8 i_flags; /* for skh or the u and o feilds */ 1048 u8 i_sts; /* for skh if cmd_complete is not-set then i_sts is status */ 1049 }; 1050 1051 /*** iSCSI ack/driver message completions ***/ 1052 struct amap_it_dmsg_cqe { 1053 u8 ack_num[32]; /* DWORD 0 */ 1054 u8 pdu_bytes_rcvd[32]; /* DWORD 1 */ 1055 u8 code[6]; /* DWORD 2 */ 1056 u8 cid[10]; /* DWORD 2 */ 1057 u8 wrb_idx[8]; /* DWORD 2 */ 1058 u8 rsvd0[8]; /* DWORD 2*/ 1059 u8 rsvd1[31]; /* DWORD 3*/ 1060 u8 valid; /* DWORD 3 */ 1061 } __packed; 1062 1063 struct amap_it_dmsg_cqe_v2 { 1064 u8 ack_num[32]; /* DWORD 0 */ 1065 u8 pdu_bytes_rcvd[32]; /* DWORD 1 */ 1066 u8 code[6]; /* DWORD 2 */ 1067 u8 rsvd0[10]; /* DWORD 2 */ 1068 u8 wrb_idx[16]; /* DWORD 2 */ 1069 u8 rsvd1[16]; /* DWORD 3 */ 1070 u8 cid[13]; /* DWORD 3 */ 1071 u8 rsvd2[2]; /* DWORD 3 */ 1072 u8 valid; /* DWORD 3 */ 1073 } __packed; 1074 1075 1076 /** 1077 * Post WRB Queue Doorbell Register used by the host Storage 1078 * stack to notify the 1079 * controller of a posted Work Request Block 1080 */ 1081 #define DB_WRB_POST_CID_MASK 0xFFFF /* bits 0 - 16 */ 1082 #define DB_DEF_PDU_WRB_INDEX_MASK 0xFF /* bits 0 - 9 */ 1083 1084 #define DB_DEF_PDU_WRB_INDEX_SHIFT 16 1085 #define DB_DEF_PDU_NUM_POSTED_SHIFT 24 1086 1087 struct fragnum_bits_for_sgl_cra_in { 1088 struct be_cmd_req_hdr hdr; 1089 u32 num_bits; 1090 } __packed; 1091 1092 struct iscsi_cleanup_req { 1093 struct be_cmd_req_hdr hdr; 1094 u16 chute; 1095 u8 hdr_ring_id; 1096 u8 data_ring_id; 1097 } __packed; 1098 1099 struct iscsi_cleanup_req_v1 { 1100 struct be_cmd_req_hdr hdr; 1101 u16 chute; 1102 u16 rsvd1; 1103 u16 hdr_ring_id; 1104 u16 rsvd2; 1105 u16 data_ring_id; 1106 u16 rsvd3; 1107 } __packed; 1108 1109 struct eq_delay { 1110 u32 eq_id; 1111 u32 phase; 1112 u32 delay_multiplier; 1113 } __packed; 1114 1115 struct be_eq_delay_params_in { 1116 struct be_cmd_req_hdr hdr; 1117 u32 num_eq; 1118 struct eq_delay delay[8]; 1119 } __packed; 1120 1121 struct tcp_connect_and_offload_in { 1122 struct be_cmd_req_hdr hdr; 1123 struct ip_addr_format ip_address; 1124 u16 tcp_port; 1125 u16 cid; 1126 u16 cq_id; 1127 u16 defq_id; 1128 struct phys_addr dataout_template_pa; 1129 u16 hdr_ring_id; 1130 u16 data_ring_id; 1131 u8 do_offload; 1132 u8 rsvd0[3]; 1133 } __packed; 1134 1135 struct tcp_connect_and_offload_in_v1 { 1136 struct be_cmd_req_hdr hdr; 1137 struct ip_addr_format ip_address; 1138 u16 tcp_port; 1139 u16 cid; 1140 u16 cq_id; 1141 u16 defq_id; 1142 struct phys_addr dataout_template_pa; 1143 u16 hdr_ring_id; 1144 u16 data_ring_id; 1145 u8 do_offload; 1146 u8 ifd_state; 1147 u8 rsvd0[2]; 1148 u16 tcp_window_size; 1149 u8 tcp_window_scale_count; 1150 u8 rsvd1; 1151 u32 tcp_mss:24; 1152 u8 rsvd2; 1153 } __packed; 1154 1155 struct tcp_connect_and_offload_out { 1156 struct be_cmd_resp_hdr hdr; 1157 u32 connection_handle; 1158 u16 cid; 1159 u16 rsvd0; 1160 1161 } __packed; 1162 1163 #define DB_DEF_PDU_RING_ID_MASK 0x3FFF /* bits 0 - 13 */ 1164 #define DB_DEF_PDU_CQPROC_MASK 0x3FFF /* bits 16 - 29 */ 1165 #define DB_DEF_PDU_REARM_SHIFT 14 1166 #define DB_DEF_PDU_EVENT_SHIFT 15 1167 #define DB_DEF_PDU_CQPROC_SHIFT 16 1168 1169 struct be_invalidate_connection_params_in { 1170 struct be_cmd_req_hdr hdr; 1171 u32 session_handle; 1172 u16 cid; 1173 u16 unused; 1174 #define BE_CLEANUP_TYPE_INVALIDATE 0x8001 1175 #define BE_CLEANUP_TYPE_ISSUE_TCP_RST 0x8002 1176 u16 cleanup_type; 1177 u16 save_cfg; 1178 } __packed; 1179 1180 struct be_invalidate_connection_params_out { 1181 u32 session_handle; 1182 u16 cid; 1183 u16 unused; 1184 } __packed; 1185 1186 union be_invalidate_connection_params { 1187 struct be_invalidate_connection_params_in req; 1188 struct be_invalidate_connection_params_out resp; 1189 } __packed; 1190 1191 struct be_tcp_upload_params_in { 1192 struct be_cmd_req_hdr hdr; 1193 u16 id; 1194 #define BE_UPLOAD_TYPE_GRACEFUL 1 1195 /* abortive upload with reset */ 1196 #define BE_UPLOAD_TYPE_ABORT_RESET 2 1197 /* abortive upload without reset */ 1198 #define BE_UPLOAD_TYPE_ABORT 3 1199 /* abortive upload with reset, sequence number by driver */ 1200 #define BE_UPLOAD_TYPE_ABORT_WITH_SEQ 4 1201 u16 upload_type; 1202 u32 reset_seq; 1203 } __packed; 1204 1205 struct be_tcp_upload_params_out { 1206 u32 dw[32]; 1207 } __packed; 1208 1209 union be_tcp_upload_params { 1210 struct be_tcp_upload_params_in request; 1211 struct be_tcp_upload_params_out response; 1212 } __packed; 1213 1214 struct be_ulp_fw_cfg { 1215 #define BEISCSI_ULP_ISCSI_INI_MODE 0x10 1216 u32 ulp_mode; 1217 u32 etx_base; 1218 u32 etx_count; 1219 u32 sq_base; 1220 u32 sq_count; 1221 u32 rq_base; 1222 u32 rq_count; 1223 u32 dq_base; 1224 u32 dq_count; 1225 u32 lro_base; 1226 u32 lro_count; 1227 u32 icd_base; 1228 u32 icd_count; 1229 }; 1230 1231 struct be_ulp_chain_icd { 1232 u32 chain_base; 1233 u32 chain_count; 1234 }; 1235 1236 struct be_fw_cfg { 1237 struct be_cmd_req_hdr hdr; 1238 u32 be_config_number; 1239 u32 asic_revision; 1240 u32 phys_port; 1241 #define BEISCSI_FUNC_ISCSI_INI_MODE 0x10 1242 #define BEISCSI_FUNC_DUA_MODE 0x800 1243 u32 function_mode; 1244 struct be_ulp_fw_cfg ulp[2]; 1245 u32 function_caps; 1246 u32 cqid_base; 1247 u32 cqid_count; 1248 u32 eqid_base; 1249 u32 eqid_count; 1250 struct be_ulp_chain_icd chain_icd[2]; 1251 } __packed; 1252 1253 struct be_cmd_get_all_if_id_req { 1254 struct be_cmd_req_hdr hdr; 1255 u32 if_count; 1256 u32 if_hndl_list[1]; 1257 } __packed; 1258 1259 struct be_cmd_get_port_name { 1260 union { 1261 struct be_cmd_req_hdr req_hdr; 1262 struct be_cmd_resp_hdr resp_hdr; 1263 } h; 1264 union { 1265 struct { 1266 u32 reserved; 1267 } req; 1268 struct { 1269 u32 port_names; 1270 } resp; 1271 } p; 1272 } __packed; 1273 1274 #define ISCSI_OPCODE_SCSI_DATA_OUT 5 1275 #define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5 1276 #define OPCODE_COMMON_MODIFY_EQ_DELAY 41 1277 #define OPCODE_COMMON_ISCSI_CLEANUP 59 1278 #define OPCODE_COMMON_TCP_UPLOAD 56 1279 #define OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD 70 1280 #define OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS 1 1281 #define OPCODE_ISCSI_INI_CFG_GET_HBA_NAME 6 1282 #define OPCODE_ISCSI_INI_CFG_SET_HBA_NAME 7 1283 #define OPCODE_ISCSI_INI_SESSION_GET_A_SESSION 14 1284 #define OPCODE_ISCSI_INI_SESSION_LOGOUT_TARGET 24 1285 #define OPCODE_ISCSI_INI_DRIVER_REOPEN_ALL_SESSIONS 36 1286 #define OPCODE_ISCSI_INI_DRIVER_OFFLOAD_SESSION 41 1287 #define OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION 42 1288 #define OPCODE_ISCSI_INI_BOOT_GET_BOOT_TARGET 52 1289 #define OPCODE_COMMON_WRITE_FLASH 96 1290 #define OPCODE_COMMON_READ_FLASH 97 1291 1292 #define CMD_ISCSI_COMMAND_INVALIDATE 1 1293 1294 #define INI_WR_CMD 1 /* Initiator write command */ 1295 #define INI_TMF_CMD 2 /* Initiator TMF command */ 1296 #define INI_NOPOUT_CMD 3 /* Initiator; Send a NOP-OUT */ 1297 #define INI_RD_CMD 5 /* Initiator requesting to send 1298 * a read command 1299 */ 1300 #define TGT_CTX_UPDT_CMD 7 /* Target context update */ 1301 #define TGT_DM_CMD 11 /* Indicates that the bhs 1302 * prepared by driver should not 1303 * be touched. 1304 */ 1305 1306 /* Returns the number of items in the field array. */ 1307 #define BE_NUMBER_OF_FIELD(_type_, _field_) \ 1308 (FIELD_SIZEOF(_type_, _field_)/sizeof((((_type_ *)0)->_field_[0])))\ 1309 1310 /** 1311 * Different types of iSCSI completions to host driver for both initiator 1312 * and taget mode 1313 * of operation. 1314 */ 1315 #define SOL_CMD_COMPLETE 1 /* Solicited command completed 1316 * normally 1317 */ 1318 #define SOL_CMD_KILLED_DATA_DIGEST_ERR 2 /* Solicited command got 1319 * invalidated internally due 1320 * to Data Digest error 1321 */ 1322 #define CXN_KILLED_PDU_SIZE_EXCEEDS_DSL 3 /* Connection got invalidated 1323 * internally 1324 * due to a received PDU 1325 * size > DSL 1326 */ 1327 #define CXN_KILLED_BURST_LEN_MISMATCH 4 /* Connection got invalidated 1328 * internally due ti received 1329 * PDU sequence size > 1330 * FBL/MBL. 1331 */ 1332 #define CXN_KILLED_AHS_RCVD 5 /* Connection got invalidated 1333 * internally due to a received 1334 * PDU Hdr that has 1335 * AHS */ 1336 #define CXN_KILLED_HDR_DIGEST_ERR 6 /* Connection got invalidated 1337 * internally due to Hdr Digest 1338 * error 1339 */ 1340 #define CXN_KILLED_UNKNOWN_HDR 7 /* Connection got invalidated 1341 * internally 1342 * due to a bad opcode in the 1343 * pdu hdr 1344 */ 1345 #define CXN_KILLED_STALE_ITT_TTT_RCVD 8 /* Connection got invalidated 1346 * internally due to a received 1347 * ITT/TTT that does not belong 1348 * to this Connection 1349 */ 1350 #define CXN_KILLED_INVALID_ITT_TTT_RCVD 9 /* Connection got invalidated 1351 * internally due to received 1352 * ITT/TTT value > Max 1353 * Supported ITTs/TTTs 1354 */ 1355 #define CXN_KILLED_RST_RCVD 10 /* Connection got invalidated 1356 * internally due to an 1357 * incoming TCP RST 1358 */ 1359 #define CXN_KILLED_TIMED_OUT 11 /* Connection got invalidated 1360 * internally due to timeout on 1361 * tcp segment 12 retransmit 1362 * attempts failed 1363 */ 1364 #define CXN_KILLED_RST_SENT 12 /* Connection got invalidated 1365 * internally due to TCP RST 1366 * sent by the Tx side 1367 */ 1368 #define CXN_KILLED_FIN_RCVD 13 /* Connection got invalidated 1369 * internally due to an 1370 * incoming TCP FIN. 1371 */ 1372 #define CXN_KILLED_BAD_UNSOL_PDU_RCVD 14 /* Connection got invalidated 1373 * internally due to bad 1374 * unsolicited PDU Unsolicited 1375 * PDUs are PDUs with 1376 * ITT=0xffffffff 1377 */ 1378 #define CXN_KILLED_BAD_WRB_INDEX_ERROR 15 /* Connection got invalidated 1379 * internally due to bad WRB 1380 * index. 1381 */ 1382 #define CXN_KILLED_OVER_RUN_RESIDUAL 16 /* Command got invalidated 1383 * internally due to received 1384 * command has residual 1385 * over run bytes. 1386 */ 1387 #define CXN_KILLED_UNDER_RUN_RESIDUAL 17 /* Command got invalidated 1388 * internally due to received 1389 * command has residual under 1390 * run bytes. 1391 */ 1392 #define CMD_KILLED_INVALID_STATSN_RCVD 18 /* Command got invalidated 1393 * internally due to a received 1394 * PDU has an invalid StatusSN 1395 */ 1396 #define CMD_KILLED_INVALID_R2T_RCVD 19 /* Command got invalidated 1397 * internally due to a received 1398 * an R2T with some invalid 1399 * fields in it 1400 */ 1401 #define CMD_CXN_KILLED_LUN_INVALID 20 /* Command got invalidated 1402 * internally due to received 1403 * PDU has an invalid LUN. 1404 */ 1405 #define CMD_CXN_KILLED_ICD_INVALID 21 /* Command got invalidated 1406 * internally due to the 1407 * corresponding ICD not in a 1408 * valid state 1409 */ 1410 #define CMD_CXN_KILLED_ITT_INVALID 22 /* Command got invalidated due 1411 * to received PDU has an 1412 * invalid ITT. 1413 */ 1414 #define CMD_CXN_KILLED_SEQ_OUTOFORDER 23 /* Command got invalidated due 1415 * to received sequence buffer 1416 * offset is out of order. 1417 */ 1418 #define CMD_CXN_KILLED_INVALID_DATASN_RCVD 24 /* Command got invalidated 1419 * internally due to a 1420 * received PDU has an invalid 1421 * DataSN 1422 */ 1423 #define CXN_INVALIDATE_NOTIFY 25 /* Connection invalidation 1424 * completion notify. 1425 */ 1426 #define CXN_INVALIDATE_INDEX_NOTIFY 26 /* Connection invalidation 1427 * completion 1428 * with data PDU index. 1429 */ 1430 #define CMD_INVALIDATED_NOTIFY 27 /* Command invalidation 1431 * completionnotifify. 1432 */ 1433 #define UNSOL_HDR_NOTIFY 28 /* Unsolicited header notify.*/ 1434 #define UNSOL_DATA_NOTIFY 29 /* Unsolicited data notify.*/ 1435 #define UNSOL_DATA_DIGEST_ERROR_NOTIFY 30 /* Unsolicited data digest 1436 * error notify. 1437 */ 1438 #define DRIVERMSG_NOTIFY 31 /* TCP acknowledge based 1439 * notification. 1440 */ 1441 #define CXN_KILLED_CMND_DATA_NOT_ON_SAME_CONN 32 /* Connection got invalidated 1442 * internally due to command 1443 * and data are not on same 1444 * connection. 1445 */ 1446 #define SOL_CMD_KILLED_DIF_ERR 33 /* Solicited command got 1447 * invalidated internally due 1448 * to DIF error 1449 */ 1450 #define CXN_KILLED_SYN_RCVD 34 /* Connection got invalidated 1451 * internally due to incoming 1452 * TCP SYN 1453 */ 1454 #define CXN_KILLED_IMM_DATA_RCVD 35 /* Connection got invalidated 1455 * internally due to an 1456 * incoming Unsolicited PDU 1457 * that has immediate data on 1458 * the cxn 1459 */ 1460 1461 void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len, 1462 bool embedded, u8 sge_cnt); 1463 1464 void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr, 1465 u8 subsystem, u8 opcode, u32 cmd_len); 1466 #endif /* !BEISCSI_CMDS_H */ 1467