162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2017 Broadcom. All Rights Reserved.
462306a36Sopenharmony_ci * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Contact Information:
762306a36Sopenharmony_ci * linux-drivers@broadcom.com
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef _BEISCSI_MAIN_
1162306a36Sopenharmony_ci#define _BEISCSI_MAIN_
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/kernel.h>
1462306a36Sopenharmony_ci#include <linux/pci.h>
1562306a36Sopenharmony_ci#include <linux/if_ether.h>
1662306a36Sopenharmony_ci#include <linux/in.h>
1762306a36Sopenharmony_ci#include <linux/ctype.h>
1862306a36Sopenharmony_ci#include <linux/module.h>
1962306a36Sopenharmony_ci#include <scsi/scsi.h>
2062306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
2162306a36Sopenharmony_ci#include <scsi/scsi_device.h>
2262306a36Sopenharmony_ci#include <scsi/scsi_host.h>
2362306a36Sopenharmony_ci#include <scsi/iscsi_proto.h>
2462306a36Sopenharmony_ci#include <scsi/libiscsi.h>
2562306a36Sopenharmony_ci#include <scsi/scsi_transport_iscsi.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define DRV_NAME		"be2iscsi"
2862306a36Sopenharmony_ci#define BUILD_STR		"11.4.0.1"
2962306a36Sopenharmony_ci#define BE_NAME			"Emulex OneConnect" \
3062306a36Sopenharmony_ci				"Open-iSCSI Driver version" BUILD_STR
3162306a36Sopenharmony_ci#define DRV_DESC		BE_NAME " " "Driver"
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define BE_VENDOR_ID		0x19A2
3462306a36Sopenharmony_ci#define ELX_VENDOR_ID		0x10DF
3562306a36Sopenharmony_ci/* DEVICE ID's for BE2 */
3662306a36Sopenharmony_ci#define BE_DEVICE_ID1		0x212
3762306a36Sopenharmony_ci#define OC_DEVICE_ID1		0x702
3862306a36Sopenharmony_ci#define OC_DEVICE_ID2		0x703
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* DEVICE ID's for BE3 */
4162306a36Sopenharmony_ci#define BE_DEVICE_ID2		0x222
4262306a36Sopenharmony_ci#define OC_DEVICE_ID3		0x712
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* DEVICE ID for SKH */
4562306a36Sopenharmony_ci#define OC_SKH_ID1		0x722
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define BE2_IO_DEPTH		1024
4862306a36Sopenharmony_ci#define BE2_MAX_SESSIONS	256
4962306a36Sopenharmony_ci#define BE2_TMFS		16
5062306a36Sopenharmony_ci#define BE2_NOPOUT_REQ		16
5162306a36Sopenharmony_ci#define BE2_SGE			32
5262306a36Sopenharmony_ci#define BE2_DEFPDU_HDR_SZ	64
5362306a36Sopenharmony_ci#define BE2_DEFPDU_DATA_SZ	8192
5462306a36Sopenharmony_ci#define BE2_MAX_NUM_CQ_PROC	512
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define MAX_CPUS		64U
5762306a36Sopenharmony_ci#define BEISCSI_MAX_NUM_CPUS	7
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define BEISCSI_VER_STRLEN 32
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define BEISCSI_SGLIST_ELEMENTS	30
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/**
6462306a36Sopenharmony_ci * BE_INVLDT_CMD_TBL_SZ is 128 which is total number commands that can
6562306a36Sopenharmony_ci * be invalidated at a time, consider it before changing the value of
6662306a36Sopenharmony_ci * BEISCSI_CMD_PER_LUN.
6762306a36Sopenharmony_ci */
6862306a36Sopenharmony_ci#define BEISCSI_CMD_PER_LUN	128	/* scsi_host->cmd_per_lun */
6962306a36Sopenharmony_ci#define BEISCSI_MAX_SECTORS	1024	/* scsi_host->max_sectors */
7062306a36Sopenharmony_ci#define BEISCSI_TEMPLATE_HDR_PER_CXN_SIZE 128 /* Template size per cxn */
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define BEISCSI_MAX_CMD_LEN	16	/* scsi_host->max_cmd_len */
7362306a36Sopenharmony_ci#define BEISCSI_NUM_MAX_LUN	256	/* scsi_host->max_lun */
7462306a36Sopenharmony_ci#define BEISCSI_MAX_FRAGS_INIT	192
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#define BE_SENSE_INFO_SIZE		258
7762306a36Sopenharmony_ci#define BE_ISCSI_PDU_HEADER_SIZE	64
7862306a36Sopenharmony_ci#define BE_MIN_MEM_SIZE			16384
7962306a36Sopenharmony_ci#define MAX_CMD_SZ			65536
8062306a36Sopenharmony_ci#define IIOC_SCSI_DATA                  0x05	/* Write Operation */
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/**
8362306a36Sopenharmony_ci * hardware needs the async PDU buffers to be posted in multiples of 8
8462306a36Sopenharmony_ci * So have atleast 8 of them by default
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define HWI_GET_ASYNC_PDU_CTX(phwi, ulp_num)	\
8862306a36Sopenharmony_ci	(phwi->phwi_ctxt->pasync_ctx[ulp_num])
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/********* Memory BAR register ************/
9162306a36Sopenharmony_ci#define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET	0xfc
9262306a36Sopenharmony_ci/**
9362306a36Sopenharmony_ci * Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt
9462306a36Sopenharmony_ci * Disable" may still globally block interrupts in addition to individual
9562306a36Sopenharmony_ci * interrupt masks; a mechanism for the device driver to block all interrupts
9662306a36Sopenharmony_ci * atomically without having to arbitrate for the PCI Interrupt Disable bit
9762306a36Sopenharmony_ci * with the OS.
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci#define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK	(1 << 29)	/* bit 29 */
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/********* ISR0 Register offset **********/
10262306a36Sopenharmony_ci#define CEV_ISR0_OFFSET				0xC18
10362306a36Sopenharmony_ci#define CEV_ISR_SIZE				4
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/**
10662306a36Sopenharmony_ci * Macros for reading/writing a protection domain or CSR registers
10762306a36Sopenharmony_ci * in BladeEngine.
10862306a36Sopenharmony_ci */
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#define DB_TXULP0_OFFSET 0x40
11162306a36Sopenharmony_ci#define DB_RXULP0_OFFSET 0xA0
11262306a36Sopenharmony_ci/********* Event Q door bell *************/
11362306a36Sopenharmony_ci#define DB_EQ_OFFSET			DB_CQ_OFFSET
11462306a36Sopenharmony_ci#define DB_EQ_RING_ID_LOW_MASK		0x1FF	/* bits 0 - 8 */
11562306a36Sopenharmony_ci/* Clear the interrupt for this eq */
11662306a36Sopenharmony_ci#define DB_EQ_CLR_SHIFT			(9)	/* bit 9 */
11762306a36Sopenharmony_ci/* Must be 1 */
11862306a36Sopenharmony_ci#define DB_EQ_EVNT_SHIFT		(10)	/* bit 10 */
11962306a36Sopenharmony_ci/* Higher Order EQ_ID bit */
12062306a36Sopenharmony_ci#define DB_EQ_RING_ID_HIGH_MASK	0x1F /* bits 11 - 15 */
12162306a36Sopenharmony_ci#define DB_EQ_HIGH_SET_SHIFT	11
12262306a36Sopenharmony_ci#define DB_EQ_HIGH_FEILD_SHIFT	9
12362306a36Sopenharmony_ci/* Number of event entries processed */
12462306a36Sopenharmony_ci#define DB_EQ_NUM_POPPED_SHIFT		(16)	/* bits 16 - 28 */
12562306a36Sopenharmony_ci/* Rearm bit */
12662306a36Sopenharmony_ci#define DB_EQ_REARM_SHIFT		(29)	/* bit 29 */
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/********* Compl Q door bell *************/
12962306a36Sopenharmony_ci#define DB_CQ_OFFSET			0x120
13062306a36Sopenharmony_ci#define DB_CQ_RING_ID_LOW_MASK		0x3FF	/* bits 0 - 9 */
13162306a36Sopenharmony_ci/* Higher Order CQ_ID bit */
13262306a36Sopenharmony_ci#define DB_CQ_RING_ID_HIGH_MASK	0x1F /* bits 11 - 15 */
13362306a36Sopenharmony_ci#define DB_CQ_HIGH_SET_SHIFT	11
13462306a36Sopenharmony_ci#define DB_CQ_HIGH_FEILD_SHIFT	10
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci/* Number of event entries processed */
13762306a36Sopenharmony_ci#define DB_CQ_NUM_POPPED_SHIFT		(16)	/* bits 16 - 28 */
13862306a36Sopenharmony_ci/* Rearm bit */
13962306a36Sopenharmony_ci#define DB_CQ_REARM_SHIFT		(29)	/* bit 29 */
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#define GET_HWI_CONTROLLER_WS(pc)	(pc->phwi_ctrlr)
14262306a36Sopenharmony_ci#define HWI_GET_DEF_BUFQ_ID(pc, ulp_num) (((struct hwi_controller *)\
14362306a36Sopenharmony_ci		(GET_HWI_CONTROLLER_WS(pc)))->default_pdu_data[ulp_num].id)
14462306a36Sopenharmony_ci#define HWI_GET_DEF_HDRQ_ID(pc, ulp_num) (((struct hwi_controller *)\
14562306a36Sopenharmony_ci		(GET_HWI_CONTROLLER_WS(pc)))->default_pdu_hdr[ulp_num].id)
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#define PAGES_REQUIRED(x) \
14862306a36Sopenharmony_ci	((x < PAGE_SIZE) ? 1 :  ((x + PAGE_SIZE - 1) / PAGE_SIZE))
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define MEM_DESCR_OFFSET 8
15162306a36Sopenharmony_ci#define BEISCSI_DEFQ_HDR 1
15262306a36Sopenharmony_ci#define BEISCSI_DEFQ_DATA 0
15362306a36Sopenharmony_cienum be_mem_enum {
15462306a36Sopenharmony_ci	HWI_MEM_ADDN_CONTEXT,
15562306a36Sopenharmony_ci	HWI_MEM_WRB,
15662306a36Sopenharmony_ci	HWI_MEM_WRBH,
15762306a36Sopenharmony_ci	HWI_MEM_SGLH,
15862306a36Sopenharmony_ci	HWI_MEM_SGE,
15962306a36Sopenharmony_ci	HWI_MEM_TEMPLATE_HDR_ULP0,
16062306a36Sopenharmony_ci	HWI_MEM_ASYNC_HEADER_BUF_ULP0,	/* 6 */
16162306a36Sopenharmony_ci	HWI_MEM_ASYNC_DATA_BUF_ULP0,
16262306a36Sopenharmony_ci	HWI_MEM_ASYNC_HEADER_RING_ULP0,
16362306a36Sopenharmony_ci	HWI_MEM_ASYNC_DATA_RING_ULP0,
16462306a36Sopenharmony_ci	HWI_MEM_ASYNC_HEADER_HANDLE_ULP0,
16562306a36Sopenharmony_ci	HWI_MEM_ASYNC_DATA_HANDLE_ULP0,	/* 11 */
16662306a36Sopenharmony_ci	HWI_MEM_ASYNC_PDU_CONTEXT_ULP0,
16762306a36Sopenharmony_ci	HWI_MEM_TEMPLATE_HDR_ULP1,
16862306a36Sopenharmony_ci	HWI_MEM_ASYNC_HEADER_BUF_ULP1,	/* 14 */
16962306a36Sopenharmony_ci	HWI_MEM_ASYNC_DATA_BUF_ULP1,
17062306a36Sopenharmony_ci	HWI_MEM_ASYNC_HEADER_RING_ULP1,
17162306a36Sopenharmony_ci	HWI_MEM_ASYNC_DATA_RING_ULP1,
17262306a36Sopenharmony_ci	HWI_MEM_ASYNC_HEADER_HANDLE_ULP1,
17362306a36Sopenharmony_ci	HWI_MEM_ASYNC_DATA_HANDLE_ULP1,	/* 19 */
17462306a36Sopenharmony_ci	HWI_MEM_ASYNC_PDU_CONTEXT_ULP1,
17562306a36Sopenharmony_ci	ISCSI_MEM_GLOBAL_HEADER,
17662306a36Sopenharmony_ci	SE_MEM_MAX
17762306a36Sopenharmony_ci};
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_cistruct be_bus_address32 {
18062306a36Sopenharmony_ci	unsigned int address_lo;
18162306a36Sopenharmony_ci	unsigned int address_hi;
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistruct be_bus_address64 {
18562306a36Sopenharmony_ci	unsigned long long address;
18662306a36Sopenharmony_ci};
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistruct be_bus_address {
18962306a36Sopenharmony_ci	union {
19062306a36Sopenharmony_ci		struct be_bus_address32 a32;
19162306a36Sopenharmony_ci		struct be_bus_address64 a64;
19262306a36Sopenharmony_ci	} u;
19362306a36Sopenharmony_ci};
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_cistruct mem_array {
19662306a36Sopenharmony_ci	struct be_bus_address bus_address;	/* Bus address of location */
19762306a36Sopenharmony_ci	void *virtual_address;		/* virtual address to the location */
19862306a36Sopenharmony_ci	unsigned int size;		/* Size required by memory block */
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistruct be_mem_descriptor {
20262306a36Sopenharmony_ci	unsigned int size_in_bytes;	/* Size required by memory block */
20362306a36Sopenharmony_ci	unsigned int num_elements;
20462306a36Sopenharmony_ci	struct mem_array *mem_array;
20562306a36Sopenharmony_ci};
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistruct sgl_handle {
20862306a36Sopenharmony_ci	unsigned int sgl_index;
20962306a36Sopenharmony_ci	unsigned int type;
21062306a36Sopenharmony_ci	unsigned int cid;
21162306a36Sopenharmony_ci	struct iscsi_task *task;
21262306a36Sopenharmony_ci	struct iscsi_sge *pfrag;
21362306a36Sopenharmony_ci};
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_cistruct hba_parameters {
21662306a36Sopenharmony_ci	unsigned int ios_per_ctrl;
21762306a36Sopenharmony_ci	unsigned int cxns_per_ctrl;
21862306a36Sopenharmony_ci	unsigned int icds_per_ctrl;
21962306a36Sopenharmony_ci	unsigned int num_sge_per_io;
22062306a36Sopenharmony_ci	unsigned int defpdu_hdr_sz;
22162306a36Sopenharmony_ci	unsigned int defpdu_data_sz;
22262306a36Sopenharmony_ci	unsigned int num_cq_entries;
22362306a36Sopenharmony_ci	unsigned int num_eq_entries;
22462306a36Sopenharmony_ci	unsigned int wrbs_per_cxn;
22562306a36Sopenharmony_ci	unsigned int hwi_ws_sz;
22662306a36Sopenharmony_ci};
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci#define BEISCSI_GET_ULP_FROM_CRI(phwi_ctrlr, cri) \
22962306a36Sopenharmony_ci	(phwi_ctrlr->wrb_context[cri].ulp_num)
23062306a36Sopenharmony_cistruct hwi_wrb_context {
23162306a36Sopenharmony_ci	spinlock_t wrb_lock;
23262306a36Sopenharmony_ci	struct wrb_handle **pwrb_handle_base;
23362306a36Sopenharmony_ci	struct wrb_handle **pwrb_handle_basestd;
23462306a36Sopenharmony_ci	struct iscsi_wrb *plast_wrb;
23562306a36Sopenharmony_ci	unsigned short alloc_index;
23662306a36Sopenharmony_ci	unsigned short free_index;
23762306a36Sopenharmony_ci	unsigned short wrb_handles_available;
23862306a36Sopenharmony_ci	unsigned short cid;
23962306a36Sopenharmony_ci	uint8_t ulp_num;	/* ULP to which CID binded */
24062306a36Sopenharmony_ci	uint32_t doorbell_offset;
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cistruct ulp_cid_info {
24462306a36Sopenharmony_ci	unsigned short *cid_array;
24562306a36Sopenharmony_ci	unsigned short avlbl_cids;
24662306a36Sopenharmony_ci	unsigned short cid_alloc;
24762306a36Sopenharmony_ci	unsigned short cid_free;
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci#include "be.h"
25162306a36Sopenharmony_ci#define chip_be2(phba)      (phba->generation == BE_GEN2)
25262306a36Sopenharmony_ci#define chip_be3_r(phba)    (phba->generation == BE_GEN3)
25362306a36Sopenharmony_ci#define is_chip_be2_be3r(phba) (chip_be3_r(phba) || (chip_be2(phba)))
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci#define BEISCSI_ULP0    0
25662306a36Sopenharmony_ci#define BEISCSI_ULP1    1
25762306a36Sopenharmony_ci#define BEISCSI_ULP_COUNT   2
25862306a36Sopenharmony_ci#define BEISCSI_ULP0_LOADED 0x01
25962306a36Sopenharmony_ci#define BEISCSI_ULP1_LOADED 0x02
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci#define BEISCSI_ULP_AVLBL_CID(phba, ulp_num) \
26262306a36Sopenharmony_ci	(((struct ulp_cid_info *)phba->cid_array_info[ulp_num])->avlbl_cids)
26362306a36Sopenharmony_ci#define BEISCSI_ULP0_AVLBL_CID(phba) \
26462306a36Sopenharmony_ci	BEISCSI_ULP_AVLBL_CID(phba, BEISCSI_ULP0)
26562306a36Sopenharmony_ci#define BEISCSI_ULP1_AVLBL_CID(phba) \
26662306a36Sopenharmony_ci	BEISCSI_ULP_AVLBL_CID(phba, BEISCSI_ULP1)
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_cistruct beiscsi_hba {
26962306a36Sopenharmony_ci	struct hba_parameters params;
27062306a36Sopenharmony_ci	struct hwi_controller *phwi_ctrlr;
27162306a36Sopenharmony_ci	unsigned int mem_req[SE_MEM_MAX];
27262306a36Sopenharmony_ci	/* PCI BAR mapped addresses */
27362306a36Sopenharmony_ci	u8 __iomem *csr_va;	/* CSR */
27462306a36Sopenharmony_ci	u8 __iomem *db_va;	/* Door  Bell  */
27562306a36Sopenharmony_ci	u8 __iomem *pci_va;	/* PCI Config */
27662306a36Sopenharmony_ci	/* PCI representation of our HBA */
27762306a36Sopenharmony_ci	struct pci_dev *pcidev;
27862306a36Sopenharmony_ci	unsigned int num_cpus;
27962306a36Sopenharmony_ci	unsigned int nxt_cqid;
28062306a36Sopenharmony_ci	char *msi_name[MAX_CPUS];
28162306a36Sopenharmony_ci	struct be_mem_descriptor *init_mem;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci	unsigned short io_sgl_alloc_index;
28462306a36Sopenharmony_ci	unsigned short io_sgl_free_index;
28562306a36Sopenharmony_ci	unsigned short io_sgl_hndl_avbl;
28662306a36Sopenharmony_ci	struct sgl_handle **io_sgl_hndl_base;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	unsigned short eh_sgl_alloc_index;
28962306a36Sopenharmony_ci	unsigned short eh_sgl_free_index;
29062306a36Sopenharmony_ci	unsigned short eh_sgl_hndl_avbl;
29162306a36Sopenharmony_ci	struct sgl_handle **eh_sgl_hndl_base;
29262306a36Sopenharmony_ci	spinlock_t io_sgl_lock;
29362306a36Sopenharmony_ci	spinlock_t mgmt_sgl_lock;
29462306a36Sopenharmony_ci	spinlock_t async_pdu_lock;
29562306a36Sopenharmony_ci	struct list_head hba_queue;
29662306a36Sopenharmony_ci#define BE_MAX_SESSION 2048
29762306a36Sopenharmony_ci#define BE_INVALID_CID 0xffff
29862306a36Sopenharmony_ci#define BE_SET_CID_TO_CRI(cri_index, cid) \
29962306a36Sopenharmony_ci			  (phba->cid_to_cri_map[cid] = cri_index)
30062306a36Sopenharmony_ci#define BE_GET_CRI_FROM_CID(cid) (phba->cid_to_cri_map[cid])
30162306a36Sopenharmony_ci	unsigned short cid_to_cri_map[BE_MAX_SESSION];
30262306a36Sopenharmony_ci	struct ulp_cid_info *cid_array_info[BEISCSI_ULP_COUNT];
30362306a36Sopenharmony_ci	struct iscsi_endpoint **ep_array;
30462306a36Sopenharmony_ci	struct beiscsi_conn **conn_table;
30562306a36Sopenharmony_ci	struct Scsi_Host *shost;
30662306a36Sopenharmony_ci	struct iscsi_iface *ipv4_iface;
30762306a36Sopenharmony_ci	struct iscsi_iface *ipv6_iface;
30862306a36Sopenharmony_ci	struct {
30962306a36Sopenharmony_ci		/**
31062306a36Sopenharmony_ci		 * group together since they are used most frequently
31162306a36Sopenharmony_ci		 * for cid to cri conversion
31262306a36Sopenharmony_ci		 */
31362306a36Sopenharmony_ci#define BEISCSI_PHYS_PORT_MAX	4
31462306a36Sopenharmony_ci		unsigned int phys_port;
31562306a36Sopenharmony_ci		/* valid values of phys_port id are 0, 1, 2, 3 */
31662306a36Sopenharmony_ci		unsigned int eqid_count;
31762306a36Sopenharmony_ci		unsigned int cqid_count;
31862306a36Sopenharmony_ci		unsigned int iscsi_cid_start[BEISCSI_ULP_COUNT];
31962306a36Sopenharmony_ci#define BEISCSI_GET_CID_COUNT(phba, ulp_num) \
32062306a36Sopenharmony_ci		(phba->fw_config.iscsi_cid_count[ulp_num])
32162306a36Sopenharmony_ci		unsigned int iscsi_cid_count[BEISCSI_ULP_COUNT];
32262306a36Sopenharmony_ci		unsigned int iscsi_icd_count[BEISCSI_ULP_COUNT];
32362306a36Sopenharmony_ci		unsigned int iscsi_icd_start[BEISCSI_ULP_COUNT];
32462306a36Sopenharmony_ci		unsigned int iscsi_chain_start[BEISCSI_ULP_COUNT];
32562306a36Sopenharmony_ci		unsigned int iscsi_chain_count[BEISCSI_ULP_COUNT];
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci		unsigned short iscsi_features;
32862306a36Sopenharmony_ci		uint16_t dual_ulp_aware;
32962306a36Sopenharmony_ci		unsigned long ulp_supported;
33062306a36Sopenharmony_ci	} fw_config;
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci	unsigned long state;
33362306a36Sopenharmony_ci#define BEISCSI_HBA_ONLINE	0
33462306a36Sopenharmony_ci#define BEISCSI_HBA_LINK_UP	1
33562306a36Sopenharmony_ci#define BEISCSI_HBA_BOOT_FOUND	2
33662306a36Sopenharmony_ci#define BEISCSI_HBA_BOOT_WORK	3
33762306a36Sopenharmony_ci#define BEISCSI_HBA_UER_SUPP	4
33862306a36Sopenharmony_ci#define BEISCSI_HBA_PCI_ERR	5
33962306a36Sopenharmony_ci#define BEISCSI_HBA_FW_TIMEOUT	6
34062306a36Sopenharmony_ci#define BEISCSI_HBA_IN_UE	7
34162306a36Sopenharmony_ci#define BEISCSI_HBA_IN_TPE	8
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci/* error bits */
34462306a36Sopenharmony_ci#define BEISCSI_HBA_IN_ERR	((1 << BEISCSI_HBA_PCI_ERR) | \
34562306a36Sopenharmony_ci				 (1 << BEISCSI_HBA_FW_TIMEOUT) | \
34662306a36Sopenharmony_ci				 (1 << BEISCSI_HBA_IN_UE) | \
34762306a36Sopenharmony_ci				 (1 << BEISCSI_HBA_IN_TPE))
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	u8 optic_state;
35062306a36Sopenharmony_ci	struct delayed_work eqd_update;
35162306a36Sopenharmony_ci	/* update EQ delay timer every 1000ms */
35262306a36Sopenharmony_ci#define BEISCSI_EQD_UPDATE_INTERVAL	1000
35362306a36Sopenharmony_ci	struct timer_list hw_check;
35462306a36Sopenharmony_ci	/* check for UE every 1000ms */
35562306a36Sopenharmony_ci#define BEISCSI_UE_DETECT_INTERVAL	1000
35662306a36Sopenharmony_ci	u32 ue2rp;
35762306a36Sopenharmony_ci	struct delayed_work recover_port;
35862306a36Sopenharmony_ci	struct work_struct sess_work;
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	bool mac_addr_set;
36162306a36Sopenharmony_ci	u8 mac_address[ETH_ALEN];
36262306a36Sopenharmony_ci	u8 port_name;
36362306a36Sopenharmony_ci	u8 port_speed;
36462306a36Sopenharmony_ci	char fw_ver_str[BEISCSI_VER_STRLEN];
36562306a36Sopenharmony_ci	struct workqueue_struct *wq;	/* The actuak work queue */
36662306a36Sopenharmony_ci	struct be_ctrl_info ctrl;
36762306a36Sopenharmony_ci	unsigned int generation;
36862306a36Sopenharmony_ci	unsigned int interface_handle;
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	struct be_aic_obj aic_obj[MAX_CPUS];
37162306a36Sopenharmony_ci	unsigned int attr_log_enable;
37262306a36Sopenharmony_ci	int (*iotask_fn)(struct iscsi_task *,
37362306a36Sopenharmony_ci			struct scatterlist *sg,
37462306a36Sopenharmony_ci			uint32_t num_sg, uint32_t xferlen,
37562306a36Sopenharmony_ci			uint32_t writedir);
37662306a36Sopenharmony_ci	struct boot_struct {
37762306a36Sopenharmony_ci		int retry;
37862306a36Sopenharmony_ci		unsigned int tag;
37962306a36Sopenharmony_ci		unsigned int s_handle;
38062306a36Sopenharmony_ci		struct be_dma_mem nonemb_cmd;
38162306a36Sopenharmony_ci		enum {
38262306a36Sopenharmony_ci			BEISCSI_BOOT_REOPEN_SESS = 1,
38362306a36Sopenharmony_ci			BEISCSI_BOOT_GET_SHANDLE,
38462306a36Sopenharmony_ci			BEISCSI_BOOT_GET_SINFO,
38562306a36Sopenharmony_ci			BEISCSI_BOOT_LOGOUT_SESS,
38662306a36Sopenharmony_ci			BEISCSI_BOOT_CREATE_KSET,
38762306a36Sopenharmony_ci		} action;
38862306a36Sopenharmony_ci		struct mgmt_session_info boot_sess;
38962306a36Sopenharmony_ci		struct iscsi_boot_kset *boot_kset;
39062306a36Sopenharmony_ci	} boot_struct;
39162306a36Sopenharmony_ci	struct work_struct boot_work;
39262306a36Sopenharmony_ci};
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci#define beiscsi_hba_in_error(phba) ((phba)->state & BEISCSI_HBA_IN_ERR)
39562306a36Sopenharmony_ci#define beiscsi_hba_is_online(phba) \
39662306a36Sopenharmony_ci	(!beiscsi_hba_in_error((phba)) && \
39762306a36Sopenharmony_ci	 test_bit(BEISCSI_HBA_ONLINE, &phba->state))
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistruct beiscsi_session {
40062306a36Sopenharmony_ci	struct dma_pool *bhs_pool;
40162306a36Sopenharmony_ci};
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci/**
40462306a36Sopenharmony_ci * struct beiscsi_conn - iscsi connection structure
40562306a36Sopenharmony_ci */
40662306a36Sopenharmony_cistruct beiscsi_conn {
40762306a36Sopenharmony_ci	struct iscsi_conn *conn;
40862306a36Sopenharmony_ci	struct beiscsi_hba *phba;
40962306a36Sopenharmony_ci	u32 exp_statsn;
41062306a36Sopenharmony_ci	u32 doorbell_offset;
41162306a36Sopenharmony_ci	u32 beiscsi_conn_cid;
41262306a36Sopenharmony_ci	struct beiscsi_endpoint *ep;
41362306a36Sopenharmony_ci	unsigned short login_in_progress;
41462306a36Sopenharmony_ci	struct wrb_handle *plogin_wrb_handle;
41562306a36Sopenharmony_ci	struct sgl_handle *plogin_sgl_handle;
41662306a36Sopenharmony_ci	struct beiscsi_session *beiscsi_sess;
41762306a36Sopenharmony_ci	struct iscsi_task *task;
41862306a36Sopenharmony_ci};
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci/* This structure is used by the chip */
42162306a36Sopenharmony_cistruct pdu_data_out {
42262306a36Sopenharmony_ci	u32 dw[12];
42362306a36Sopenharmony_ci};
42462306a36Sopenharmony_ci/**
42562306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
42662306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
42762306a36Sopenharmony_ci */
42862306a36Sopenharmony_cistruct amap_pdu_data_out {
42962306a36Sopenharmony_ci	u8 opcode[6];		/* opcode */
43062306a36Sopenharmony_ci	u8 rsvd0[2];		/* should be 0 */
43162306a36Sopenharmony_ci	u8 rsvd1[7];
43262306a36Sopenharmony_ci	u8 final_bit;		/* F bit */
43362306a36Sopenharmony_ci	u8 rsvd2[16];
43462306a36Sopenharmony_ci	u8 ahs_length[8];	/* no AHS */
43562306a36Sopenharmony_ci	u8 data_len_hi[8];
43662306a36Sopenharmony_ci	u8 data_len_lo[16];	/* DataSegmentLength */
43762306a36Sopenharmony_ci	u8 lun[64];
43862306a36Sopenharmony_ci	u8 itt[32];		/* ITT; initiator task tag */
43962306a36Sopenharmony_ci	u8 ttt[32];		/* TTT; valid for R2T or 0xffffffff */
44062306a36Sopenharmony_ci	u8 rsvd3[32];
44162306a36Sopenharmony_ci	u8 exp_stat_sn[32];
44262306a36Sopenharmony_ci	u8 rsvd4[32];
44362306a36Sopenharmony_ci	u8 data_sn[32];
44462306a36Sopenharmony_ci	u8 buffer_offset[32];
44562306a36Sopenharmony_ci	u8 rsvd5[32];
44662306a36Sopenharmony_ci};
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_cistruct be_cmd_bhs {
44962306a36Sopenharmony_ci	struct iscsi_scsi_req iscsi_hdr;
45062306a36Sopenharmony_ci	unsigned char pad1[16];
45162306a36Sopenharmony_ci	struct pdu_data_out iscsi_data_pdu;
45262306a36Sopenharmony_ci	unsigned char pad2[BE_SENSE_INFO_SIZE -
45362306a36Sopenharmony_ci			sizeof(struct pdu_data_out)];
45462306a36Sopenharmony_ci};
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_cistruct beiscsi_io_task {
45762306a36Sopenharmony_ci	struct wrb_handle *pwrb_handle;
45862306a36Sopenharmony_ci	struct sgl_handle *psgl_handle;
45962306a36Sopenharmony_ci	struct beiscsi_conn *conn;
46062306a36Sopenharmony_ci	struct scsi_cmnd *scsi_cmnd;
46162306a36Sopenharmony_ci	int num_sg;
46262306a36Sopenharmony_ci	struct hwi_wrb_context *pwrb_context;
46362306a36Sopenharmony_ci	itt_t libiscsi_itt;
46462306a36Sopenharmony_ci	struct be_cmd_bhs *cmd_bhs;
46562306a36Sopenharmony_ci	struct be_bus_address bhs_pa;
46662306a36Sopenharmony_ci	unsigned short bhs_len;
46762306a36Sopenharmony_ci	dma_addr_t mtask_addr;
46862306a36Sopenharmony_ci	uint32_t mtask_data_count;
46962306a36Sopenharmony_ci	uint8_t wrb_type;
47062306a36Sopenharmony_ci};
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_cistruct be_nonio_bhs {
47362306a36Sopenharmony_ci	struct iscsi_hdr iscsi_hdr;
47462306a36Sopenharmony_ci	unsigned char pad1[16];
47562306a36Sopenharmony_ci	struct pdu_data_out iscsi_data_pdu;
47662306a36Sopenharmony_ci	unsigned char pad2[BE_SENSE_INFO_SIZE -
47762306a36Sopenharmony_ci			sizeof(struct pdu_data_out)];
47862306a36Sopenharmony_ci};
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_cistruct be_status_bhs {
48162306a36Sopenharmony_ci	struct iscsi_scsi_req iscsi_hdr;
48262306a36Sopenharmony_ci	unsigned char pad1[16];
48362306a36Sopenharmony_ci	/**
48462306a36Sopenharmony_ci	 * The plus 2 below is to hold the sense info length that gets
48562306a36Sopenharmony_ci	 * DMA'ed by RxULP
48662306a36Sopenharmony_ci	 */
48762306a36Sopenharmony_ci	unsigned char sense_info[BE_SENSE_INFO_SIZE];
48862306a36Sopenharmony_ci};
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_cistruct iscsi_sge {
49162306a36Sopenharmony_ci	u32 dw[4];
49262306a36Sopenharmony_ci};
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci/**
49562306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
49662306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
49762306a36Sopenharmony_ci */
49862306a36Sopenharmony_cistruct amap_iscsi_sge {
49962306a36Sopenharmony_ci	u8 addr_hi[32];
50062306a36Sopenharmony_ci	u8 addr_lo[32];
50162306a36Sopenharmony_ci	u8 sge_offset[22];	/* DWORD 2 */
50262306a36Sopenharmony_ci	u8 rsvd0[9];		/* DWORD 2 */
50362306a36Sopenharmony_ci	u8 last_sge;		/* DWORD 2 */
50462306a36Sopenharmony_ci	u8 len[17];		/* DWORD 3 */
50562306a36Sopenharmony_ci	u8 rsvd1[15];		/* DWORD 3 */
50662306a36Sopenharmony_ci};
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistruct beiscsi_offload_params {
50962306a36Sopenharmony_ci	u32 dw[6];
51062306a36Sopenharmony_ci};
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci#define OFFLD_PARAMS_ERL	0x00000003
51362306a36Sopenharmony_ci#define OFFLD_PARAMS_DDE	0x00000004
51462306a36Sopenharmony_ci#define OFFLD_PARAMS_HDE	0x00000008
51562306a36Sopenharmony_ci#define OFFLD_PARAMS_IR2T	0x00000010
51662306a36Sopenharmony_ci#define OFFLD_PARAMS_IMD	0x00000020
51762306a36Sopenharmony_ci#define OFFLD_PARAMS_DATA_SEQ_INORDER   0x00000040
51862306a36Sopenharmony_ci#define OFFLD_PARAMS_PDU_SEQ_INORDER    0x00000080
51962306a36Sopenharmony_ci#define OFFLD_PARAMS_MAX_R2T 0x00FFFF00
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci/**
52262306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
52362306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
52462306a36Sopenharmony_ci */
52562306a36Sopenharmony_cistruct amap_beiscsi_offload_params {
52662306a36Sopenharmony_ci	u8 max_burst_length[32];
52762306a36Sopenharmony_ci	u8 max_send_data_segment_length[32];
52862306a36Sopenharmony_ci	u8 first_burst_length[32];
52962306a36Sopenharmony_ci	u8 erl[2];
53062306a36Sopenharmony_ci	u8 dde[1];
53162306a36Sopenharmony_ci	u8 hde[1];
53262306a36Sopenharmony_ci	u8 ir2t[1];
53362306a36Sopenharmony_ci	u8 imd[1];
53462306a36Sopenharmony_ci	u8 data_seq_inorder[1];
53562306a36Sopenharmony_ci	u8 pdu_seq_inorder[1];
53662306a36Sopenharmony_ci	u8 max_r2t[16];
53762306a36Sopenharmony_ci	u8 pad[8];
53862306a36Sopenharmony_ci	u8 exp_statsn[32];
53962306a36Sopenharmony_ci	u8 max_recv_data_segment_length[32];
54062306a36Sopenharmony_ci};
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_cistruct hd_async_handle {
54362306a36Sopenharmony_ci	struct list_head link;
54462306a36Sopenharmony_ci	struct be_bus_address pa;
54562306a36Sopenharmony_ci	void *pbuffer;
54662306a36Sopenharmony_ci	u32 buffer_len;
54762306a36Sopenharmony_ci	u16 index;
54862306a36Sopenharmony_ci	u16 cri;
54962306a36Sopenharmony_ci	u8 is_header;
55062306a36Sopenharmony_ci	u8 is_final;
55162306a36Sopenharmony_ci	u8 in_use;
55262306a36Sopenharmony_ci};
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_ci#define BEISCSI_ASYNC_HDQ_SIZE(phba, ulp) \
55562306a36Sopenharmony_ci	(BEISCSI_GET_CID_COUNT((phba), (ulp)) * 2)
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci/**
55862306a36Sopenharmony_ci * This has list of async PDUs that are waiting to be processed.
55962306a36Sopenharmony_ci * Buffers live in this list for a brief duration before they get
56062306a36Sopenharmony_ci * processed and posted back to hardware.
56162306a36Sopenharmony_ci * Note that we don't really need one cri_wait_queue per async_entry.
56262306a36Sopenharmony_ci * We need one cri_wait_queue per CRI. Its easier to manage if this
56362306a36Sopenharmony_ci * is tagged along with the async_entry.
56462306a36Sopenharmony_ci */
56562306a36Sopenharmony_cistruct hd_async_entry {
56662306a36Sopenharmony_ci	struct cri_wait_queue {
56762306a36Sopenharmony_ci		unsigned short hdr_len;
56862306a36Sopenharmony_ci		unsigned int bytes_received;
56962306a36Sopenharmony_ci		unsigned int bytes_needed;
57062306a36Sopenharmony_ci		struct list_head list;
57162306a36Sopenharmony_ci	} wq;
57262306a36Sopenharmony_ci	/* handles posted to FW resides here */
57362306a36Sopenharmony_ci	struct hd_async_handle *header;
57462306a36Sopenharmony_ci	struct hd_async_handle *data;
57562306a36Sopenharmony_ci};
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_cistruct hd_async_buf_context {
57862306a36Sopenharmony_ci	struct be_bus_address pa_base;
57962306a36Sopenharmony_ci	void *va_base;
58062306a36Sopenharmony_ci	void *ring_base;
58162306a36Sopenharmony_ci	struct hd_async_handle *handle_base;
58262306a36Sopenharmony_ci	u32 buffer_size;
58362306a36Sopenharmony_ci	u16 pi;
58462306a36Sopenharmony_ci};
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci/**
58762306a36Sopenharmony_ci * hd_async_context is declared for each ULP supporting iSCSI function.
58862306a36Sopenharmony_ci */
58962306a36Sopenharmony_cistruct hd_async_context {
59062306a36Sopenharmony_ci	struct hd_async_buf_context async_header;
59162306a36Sopenharmony_ci	struct hd_async_buf_context async_data;
59262306a36Sopenharmony_ci	u16 num_entries;
59362306a36Sopenharmony_ci	/**
59462306a36Sopenharmony_ci	 * When unsol PDU is in, it needs to be chained till all the bytes are
59562306a36Sopenharmony_ci	 * received and then processing is done. hd_async_entry is created
59662306a36Sopenharmony_ci	 * based on the cid_count for each ULP. When unsol PDU comes in based
59762306a36Sopenharmony_ci	 * on the conn_id it needs to be added to the correct async_entry wq.
59862306a36Sopenharmony_ci	 * Below defined cid_to_async_cri_map is used to reterive the
59962306a36Sopenharmony_ci	 * async_cri_map for a particular connection.
60062306a36Sopenharmony_ci	 *
60162306a36Sopenharmony_ci	 * This array is initialized after beiscsi_create_wrb_rings returns.
60262306a36Sopenharmony_ci	 *
60362306a36Sopenharmony_ci	 * - this method takes more memory space, fixed to 2K
60462306a36Sopenharmony_ci	 * - any support for connections greater than this the array size needs
60562306a36Sopenharmony_ci	 * to be incremented
60662306a36Sopenharmony_ci	 */
60762306a36Sopenharmony_ci#define BE_GET_ASYNC_CRI_FROM_CID(cid) (pasync_ctx->cid_to_async_cri_map[cid])
60862306a36Sopenharmony_ci	unsigned short cid_to_async_cri_map[BE_MAX_SESSION];
60962306a36Sopenharmony_ci	/**
61062306a36Sopenharmony_ci	 * This is a variable size array. Don`t add anything after this field!!
61162306a36Sopenharmony_ci	 */
61262306a36Sopenharmony_ci	struct hd_async_entry *async_entry;
61362306a36Sopenharmony_ci};
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_cistruct i_t_dpdu_cqe {
61662306a36Sopenharmony_ci	u32 dw[4];
61762306a36Sopenharmony_ci} __packed;
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci/**
62062306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
62162306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
62262306a36Sopenharmony_ci */
62362306a36Sopenharmony_cistruct amap_i_t_dpdu_cqe {
62462306a36Sopenharmony_ci	u8 db_addr_hi[32];
62562306a36Sopenharmony_ci	u8 db_addr_lo[32];
62662306a36Sopenharmony_ci	u8 code[6];
62762306a36Sopenharmony_ci	u8 cid[10];
62862306a36Sopenharmony_ci	u8 dpl[16];
62962306a36Sopenharmony_ci	u8 index[16];
63062306a36Sopenharmony_ci	u8 num_cons[10];
63162306a36Sopenharmony_ci	u8 rsvd0[4];
63262306a36Sopenharmony_ci	u8 final;
63362306a36Sopenharmony_ci	u8 valid;
63462306a36Sopenharmony_ci} __packed;
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_cistruct amap_i_t_dpdu_cqe_v2 {
63762306a36Sopenharmony_ci	u8 db_addr_hi[32];  /* DWORD 0 */
63862306a36Sopenharmony_ci	u8 db_addr_lo[32];  /* DWORD 1 */
63962306a36Sopenharmony_ci	u8 code[6]; /* DWORD 2 */
64062306a36Sopenharmony_ci	u8 num_cons; /* DWORD 2*/
64162306a36Sopenharmony_ci	u8 rsvd0[8]; /* DWORD 2 */
64262306a36Sopenharmony_ci	u8 dpl[17]; /* DWORD 2 */
64362306a36Sopenharmony_ci	u8 index[16]; /* DWORD 3 */
64462306a36Sopenharmony_ci	u8 cid[13]; /* DWORD 3 */
64562306a36Sopenharmony_ci	u8 rsvd1; /* DWORD 3 */
64662306a36Sopenharmony_ci	u8 final; /* DWORD 3 */
64762306a36Sopenharmony_ci	u8 valid; /* DWORD 3 */
64862306a36Sopenharmony_ci} __packed;
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci#define CQE_VALID_MASK	0x80000000
65162306a36Sopenharmony_ci#define CQE_CODE_MASK	0x0000003F
65262306a36Sopenharmony_ci#define CQE_CID_MASK	0x0000FFC0
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci#define EQE_VALID_MASK		0x00000001
65562306a36Sopenharmony_ci#define EQE_MAJORCODE_MASK	0x0000000E
65662306a36Sopenharmony_ci#define EQE_RESID_MASK		0xFFFF0000
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_cistruct be_eq_entry {
65962306a36Sopenharmony_ci	u32 dw[1];
66062306a36Sopenharmony_ci} __packed;
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci/**
66362306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
66462306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
66562306a36Sopenharmony_ci */
66662306a36Sopenharmony_cistruct amap_eq_entry {
66762306a36Sopenharmony_ci	u8 valid;		/* DWORD 0 */
66862306a36Sopenharmony_ci	u8 major_code[3];	/* DWORD 0 */
66962306a36Sopenharmony_ci	u8 minor_code[12];	/* DWORD 0 */
67062306a36Sopenharmony_ci	u8 resource_id[16];	/* DWORD 0 */
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_ci} __packed;
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_cistruct cq_db {
67562306a36Sopenharmony_ci	u32 dw[1];
67662306a36Sopenharmony_ci} __packed;
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ci/**
67962306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
68062306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
68162306a36Sopenharmony_ci */
68262306a36Sopenharmony_cistruct amap_cq_db {
68362306a36Sopenharmony_ci	u8 qid[10];
68462306a36Sopenharmony_ci	u8 event[1];
68562306a36Sopenharmony_ci	u8 rsvd0[5];
68662306a36Sopenharmony_ci	u8 num_popped[13];
68762306a36Sopenharmony_ci	u8 rearm[1];
68862306a36Sopenharmony_ci	u8 rsvd1[2];
68962306a36Sopenharmony_ci} __packed;
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_civoid beiscsi_process_eq(struct beiscsi_hba *phba);
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_cistruct iscsi_wrb {
69462306a36Sopenharmony_ci	u32 dw[16];
69562306a36Sopenharmony_ci} __packed;
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_ci#define WRB_TYPE_MASK 0xF0000000
69862306a36Sopenharmony_ci#define SKH_WRB_TYPE_OFFSET 27
69962306a36Sopenharmony_ci#define BE_WRB_TYPE_OFFSET  28
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_ci#define ADAPTER_SET_WRB_TYPE(pwrb, wrb_type, type_offset) \
70262306a36Sopenharmony_ci		(pwrb->dw[0] |= (wrb_type << type_offset))
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci/**
70562306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
70662306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
70762306a36Sopenharmony_ci */
70862306a36Sopenharmony_cistruct amap_iscsi_wrb {
70962306a36Sopenharmony_ci	u8 lun[14];		/* DWORD 0 */
71062306a36Sopenharmony_ci	u8 lt;			/* DWORD 0 */
71162306a36Sopenharmony_ci	u8 invld;		/* DWORD 0 */
71262306a36Sopenharmony_ci	u8 wrb_idx[8];		/* DWORD 0 */
71362306a36Sopenharmony_ci	u8 dsp;			/* DWORD 0 */
71462306a36Sopenharmony_ci	u8 dmsg;		/* DWORD 0 */
71562306a36Sopenharmony_ci	u8 undr_run;		/* DWORD 0 */
71662306a36Sopenharmony_ci	u8 over_run;		/* DWORD 0 */
71762306a36Sopenharmony_ci	u8 type[4];		/* DWORD 0 */
71862306a36Sopenharmony_ci	u8 ptr2nextwrb[8];	/* DWORD 1 */
71962306a36Sopenharmony_ci	u8 r2t_exp_dtl[24];	/* DWORD 1 */
72062306a36Sopenharmony_ci	u8 sgl_icd_idx[12];	/* DWORD 2 */
72162306a36Sopenharmony_ci	u8 rsvd0[20];		/* DWORD 2 */
72262306a36Sopenharmony_ci	u8 exp_data_sn[32];	/* DWORD 3 */
72362306a36Sopenharmony_ci	u8 iscsi_bhs_addr_hi[32];	/* DWORD 4 */
72462306a36Sopenharmony_ci	u8 iscsi_bhs_addr_lo[32];	/* DWORD 5 */
72562306a36Sopenharmony_ci	u8 cmdsn_itt[32];	/* DWORD 6 */
72662306a36Sopenharmony_ci	u8 dif_ref_tag[32];	/* DWORD 7 */
72762306a36Sopenharmony_ci	u8 sge0_addr_hi[32];	/* DWORD 8 */
72862306a36Sopenharmony_ci	u8 sge0_addr_lo[32];	/* DWORD 9  */
72962306a36Sopenharmony_ci	u8 sge0_offset[22];	/* DWORD 10 */
73062306a36Sopenharmony_ci	u8 pbs;			/* DWORD 10 */
73162306a36Sopenharmony_ci	u8 dif_mode[2];		/* DWORD 10 */
73262306a36Sopenharmony_ci	u8 rsvd1[6];		/* DWORD 10 */
73362306a36Sopenharmony_ci	u8 sge0_last;		/* DWORD 10 */
73462306a36Sopenharmony_ci	u8 sge0_len[17];	/* DWORD 11 */
73562306a36Sopenharmony_ci	u8 dif_meta_tag[14];	/* DWORD 11 */
73662306a36Sopenharmony_ci	u8 sge0_in_ddr;		/* DWORD 11 */
73762306a36Sopenharmony_ci	u8 sge1_addr_hi[32];	/* DWORD 12 */
73862306a36Sopenharmony_ci	u8 sge1_addr_lo[32];	/* DWORD 13 */
73962306a36Sopenharmony_ci	u8 sge1_r2t_offset[22];	/* DWORD 14 */
74062306a36Sopenharmony_ci	u8 rsvd2[9];		/* DWORD 14 */
74162306a36Sopenharmony_ci	u8 sge1_last;		/* DWORD 14 */
74262306a36Sopenharmony_ci	u8 sge1_len[17];	/* DWORD 15 */
74362306a36Sopenharmony_ci	u8 ref_sgl_icd_idx[12];	/* DWORD 15 */
74462306a36Sopenharmony_ci	u8 rsvd3[2];		/* DWORD 15 */
74562306a36Sopenharmony_ci	u8 sge1_in_ddr;		/* DWORD 15 */
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci} __packed;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_cistruct amap_iscsi_wrb_v2 {
75062306a36Sopenharmony_ci	u8 r2t_exp_dtl[25]; /* DWORD 0 */
75162306a36Sopenharmony_ci	u8 rsvd0[2];    /* DWORD 0*/
75262306a36Sopenharmony_ci	u8 type[5];     /* DWORD 0 */
75362306a36Sopenharmony_ci	u8 ptr2nextwrb[8];  /* DWORD 1 */
75462306a36Sopenharmony_ci	u8 wrb_idx[8];      /* DWORD 1 */
75562306a36Sopenharmony_ci	u8 lun[16];     /* DWORD 1 */
75662306a36Sopenharmony_ci	u8 sgl_idx[16]; /* DWORD 2 */
75762306a36Sopenharmony_ci	u8 ref_sgl_icd_idx[16]; /* DWORD 2 */
75862306a36Sopenharmony_ci	u8 exp_data_sn[32]; /* DWORD 3 */
75962306a36Sopenharmony_ci	u8 iscsi_bhs_addr_hi[32];   /* DWORD 4 */
76062306a36Sopenharmony_ci	u8 iscsi_bhs_addr_lo[32];   /* DWORD 5 */
76162306a36Sopenharmony_ci	u8 cq_id[16];   /* DWORD 6 */
76262306a36Sopenharmony_ci	u8 rsvd1[16];   /* DWORD 6 */
76362306a36Sopenharmony_ci	u8 cmdsn_itt[32];   /* DWORD 7 */
76462306a36Sopenharmony_ci	u8 sge0_addr_hi[32];    /* DWORD 8 */
76562306a36Sopenharmony_ci	u8 sge0_addr_lo[32];    /* DWORD 9 */
76662306a36Sopenharmony_ci	u8 sge0_offset[24]; /* DWORD 10 */
76762306a36Sopenharmony_ci	u8 rsvd2[7];    /* DWORD 10 */
76862306a36Sopenharmony_ci	u8 sge0_last;   /* DWORD 10 */
76962306a36Sopenharmony_ci	u8 sge0_len[17];    /* DWORD 11 */
77062306a36Sopenharmony_ci	u8 rsvd3[7];    /* DWORD 11 */
77162306a36Sopenharmony_ci	u8 diff_enbl;   /* DWORD 11 */
77262306a36Sopenharmony_ci	u8 u_run;       /* DWORD 11 */
77362306a36Sopenharmony_ci	u8 o_run;       /* DWORD 11 */
77462306a36Sopenharmony_ci	u8 invld;     /* DWORD 11 */
77562306a36Sopenharmony_ci	u8 dsp;         /* DWORD 11 */
77662306a36Sopenharmony_ci	u8 dmsg;        /* DWORD 11 */
77762306a36Sopenharmony_ci	u8 rsvd4;       /* DWORD 11 */
77862306a36Sopenharmony_ci	u8 lt;          /* DWORD 11 */
77962306a36Sopenharmony_ci	u8 sge1_addr_hi[32];    /* DWORD 12 */
78062306a36Sopenharmony_ci	u8 sge1_addr_lo[32];    /* DWORD 13 */
78162306a36Sopenharmony_ci	u8 sge1_r2t_offset[24]; /* DWORD 14 */
78262306a36Sopenharmony_ci	u8 rsvd5[7];    /* DWORD 14 */
78362306a36Sopenharmony_ci	u8 sge1_last;   /* DWORD 14 */
78462306a36Sopenharmony_ci	u8 sge1_len[17];    /* DWORD 15 */
78562306a36Sopenharmony_ci	u8 rsvd6[15];   /* DWORD 15 */
78662306a36Sopenharmony_ci} __packed;
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_cistruct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid,
79062306a36Sopenharmony_ci				     struct hwi_wrb_context **pcontext);
79162306a36Sopenharmony_civoid
79262306a36Sopenharmony_cifree_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle);
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_civoid beiscsi_free_mgmt_task_handles(struct beiscsi_conn *beiscsi_conn,
79562306a36Sopenharmony_ci				     struct iscsi_task *task);
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_civoid hwi_ring_cq_db(struct beiscsi_hba *phba,
79862306a36Sopenharmony_ci		     unsigned int id, unsigned int num_processed,
79962306a36Sopenharmony_ci		     unsigned char rearm);
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ciunsigned int beiscsi_process_cq(struct be_eq_obj *pbe_eq, int budget);
80262306a36Sopenharmony_civoid beiscsi_process_mcc_cq(struct beiscsi_hba *phba);
80362306a36Sopenharmony_ci
80462306a36Sopenharmony_cistruct pdu_nop_out {
80562306a36Sopenharmony_ci	u32 dw[12];
80662306a36Sopenharmony_ci};
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci/**
80962306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
81062306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
81162306a36Sopenharmony_ci */
81262306a36Sopenharmony_cistruct amap_pdu_nop_out {
81362306a36Sopenharmony_ci	u8 opcode[6];		/* opcode 0x00 */
81462306a36Sopenharmony_ci	u8 i_bit;		/* I Bit */
81562306a36Sopenharmony_ci	u8 x_bit;		/* reserved; should be 0 */
81662306a36Sopenharmony_ci	u8 fp_bit_filler1[7];
81762306a36Sopenharmony_ci	u8 f_bit;		/* always 1 */
81862306a36Sopenharmony_ci	u8 reserved1[16];
81962306a36Sopenharmony_ci	u8 ahs_length[8];	/* no AHS */
82062306a36Sopenharmony_ci	u8 data_len_hi[8];
82162306a36Sopenharmony_ci	u8 data_len_lo[16];	/* DataSegmentLength */
82262306a36Sopenharmony_ci	u8 lun[64];
82362306a36Sopenharmony_ci	u8 itt[32];		/* initiator id for ping or 0xffffffff */
82462306a36Sopenharmony_ci	u8 ttt[32];		/* target id for ping or 0xffffffff */
82562306a36Sopenharmony_ci	u8 cmd_sn[32];
82662306a36Sopenharmony_ci	u8 exp_stat_sn[32];
82762306a36Sopenharmony_ci	u8 reserved5[128];
82862306a36Sopenharmony_ci};
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci#define PDUBASE_OPCODE_MASK	0x0000003F
83162306a36Sopenharmony_ci#define PDUBASE_DATALENHI_MASK	0x0000FF00
83262306a36Sopenharmony_ci#define PDUBASE_DATALENLO_MASK	0xFFFF0000
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_cistruct pdu_base {
83562306a36Sopenharmony_ci	u32 dw[16];
83662306a36Sopenharmony_ci} __packed;
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci/**
83962306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
84062306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
84162306a36Sopenharmony_ci */
84262306a36Sopenharmony_cistruct amap_pdu_base {
84362306a36Sopenharmony_ci	u8 opcode[6];
84462306a36Sopenharmony_ci	u8 i_bit;		/* immediate bit */
84562306a36Sopenharmony_ci	u8 x_bit;		/* reserved, always 0 */
84662306a36Sopenharmony_ci	u8 reserved1[24];	/* opcode-specific fields */
84762306a36Sopenharmony_ci	u8 ahs_length[8];	/* length units is 4 byte words */
84862306a36Sopenharmony_ci	u8 data_len_hi[8];
84962306a36Sopenharmony_ci	u8 data_len_lo[16];	/* DatasegmentLength */
85062306a36Sopenharmony_ci	u8 lun[64];		/* lun or opcode-specific fields */
85162306a36Sopenharmony_ci	u8 itt[32];		/* initiator task tag */
85262306a36Sopenharmony_ci	u8 reserved4[224];
85362306a36Sopenharmony_ci};
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_cistruct iscsi_target_context_update_wrb {
85662306a36Sopenharmony_ci	u32 dw[16];
85762306a36Sopenharmony_ci} __packed;
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci/**
86062306a36Sopenharmony_ci * Pseudo amap definition in which each bit of the actual structure is defined
86162306a36Sopenharmony_ci * as a byte: used to calculate offset/shift/mask of each field
86262306a36Sopenharmony_ci */
86362306a36Sopenharmony_ci#define BE_TGT_CTX_UPDT_CMD 0x07
86462306a36Sopenharmony_cistruct amap_iscsi_target_context_update_wrb {
86562306a36Sopenharmony_ci	u8 lun[14];		/* DWORD 0 */
86662306a36Sopenharmony_ci	u8 lt;			/* DWORD 0 */
86762306a36Sopenharmony_ci	u8 invld;		/* DWORD 0 */
86862306a36Sopenharmony_ci	u8 wrb_idx[8];		/* DWORD 0 */
86962306a36Sopenharmony_ci	u8 dsp;			/* DWORD 0 */
87062306a36Sopenharmony_ci	u8 dmsg;		/* DWORD 0 */
87162306a36Sopenharmony_ci	u8 undr_run;		/* DWORD 0 */
87262306a36Sopenharmony_ci	u8 over_run;		/* DWORD 0 */
87362306a36Sopenharmony_ci	u8 type[4];		/* DWORD 0 */
87462306a36Sopenharmony_ci	u8 ptr2nextwrb[8];	/* DWORD 1 */
87562306a36Sopenharmony_ci	u8 max_burst_length[19];	/* DWORD 1 */
87662306a36Sopenharmony_ci	u8 rsvd0[5];		/* DWORD 1 */
87762306a36Sopenharmony_ci	u8 rsvd1[15];		/* DWORD 2 */
87862306a36Sopenharmony_ci	u8 max_send_data_segment_length[17];	/* DWORD 2 */
87962306a36Sopenharmony_ci	u8 first_burst_length[14];	/* DWORD 3 */
88062306a36Sopenharmony_ci	u8 rsvd2[2];		/* DWORD 3 */
88162306a36Sopenharmony_ci	u8 tx_wrbindex_drv_msg[8];	/* DWORD 3 */
88262306a36Sopenharmony_ci	u8 rsvd3[5];		/* DWORD 3 */
88362306a36Sopenharmony_ci	u8 session_state[3];	/* DWORD 3 */
88462306a36Sopenharmony_ci	u8 rsvd4[16];		/* DWORD 4 */
88562306a36Sopenharmony_ci	u8 tx_jumbo;		/* DWORD 4 */
88662306a36Sopenharmony_ci	u8 hde;			/* DWORD 4 */
88762306a36Sopenharmony_ci	u8 dde;			/* DWORD 4 */
88862306a36Sopenharmony_ci	u8 erl[2];		/* DWORD 4 */
88962306a36Sopenharmony_ci	u8 domain_id[5];		/* DWORD 4 */
89062306a36Sopenharmony_ci	u8 mode;		/* DWORD 4 */
89162306a36Sopenharmony_ci	u8 imd;			/* DWORD 4 */
89262306a36Sopenharmony_ci	u8 ir2t;		/* DWORD 4 */
89362306a36Sopenharmony_ci	u8 notpredblq[2];	/* DWORD 4 */
89462306a36Sopenharmony_ci	u8 compltonack;		/* DWORD 4 */
89562306a36Sopenharmony_ci	u8 stat_sn[32];		/* DWORD 5 */
89662306a36Sopenharmony_ci	u8 pad_buffer_addr_hi[32];	/* DWORD 6 */
89762306a36Sopenharmony_ci	u8 pad_buffer_addr_lo[32];	/* DWORD 7 */
89862306a36Sopenharmony_ci	u8 pad_addr_hi[32];	/* DWORD 8 */
89962306a36Sopenharmony_ci	u8 pad_addr_lo[32];	/* DWORD 9 */
90062306a36Sopenharmony_ci	u8 rsvd5[32];		/* DWORD 10 */
90162306a36Sopenharmony_ci	u8 rsvd6[32];		/* DWORD 11 */
90262306a36Sopenharmony_ci	u8 rsvd7[32];		/* DWORD 12 */
90362306a36Sopenharmony_ci	u8 rsvd8[32];		/* DWORD 13 */
90462306a36Sopenharmony_ci	u8 rsvd9[32];		/* DWORD 14 */
90562306a36Sopenharmony_ci	u8 rsvd10[32];		/* DWORD 15 */
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_ci} __packed;
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci#define BEISCSI_MAX_RECV_DATASEG_LEN    (64 * 1024)
91062306a36Sopenharmony_ci#define BEISCSI_MAX_CXNS    1
91162306a36Sopenharmony_cistruct amap_iscsi_target_context_update_wrb_v2 {
91262306a36Sopenharmony_ci	u8 max_burst_length[24];    /* DWORD 0 */
91362306a36Sopenharmony_ci	u8 rsvd0[3];    /* DWORD 0 */
91462306a36Sopenharmony_ci	u8 type[5];     /* DWORD 0 */
91562306a36Sopenharmony_ci	u8 ptr2nextwrb[8];  /* DWORD 1 */
91662306a36Sopenharmony_ci	u8 wrb_idx[8];      /* DWORD 1 */
91762306a36Sopenharmony_ci	u8 rsvd1[16];       /* DWORD 1 */
91862306a36Sopenharmony_ci	u8 max_send_data_segment_length[24];    /* DWORD 2 */
91962306a36Sopenharmony_ci	u8 rsvd2[8];    /* DWORD 2 */
92062306a36Sopenharmony_ci	u8 first_burst_length[24]; /* DWORD 3 */
92162306a36Sopenharmony_ci	u8 rsvd3[8]; /* DOWRD 3 */
92262306a36Sopenharmony_ci	u8 max_r2t[16]; /* DWORD 4 */
92362306a36Sopenharmony_ci	u8 rsvd4;       /* DWORD 4 */
92462306a36Sopenharmony_ci	u8 hde;         /* DWORD 4 */
92562306a36Sopenharmony_ci	u8 dde;         /* DWORD 4 */
92662306a36Sopenharmony_ci	u8 erl[2];      /* DWORD 4 */
92762306a36Sopenharmony_ci	u8 rsvd5[6];    /* DWORD 4 */
92862306a36Sopenharmony_ci	u8 imd;         /* DWORD 4 */
92962306a36Sopenharmony_ci	u8 ir2t;        /* DWORD 4 */
93062306a36Sopenharmony_ci	u8 rsvd6[3];    /* DWORD 4 */
93162306a36Sopenharmony_ci	u8 stat_sn[32];     /* DWORD 5 */
93262306a36Sopenharmony_ci	u8 rsvd7[32];   /* DWORD 6 */
93362306a36Sopenharmony_ci	u8 rsvd8[32];   /* DWORD 7 */
93462306a36Sopenharmony_ci	u8 max_recv_dataseg_len[24];    /* DWORD 8 */
93562306a36Sopenharmony_ci	u8 rsvd9[8]; /* DWORD 8 */
93662306a36Sopenharmony_ci	u8 rsvd10[32];   /* DWORD 9 */
93762306a36Sopenharmony_ci	u8 rsvd11[32];   /* DWORD 10 */
93862306a36Sopenharmony_ci	u8 max_cxns[16]; /* DWORD 11 */
93962306a36Sopenharmony_ci	u8 rsvd12[11]; /* DWORD  11*/
94062306a36Sopenharmony_ci	u8 invld; /* DWORD 11 */
94162306a36Sopenharmony_ci	u8 rsvd13;/* DWORD 11*/
94262306a36Sopenharmony_ci	u8 dmsg; /* DWORD 11 */
94362306a36Sopenharmony_ci	u8 data_seq_inorder; /* DWORD 11 */
94462306a36Sopenharmony_ci	u8 pdu_seq_inorder; /* DWORD 11 */
94562306a36Sopenharmony_ci	u8 rsvd14[32]; /*DWORD 12 */
94662306a36Sopenharmony_ci	u8 rsvd15[32]; /* DWORD 13 */
94762306a36Sopenharmony_ci	u8 rsvd16[32]; /* DWORD 14 */
94862306a36Sopenharmony_ci	u8 rsvd17[32]; /* DWORD 15 */
94962306a36Sopenharmony_ci} __packed;
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_cistruct be_ring {
95362306a36Sopenharmony_ci	u32 pages;		/* queue size in pages */
95462306a36Sopenharmony_ci	u32 id;			/* queue id assigned by beklib */
95562306a36Sopenharmony_ci	u32 num;		/* number of elements in queue */
95662306a36Sopenharmony_ci	u32 cidx;		/* consumer index */
95762306a36Sopenharmony_ci	u32 pidx;		/* producer index -- not used by most rings */
95862306a36Sopenharmony_ci	u32 item_size;		/* size in bytes of one object */
95962306a36Sopenharmony_ci	u8 ulp_num;	/* ULP to which CID binded */
96062306a36Sopenharmony_ci	u16 register_set;
96162306a36Sopenharmony_ci	u16 doorbell_format;
96262306a36Sopenharmony_ci	u32 doorbell_offset;
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci	void *va;		/* The virtual address of the ring.  This
96562306a36Sopenharmony_ci				 * should be last to allow 32 & 64 bit debugger
96662306a36Sopenharmony_ci				 * extensions to work.
96762306a36Sopenharmony_ci				 */
96862306a36Sopenharmony_ci};
96962306a36Sopenharmony_ci
97062306a36Sopenharmony_cistruct hwi_controller {
97162306a36Sopenharmony_ci	struct hwi_wrb_context *wrb_context;
97262306a36Sopenharmony_ci	struct be_ring default_pdu_hdr[BEISCSI_ULP_COUNT];
97362306a36Sopenharmony_ci	struct be_ring default_pdu_data[BEISCSI_ULP_COUNT];
97462306a36Sopenharmony_ci	struct hwi_context_memory *phwi_ctxt;
97562306a36Sopenharmony_ci};
97662306a36Sopenharmony_ci
97762306a36Sopenharmony_cienum hwh_type_enum {
97862306a36Sopenharmony_ci	HWH_TYPE_IO = 1,
97962306a36Sopenharmony_ci	HWH_TYPE_LOGOUT = 2,
98062306a36Sopenharmony_ci	HWH_TYPE_TMF = 3,
98162306a36Sopenharmony_ci	HWH_TYPE_NOP = 4,
98262306a36Sopenharmony_ci	HWH_TYPE_IO_RD = 5,
98362306a36Sopenharmony_ci	HWH_TYPE_LOGIN = 11,
98462306a36Sopenharmony_ci	HWH_TYPE_INVALID = 0xFFFFFFFF
98562306a36Sopenharmony_ci};
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_cistruct wrb_handle {
98862306a36Sopenharmony_ci	unsigned short wrb_index;
98962306a36Sopenharmony_ci	struct iscsi_task *pio_handle;
99062306a36Sopenharmony_ci	struct iscsi_wrb *pwrb;
99162306a36Sopenharmony_ci};
99262306a36Sopenharmony_ci
99362306a36Sopenharmony_cistruct hwi_context_memory {
99462306a36Sopenharmony_ci	struct be_eq_obj be_eq[MAX_CPUS];
99562306a36Sopenharmony_ci	struct be_queue_info be_cq[MAX_CPUS - 1];
99662306a36Sopenharmony_ci
99762306a36Sopenharmony_ci	struct be_queue_info *be_wrbq;
99862306a36Sopenharmony_ci	/**
99962306a36Sopenharmony_ci	 * Create array of ULP number for below entries as DEFQ
100062306a36Sopenharmony_ci	 * will be created for both ULP if iSCSI Protocol is
100162306a36Sopenharmony_ci	 * loaded on both ULP.
100262306a36Sopenharmony_ci	 */
100362306a36Sopenharmony_ci	struct be_queue_info be_def_hdrq[BEISCSI_ULP_COUNT];
100462306a36Sopenharmony_ci	struct be_queue_info be_def_dataq[BEISCSI_ULP_COUNT];
100562306a36Sopenharmony_ci	struct hd_async_context *pasync_ctx[BEISCSI_ULP_COUNT];
100662306a36Sopenharmony_ci};
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_civoid beiscsi_start_boot_work(struct beiscsi_hba *phba, unsigned int s_handle);
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci/* Logging related definitions */
101162306a36Sopenharmony_ci#define BEISCSI_LOG_INIT	0x0001	/* Initialization events */
101262306a36Sopenharmony_ci#define BEISCSI_LOG_MBOX	0x0002	/* Mailbox Events */
101362306a36Sopenharmony_ci#define BEISCSI_LOG_MISC	0x0004	/* Miscllaneous Events */
101462306a36Sopenharmony_ci#define BEISCSI_LOG_EH		0x0008	/* Error Handler */
101562306a36Sopenharmony_ci#define BEISCSI_LOG_IO		0x0010	/* IO Code Path */
101662306a36Sopenharmony_ci#define BEISCSI_LOG_CONFIG	0x0020	/* CONFIG Code Path */
101762306a36Sopenharmony_ci#define BEISCSI_LOG_ISCSI	0x0040	/* SCSI/iSCSI Protocol related Logs */
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci#define __beiscsi_log(phba, level, fmt, arg...) \
102062306a36Sopenharmony_ci	shost_printk(level, phba->shost, fmt, __LINE__, ##arg)
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci#define beiscsi_log(phba, level, mask, fmt, arg...) \
102362306a36Sopenharmony_cido { \
102462306a36Sopenharmony_ci	uint32_t log_value = phba->attr_log_enable; \
102562306a36Sopenharmony_ci		if (((mask) & log_value) || (level[1] <= '3')) \
102662306a36Sopenharmony_ci			__beiscsi_log(phba, level, fmt, ##arg); \
102762306a36Sopenharmony_ci} while (0);
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci#endif
1030