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