cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

be_cmds.h (38192B)


      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 */
     20struct be_sge {
     21	__le32 pa_lo;
     22	__le32 pa_hi;
     23	__le32 len;
     24};
     25
     26struct 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
     77struct 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
    147struct be_async_event_trailer {
    148	u32 code;
    149};
    150
    151enum {
    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 */
    160struct 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 */
    189struct be_async_event_sli {
    190	u32 event_data1;
    191	u32 event_data2;
    192	u32 reserved;
    193	u32 trailer;
    194} __packed;
    195
    196struct 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
    253struct 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
    264struct 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
    271struct phys_addr {
    272	u32 lo;
    273	u32 hi;
    274};
    275
    276struct 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 */
    288struct 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
    313struct 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
    321struct 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
    327struct be_set_eqd {
    328	u32 eq_id;
    329	u32 phase;
    330	u32 delay_multiplier;
    331} __packed;
    332
    333struct 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
    345struct mgmt_auth_method_format {
    346	u8	auth_method_type;
    347	u8	padding[3];
    348	struct	mgmt_chap_format chap;
    349} __packed;
    350
    351struct be_cmd_req_logout_fw_sess {
    352	struct be_cmd_req_hdr hdr;	/* dw[4] */
    353	uint32_t session_handle;
    354} __packed;
    355
    356struct 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
    362struct 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
    374struct 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
    390struct 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
    404struct 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
    416struct 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
    430struct be_cmd_get_session_req {
    431	struct be_cmd_req_hdr hdr;
    432	u32 session_handle;
    433} __packed;
    434
    435struct be_cmd_get_session_resp {
    436	struct be_cmd_resp_hdr hdr;
    437	struct mgmt_session_info session_info;
    438} __packed;
    439
    440struct mac_addr {
    441	u16 size_of_structure;
    442	u8 addr[ETH_ALEN];
    443} __packed;
    444
    445struct be_cmd_get_boot_target_req {
    446	struct be_cmd_req_hdr hdr;
    447} __packed;
    448
    449struct 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
    460struct 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
    470struct be_cmd_reopen_session_resp {
    471	struct be_cmd_resp_hdr hdr;
    472	u32 rsvd;
    473	u32 session_handle;
    474} __packed;
    475
    476
    477struct 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
    484struct be_cmd_get_mac_resp {
    485	struct be_cmd_resp_hdr hdr;
    486	struct mac_addr mac;
    487};
    488
    489struct 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
    498struct be_cmd_get_if_info_req {
    499	struct be_cmd_req_hdr hdr;
    500	u32 interface_hndl;
    501	u32 ip_type;
    502} __packed;
    503
    504struct 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
    513struct 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
    520struct be_ip_addr_record_params {
    521	u32 record_entry_count;
    522	struct be_ip_addr_record ip_record;
    523} __packed;
    524
    525struct 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
    531struct 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
    539struct be_cmd_rel_dhcp_req {
    540	struct be_cmd_req_hdr hdr;
    541	u32 interface_hndl;
    542	u32 ip_type;
    543} __packed;
    544
    545struct 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
    551struct be_cmd_get_def_gateway_req {
    552	struct be_cmd_req_hdr hdr;
    553	u32 ip_type;
    554} __packed;
    555
    556struct 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
    562struct 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 */
    572struct 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
    595struct 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
    612struct 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
    621struct 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 */
    632struct 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
    647struct 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
    656struct 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 */
    664enum {
    665	QTYPE_EQ = 1,
    666	QTYPE_CQ,
    667	QTYPE_MCCQ,
    668	QTYPE_WRBQ,
    669	QTYPE_DPDUQ,
    670	QTYPE_SGL
    671};
    672
    673struct 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
    679struct macaddr {
    680	u8 byte[ETH_ALEN];
    681};
    682
    683struct 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
    691static inline void *embedded_payload(struct be_mcc_wrb *wrb)
    692{
    693	return wrb->payload.embedded_payload;
    694}
    695
    696static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
    697{
    698	return &wrb->payload.sgl[0];
    699}
    700
    701/******************** Modify EQ Delay *******************/
    702struct 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
    714struct 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
    727struct 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
    739struct be_sethost_req {
    740	u32 param_id;
    741	u32 param_len;
    742	u32 param_data[32];
    743};
    744
    745struct be_sethost_resp {
    746	u32 rsvd0;
    747};
    748
    749struct 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
    763struct be_uer_req {
    764	u32 uer;
    765	u32 rsvd;
    766};
    767
    768struct be_uer_resp {
    769	u32 uer;
    770	u16 ue2rp;
    771	u16 ue2sr;
    772};
    773
    774struct 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
    788int beiscsi_cmd_function_reset(struct beiscsi_hba *phba);
    789
    790int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load);
    791
    792int beiscsi_check_fw_rdy(struct beiscsi_hba *phba);
    793
    794int beiscsi_init_sliport(struct beiscsi_hba *phba);
    795
    796int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num);
    797
    798int beiscsi_detect_ue(struct beiscsi_hba *phba);
    799
    800int beiscsi_detect_tpe(struct beiscsi_hba *phba);
    801
    802int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
    803			  struct be_queue_info *eq, int eq_delay);
    804
    805int 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
    810int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
    811			  int type);
    812int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
    813			struct be_queue_info *mccq,
    814			struct be_queue_info *cq);
    815
    816void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag);
    817
    818int beiscsi_modify_eq_delay(struct beiscsi_hba *phba, struct be_set_eqd *,
    819			    int num);
    820int 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);
    824int __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);
    828struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem);
    829void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag);
    830struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
    831				 unsigned int *ref_tag);
    832void beiscsi_process_async_event(struct beiscsi_hba *phba,
    833				struct be_mcc_compl *compl);
    834int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
    835			      struct be_mcc_compl *compl);
    836
    837int 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
    843int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
    844				    struct be_dma_mem *q_mem);
    845
    846int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl);
    847
    848int 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
    852int 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 */
    858int be_cmd_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag);
    859
    860int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl,
    861			       struct beiscsi_hba *phba);
    862
    863int beiscsi_get_fw_config(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
    864
    865int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba);
    866
    867int beiscsi_set_uer_feature(struct beiscsi_hba *phba);
    868int beiscsi_set_host_data(struct beiscsi_hba *phba);
    869
    870struct be_default_pdu_context {
    871	u32 dw[4];
    872} __packed;
    873
    874struct 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
    892struct 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
    904struct 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
    915struct 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
    925struct 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
    936struct be_remove_template_pages_req {
    937	struct be_cmd_req_hdr hdr;
    938	u16 type;
    939	u16 rsvd0;
    940} __packed;
    941
    942struct 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
    951struct 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
    959struct 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
    981struct sol_cqe {
    982	u32 dw[4];
    983};
    984
    985struct 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
   1001struct 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
   1016struct 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
   1033struct 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 ***/
   1047struct 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
   1058struct 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
   1082struct fragnum_bits_for_sgl_cra_in {
   1083	struct be_cmd_req_hdr hdr;
   1084	u32 num_bits;
   1085} __packed;
   1086
   1087struct 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
   1094struct 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
   1104struct eq_delay {
   1105	u32 eq_id;
   1106	u32 phase;
   1107	u32 delay_multiplier;
   1108} __packed;
   1109
   1110struct 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
   1116struct 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
   1130struct 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
   1150struct 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
   1164struct 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
   1175struct be_invalidate_connection_params_out {
   1176	u32 session_handle;
   1177	u16 cid;
   1178	u16 unused;
   1179} __packed;
   1180
   1181union be_invalidate_connection_params {
   1182	struct be_invalidate_connection_params_in req;
   1183	struct be_invalidate_connection_params_out resp;
   1184} __packed;
   1185
   1186struct 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
   1200struct be_tcp_upload_params_out {
   1201	u32 dw[32];
   1202} __packed;
   1203
   1204union be_tcp_upload_params {
   1205	struct be_tcp_upload_params_in request;
   1206	struct be_tcp_upload_params_out response;
   1207} __packed;
   1208
   1209struct 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
   1226struct be_ulp_chain_icd {
   1227	u32 chain_base;
   1228	u32 chain_count;
   1229};
   1230
   1231struct 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
   1248struct 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
   1254struct 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
   1456void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len,
   1457			bool embedded, u8 sge_cnt);
   1458
   1459void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
   1460			u8 subsystem, u8 opcode, u32 cmd_len);
   1461#endif /* !BEISCSI_CMDS_H */