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