linux/drivers/scsi/be2iscsi/be_cmds.h
<<
>>
Prefs
   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 */
  25struct be_sge {
  26        __le32 pa_lo;
  27        __le32 pa_hi;
  28        __le32 len;
  29};
  30
  31struct 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
  82struct 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
 152struct be_async_event_trailer {
 153        u32 code;
 154};
 155
 156enum {
 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 */
 165struct 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 */
 194struct be_async_event_sli {
 195        u32 event_data1;
 196        u32 event_data2;
 197        u32 reserved;
 198        u32 trailer;
 199} __packed;
 200
 201struct 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
 258struct 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
 269struct 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
 276struct phys_addr {
 277        u32 lo;
 278        u32 hi;
 279};
 280
 281struct 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 */
 293struct 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
 318struct 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
 326struct 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
 332struct be_set_eqd {
 333        u32 eq_id;
 334        u32 phase;
 335        u32 delay_multiplier;
 336} __packed;
 337
 338struct 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
 350struct mgmt_auth_method_format {
 351        u8      auth_method_type;
 352        u8      padding[3];
 353        struct  mgmt_chap_format chap;
 354} __packed;
 355
 356struct be_cmd_req_logout_fw_sess {
 357        struct be_cmd_req_hdr hdr;      /* dw[4] */
 358        uint32_t session_handle;
 359} __packed;
 360
 361struct 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
 367struct 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
 379struct 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
 395struct 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
 409struct 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
 421struct 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
 435struct be_cmd_get_session_req {
 436        struct be_cmd_req_hdr hdr;
 437        u32 session_handle;
 438} __packed;
 439
 440struct be_cmd_get_session_resp {
 441        struct be_cmd_resp_hdr hdr;
 442        struct mgmt_session_info session_info;
 443} __packed;
 444
 445struct mac_addr {
 446        u16 size_of_structure;
 447        u8 addr[ETH_ALEN];
 448} __packed;
 449
 450struct be_cmd_get_boot_target_req {
 451        struct be_cmd_req_hdr hdr;
 452} __packed;
 453
 454struct 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
 465struct 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
 475struct be_cmd_reopen_session_resp {
 476        struct be_cmd_resp_hdr hdr;
 477        u32 rsvd;
 478        u32 session_handle;
 479} __packed;
 480
 481
 482struct 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
 489struct be_cmd_get_mac_resp {
 490        struct be_cmd_resp_hdr hdr;
 491        struct mac_addr mac;
 492};
 493
 494struct 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
 503struct be_cmd_get_if_info_req {
 504        struct be_cmd_req_hdr hdr;
 505        u32 interface_hndl;
 506        u32 ip_type;
 507} __packed;
 508
 509struct 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
 518struct 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
 525struct be_ip_addr_record_params {
 526        u32 record_entry_count;
 527        struct be_ip_addr_record ip_record;
 528} __packed;
 529
 530struct 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
 536struct 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
 544struct be_cmd_rel_dhcp_req {
 545        struct be_cmd_req_hdr hdr;
 546        u32 interface_hndl;
 547        u32 ip_type;
 548} __packed;
 549
 550struct 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
 556struct be_cmd_get_def_gateway_req {
 557        struct be_cmd_req_hdr hdr;
 558        u32 ip_type;
 559} __packed;
 560
 561struct 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
 567struct 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 */
 577struct 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
 600struct 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
 617struct 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
 626struct 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 */
 637struct 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
 652struct 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
 661struct 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 */
 669enum {
 670        QTYPE_EQ = 1,
 671        QTYPE_CQ,
 672        QTYPE_MCCQ,
 673        QTYPE_WRBQ,
 674        QTYPE_DPDUQ,
 675        QTYPE_SGL
 676};
 677
 678struct 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
 684struct macaddr {
 685        u8 byte[ETH_ALEN];
 686};
 687
 688struct 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
 696static inline void *embedded_payload(struct be_mcc_wrb *wrb)
 697{
 698        return wrb->payload.embedded_payload;
 699}
 700
 701static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
 702{
 703        return &wrb->payload.sgl[0];
 704}
 705
 706/******************** Modify EQ Delay *******************/
 707struct 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
 719struct 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
 732struct 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
 744struct be_sethost_req {
 745        u32 param_id;
 746        u32 param_len;
 747        u32 param_data[32];
 748};
 749
 750struct be_sethost_resp {
 751        u32 rsvd0;
 752};
 753
 754struct 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
 768struct be_uer_req {
 769        u32 uer;
 770        u32 rsvd;
 771};
 772
 773struct be_uer_resp {
 774        u32 uer;
 775        u16 ue2rp;
 776        u16 ue2sr;
 777};
 778
 779struct 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
 793int beiscsi_cmd_function_reset(struct beiscsi_hba *phba);
 794
 795int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load);
 796
 797int beiscsi_check_fw_rdy(struct beiscsi_hba *phba);
 798
 799int beiscsi_init_sliport(struct beiscsi_hba *phba);
 800
 801int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num);
 802
 803int beiscsi_detect_ue(struct beiscsi_hba *phba);
 804
 805int beiscsi_detect_tpe(struct beiscsi_hba *phba);
 806
 807int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
 808                          struct be_queue_info *eq, int eq_delay);
 809
 810int 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
 815int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
 816                          int type);
 817int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
 818                        struct be_queue_info *mccq,
 819                        struct be_queue_info *cq);
 820
 821void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag);
 822
 823int beiscsi_modify_eq_delay(struct beiscsi_hba *phba, struct be_set_eqd *,
 824                            int num);
 825int 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);
 829int __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);
 833struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem);
 834void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag);
 835struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
 836                                 unsigned int *ref_tag);
 837void beiscsi_process_async_event(struct beiscsi_hba *phba,
 838                                struct be_mcc_compl *compl);
 839int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
 840                              struct be_mcc_compl *compl);
 841
 842int 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
 848int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
 849                                    struct be_dma_mem *q_mem);
 850
 851int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl);
 852
 853int 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
 857int 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 */
 863int be_cmd_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag);
 864
 865int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl,
 866                               struct beiscsi_hba *phba);
 867
 868int beiscsi_get_fw_config(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
 869
 870int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
 871
 872int beiscsi_set_uer_feature(struct beiscsi_hba *phba);
 873int beiscsi_set_host_data(struct beiscsi_hba *phba);
 874
 875struct be_default_pdu_context {
 876        u32 dw[4];
 877} __packed;
 878
 879struct 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
 897struct 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
 909struct 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
 920struct 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
 930struct 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
 941struct be_remove_template_pages_req {
 942        struct be_cmd_req_hdr hdr;
 943        u16 type;
 944        u16 rsvd0;
 945} __packed;
 946
 947struct 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
 956struct 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
 964struct 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
 986struct sol_cqe {
 987        u32 dw[4];
 988};
 989
 990struct 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
1006struct 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
1021struct 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
1038struct 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 ***/
1052struct 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
1063struct 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
1087struct fragnum_bits_for_sgl_cra_in {
1088        struct be_cmd_req_hdr hdr;
1089        u32 num_bits;
1090} __packed;
1091
1092struct 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
1099struct 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
1109struct eq_delay {
1110        u32 eq_id;
1111        u32 phase;
1112        u32 delay_multiplier;
1113} __packed;
1114
1115struct 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
1121struct 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
1135struct 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
1155struct 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
1169struct 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
1180struct be_invalidate_connection_params_out {
1181        u32 session_handle;
1182        u16 cid;
1183        u16 unused;
1184} __packed;
1185
1186union be_invalidate_connection_params {
1187        struct be_invalidate_connection_params_in req;
1188        struct be_invalidate_connection_params_out resp;
1189} __packed;
1190
1191struct 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
1205struct be_tcp_upload_params_out {
1206        u32 dw[32];
1207} __packed;
1208
1209union be_tcp_upload_params {
1210        struct be_tcp_upload_params_in request;
1211        struct be_tcp_upload_params_out response;
1212} __packed;
1213
1214struct 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
1231struct be_ulp_chain_icd {
1232        u32 chain_base;
1233        u32 chain_count;
1234};
1235
1236struct 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
1253struct 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
1259struct 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
1461void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len,
1462                        bool embedded, u8 sge_cnt);
1463
1464void 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