xref: /openbmc/linux/drivers/scsi/be2iscsi/be_main.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1*6e9ef509SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2942b7654SJitendra Bhivare /*
30172dc65SJitendra Bhivare  * Copyright 2017 Broadcom. All Rights Reserved.
4942b7654SJitendra Bhivare  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
56733b39aSJayamohan Kallickal  *
66733b39aSJayamohan Kallickal  * Contact Information:
760f36e04SJitendra Bhivare  * linux-drivers@broadcom.com
86733b39aSJayamohan Kallickal  */
96733b39aSJayamohan Kallickal 
106733b39aSJayamohan Kallickal #ifndef _BEISCSI_MAIN_
116733b39aSJayamohan Kallickal #define _BEISCSI_MAIN_
126733b39aSJayamohan Kallickal 
136733b39aSJayamohan Kallickal #include <linux/kernel.h>
146733b39aSJayamohan Kallickal #include <linux/pci.h>
1582c57028SRandy Dunlap #include <linux/if_ether.h>
166733b39aSJayamohan Kallickal #include <linux/in.h>
1799bc5d55SJohn Soni Jose #include <linux/ctype.h>
1899bc5d55SJohn Soni Jose #include <linux/module.h>
196733b39aSJayamohan Kallickal #include <scsi/scsi.h>
206733b39aSJayamohan Kallickal #include <scsi/scsi_cmnd.h>
216733b39aSJayamohan Kallickal #include <scsi/scsi_device.h>
226733b39aSJayamohan Kallickal #include <scsi/scsi_host.h>
236733b39aSJayamohan Kallickal #include <scsi/iscsi_proto.h>
246733b39aSJayamohan Kallickal #include <scsi/libiscsi.h>
256733b39aSJayamohan Kallickal #include <scsi/scsi_transport_iscsi.h>
266733b39aSJayamohan Kallickal 
276733b39aSJayamohan Kallickal #define DRV_NAME		"be2iscsi"
2827aa292eSJitendra Bhivare #define BUILD_STR		"11.4.0.1"
29c4f39bdaSKetan Mukadam #define BE_NAME			"Emulex OneConnect" \
302f635883SJayamohan Kallickal 				"Open-iSCSI Driver version" BUILD_STR
316733b39aSJayamohan Kallickal #define DRV_DESC		BE_NAME " " "Driver"
326733b39aSJayamohan Kallickal 
336733b39aSJayamohan Kallickal #define BE_VENDOR_ID		0x19A2
34139a1b1eSJohn Soni Jose #define ELX_VENDOR_ID		0x10DF
35f98c96b0SJayamohan Kallickal /* DEVICE ID's for BE2 */
366733b39aSJayamohan Kallickal #define BE_DEVICE_ID1		0x212
376733b39aSJayamohan Kallickal #define OC_DEVICE_ID1		0x702
386733b39aSJayamohan Kallickal #define OC_DEVICE_ID2		0x703
39f98c96b0SJayamohan Kallickal 
40f98c96b0SJayamohan Kallickal /* DEVICE ID's for BE3 */
41f98c96b0SJayamohan Kallickal #define BE_DEVICE_ID2		0x222
42bfead3b2SJayamohan Kallickal #define OC_DEVICE_ID3		0x712
436733b39aSJayamohan Kallickal 
44139a1b1eSJohn Soni Jose /* DEVICE ID for SKH */
45139a1b1eSJohn Soni Jose #define OC_SKH_ID1		0x722
46139a1b1eSJohn Soni Jose 
477da50879SJayamohan Kallickal #define BE2_IO_DEPTH		1024
487da50879SJayamohan Kallickal #define BE2_MAX_SESSIONS	256
496733b39aSJayamohan Kallickal #define BE2_TMFS		16
506733b39aSJayamohan Kallickal #define BE2_NOPOUT_REQ		16
516733b39aSJayamohan Kallickal #define BE2_SGE			32
526733b39aSJayamohan Kallickal #define BE2_DEFPDU_HDR_SZ	64
536733b39aSJayamohan Kallickal #define BE2_DEFPDU_DATA_SZ	8192
541094cf68SJitendra Bhivare #define BE2_MAX_NUM_CQ_PROC	512
556733b39aSJayamohan Kallickal 
5645efc940SJitendra Bhivare #define MAX_CPUS		64U
5722abeef0SJohn Soni Jose #define BEISCSI_MAX_NUM_CPUS	7
5822abeef0SJohn Soni Jose 
5922661e25SJayamohan Kallickal #define BEISCSI_VER_STRLEN 32
6022abeef0SJohn Soni Jose 
61aa359032SJayamohan Kallickal #define BEISCSI_SGLIST_ELEMENTS	30
626733b39aSJayamohan Kallickal 
63f3505013SJitendra Bhivare /**
64f3505013SJitendra Bhivare  * BE_INVLDT_CMD_TBL_SZ is 128 which is total number commands that can
65f3505013SJitendra Bhivare  * be invalidated at a time, consider it before changing the value of
66f3505013SJitendra Bhivare  * BEISCSI_CMD_PER_LUN.
67f3505013SJitendra Bhivare  */
686733b39aSJayamohan Kallickal #define BEISCSI_CMD_PER_LUN	128	/* scsi_host->cmd_per_lun */
6973af08e1SJayamohan Kallickal #define BEISCSI_MAX_SECTORS	1024	/* scsi_host->max_sectors */
7015a90fe0SJayamohan Kallickal #define BEISCSI_TEMPLATE_HDR_PER_CXN_SIZE 128 /* Template size per cxn */
716733b39aSJayamohan Kallickal 
726733b39aSJayamohan Kallickal #define BEISCSI_MAX_CMD_LEN	16	/* scsi_host->max_cmd_len */
736733b39aSJayamohan Kallickal #define BEISCSI_NUM_MAX_LUN	256	/* scsi_host->max_lun */
746733b39aSJayamohan Kallickal #define BEISCSI_MAX_FRAGS_INIT	192
75e9b91193SJayamohan Kallickal 
766733b39aSJayamohan Kallickal #define BE_SENSE_INFO_SIZE		258
776733b39aSJayamohan Kallickal #define BE_ISCSI_PDU_HEADER_SIZE	64
786733b39aSJayamohan Kallickal #define BE_MIN_MEM_SIZE			16384
79bfead3b2SJayamohan Kallickal #define MAX_CMD_SZ			65536
806733b39aSJayamohan Kallickal #define IIOC_SCSI_DATA                  0x05	/* Write Operation */
816733b39aSJayamohan Kallickal 
826733b39aSJayamohan Kallickal /**
836733b39aSJayamohan Kallickal  * hardware needs the async PDU buffers to be posted in multiples of 8
846733b39aSJayamohan Kallickal  * So have atleast 8 of them by default
856733b39aSJayamohan Kallickal  */
866733b39aSJayamohan Kallickal 
878a86e833SJayamohan Kallickal #define HWI_GET_ASYNC_PDU_CTX(phwi, ulp_num)	\
888a86e833SJayamohan Kallickal 	(phwi->phwi_ctxt->pasync_ctx[ulp_num])
896733b39aSJayamohan Kallickal 
906733b39aSJayamohan Kallickal /********* Memory BAR register ************/
916733b39aSJayamohan Kallickal #define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET	0xfc
926733b39aSJayamohan Kallickal /**
936733b39aSJayamohan Kallickal  * Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt
946733b39aSJayamohan Kallickal  * Disable" may still globally block interrupts in addition to individual
956733b39aSJayamohan Kallickal  * interrupt masks; a mechanism for the device driver to block all interrupts
966733b39aSJayamohan Kallickal  * atomically without having to arbitrate for the PCI Interrupt Disable bit
976733b39aSJayamohan Kallickal  * with the OS.
986733b39aSJayamohan Kallickal  */
996733b39aSJayamohan Kallickal #define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK	(1 << 29)	/* bit 29 */
1006733b39aSJayamohan Kallickal 
1016733b39aSJayamohan Kallickal /********* ISR0 Register offset **********/
1026733b39aSJayamohan Kallickal #define CEV_ISR0_OFFSET				0xC18
1036733b39aSJayamohan Kallickal #define CEV_ISR_SIZE				4
1046733b39aSJayamohan Kallickal 
1056733b39aSJayamohan Kallickal /**
1066733b39aSJayamohan Kallickal  * Macros for reading/writing a protection domain or CSR registers
1076733b39aSJayamohan Kallickal  * in BladeEngine.
1086733b39aSJayamohan Kallickal  */
1096733b39aSJayamohan Kallickal 
1106733b39aSJayamohan Kallickal #define DB_TXULP0_OFFSET 0x40
1116733b39aSJayamohan Kallickal #define DB_RXULP0_OFFSET 0xA0
1126733b39aSJayamohan Kallickal /********* Event Q door bell *************/
1136733b39aSJayamohan Kallickal #define DB_EQ_OFFSET			DB_CQ_OFFSET
114e08b3c8bSJayamohan Kallickal #define DB_EQ_RING_ID_LOW_MASK		0x1FF	/* bits 0 - 8 */
1156733b39aSJayamohan Kallickal /* Clear the interrupt for this eq */
1166733b39aSJayamohan Kallickal #define DB_EQ_CLR_SHIFT			(9)	/* bit 9 */
1176733b39aSJayamohan Kallickal /* Must be 1 */
1186733b39aSJayamohan Kallickal #define DB_EQ_EVNT_SHIFT		(10)	/* bit 10 */
119e08b3c8bSJayamohan Kallickal /* Higher Order EQ_ID bit */
120e08b3c8bSJayamohan Kallickal #define DB_EQ_RING_ID_HIGH_MASK	0x1F /* bits 11 - 15 */
121e08b3c8bSJayamohan Kallickal #define DB_EQ_HIGH_SET_SHIFT	11
122e08b3c8bSJayamohan Kallickal #define DB_EQ_HIGH_FEILD_SHIFT	9
1236733b39aSJayamohan Kallickal /* Number of event entries processed */
1246733b39aSJayamohan Kallickal #define DB_EQ_NUM_POPPED_SHIFT		(16)	/* bits 16 - 28 */
1256733b39aSJayamohan Kallickal /* Rearm bit */
1266733b39aSJayamohan Kallickal #define DB_EQ_REARM_SHIFT		(29)	/* bit 29 */
1276733b39aSJayamohan Kallickal 
1286733b39aSJayamohan Kallickal /********* Compl Q door bell *************/
1296733b39aSJayamohan Kallickal #define DB_CQ_OFFSET			0x120
130e08b3c8bSJayamohan Kallickal #define DB_CQ_RING_ID_LOW_MASK		0x3FF	/* bits 0 - 9 */
131e08b3c8bSJayamohan Kallickal /* Higher Order CQ_ID bit */
132e08b3c8bSJayamohan Kallickal #define DB_CQ_RING_ID_HIGH_MASK	0x1F /* bits 11 - 15 */
133e08b3c8bSJayamohan Kallickal #define DB_CQ_HIGH_SET_SHIFT	11
134e08b3c8bSJayamohan Kallickal #define DB_CQ_HIGH_FEILD_SHIFT	10
135e08b3c8bSJayamohan Kallickal 
1366733b39aSJayamohan Kallickal /* Number of event entries processed */
1376733b39aSJayamohan Kallickal #define DB_CQ_NUM_POPPED_SHIFT		(16)	/* bits 16 - 28 */
1386733b39aSJayamohan Kallickal /* Rearm bit */
1396733b39aSJayamohan Kallickal #define DB_CQ_REARM_SHIFT		(29)	/* bit 29 */
1406733b39aSJayamohan Kallickal 
1416733b39aSJayamohan Kallickal #define GET_HWI_CONTROLLER_WS(pc)	(pc->phwi_ctrlr)
1428a86e833SJayamohan Kallickal #define HWI_GET_DEF_BUFQ_ID(pc, ulp_num) (((struct hwi_controller *)\
1438a86e833SJayamohan Kallickal 		(GET_HWI_CONTROLLER_WS(pc)))->default_pdu_data[ulp_num].id)
1448a86e833SJayamohan Kallickal #define HWI_GET_DEF_HDRQ_ID(pc, ulp_num) (((struct hwi_controller *)\
1458a86e833SJayamohan Kallickal 		(GET_HWI_CONTROLLER_WS(pc)))->default_pdu_hdr[ulp_num].id)
1466733b39aSJayamohan Kallickal 
1476733b39aSJayamohan Kallickal #define PAGES_REQUIRED(x) \
1486733b39aSJayamohan Kallickal 	((x < PAGE_SIZE) ? 1 :  ((x + PAGE_SIZE - 1) / PAGE_SIZE))
1496733b39aSJayamohan Kallickal 
150a129d92fSJayamohan Kallickal #define MEM_DESCR_OFFSET 8
1518a86e833SJayamohan Kallickal #define BEISCSI_DEFQ_HDR 1
1528a86e833SJayamohan Kallickal #define BEISCSI_DEFQ_DATA 0
1536733b39aSJayamohan Kallickal enum be_mem_enum {
1546733b39aSJayamohan Kallickal 	HWI_MEM_ADDN_CONTEXT,
1556733b39aSJayamohan Kallickal 	HWI_MEM_WRB,
1566733b39aSJayamohan Kallickal 	HWI_MEM_WRBH,
157bfead3b2SJayamohan Kallickal 	HWI_MEM_SGLH,
1586733b39aSJayamohan Kallickal 	HWI_MEM_SGE,
159a129d92fSJayamohan Kallickal 	HWI_MEM_TEMPLATE_HDR_ULP0,
160a129d92fSJayamohan Kallickal 	HWI_MEM_ASYNC_HEADER_BUF_ULP0,	/* 6 */
1618a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_DATA_BUF_ULP0,
1628a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_HEADER_RING_ULP0,
1638a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_DATA_RING_ULP0,
1648a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_HEADER_HANDLE_ULP0,
165a129d92fSJayamohan Kallickal 	HWI_MEM_ASYNC_DATA_HANDLE_ULP0,	/* 11 */
1668a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_PDU_CONTEXT_ULP0,
167a129d92fSJayamohan Kallickal 	HWI_MEM_TEMPLATE_HDR_ULP1,
168a129d92fSJayamohan Kallickal 	HWI_MEM_ASYNC_HEADER_BUF_ULP1,	/* 14 */
1698a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_DATA_BUF_ULP1,
1708a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_HEADER_RING_ULP1,
1718a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_DATA_RING_ULP1,
1728a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_HEADER_HANDLE_ULP1,
173a129d92fSJayamohan Kallickal 	HWI_MEM_ASYNC_DATA_HANDLE_ULP1,	/* 19 */
1748a86e833SJayamohan Kallickal 	HWI_MEM_ASYNC_PDU_CONTEXT_ULP1,
1756733b39aSJayamohan Kallickal 	ISCSI_MEM_GLOBAL_HEADER,
176bfead3b2SJayamohan Kallickal 	SE_MEM_MAX
1776733b39aSJayamohan Kallickal };
1786733b39aSJayamohan Kallickal 
1796733b39aSJayamohan Kallickal struct be_bus_address32 {
1806733b39aSJayamohan Kallickal 	unsigned int address_lo;
1816733b39aSJayamohan Kallickal 	unsigned int address_hi;
1826733b39aSJayamohan Kallickal };
1836733b39aSJayamohan Kallickal 
1846733b39aSJayamohan Kallickal struct be_bus_address64 {
1856733b39aSJayamohan Kallickal 	unsigned long long address;
1866733b39aSJayamohan Kallickal };
1876733b39aSJayamohan Kallickal 
1886733b39aSJayamohan Kallickal struct be_bus_address {
1896733b39aSJayamohan Kallickal 	union {
1906733b39aSJayamohan Kallickal 		struct be_bus_address32 a32;
1916733b39aSJayamohan Kallickal 		struct be_bus_address64 a64;
1926733b39aSJayamohan Kallickal 	} u;
1936733b39aSJayamohan Kallickal };
1946733b39aSJayamohan Kallickal 
1956733b39aSJayamohan Kallickal struct mem_array {
1966733b39aSJayamohan Kallickal 	struct be_bus_address bus_address;	/* Bus address of location */
1976733b39aSJayamohan Kallickal 	void *virtual_address;		/* virtual address to the location */
1986733b39aSJayamohan Kallickal 	unsigned int size;		/* Size required by memory block */
1996733b39aSJayamohan Kallickal };
2006733b39aSJayamohan Kallickal 
2016733b39aSJayamohan Kallickal struct be_mem_descriptor {
2026733b39aSJayamohan Kallickal 	unsigned int size_in_bytes;	/* Size required by memory block */
20345efc940SJitendra Bhivare 	unsigned int num_elements;
2046733b39aSJayamohan Kallickal 	struct mem_array *mem_array;
2056733b39aSJayamohan Kallickal };
2066733b39aSJayamohan Kallickal 
2076733b39aSJayamohan Kallickal struct sgl_handle {
2086733b39aSJayamohan Kallickal 	unsigned int sgl_index;
209bfead3b2SJayamohan Kallickal 	unsigned int type;
210bfead3b2SJayamohan Kallickal 	unsigned int cid;
211bfead3b2SJayamohan Kallickal 	struct iscsi_task *task;
2126733b39aSJayamohan Kallickal 	struct iscsi_sge *pfrag;
2136733b39aSJayamohan Kallickal };
2146733b39aSJayamohan Kallickal 
2156733b39aSJayamohan Kallickal struct hba_parameters {
2166733b39aSJayamohan Kallickal 	unsigned int ios_per_ctrl;
2176733b39aSJayamohan Kallickal 	unsigned int cxns_per_ctrl;
2186733b39aSJayamohan Kallickal 	unsigned int icds_per_ctrl;
2196733b39aSJayamohan Kallickal 	unsigned int num_sge_per_io;
2206733b39aSJayamohan Kallickal 	unsigned int defpdu_hdr_sz;
2216733b39aSJayamohan Kallickal 	unsigned int defpdu_data_sz;
2226733b39aSJayamohan Kallickal 	unsigned int num_cq_entries;
2236733b39aSJayamohan Kallickal 	unsigned int num_eq_entries;
2246733b39aSJayamohan Kallickal 	unsigned int wrbs_per_cxn;
2256733b39aSJayamohan Kallickal 	unsigned int hwi_ws_sz;
2266733b39aSJayamohan Kallickal };
2276733b39aSJayamohan Kallickal 
2284eea99d5SJayamohan Kallickal #define BEISCSI_GET_ULP_FROM_CRI(phwi_ctrlr, cri) \
2294eea99d5SJayamohan Kallickal 	(phwi_ctrlr->wrb_context[cri].ulp_num)
2304eea99d5SJayamohan Kallickal struct hwi_wrb_context {
231f64d92e6SJitendra Bhivare 	spinlock_t wrb_lock;
2324eea99d5SJayamohan Kallickal 	struct wrb_handle **pwrb_handle_base;
2334eea99d5SJayamohan Kallickal 	struct wrb_handle **pwrb_handle_basestd;
2344eea99d5SJayamohan Kallickal 	struct iscsi_wrb *plast_wrb;
2354eea99d5SJayamohan Kallickal 	unsigned short alloc_index;
2364eea99d5SJayamohan Kallickal 	unsigned short free_index;
2374eea99d5SJayamohan Kallickal 	unsigned short wrb_handles_available;
2384eea99d5SJayamohan Kallickal 	unsigned short cid;
2394eea99d5SJayamohan Kallickal 	uint8_t ulp_num;	/* ULP to which CID binded */
2404eea99d5SJayamohan Kallickal 	uint32_t doorbell_offset;
2414eea99d5SJayamohan Kallickal };
2424eea99d5SJayamohan Kallickal 
2430a3db7c0SJayamohan Kallickal struct ulp_cid_info {
2440a3db7c0SJayamohan Kallickal 	unsigned short *cid_array;
2450a3db7c0SJayamohan Kallickal 	unsigned short avlbl_cids;
2460a3db7c0SJayamohan Kallickal 	unsigned short cid_alloc;
2470a3db7c0SJayamohan Kallickal 	unsigned short cid_free;
2480a3db7c0SJayamohan Kallickal };
2490a3db7c0SJayamohan Kallickal 
2504eea99d5SJayamohan Kallickal #include "be.h"
2512c9dfd36SJayamohan Kallickal #define chip_be2(phba)      (phba->generation == BE_GEN2)
2522c9dfd36SJayamohan Kallickal #define chip_be3_r(phba)    (phba->generation == BE_GEN3)
2532c9dfd36SJayamohan Kallickal #define is_chip_be2_be3r(phba) (chip_be3_r(phba) || (chip_be2(phba)))
254843ae752SJayamohan Kallickal 
255843ae752SJayamohan Kallickal #define BEISCSI_ULP0    0
256843ae752SJayamohan Kallickal #define BEISCSI_ULP1    1
257843ae752SJayamohan Kallickal #define BEISCSI_ULP_COUNT   2
258843ae752SJayamohan Kallickal #define BEISCSI_ULP0_LOADED 0x01
259843ae752SJayamohan Kallickal #define BEISCSI_ULP1_LOADED 0x02
2600a3db7c0SJayamohan Kallickal 
2610a3db7c0SJayamohan Kallickal #define BEISCSI_ULP_AVLBL_CID(phba, ulp_num) \
2620a3db7c0SJayamohan Kallickal 	(((struct ulp_cid_info *)phba->cid_array_info[ulp_num])->avlbl_cids)
2630a3db7c0SJayamohan Kallickal #define BEISCSI_ULP0_AVLBL_CID(phba) \
2640a3db7c0SJayamohan Kallickal 	BEISCSI_ULP_AVLBL_CID(phba, BEISCSI_ULP0)
2650a3db7c0SJayamohan Kallickal #define BEISCSI_ULP1_AVLBL_CID(phba) \
2660a3db7c0SJayamohan Kallickal 	BEISCSI_ULP_AVLBL_CID(phba, BEISCSI_ULP1)
2670a3db7c0SJayamohan Kallickal 
2686733b39aSJayamohan Kallickal struct beiscsi_hba {
2696733b39aSJayamohan Kallickal 	struct hba_parameters params;
2706733b39aSJayamohan Kallickal 	struct hwi_controller *phwi_ctrlr;
2716733b39aSJayamohan Kallickal 	unsigned int mem_req[SE_MEM_MAX];
2726733b39aSJayamohan Kallickal 	/* PCI BAR mapped addresses */
2736733b39aSJayamohan Kallickal 	u8 __iomem *csr_va;	/* CSR */
2746733b39aSJayamohan Kallickal 	u8 __iomem *db_va;	/* Door  Bell  */
2756733b39aSJayamohan Kallickal 	u8 __iomem *pci_va;	/* PCI Config */
2766733b39aSJayamohan Kallickal 	/* PCI representation of our HBA */
2776733b39aSJayamohan Kallickal 	struct pci_dev *pcidev;
278bfead3b2SJayamohan Kallickal 	unsigned int num_cpus;
279bfead3b2SJayamohan Kallickal 	unsigned int nxt_cqid;
28022abeef0SJohn Soni Jose 	char *msi_name[MAX_CPUS];
2816733b39aSJayamohan Kallickal 	struct be_mem_descriptor *init_mem;
2826733b39aSJayamohan Kallickal 
2836733b39aSJayamohan Kallickal 	unsigned short io_sgl_alloc_index;
2846733b39aSJayamohan Kallickal 	unsigned short io_sgl_free_index;
2856733b39aSJayamohan Kallickal 	unsigned short io_sgl_hndl_avbl;
2866733b39aSJayamohan Kallickal 	struct sgl_handle **io_sgl_hndl_base;
2876733b39aSJayamohan Kallickal 
2886733b39aSJayamohan Kallickal 	unsigned short eh_sgl_alloc_index;
2896733b39aSJayamohan Kallickal 	unsigned short eh_sgl_free_index;
2906733b39aSJayamohan Kallickal 	unsigned short eh_sgl_hndl_avbl;
2916733b39aSJayamohan Kallickal 	struct sgl_handle **eh_sgl_hndl_base;
2926733b39aSJayamohan Kallickal 	spinlock_t io_sgl_lock;
2936733b39aSJayamohan Kallickal 	spinlock_t mgmt_sgl_lock;
2948f09a3b9SJayamohan Kallickal 	spinlock_t async_pdu_lock;
2956733b39aSJayamohan Kallickal 	struct list_head hba_queue;
296a7909b39SJayamohan Kallickal #define BE_MAX_SESSION 2048
297413f3656SJitendra Bhivare #define BE_INVALID_CID 0xffff
298a7909b39SJayamohan Kallickal #define BE_SET_CID_TO_CRI(cri_index, cid) \
299a7909b39SJayamohan Kallickal 			  (phba->cid_to_cri_map[cid] = cri_index)
300a7909b39SJayamohan Kallickal #define BE_GET_CRI_FROM_CID(cid) (phba->cid_to_cri_map[cid])
301a7909b39SJayamohan Kallickal 	unsigned short cid_to_cri_map[BE_MAX_SESSION];
3020a3db7c0SJayamohan Kallickal 	struct ulp_cid_info *cid_array_info[BEISCSI_ULP_COUNT];
3036733b39aSJayamohan Kallickal 	struct iscsi_endpoint **ep_array;
304a7909b39SJayamohan Kallickal 	struct beiscsi_conn **conn_table;
3056733b39aSJayamohan Kallickal 	struct Scsi_Host *shost;
3060e43895eSMike Christie 	struct iscsi_iface *ipv4_iface;
3070e43895eSMike Christie 	struct iscsi_iface *ipv6_iface;
3086733b39aSJayamohan Kallickal 	struct {
3096733b39aSJayamohan Kallickal 		/**
3106733b39aSJayamohan Kallickal 		 * group together since they are used most frequently
3116733b39aSJayamohan Kallickal 		 * for cid to cri conversion
3126733b39aSJayamohan Kallickal 		 */
3134570f161SJitendra Bhivare #define BEISCSI_PHYS_PORT_MAX	4
3146733b39aSJayamohan Kallickal 		unsigned int phys_port;
3154570f161SJitendra Bhivare 		/* valid values of phys_port id are 0, 1, 2, 3 */
31668c26a3aSJayamohan Kallickal 		unsigned int eqid_count;
31768c26a3aSJayamohan Kallickal 		unsigned int cqid_count;
318843ae752SJayamohan Kallickal 		unsigned int iscsi_cid_start[BEISCSI_ULP_COUNT];
319843ae752SJayamohan Kallickal #define BEISCSI_GET_CID_COUNT(phba, ulp_num) \
320843ae752SJayamohan Kallickal 		(phba->fw_config.iscsi_cid_count[ulp_num])
321843ae752SJayamohan Kallickal 		unsigned int iscsi_cid_count[BEISCSI_ULP_COUNT];
322843ae752SJayamohan Kallickal 		unsigned int iscsi_icd_count[BEISCSI_ULP_COUNT];
323843ae752SJayamohan Kallickal 		unsigned int iscsi_icd_start[BEISCSI_ULP_COUNT];
324843ae752SJayamohan Kallickal 		unsigned int iscsi_chain_start[BEISCSI_ULP_COUNT];
325843ae752SJayamohan Kallickal 		unsigned int iscsi_chain_count[BEISCSI_ULP_COUNT];
3266733b39aSJayamohan Kallickal 
327bfead3b2SJayamohan Kallickal 		unsigned short iscsi_features;
328843ae752SJayamohan Kallickal 		uint16_t dual_ulp_aware;
329843ae752SJayamohan Kallickal 		unsigned long ulp_supported;
3306733b39aSJayamohan Kallickal 	} fw_config;
3316733b39aSJayamohan Kallickal 
3329122e991SJitendra Bhivare 	unsigned long state;
333d1d5ca88SJitendra Bhivare #define BEISCSI_HBA_ONLINE	0
3349122e991SJitendra Bhivare #define BEISCSI_HBA_LINK_UP	1
3359122e991SJitendra Bhivare #define BEISCSI_HBA_BOOT_FOUND	2
33650a4b824SJitendra Bhivare #define BEISCSI_HBA_BOOT_WORK	3
3376694095bSJitendra Bhivare #define BEISCSI_HBA_UER_SUPP	4
3386694095bSJitendra Bhivare #define BEISCSI_HBA_PCI_ERR	5
3396694095bSJitendra Bhivare #define BEISCSI_HBA_FW_TIMEOUT	6
3406694095bSJitendra Bhivare #define BEISCSI_HBA_IN_UE	7
3416694095bSJitendra Bhivare #define BEISCSI_HBA_IN_TPE	8
3426694095bSJitendra Bhivare 
3439122e991SJitendra Bhivare /* error bits */
3449122e991SJitendra Bhivare #define BEISCSI_HBA_IN_ERR	((1 << BEISCSI_HBA_PCI_ERR) | \
3459122e991SJitendra Bhivare 				 (1 << BEISCSI_HBA_FW_TIMEOUT) | \
3466694095bSJitendra Bhivare 				 (1 << BEISCSI_HBA_IN_UE) | \
3476694095bSJitendra Bhivare 				 (1 << BEISCSI_HBA_IN_TPE))
3489122e991SJitendra Bhivare 
34953aefe25SJitendra Bhivare 	u8 optic_state;
35010bcd47dSJitendra Bhivare 	struct delayed_work eqd_update;
35110bcd47dSJitendra Bhivare 	/* update EQ delay timer every 1000ms */
35210bcd47dSJitendra Bhivare #define BEISCSI_EQD_UPDATE_INTERVAL	1000
35310bcd47dSJitendra Bhivare 	struct timer_list hw_check;
35410bcd47dSJitendra Bhivare 	/* check for UE every 1000ms */
35510bcd47dSJitendra Bhivare #define BEISCSI_UE_DETECT_INTERVAL	1000
3566694095bSJitendra Bhivare 	u32 ue2rp;
357d1d5ca88SJitendra Bhivare 	struct delayed_work recover_port;
35810e1a44aSJitendra Bhivare 	struct work_struct sess_work;
359e175defeSJohn Soni Jose 
3606c83185aSJayamohan Kallickal 	bool mac_addr_set;
3616733b39aSJayamohan Kallickal 	u8 mac_address[ETH_ALEN];
36253aefe25SJitendra Bhivare 	u8 port_name;
363048084c2SJitendra Bhivare 	u8 port_speed;
36422661e25SJayamohan Kallickal 	char fw_ver_str[BEISCSI_VER_STRLEN];
3656733b39aSJayamohan Kallickal 	struct workqueue_struct *wq;	/* The actuak work queue */
3666733b39aSJayamohan Kallickal 	struct be_ctrl_info ctrl;
367f98c96b0SJayamohan Kallickal 	unsigned int generation;
3680e43895eSMike Christie 	unsigned int interface_handle;
3694183122dSJayamohan Kallickal 
37073af08e1SJayamohan Kallickal 	struct be_aic_obj aic_obj[MAX_CPUS];
37199bc5d55SJohn Soni Jose 	unsigned int attr_log_enable;
37209a1093aSJohn Soni Jose 	int (*iotask_fn)(struct iscsi_task *,
37309a1093aSJohn Soni Jose 			struct scatterlist *sg,
37409a1093aSJohn Soni Jose 			uint32_t num_sg, uint32_t xferlen,
37509a1093aSJohn Soni Jose 			uint32_t writedir);
37650a4b824SJitendra Bhivare 	struct boot_struct {
37750a4b824SJitendra Bhivare 		int retry;
37850a4b824SJitendra Bhivare 		unsigned int tag;
37950a4b824SJitendra Bhivare 		unsigned int s_handle;
38050a4b824SJitendra Bhivare 		struct be_dma_mem nonemb_cmd;
38150a4b824SJitendra Bhivare 		enum {
38250a4b824SJitendra Bhivare 			BEISCSI_BOOT_REOPEN_SESS = 1,
38350a4b824SJitendra Bhivare 			BEISCSI_BOOT_GET_SHANDLE,
38450a4b824SJitendra Bhivare 			BEISCSI_BOOT_GET_SINFO,
38550a4b824SJitendra Bhivare 			BEISCSI_BOOT_LOGOUT_SESS,
38650a4b824SJitendra Bhivare 			BEISCSI_BOOT_CREATE_KSET,
38750a4b824SJitendra Bhivare 		} action;
38850a4b824SJitendra Bhivare 		struct mgmt_session_info boot_sess;
38950a4b824SJitendra Bhivare 		struct iscsi_boot_kset *boot_kset;
39050a4b824SJitendra Bhivare 	} boot_struct;
39150a4b824SJitendra Bhivare 	struct work_struct boot_work;
3926733b39aSJayamohan Kallickal };
3936733b39aSJayamohan Kallickal 
3949122e991SJitendra Bhivare #define beiscsi_hba_in_error(phba) ((phba)->state & BEISCSI_HBA_IN_ERR)
395d1d5ca88SJitendra Bhivare #define beiscsi_hba_is_online(phba) \
396d1d5ca88SJitendra Bhivare 	(!beiscsi_hba_in_error((phba)) && \
397d1d5ca88SJitendra Bhivare 	 test_bit(BEISCSI_HBA_ONLINE, &phba->state))
3989122e991SJitendra Bhivare 
399b8b9e1b8SJayamohan Kallickal struct beiscsi_session {
400af007b02SRomain Perier 	struct dma_pool *bhs_pool;
401b8b9e1b8SJayamohan Kallickal };
402b8b9e1b8SJayamohan Kallickal 
4036733b39aSJayamohan Kallickal /**
4046733b39aSJayamohan Kallickal  * struct beiscsi_conn - iscsi connection structure
4056733b39aSJayamohan Kallickal  */
4066733b39aSJayamohan Kallickal struct beiscsi_conn {
4076733b39aSJayamohan Kallickal 	struct iscsi_conn *conn;
4086733b39aSJayamohan Kallickal 	struct beiscsi_hba *phba;
4096733b39aSJayamohan Kallickal 	u32 exp_statsn;
4101e4be6ffSJayamohan Kallickal 	u32 doorbell_offset;
4116733b39aSJayamohan Kallickal 	u32 beiscsi_conn_cid;
4126733b39aSJayamohan Kallickal 	struct beiscsi_endpoint *ep;
4136733b39aSJayamohan Kallickal 	unsigned short login_in_progress;
414d2cecf0dSJayamohan Kallickal 	struct wrb_handle *plogin_wrb_handle;
4156733b39aSJayamohan Kallickal 	struct sgl_handle *plogin_sgl_handle;
416b8b9e1b8SJayamohan Kallickal 	struct beiscsi_session *beiscsi_sess;
417bfead3b2SJayamohan Kallickal 	struct iscsi_task *task;
4186733b39aSJayamohan Kallickal };
4196733b39aSJayamohan Kallickal 
4206733b39aSJayamohan Kallickal /* This structure is used by the chip */
4216733b39aSJayamohan Kallickal struct pdu_data_out {
4226733b39aSJayamohan Kallickal 	u32 dw[12];
4236733b39aSJayamohan Kallickal };
4246733b39aSJayamohan Kallickal /**
4256733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
4266733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
4276733b39aSJayamohan Kallickal  */
4286733b39aSJayamohan Kallickal struct amap_pdu_data_out {
4296733b39aSJayamohan Kallickal 	u8 opcode[6];		/* opcode */
4306733b39aSJayamohan Kallickal 	u8 rsvd0[2];		/* should be 0 */
4316733b39aSJayamohan Kallickal 	u8 rsvd1[7];
4326733b39aSJayamohan Kallickal 	u8 final_bit;		/* F bit */
4336733b39aSJayamohan Kallickal 	u8 rsvd2[16];
4346733b39aSJayamohan Kallickal 	u8 ahs_length[8];	/* no AHS */
4356733b39aSJayamohan Kallickal 	u8 data_len_hi[8];
4366733b39aSJayamohan Kallickal 	u8 data_len_lo[16];	/* DataSegmentLength */
4376733b39aSJayamohan Kallickal 	u8 lun[64];
4386733b39aSJayamohan Kallickal 	u8 itt[32];		/* ITT; initiator task tag */
4396733b39aSJayamohan Kallickal 	u8 ttt[32];		/* TTT; valid for R2T or 0xffffffff */
4406733b39aSJayamohan Kallickal 	u8 rsvd3[32];
4416733b39aSJayamohan Kallickal 	u8 exp_stat_sn[32];
4426733b39aSJayamohan Kallickal 	u8 rsvd4[32];
4436733b39aSJayamohan Kallickal 	u8 data_sn[32];
4446733b39aSJayamohan Kallickal 	u8 buffer_offset[32];
4456733b39aSJayamohan Kallickal 	u8 rsvd5[32];
4466733b39aSJayamohan Kallickal };
4476733b39aSJayamohan Kallickal 
4486733b39aSJayamohan Kallickal struct be_cmd_bhs {
44912352183SNicholas Bellinger 	struct iscsi_scsi_req iscsi_hdr;
4506733b39aSJayamohan Kallickal 	unsigned char pad1[16];
4516733b39aSJayamohan Kallickal 	struct pdu_data_out iscsi_data_pdu;
4526733b39aSJayamohan Kallickal 	unsigned char pad2[BE_SENSE_INFO_SIZE -
4536733b39aSJayamohan Kallickal 			sizeof(struct pdu_data_out)];
4546733b39aSJayamohan Kallickal };
4556733b39aSJayamohan Kallickal 
4566733b39aSJayamohan Kallickal struct beiscsi_io_task {
4576733b39aSJayamohan Kallickal 	struct wrb_handle *pwrb_handle;
4586733b39aSJayamohan Kallickal 	struct sgl_handle *psgl_handle;
4596733b39aSJayamohan Kallickal 	struct beiscsi_conn *conn;
4606733b39aSJayamohan Kallickal 	struct scsi_cmnd *scsi_cmnd;
4619122e991SJitendra Bhivare 	int num_sg;
462340c99e9SJohn Soni Jose 	struct hwi_wrb_context *pwrb_context;
463bfead3b2SJayamohan Kallickal 	itt_t libiscsi_itt;
4646733b39aSJayamohan Kallickal 	struct be_cmd_bhs *cmd_bhs;
4656733b39aSJayamohan Kallickal 	struct be_bus_address bhs_pa;
4666733b39aSJayamohan Kallickal 	unsigned short bhs_len;
467d629c471SJohn Soni Jose 	dma_addr_t mtask_addr;
468d629c471SJohn Soni Jose 	uint32_t mtask_data_count;
46909a1093aSJohn Soni Jose 	uint8_t wrb_type;
4706733b39aSJayamohan Kallickal };
4716733b39aSJayamohan Kallickal 
4726733b39aSJayamohan Kallickal struct be_nonio_bhs {
4736733b39aSJayamohan Kallickal 	struct iscsi_hdr iscsi_hdr;
4746733b39aSJayamohan Kallickal 	unsigned char pad1[16];
4756733b39aSJayamohan Kallickal 	struct pdu_data_out iscsi_data_pdu;
4766733b39aSJayamohan Kallickal 	unsigned char pad2[BE_SENSE_INFO_SIZE -
4776733b39aSJayamohan Kallickal 			sizeof(struct pdu_data_out)];
4786733b39aSJayamohan Kallickal };
4796733b39aSJayamohan Kallickal 
4806733b39aSJayamohan Kallickal struct be_status_bhs {
48112352183SNicholas Bellinger 	struct iscsi_scsi_req iscsi_hdr;
4826733b39aSJayamohan Kallickal 	unsigned char pad1[16];
4836733b39aSJayamohan Kallickal 	/**
4846733b39aSJayamohan Kallickal 	 * The plus 2 below is to hold the sense info length that gets
4856733b39aSJayamohan Kallickal 	 * DMA'ed by RxULP
4866733b39aSJayamohan Kallickal 	 */
4876733b39aSJayamohan Kallickal 	unsigned char sense_info[BE_SENSE_INFO_SIZE];
4886733b39aSJayamohan Kallickal };
4896733b39aSJayamohan Kallickal 
4906733b39aSJayamohan Kallickal struct iscsi_sge {
4916733b39aSJayamohan Kallickal 	u32 dw[4];
4926733b39aSJayamohan Kallickal };
4936733b39aSJayamohan Kallickal 
4946733b39aSJayamohan Kallickal /**
4956733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
4966733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
4976733b39aSJayamohan Kallickal  */
4986733b39aSJayamohan Kallickal struct amap_iscsi_sge {
4996733b39aSJayamohan Kallickal 	u8 addr_hi[32];
5006733b39aSJayamohan Kallickal 	u8 addr_lo[32];
5016733b39aSJayamohan Kallickal 	u8 sge_offset[22];	/* DWORD 2 */
5026733b39aSJayamohan Kallickal 	u8 rsvd0[9];		/* DWORD 2 */
5036733b39aSJayamohan Kallickal 	u8 last_sge;		/* DWORD 2 */
5046733b39aSJayamohan Kallickal 	u8 len[17];		/* DWORD 3 */
5056733b39aSJayamohan Kallickal 	u8 rsvd1[15];		/* DWORD 3 */
5066733b39aSJayamohan Kallickal };
5076733b39aSJayamohan Kallickal 
5086733b39aSJayamohan Kallickal struct beiscsi_offload_params {
5097331613eSJayamohan Kallickal 	u32 dw[6];
5106733b39aSJayamohan Kallickal };
5116733b39aSJayamohan Kallickal 
5126733b39aSJayamohan Kallickal #define OFFLD_PARAMS_ERL	0x00000003
5136733b39aSJayamohan Kallickal #define OFFLD_PARAMS_DDE	0x00000004
5146733b39aSJayamohan Kallickal #define OFFLD_PARAMS_HDE	0x00000008
5156733b39aSJayamohan Kallickal #define OFFLD_PARAMS_IR2T	0x00000010
5166733b39aSJayamohan Kallickal #define OFFLD_PARAMS_IMD	0x00000020
517acb9693cSJohn Soni Jose #define OFFLD_PARAMS_DATA_SEQ_INORDER   0x00000040
518acb9693cSJohn Soni Jose #define OFFLD_PARAMS_PDU_SEQ_INORDER    0x00000080
519acb9693cSJohn Soni Jose #define OFFLD_PARAMS_MAX_R2T 0x00FFFF00
5206733b39aSJayamohan Kallickal 
5216733b39aSJayamohan Kallickal /**
5226733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
5236733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
5246733b39aSJayamohan Kallickal  */
5256733b39aSJayamohan Kallickal struct amap_beiscsi_offload_params {
5266733b39aSJayamohan Kallickal 	u8 max_burst_length[32];
5276733b39aSJayamohan Kallickal 	u8 max_send_data_segment_length[32];
5286733b39aSJayamohan Kallickal 	u8 first_burst_length[32];
5296733b39aSJayamohan Kallickal 	u8 erl[2];
5306733b39aSJayamohan Kallickal 	u8 dde[1];
5316733b39aSJayamohan Kallickal 	u8 hde[1];
5326733b39aSJayamohan Kallickal 	u8 ir2t[1];
5336733b39aSJayamohan Kallickal 	u8 imd[1];
534acb9693cSJohn Soni Jose 	u8 data_seq_inorder[1];
535acb9693cSJohn Soni Jose 	u8 pdu_seq_inorder[1];
536acb9693cSJohn Soni Jose 	u8 max_r2t[16];
537acb9693cSJohn Soni Jose 	u8 pad[8];
5386733b39aSJayamohan Kallickal 	u8 exp_statsn[32];
5397331613eSJayamohan Kallickal 	u8 max_recv_data_segment_length[32];
5406733b39aSJayamohan Kallickal };
5416733b39aSJayamohan Kallickal 
542938f372cSJitendra Bhivare struct hd_async_handle {
5436733b39aSJayamohan Kallickal 	struct list_head link;
5446733b39aSJayamohan Kallickal 	struct be_bus_address pa;
5456733b39aSJayamohan Kallickal 	void *pbuffer;
546938f372cSJitendra Bhivare 	u32 buffer_len;
547938f372cSJitendra Bhivare 	u16 index;
548938f372cSJitendra Bhivare 	u16 cri;
549938f372cSJitendra Bhivare 	u8 is_header;
550938f372cSJitendra Bhivare 	u8 is_final;
551ba6983a7SJitendra Bhivare 	u8 in_use;
5526733b39aSJayamohan Kallickal };
5536733b39aSJayamohan Kallickal 
554fecc3824SJitendra Bhivare #define BEISCSI_ASYNC_HDQ_SIZE(phba, ulp) \
555fecc3824SJitendra Bhivare 	(BEISCSI_GET_CID_COUNT((phba), (ulp)) * 2)
556fecc3824SJitendra Bhivare 
557938f372cSJitendra Bhivare /**
558938f372cSJitendra Bhivare  * This has list of async PDUs that are waiting to be processed.
559938f372cSJitendra Bhivare  * Buffers live in this list for a brief duration before they get
560938f372cSJitendra Bhivare  * processed and posted back to hardware.
561938f372cSJitendra Bhivare  * Note that we don't really need one cri_wait_queue per async_entry.
562938f372cSJitendra Bhivare  * We need one cri_wait_queue per CRI. Its easier to manage if this
563938f372cSJitendra Bhivare  * is tagged along with the async_entry.
564938f372cSJitendra Bhivare  */
565938f372cSJitendra Bhivare struct hd_async_entry {
566938f372cSJitendra Bhivare 	struct cri_wait_queue {
567938f372cSJitendra Bhivare 		unsigned short hdr_len;
568938f372cSJitendra Bhivare 		unsigned int bytes_received;
5696733b39aSJayamohan Kallickal 		unsigned int bytes_needed;
5706733b39aSJayamohan Kallickal 		struct list_head list;
571938f372cSJitendra Bhivare 	} wq;
572938f372cSJitendra Bhivare 	/* handles posted to FW resides here */
573938f372cSJitendra Bhivare 	struct hd_async_handle *header;
574938f372cSJitendra Bhivare 	struct hd_async_handle *data;
5756733b39aSJayamohan Kallickal };
5766733b39aSJayamohan Kallickal 
577938f372cSJitendra Bhivare struct hd_async_buf_context {
5786733b39aSJayamohan Kallickal 	struct be_bus_address pa_base;
5796733b39aSJayamohan Kallickal 	void *va_base;
5806733b39aSJayamohan Kallickal 	void *ring_base;
581938f372cSJitendra Bhivare 	struct hd_async_handle *handle_base;
582938f372cSJitendra Bhivare 	u32 buffer_size;
5831e2931f1SJitendra Bhivare 	u16 pi;
584938f372cSJitendra Bhivare };
5856733b39aSJayamohan Kallickal 
586938f372cSJitendra Bhivare /**
587938f372cSJitendra Bhivare  * hd_async_context is declared for each ULP supporting iSCSI function.
588938f372cSJitendra Bhivare  */
589938f372cSJitendra Bhivare struct hd_async_context {
590938f372cSJitendra Bhivare 	struct hd_async_buf_context async_header;
591938f372cSJitendra Bhivare 	struct hd_async_buf_context async_data;
592938f372cSJitendra Bhivare 	u16 num_entries;
593938f372cSJitendra Bhivare 	/**
594938f372cSJitendra Bhivare 	 * When unsol PDU is in, it needs to be chained till all the bytes are
595938f372cSJitendra Bhivare 	 * received and then processing is done. hd_async_entry is created
596938f372cSJitendra Bhivare 	 * based on the cid_count for each ULP. When unsol PDU comes in based
597938f372cSJitendra Bhivare 	 * on the conn_id it needs to be added to the correct async_entry wq.
598938f372cSJitendra Bhivare 	 * Below defined cid_to_async_cri_map is used to reterive the
599938f372cSJitendra Bhivare 	 * async_cri_map for a particular connection.
600938f372cSJitendra Bhivare 	 *
601938f372cSJitendra Bhivare 	 * This array is initialized after beiscsi_create_wrb_rings returns.
602938f372cSJitendra Bhivare 	 *
603938f372cSJitendra Bhivare 	 * - this method takes more memory space, fixed to 2K
604938f372cSJitendra Bhivare 	 * - any support for connections greater than this the array size needs
605938f372cSJitendra Bhivare 	 * to be incremented
606938f372cSJitendra Bhivare 	 */
6078a86e833SJayamohan Kallickal #define BE_GET_ASYNC_CRI_FROM_CID(cid) (pasync_ctx->cid_to_async_cri_map[cid])
6088a86e833SJayamohan Kallickal 	unsigned short cid_to_async_cri_map[BE_MAX_SESSION];
6096733b39aSJayamohan Kallickal 	/**
610938f372cSJitendra Bhivare 	 * This is a variable size array. Don`t add anything after this field!!
6116733b39aSJayamohan Kallickal 	 */
612938f372cSJitendra Bhivare 	struct hd_async_entry *async_entry;
6136733b39aSJayamohan Kallickal };
6146733b39aSJayamohan Kallickal 
6156733b39aSJayamohan Kallickal struct i_t_dpdu_cqe {
6166733b39aSJayamohan Kallickal 	u32 dw[4];
6176733b39aSJayamohan Kallickal } __packed;
6186733b39aSJayamohan Kallickal 
6196733b39aSJayamohan Kallickal /**
6206733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
6216733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
6226733b39aSJayamohan Kallickal  */
6236733b39aSJayamohan Kallickal struct amap_i_t_dpdu_cqe {
6246733b39aSJayamohan Kallickal 	u8 db_addr_hi[32];
6256733b39aSJayamohan Kallickal 	u8 db_addr_lo[32];
6266733b39aSJayamohan Kallickal 	u8 code[6];
6276733b39aSJayamohan Kallickal 	u8 cid[10];
6286733b39aSJayamohan Kallickal 	u8 dpl[16];
6296733b39aSJayamohan Kallickal 	u8 index[16];
6306733b39aSJayamohan Kallickal 	u8 num_cons[10];
6316733b39aSJayamohan Kallickal 	u8 rsvd0[4];
6326733b39aSJayamohan Kallickal 	u8 final;
6336733b39aSJayamohan Kallickal 	u8 valid;
6346733b39aSJayamohan Kallickal } __packed;
6356733b39aSJayamohan Kallickal 
63673133261SJohn Soni Jose struct amap_i_t_dpdu_cqe_v2 {
63773133261SJohn Soni Jose 	u8 db_addr_hi[32];  /* DWORD 0 */
63873133261SJohn Soni Jose 	u8 db_addr_lo[32];  /* DWORD 1 */
63973133261SJohn Soni Jose 	u8 code[6]; /* DWORD 2 */
64073133261SJohn Soni Jose 	u8 num_cons; /* DWORD 2*/
64173133261SJohn Soni Jose 	u8 rsvd0[8]; /* DWORD 2 */
64273133261SJohn Soni Jose 	u8 dpl[17]; /* DWORD 2 */
64373133261SJohn Soni Jose 	u8 index[16]; /* DWORD 3 */
64473133261SJohn Soni Jose 	u8 cid[13]; /* DWORD 3 */
64573133261SJohn Soni Jose 	u8 rsvd1; /* DWORD 3 */
64673133261SJohn Soni Jose 	u8 final; /* DWORD 3 */
64773133261SJohn Soni Jose 	u8 valid; /* DWORD 3 */
64873133261SJohn Soni Jose } __packed;
64973133261SJohn Soni Jose 
6506733b39aSJayamohan Kallickal #define CQE_VALID_MASK	0x80000000
6516733b39aSJayamohan Kallickal #define CQE_CODE_MASK	0x0000003F
6526733b39aSJayamohan Kallickal #define CQE_CID_MASK	0x0000FFC0
6536733b39aSJayamohan Kallickal 
6546733b39aSJayamohan Kallickal #define EQE_VALID_MASK		0x00000001
6556733b39aSJayamohan Kallickal #define EQE_MAJORCODE_MASK	0x0000000E
6566733b39aSJayamohan Kallickal #define EQE_RESID_MASK		0xFFFF0000
6576733b39aSJayamohan Kallickal 
6586733b39aSJayamohan Kallickal struct be_eq_entry {
6596733b39aSJayamohan Kallickal 	u32 dw[1];
6606733b39aSJayamohan Kallickal } __packed;
6616733b39aSJayamohan Kallickal 
6626733b39aSJayamohan Kallickal /**
6636733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
6646733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
6656733b39aSJayamohan Kallickal  */
6666733b39aSJayamohan Kallickal struct amap_eq_entry {
6676733b39aSJayamohan Kallickal 	u8 valid;		/* DWORD 0 */
6686733b39aSJayamohan Kallickal 	u8 major_code[3];	/* DWORD 0 */
6696733b39aSJayamohan Kallickal 	u8 minor_code[12];	/* DWORD 0 */
6706733b39aSJayamohan Kallickal 	u8 resource_id[16];	/* DWORD 0 */
6716733b39aSJayamohan Kallickal 
6726733b39aSJayamohan Kallickal } __packed;
6736733b39aSJayamohan Kallickal 
6746733b39aSJayamohan Kallickal struct cq_db {
6756733b39aSJayamohan Kallickal 	u32 dw[1];
6766733b39aSJayamohan Kallickal } __packed;
6776733b39aSJayamohan Kallickal 
6786733b39aSJayamohan Kallickal /**
6796733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
6806733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
6816733b39aSJayamohan Kallickal  */
6826733b39aSJayamohan Kallickal struct amap_cq_db {
6836733b39aSJayamohan Kallickal 	u8 qid[10];
6846733b39aSJayamohan Kallickal 	u8 event[1];
6856733b39aSJayamohan Kallickal 	u8 rsvd0[5];
6866733b39aSJayamohan Kallickal 	u8 num_popped[13];
6876733b39aSJayamohan Kallickal 	u8 rearm[1];
6886733b39aSJayamohan Kallickal 	u8 rsvd1[2];
6896733b39aSJayamohan Kallickal } __packed;
6906733b39aSJayamohan Kallickal 
6916733b39aSJayamohan Kallickal void beiscsi_process_eq(struct beiscsi_hba *phba);
6926733b39aSJayamohan Kallickal 
6936733b39aSJayamohan Kallickal struct iscsi_wrb {
6946733b39aSJayamohan Kallickal 	u32 dw[16];
6956733b39aSJayamohan Kallickal } __packed;
6966733b39aSJayamohan Kallickal 
6976733b39aSJayamohan Kallickal #define WRB_TYPE_MASK 0xF0000000
69809a1093aSJohn Soni Jose #define SKH_WRB_TYPE_OFFSET 27
69909a1093aSJohn Soni Jose #define BE_WRB_TYPE_OFFSET  28
70009a1093aSJohn Soni Jose 
70109a1093aSJohn Soni Jose #define ADAPTER_SET_WRB_TYPE(pwrb, wrb_type, type_offset) \
70209a1093aSJohn Soni Jose 		(pwrb->dw[0] |= (wrb_type << type_offset))
7036733b39aSJayamohan Kallickal 
7046733b39aSJayamohan Kallickal /**
7056733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
7066733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
7076733b39aSJayamohan Kallickal  */
7086733b39aSJayamohan Kallickal struct amap_iscsi_wrb {
7096733b39aSJayamohan Kallickal 	u8 lun[14];		/* DWORD 0 */
7106733b39aSJayamohan Kallickal 	u8 lt;			/* DWORD 0 */
7116733b39aSJayamohan Kallickal 	u8 invld;		/* DWORD 0 */
7126733b39aSJayamohan Kallickal 	u8 wrb_idx[8];		/* DWORD 0 */
7136733b39aSJayamohan Kallickal 	u8 dsp;			/* DWORD 0 */
7146733b39aSJayamohan Kallickal 	u8 dmsg;		/* DWORD 0 */
7156733b39aSJayamohan Kallickal 	u8 undr_run;		/* DWORD 0 */
7166733b39aSJayamohan Kallickal 	u8 over_run;		/* DWORD 0 */
7176733b39aSJayamohan Kallickal 	u8 type[4];		/* DWORD 0 */
7186733b39aSJayamohan Kallickal 	u8 ptr2nextwrb[8];	/* DWORD 1 */
7196733b39aSJayamohan Kallickal 	u8 r2t_exp_dtl[24];	/* DWORD 1 */
7206733b39aSJayamohan Kallickal 	u8 sgl_icd_idx[12];	/* DWORD 2 */
7216733b39aSJayamohan Kallickal 	u8 rsvd0[20];		/* DWORD 2 */
7226733b39aSJayamohan Kallickal 	u8 exp_data_sn[32];	/* DWORD 3 */
7236733b39aSJayamohan Kallickal 	u8 iscsi_bhs_addr_hi[32];	/* DWORD 4 */
7246733b39aSJayamohan Kallickal 	u8 iscsi_bhs_addr_lo[32];	/* DWORD 5 */
7256733b39aSJayamohan Kallickal 	u8 cmdsn_itt[32];	/* DWORD 6 */
7266733b39aSJayamohan Kallickal 	u8 dif_ref_tag[32];	/* DWORD 7 */
7276733b39aSJayamohan Kallickal 	u8 sge0_addr_hi[32];	/* DWORD 8 */
7286733b39aSJayamohan Kallickal 	u8 sge0_addr_lo[32];	/* DWORD 9  */
7296733b39aSJayamohan Kallickal 	u8 sge0_offset[22];	/* DWORD 10 */
7306733b39aSJayamohan Kallickal 	u8 pbs;			/* DWORD 10 */
7316733b39aSJayamohan Kallickal 	u8 dif_mode[2];		/* DWORD 10 */
7326733b39aSJayamohan Kallickal 	u8 rsvd1[6];		/* DWORD 10 */
7336733b39aSJayamohan Kallickal 	u8 sge0_last;		/* DWORD 10 */
7346733b39aSJayamohan Kallickal 	u8 sge0_len[17];	/* DWORD 11 */
7356733b39aSJayamohan Kallickal 	u8 dif_meta_tag[14];	/* DWORD 11 */
7366733b39aSJayamohan Kallickal 	u8 sge0_in_ddr;		/* DWORD 11 */
7376733b39aSJayamohan Kallickal 	u8 sge1_addr_hi[32];	/* DWORD 12 */
7386733b39aSJayamohan Kallickal 	u8 sge1_addr_lo[32];	/* DWORD 13 */
7396733b39aSJayamohan Kallickal 	u8 sge1_r2t_offset[22];	/* DWORD 14 */
7406733b39aSJayamohan Kallickal 	u8 rsvd2[9];		/* DWORD 14 */
7416733b39aSJayamohan Kallickal 	u8 sge1_last;		/* DWORD 14 */
7426733b39aSJayamohan Kallickal 	u8 sge1_len[17];	/* DWORD 15 */
7436733b39aSJayamohan Kallickal 	u8 ref_sgl_icd_idx[12];	/* DWORD 15 */
7446733b39aSJayamohan Kallickal 	u8 rsvd3[2];		/* DWORD 15 */
7456733b39aSJayamohan Kallickal 	u8 sge1_in_ddr;		/* DWORD 15 */
7466733b39aSJayamohan Kallickal 
7476733b39aSJayamohan Kallickal } __packed;
7486733b39aSJayamohan Kallickal 
74909a1093aSJohn Soni Jose struct amap_iscsi_wrb_v2 {
75009a1093aSJohn Soni Jose 	u8 r2t_exp_dtl[25]; /* DWORD 0 */
75109a1093aSJohn Soni Jose 	u8 rsvd0[2];    /* DWORD 0*/
75209a1093aSJohn Soni Jose 	u8 type[5];     /* DWORD 0 */
75309a1093aSJohn Soni Jose 	u8 ptr2nextwrb[8];  /* DWORD 1 */
75409a1093aSJohn Soni Jose 	u8 wrb_idx[8];      /* DWORD 1 */
75509a1093aSJohn Soni Jose 	u8 lun[16];     /* DWORD 1 */
75609a1093aSJohn Soni Jose 	u8 sgl_idx[16]; /* DWORD 2 */
75709a1093aSJohn Soni Jose 	u8 ref_sgl_icd_idx[16]; /* DWORD 2 */
75809a1093aSJohn Soni Jose 	u8 exp_data_sn[32]; /* DWORD 3 */
75909a1093aSJohn Soni Jose 	u8 iscsi_bhs_addr_hi[32];   /* DWORD 4 */
76009a1093aSJohn Soni Jose 	u8 iscsi_bhs_addr_lo[32];   /* DWORD 5 */
76109a1093aSJohn Soni Jose 	u8 cq_id[16];   /* DWORD 6 */
76209a1093aSJohn Soni Jose 	u8 rsvd1[16];   /* DWORD 6 */
76309a1093aSJohn Soni Jose 	u8 cmdsn_itt[32];   /* DWORD 7 */
76409a1093aSJohn Soni Jose 	u8 sge0_addr_hi[32];    /* DWORD 8 */
76509a1093aSJohn Soni Jose 	u8 sge0_addr_lo[32];    /* DWORD 9 */
76609a1093aSJohn Soni Jose 	u8 sge0_offset[24]; /* DWORD 10 */
76709a1093aSJohn Soni Jose 	u8 rsvd2[7];    /* DWORD 10 */
76809a1093aSJohn Soni Jose 	u8 sge0_last;   /* DWORD 10 */
76909a1093aSJohn Soni Jose 	u8 sge0_len[17];    /* DWORD 11 */
77009a1093aSJohn Soni Jose 	u8 rsvd3[7];    /* DWORD 11 */
77109a1093aSJohn Soni Jose 	u8 diff_enbl;   /* DWORD 11 */
77209a1093aSJohn Soni Jose 	u8 u_run;       /* DWORD 11 */
77309a1093aSJohn Soni Jose 	u8 o_run;       /* DWORD 11 */
774392b7d2fSJitendra Bhivare 	u8 invld;     /* DWORD 11 */
77509a1093aSJohn Soni Jose 	u8 dsp;         /* DWORD 11 */
77609a1093aSJohn Soni Jose 	u8 dmsg;        /* DWORD 11 */
77709a1093aSJohn Soni Jose 	u8 rsvd4;       /* DWORD 11 */
77809a1093aSJohn Soni Jose 	u8 lt;          /* DWORD 11 */
77909a1093aSJohn Soni Jose 	u8 sge1_addr_hi[32];    /* DWORD 12 */
78009a1093aSJohn Soni Jose 	u8 sge1_addr_lo[32];    /* DWORD 13 */
78109a1093aSJohn Soni Jose 	u8 sge1_r2t_offset[24]; /* DWORD 14 */
78209a1093aSJohn Soni Jose 	u8 rsvd5[7];    /* DWORD 14 */
78309a1093aSJohn Soni Jose 	u8 sge1_last;   /* DWORD 14 */
78409a1093aSJohn Soni Jose 	u8 sge1_len[17];    /* DWORD 15 */
78509a1093aSJohn Soni Jose 	u8 rsvd6[15];   /* DWORD 15 */
78609a1093aSJohn Soni Jose } __packed;
78709a1093aSJohn Soni Jose 
78809a1093aSJohn Soni Jose 
789340c99e9SJohn Soni Jose struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid,
790340c99e9SJohn Soni Jose 				     struct hwi_wrb_context **pcontext);
7916733b39aSJayamohan Kallickal void
7926733b39aSJayamohan Kallickal free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle);
7936733b39aSJayamohan Kallickal 
7944a4a11b9SJayamohan Kallickal void beiscsi_free_mgmt_task_handles(struct beiscsi_conn *beiscsi_conn,
7954a4a11b9SJayamohan Kallickal 				     struct iscsi_task *task);
796756d29c8SJayamohan Kallickal 
797e08b3c8bSJayamohan Kallickal void hwi_ring_cq_db(struct beiscsi_hba *phba,
798e08b3c8bSJayamohan Kallickal 		     unsigned int id, unsigned int num_processed,
7991094cf68SJitendra Bhivare 		     unsigned char rearm);
800b7ab35b1SJayamohan Kallickal 
8011094cf68SJitendra Bhivare unsigned int beiscsi_process_cq(struct be_eq_obj *pbe_eq, int budget);
8022e4e8f65SJitendra Bhivare void beiscsi_process_mcc_cq(struct beiscsi_hba *phba);
803b7ab35b1SJayamohan Kallickal 
8046733b39aSJayamohan Kallickal struct pdu_nop_out {
8056733b39aSJayamohan Kallickal 	u32 dw[12];
8066733b39aSJayamohan Kallickal };
8076733b39aSJayamohan Kallickal 
8086733b39aSJayamohan Kallickal /**
8096733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
8106733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
8116733b39aSJayamohan Kallickal  */
8126733b39aSJayamohan Kallickal struct amap_pdu_nop_out {
8136733b39aSJayamohan Kallickal 	u8 opcode[6];		/* opcode 0x00 */
8146733b39aSJayamohan Kallickal 	u8 i_bit;		/* I Bit */
8156733b39aSJayamohan Kallickal 	u8 x_bit;		/* reserved; should be 0 */
8166733b39aSJayamohan Kallickal 	u8 fp_bit_filler1[7];
8176733b39aSJayamohan Kallickal 	u8 f_bit;		/* always 1 */
8186733b39aSJayamohan Kallickal 	u8 reserved1[16];
8196733b39aSJayamohan Kallickal 	u8 ahs_length[8];	/* no AHS */
8206733b39aSJayamohan Kallickal 	u8 data_len_hi[8];
8216733b39aSJayamohan Kallickal 	u8 data_len_lo[16];	/* DataSegmentLength */
8226733b39aSJayamohan Kallickal 	u8 lun[64];
8236733b39aSJayamohan Kallickal 	u8 itt[32];		/* initiator id for ping or 0xffffffff */
8246733b39aSJayamohan Kallickal 	u8 ttt[32];		/* target id for ping or 0xffffffff */
8256733b39aSJayamohan Kallickal 	u8 cmd_sn[32];
8266733b39aSJayamohan Kallickal 	u8 exp_stat_sn[32];
8276733b39aSJayamohan Kallickal 	u8 reserved5[128];
8286733b39aSJayamohan Kallickal };
8296733b39aSJayamohan Kallickal 
8306733b39aSJayamohan Kallickal #define PDUBASE_OPCODE_MASK	0x0000003F
8316733b39aSJayamohan Kallickal #define PDUBASE_DATALENHI_MASK	0x0000FF00
8326733b39aSJayamohan Kallickal #define PDUBASE_DATALENLO_MASK	0xFFFF0000
8336733b39aSJayamohan Kallickal 
8346733b39aSJayamohan Kallickal struct pdu_base {
8356733b39aSJayamohan Kallickal 	u32 dw[16];
8366733b39aSJayamohan Kallickal } __packed;
8376733b39aSJayamohan Kallickal 
8386733b39aSJayamohan Kallickal /**
8396733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
8406733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
8416733b39aSJayamohan Kallickal  */
8426733b39aSJayamohan Kallickal struct amap_pdu_base {
8436733b39aSJayamohan Kallickal 	u8 opcode[6];
8446733b39aSJayamohan Kallickal 	u8 i_bit;		/* immediate bit */
8456733b39aSJayamohan Kallickal 	u8 x_bit;		/* reserved, always 0 */
8466733b39aSJayamohan Kallickal 	u8 reserved1[24];	/* opcode-specific fields */
8476733b39aSJayamohan Kallickal 	u8 ahs_length[8];	/* length units is 4 byte words */
8486733b39aSJayamohan Kallickal 	u8 data_len_hi[8];
8496733b39aSJayamohan Kallickal 	u8 data_len_lo[16];	/* DatasegmentLength */
8506733b39aSJayamohan Kallickal 	u8 lun[64];		/* lun or opcode-specific fields */
8516733b39aSJayamohan Kallickal 	u8 itt[32];		/* initiator task tag */
8526733b39aSJayamohan Kallickal 	u8 reserved4[224];
8536733b39aSJayamohan Kallickal };
8546733b39aSJayamohan Kallickal 
8556733b39aSJayamohan Kallickal struct iscsi_target_context_update_wrb {
8566733b39aSJayamohan Kallickal 	u32 dw[16];
8576733b39aSJayamohan Kallickal } __packed;
8586733b39aSJayamohan Kallickal 
8596733b39aSJayamohan Kallickal /**
8606733b39aSJayamohan Kallickal  * Pseudo amap definition in which each bit of the actual structure is defined
8616733b39aSJayamohan Kallickal  * as a byte: used to calculate offset/shift/mask of each field
8626733b39aSJayamohan Kallickal  */
863acb9693cSJohn Soni Jose #define BE_TGT_CTX_UPDT_CMD 0x07
8646733b39aSJayamohan Kallickal struct amap_iscsi_target_context_update_wrb {
8656733b39aSJayamohan Kallickal 	u8 lun[14];		/* DWORD 0 */
8666733b39aSJayamohan Kallickal 	u8 lt;			/* DWORD 0 */
8676733b39aSJayamohan Kallickal 	u8 invld;		/* DWORD 0 */
8686733b39aSJayamohan Kallickal 	u8 wrb_idx[8];		/* DWORD 0 */
8696733b39aSJayamohan Kallickal 	u8 dsp;			/* DWORD 0 */
8706733b39aSJayamohan Kallickal 	u8 dmsg;		/* DWORD 0 */
8716733b39aSJayamohan Kallickal 	u8 undr_run;		/* DWORD 0 */
8726733b39aSJayamohan Kallickal 	u8 over_run;		/* DWORD 0 */
8736733b39aSJayamohan Kallickal 	u8 type[4];		/* DWORD 0 */
8746733b39aSJayamohan Kallickal 	u8 ptr2nextwrb[8];	/* DWORD 1 */
8756733b39aSJayamohan Kallickal 	u8 max_burst_length[19];	/* DWORD 1 */
8766733b39aSJayamohan Kallickal 	u8 rsvd0[5];		/* DWORD 1 */
8776733b39aSJayamohan Kallickal 	u8 rsvd1[15];		/* DWORD 2 */
8786733b39aSJayamohan Kallickal 	u8 max_send_data_segment_length[17];	/* DWORD 2 */
8796733b39aSJayamohan Kallickal 	u8 first_burst_length[14];	/* DWORD 3 */
8806733b39aSJayamohan Kallickal 	u8 rsvd2[2];		/* DWORD 3 */
8816733b39aSJayamohan Kallickal 	u8 tx_wrbindex_drv_msg[8];	/* DWORD 3 */
8826733b39aSJayamohan Kallickal 	u8 rsvd3[5];		/* DWORD 3 */
8836733b39aSJayamohan Kallickal 	u8 session_state[3];	/* DWORD 3 */
8846733b39aSJayamohan Kallickal 	u8 rsvd4[16];		/* DWORD 4 */
8856733b39aSJayamohan Kallickal 	u8 tx_jumbo;		/* DWORD 4 */
8866733b39aSJayamohan Kallickal 	u8 hde;			/* DWORD 4 */
8876733b39aSJayamohan Kallickal 	u8 dde;			/* DWORD 4 */
8886733b39aSJayamohan Kallickal 	u8 erl[2];		/* DWORD 4 */
8896733b39aSJayamohan Kallickal 	u8 domain_id[5];		/* DWORD 4 */
8906733b39aSJayamohan Kallickal 	u8 mode;		/* DWORD 4 */
8916733b39aSJayamohan Kallickal 	u8 imd;			/* DWORD 4 */
8926733b39aSJayamohan Kallickal 	u8 ir2t;		/* DWORD 4 */
8936733b39aSJayamohan Kallickal 	u8 notpredblq[2];	/* DWORD 4 */
8946733b39aSJayamohan Kallickal 	u8 compltonack;		/* DWORD 4 */
8956733b39aSJayamohan Kallickal 	u8 stat_sn[32];		/* DWORD 5 */
8966733b39aSJayamohan Kallickal 	u8 pad_buffer_addr_hi[32];	/* DWORD 6 */
8976733b39aSJayamohan Kallickal 	u8 pad_buffer_addr_lo[32];	/* DWORD 7 */
8986733b39aSJayamohan Kallickal 	u8 pad_addr_hi[32];	/* DWORD 8 */
8996733b39aSJayamohan Kallickal 	u8 pad_addr_lo[32];	/* DWORD 9 */
9006733b39aSJayamohan Kallickal 	u8 rsvd5[32];		/* DWORD 10 */
9016733b39aSJayamohan Kallickal 	u8 rsvd6[32];		/* DWORD 11 */
9026733b39aSJayamohan Kallickal 	u8 rsvd7[32];		/* DWORD 12 */
9036733b39aSJayamohan Kallickal 	u8 rsvd8[32];		/* DWORD 13 */
9046733b39aSJayamohan Kallickal 	u8 rsvd9[32];		/* DWORD 14 */
9056733b39aSJayamohan Kallickal 	u8 rsvd10[32];		/* DWORD 15 */
9066733b39aSJayamohan Kallickal 
9076733b39aSJayamohan Kallickal } __packed;
9086733b39aSJayamohan Kallickal 
909acb9693cSJohn Soni Jose #define BEISCSI_MAX_RECV_DATASEG_LEN    (64 * 1024)
910acb9693cSJohn Soni Jose #define BEISCSI_MAX_CXNS    1
911acb9693cSJohn Soni Jose struct amap_iscsi_target_context_update_wrb_v2 {
912acb9693cSJohn Soni Jose 	u8 max_burst_length[24];    /* DWORD 0 */
913acb9693cSJohn Soni Jose 	u8 rsvd0[3];    /* DWORD 0 */
914acb9693cSJohn Soni Jose 	u8 type[5];     /* DWORD 0 */
915acb9693cSJohn Soni Jose 	u8 ptr2nextwrb[8];  /* DWORD 1 */
916acb9693cSJohn Soni Jose 	u8 wrb_idx[8];      /* DWORD 1 */
917acb9693cSJohn Soni Jose 	u8 rsvd1[16];       /* DWORD 1 */
918acb9693cSJohn Soni Jose 	u8 max_send_data_segment_length[24];    /* DWORD 2 */
919acb9693cSJohn Soni Jose 	u8 rsvd2[8];    /* DWORD 2 */
920acb9693cSJohn Soni Jose 	u8 first_burst_length[24]; /* DWORD 3 */
921acb9693cSJohn Soni Jose 	u8 rsvd3[8]; /* DOWRD 3 */
922acb9693cSJohn Soni Jose 	u8 max_r2t[16]; /* DWORD 4 */
9237331613eSJayamohan Kallickal 	u8 rsvd4;       /* DWORD 4 */
924acb9693cSJohn Soni Jose 	u8 hde;         /* DWORD 4 */
925acb9693cSJohn Soni Jose 	u8 dde;         /* DWORD 4 */
926acb9693cSJohn Soni Jose 	u8 erl[2];      /* DWORD 4 */
9277331613eSJayamohan Kallickal 	u8 rsvd5[6];    /* DWORD 4 */
928acb9693cSJohn Soni Jose 	u8 imd;         /* DWORD 4 */
929acb9693cSJohn Soni Jose 	u8 ir2t;        /* DWORD 4 */
9307331613eSJayamohan Kallickal 	u8 rsvd6[3];    /* DWORD 4 */
931acb9693cSJohn Soni Jose 	u8 stat_sn[32];     /* DWORD 5 */
9327331613eSJayamohan Kallickal 	u8 rsvd7[32];   /* DWORD 6 */
9337331613eSJayamohan Kallickal 	u8 rsvd8[32];   /* DWORD 7 */
934acb9693cSJohn Soni Jose 	u8 max_recv_dataseg_len[24];    /* DWORD 8 */
9357331613eSJayamohan Kallickal 	u8 rsvd9[8]; /* DWORD 8 */
9367331613eSJayamohan Kallickal 	u8 rsvd10[32];   /* DWORD 9 */
9377331613eSJayamohan Kallickal 	u8 rsvd11[32];   /* DWORD 10 */
938acb9693cSJohn Soni Jose 	u8 max_cxns[16]; /* DWORD 11 */
9397331613eSJayamohan Kallickal 	u8 rsvd12[11]; /* DWORD  11*/
940acb9693cSJohn Soni Jose 	u8 invld; /* DWORD 11 */
9417331613eSJayamohan Kallickal 	u8 rsvd13;/* DWORD 11*/
942acb9693cSJohn Soni Jose 	u8 dmsg; /* DWORD 11 */
943acb9693cSJohn Soni Jose 	u8 data_seq_inorder; /* DWORD 11 */
944acb9693cSJohn Soni Jose 	u8 pdu_seq_inorder; /* DWORD 11 */
9457331613eSJayamohan Kallickal 	u8 rsvd14[32]; /*DWORD 12 */
9467331613eSJayamohan Kallickal 	u8 rsvd15[32]; /* DWORD 13 */
9477331613eSJayamohan Kallickal 	u8 rsvd16[32]; /* DWORD 14 */
9487331613eSJayamohan Kallickal 	u8 rsvd17[32]; /* DWORD 15 */
949acb9693cSJohn Soni Jose } __packed;
950acb9693cSJohn Soni Jose 
951acb9693cSJohn Soni Jose 
9526733b39aSJayamohan Kallickal struct be_ring {
9536733b39aSJayamohan Kallickal 	u32 pages;		/* queue size in pages */
9546733b39aSJayamohan Kallickal 	u32 id;			/* queue id assigned by beklib */
9556733b39aSJayamohan Kallickal 	u32 num;		/* number of elements in queue */
9566733b39aSJayamohan Kallickal 	u32 cidx;		/* consumer index */
9576733b39aSJayamohan Kallickal 	u32 pidx;		/* producer index -- not used by most rings */
9586733b39aSJayamohan Kallickal 	u32 item_size;		/* size in bytes of one object */
9598a86e833SJayamohan Kallickal 	u8 ulp_num;	/* ULP to which CID binded */
9608a86e833SJayamohan Kallickal 	u16 register_set;
9618a86e833SJayamohan Kallickal 	u16 doorbell_format;
9628a86e833SJayamohan Kallickal 	u32 doorbell_offset;
9636733b39aSJayamohan Kallickal 
9646733b39aSJayamohan Kallickal 	void *va;		/* The virtual address of the ring.  This
9656733b39aSJayamohan Kallickal 				 * should be last to allow 32 & 64 bit debugger
9666733b39aSJayamohan Kallickal 				 * extensions to work.
9676733b39aSJayamohan Kallickal 				 */
9686733b39aSJayamohan Kallickal };
9696733b39aSJayamohan Kallickal 
9706733b39aSJayamohan Kallickal struct hwi_controller {
971a7909b39SJayamohan Kallickal 	struct hwi_wrb_context *wrb_context;
9728a86e833SJayamohan Kallickal 	struct be_ring default_pdu_hdr[BEISCSI_ULP_COUNT];
9738a86e833SJayamohan Kallickal 	struct be_ring default_pdu_data[BEISCSI_ULP_COUNT];
9746733b39aSJayamohan Kallickal 	struct hwi_context_memory *phwi_ctxt;
9756733b39aSJayamohan Kallickal };
9766733b39aSJayamohan Kallickal 
9776733b39aSJayamohan Kallickal enum hwh_type_enum {
9786733b39aSJayamohan Kallickal 	HWH_TYPE_IO = 1,
9796733b39aSJayamohan Kallickal 	HWH_TYPE_LOGOUT = 2,
9806733b39aSJayamohan Kallickal 	HWH_TYPE_TMF = 3,
9816733b39aSJayamohan Kallickal 	HWH_TYPE_NOP = 4,
9826733b39aSJayamohan Kallickal 	HWH_TYPE_IO_RD = 5,
9836733b39aSJayamohan Kallickal 	HWH_TYPE_LOGIN = 11,
9846733b39aSJayamohan Kallickal 	HWH_TYPE_INVALID = 0xFFFFFFFF
9856733b39aSJayamohan Kallickal };
9866733b39aSJayamohan Kallickal 
9876733b39aSJayamohan Kallickal struct wrb_handle {
9886733b39aSJayamohan Kallickal 	unsigned short wrb_index;
9896733b39aSJayamohan Kallickal 	struct iscsi_task *pio_handle;
9906733b39aSJayamohan Kallickal 	struct iscsi_wrb *pwrb;
9916733b39aSJayamohan Kallickal };
9926733b39aSJayamohan Kallickal 
9936733b39aSJayamohan Kallickal struct hwi_context_memory {
994bfead3b2SJayamohan Kallickal 	struct be_eq_obj be_eq[MAX_CPUS];
99522abeef0SJohn Soni Jose 	struct be_queue_info be_cq[MAX_CPUS - 1];
9966733b39aSJayamohan Kallickal 
997a7909b39SJayamohan Kallickal 	struct be_queue_info *be_wrbq;
998938f372cSJitendra Bhivare 	/**
999938f372cSJitendra Bhivare 	 * Create array of ULP number for below entries as DEFQ
1000938f372cSJitendra Bhivare 	 * will be created for both ULP if iSCSI Protocol is
1001938f372cSJitendra Bhivare 	 * loaded on both ULP.
1002938f372cSJitendra Bhivare 	 */
10038a86e833SJayamohan Kallickal 	struct be_queue_info be_def_hdrq[BEISCSI_ULP_COUNT];
10048a86e833SJayamohan Kallickal 	struct be_queue_info be_def_dataq[BEISCSI_ULP_COUNT];
1005938f372cSJitendra Bhivare 	struct hd_async_context *pasync_ctx[BEISCSI_ULP_COUNT];
10066733b39aSJayamohan Kallickal };
10076733b39aSJayamohan Kallickal 
100850a4b824SJitendra Bhivare void beiscsi_start_boot_work(struct beiscsi_hba *phba, unsigned int s_handle);
100950a4b824SJitendra Bhivare 
101099bc5d55SJohn Soni Jose /* Logging related definitions */
101199bc5d55SJohn Soni Jose #define BEISCSI_LOG_INIT	0x0001	/* Initialization events */
101299bc5d55SJohn Soni Jose #define BEISCSI_LOG_MBOX	0x0002	/* Mailbox Events */
101399bc5d55SJohn Soni Jose #define BEISCSI_LOG_MISC	0x0004	/* Miscllaneous Events */
101499bc5d55SJohn Soni Jose #define BEISCSI_LOG_EH		0x0008	/* Error Handler */
101599bc5d55SJohn Soni Jose #define BEISCSI_LOG_IO		0x0010	/* IO Code Path */
101699bc5d55SJohn Soni Jose #define BEISCSI_LOG_CONFIG	0x0020	/* CONFIG Code Path */
1017afb96058SJayamohan Kallickal #define BEISCSI_LOG_ISCSI	0x0040	/* SCSI/iSCSI Protocol related Logs */
101899bc5d55SJohn Soni Jose 
101953aefe25SJitendra Bhivare #define __beiscsi_log(phba, level, fmt, arg...) \
102053aefe25SJitendra Bhivare 	shost_printk(level, phba->shost, fmt, __LINE__, ##arg)
102153aefe25SJitendra Bhivare 
102299bc5d55SJohn Soni Jose #define beiscsi_log(phba, level, mask, fmt, arg...) \
102399bc5d55SJohn Soni Jose do { \
102499bc5d55SJohn Soni Jose 	uint32_t log_value = phba->attr_log_enable; \
102599bc5d55SJohn Soni Jose 		if (((mask) & log_value) || (level[1] <= '3')) \
102653aefe25SJitendra Bhivare 			__beiscsi_log(phba, level, fmt, ##arg); \
102753aefe25SJitendra Bhivare } while (0);
102899bc5d55SJohn Soni Jose 
10296733b39aSJayamohan Kallickal #endif
1030