18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * QLogic iSCSI Offload Driver 48c2ecf20Sopenharmony_ci * Copyright (c) 2016 Cavium Inc. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _QEDI_H_ 88c2ecf20Sopenharmony_ci#define _QEDI_H_ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define __PREVENT_QED_HSI__ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <scsi/scsi_transport_iscsi.h> 138c2ecf20Sopenharmony_ci#include <scsi/libiscsi.h> 148c2ecf20Sopenharmony_ci#include <scsi/scsi_host.h> 158c2ecf20Sopenharmony_ci#include <linux/uio_driver.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include "qedi_hsi.h" 188c2ecf20Sopenharmony_ci#include <linux/qed/qed_if.h> 198c2ecf20Sopenharmony_ci#include "qedi_dbg.h" 208c2ecf20Sopenharmony_ci#include <linux/qed/qed_iscsi_if.h> 218c2ecf20Sopenharmony_ci#include <linux/qed/qed_ll2_if.h> 228c2ecf20Sopenharmony_ci#include "qedi_version.h" 238c2ecf20Sopenharmony_ci#include "qedi_nvm_iscsi_cfg.h" 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define QEDI_MODULE_NAME "qedi" 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistruct qedi_endpoint; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#ifndef GET_FIELD2 308c2ecf20Sopenharmony_ci#define GET_FIELD2(value, name) \ 318c2ecf20Sopenharmony_ci (((value) & (name ## _MASK)) >> (name ## _OFFSET)) 328c2ecf20Sopenharmony_ci#endif 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* 358c2ecf20Sopenharmony_ci * PCI function probe defines 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_ci#define QEDI_MODE_NORMAL 0 388c2ecf20Sopenharmony_ci#define QEDI_MODE_RECOVERY 1 398c2ecf20Sopenharmony_ci#define QEDI_MODE_SHUTDOWN 2 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#define ISCSI_WQE_SET_PTU_INVALIDATE 1 428c2ecf20Sopenharmony_ci#define QEDI_MAX_ISCSI_TASK 4096 438c2ecf20Sopenharmony_ci#define QEDI_MAX_TASK_NUM 0x0FFF 448c2ecf20Sopenharmony_ci#define QEDI_MAX_ISCSI_CONNS_PER_HBA 1024 458c2ecf20Sopenharmony_ci#define QEDI_ISCSI_MAX_BDS_PER_CMD 255 /* Firmware max BDs is 255 */ 468c2ecf20Sopenharmony_ci#define MAX_OUTSTANDING_TASKS_PER_CON 1024 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define QEDI_MAX_BD_LEN 0xffff 498c2ecf20Sopenharmony_ci#define QEDI_BD_SPLIT_SZ 0x1000 508c2ecf20Sopenharmony_ci#define QEDI_PAGE_SIZE 4096 518c2ecf20Sopenharmony_ci#define QEDI_FAST_SGE_COUNT 4 528c2ecf20Sopenharmony_ci/* MAX Length for cached SGL */ 538c2ecf20Sopenharmony_ci#define MAX_SGLEN_FOR_CACHESGL ((1U << 16) - 1) 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define MIN_NUM_CPUS_MSIX(x) min_t(u32, x->dev_info.num_cqs, \ 568c2ecf20Sopenharmony_ci num_online_cpus()) 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci#define QEDI_LOCAL_PORT_MIN 60000 598c2ecf20Sopenharmony_ci#define QEDI_LOCAL_PORT_MAX 61024 608c2ecf20Sopenharmony_ci#define QEDI_LOCAL_PORT_RANGE (QEDI_LOCAL_PORT_MAX - QEDI_LOCAL_PORT_MIN) 618c2ecf20Sopenharmony_ci#define QEDI_LOCAL_PORT_INVALID 0xffff 628c2ecf20Sopenharmony_ci#define TX_RX_RING 16 638c2ecf20Sopenharmony_ci#define RX_RING (TX_RX_RING - 1) 648c2ecf20Sopenharmony_ci#define QEDI_PAGE_ALIGN(addr) ALIGN(addr, QEDI_PAGE_SIZE) 658c2ecf20Sopenharmony_ci#define QEDI_PAGE_MASK (~((QEDI_PAGE_SIZE) - 1)) 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci#define QEDI_HW_DMA_BOUNDARY 0xfff 688c2ecf20Sopenharmony_ci#define QEDI_PATH_HANDLE 0xFE0000000UL 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cienum qedi_nvm_tgts { 718c2ecf20Sopenharmony_ci QEDI_NVM_TGT_PRI, 728c2ecf20Sopenharmony_ci QEDI_NVM_TGT_SEC, 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistruct qedi_nvm_iscsi_image { 768c2ecf20Sopenharmony_ci struct nvm_iscsi_cfg iscsi_cfg; 778c2ecf20Sopenharmony_ci u32 crc; 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistruct qedi_uio_ctrl { 818c2ecf20Sopenharmony_ci /* meta data */ 828c2ecf20Sopenharmony_ci u32 uio_hsi_version; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci /* user writes */ 858c2ecf20Sopenharmony_ci u32 host_tx_prod; 868c2ecf20Sopenharmony_ci u32 host_rx_cons; 878c2ecf20Sopenharmony_ci u32 host_rx_bd_cons; 888c2ecf20Sopenharmony_ci u32 host_tx_pkt_len; 898c2ecf20Sopenharmony_ci u32 host_rx_cons_cnt; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci /* driver writes */ 928c2ecf20Sopenharmony_ci u32 hw_tx_cons; 938c2ecf20Sopenharmony_ci u32 hw_rx_prod; 948c2ecf20Sopenharmony_ci u32 hw_rx_bd_prod; 958c2ecf20Sopenharmony_ci u32 hw_rx_prod_cnt; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci /* other */ 988c2ecf20Sopenharmony_ci u8 mac_addr[6]; 998c2ecf20Sopenharmony_ci u8 reserve[2]; 1008c2ecf20Sopenharmony_ci}; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_cistruct qedi_rx_bd { 1038c2ecf20Sopenharmony_ci u32 rx_pkt_index; 1048c2ecf20Sopenharmony_ci u32 rx_pkt_len; 1058c2ecf20Sopenharmony_ci u16 vlan_id; 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci#define QEDI_RX_DESC_CNT (QEDI_PAGE_SIZE / sizeof(struct qedi_rx_bd)) 1098c2ecf20Sopenharmony_ci#define QEDI_MAX_RX_DESC_CNT (QEDI_RX_DESC_CNT - 1) 1108c2ecf20Sopenharmony_ci#define QEDI_NUM_RX_BD (QEDI_RX_DESC_CNT * 1) 1118c2ecf20Sopenharmony_ci#define QEDI_MAX_RX_BD (QEDI_NUM_RX_BD - 1) 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci#define QEDI_NEXT_RX_IDX(x) ((((x) & (QEDI_MAX_RX_DESC_CNT)) == \ 1148c2ecf20Sopenharmony_ci (QEDI_MAX_RX_DESC_CNT - 1)) ? \ 1158c2ecf20Sopenharmony_ci (x) + 2 : (x) + 1) 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistruct qedi_uio_dev { 1188c2ecf20Sopenharmony_ci struct uio_info qedi_uinfo; 1198c2ecf20Sopenharmony_ci u32 uio_dev; 1208c2ecf20Sopenharmony_ci struct list_head list; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci u32 ll2_ring_size; 1238c2ecf20Sopenharmony_ci void *ll2_ring; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci u32 ll2_buf_size; 1268c2ecf20Sopenharmony_ci void *ll2_buf; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci void *rx_pkt; 1298c2ecf20Sopenharmony_ci void *tx_pkt; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci struct qedi_ctx *qedi; 1328c2ecf20Sopenharmony_ci struct pci_dev *pdev; 1338c2ecf20Sopenharmony_ci void *uctrl; 1348c2ecf20Sopenharmony_ci}; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci/* List to maintain the skb pointers */ 1378c2ecf20Sopenharmony_cistruct skb_work_list { 1388c2ecf20Sopenharmony_ci struct list_head list; 1398c2ecf20Sopenharmony_ci struct sk_buff *skb; 1408c2ecf20Sopenharmony_ci u16 vlan_id; 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci/* Queue sizes in number of elements */ 1448c2ecf20Sopenharmony_ci#define QEDI_SQ_SIZE MAX_OUTSTANDING_TASKS_PER_CON 1458c2ecf20Sopenharmony_ci#define QEDI_CQ_SIZE 2048 1468c2ecf20Sopenharmony_ci#define QEDI_CMDQ_SIZE QEDI_MAX_ISCSI_TASK 1478c2ecf20Sopenharmony_ci#define QEDI_PROTO_CQ_PROD_IDX 0 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_cistruct qedi_glbl_q_params { 1508c2ecf20Sopenharmony_ci u64 hw_p_cq; /* Completion queue PBL */ 1518c2ecf20Sopenharmony_ci u64 hw_p_rq; /* Request queue PBL */ 1528c2ecf20Sopenharmony_ci u64 hw_p_cmdq; /* Command queue PBL */ 1538c2ecf20Sopenharmony_ci}; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_cistruct global_queue { 1568c2ecf20Sopenharmony_ci union iscsi_cqe *cq; 1578c2ecf20Sopenharmony_ci dma_addr_t cq_dma; 1588c2ecf20Sopenharmony_ci u32 cq_mem_size; 1598c2ecf20Sopenharmony_ci u32 cq_cons_idx; /* Completion queue consumer index */ 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci void *cq_pbl; 1628c2ecf20Sopenharmony_ci dma_addr_t cq_pbl_dma; 1638c2ecf20Sopenharmony_ci u32 cq_pbl_size; 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci}; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistruct qedi_fastpath { 1688c2ecf20Sopenharmony_ci struct qed_sb_info *sb_info; 1698c2ecf20Sopenharmony_ci u16 sb_id; 1708c2ecf20Sopenharmony_ci#define QEDI_NAME_SIZE 16 1718c2ecf20Sopenharmony_ci char name[QEDI_NAME_SIZE]; 1728c2ecf20Sopenharmony_ci struct qedi_ctx *qedi; 1738c2ecf20Sopenharmony_ci}; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci/* Used to pass fastpath information needed to process CQEs */ 1768c2ecf20Sopenharmony_cistruct qedi_io_work { 1778c2ecf20Sopenharmony_ci struct list_head list; 1788c2ecf20Sopenharmony_ci struct iscsi_cqe_solicited cqe; 1798c2ecf20Sopenharmony_ci u16 que_idx; 1808c2ecf20Sopenharmony_ci}; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci/** 1838c2ecf20Sopenharmony_ci * struct iscsi_cid_queue - Per adapter iscsi cid queue 1848c2ecf20Sopenharmony_ci * 1858c2ecf20Sopenharmony_ci * @cid_que_base: queue base memory 1868c2ecf20Sopenharmony_ci * @cid_que: queue memory pointer 1878c2ecf20Sopenharmony_ci * @cid_q_prod_idx: produce index 1888c2ecf20Sopenharmony_ci * @cid_q_cons_idx: consumer index 1898c2ecf20Sopenharmony_ci * @cid_q_max_idx: max index. used to detect wrap around condition 1908c2ecf20Sopenharmony_ci * @cid_free_cnt: queue size 1918c2ecf20Sopenharmony_ci * @conn_cid_tbl: iscsi cid to conn structure mapping table 1928c2ecf20Sopenharmony_ci * 1938c2ecf20Sopenharmony_ci * Per adapter iSCSI CID Queue 1948c2ecf20Sopenharmony_ci */ 1958c2ecf20Sopenharmony_cistruct iscsi_cid_queue { 1968c2ecf20Sopenharmony_ci void *cid_que_base; 1978c2ecf20Sopenharmony_ci u32 *cid_que; 1988c2ecf20Sopenharmony_ci u32 cid_q_prod_idx; 1998c2ecf20Sopenharmony_ci u32 cid_q_cons_idx; 2008c2ecf20Sopenharmony_ci u32 cid_q_max_idx; 2018c2ecf20Sopenharmony_ci u32 cid_free_cnt; 2028c2ecf20Sopenharmony_ci struct qedi_conn **conn_cid_tbl; 2038c2ecf20Sopenharmony_ci}; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cistruct qedi_portid_tbl { 2068c2ecf20Sopenharmony_ci spinlock_t lock; /* Port id lock */ 2078c2ecf20Sopenharmony_ci u16 start; 2088c2ecf20Sopenharmony_ci u16 max; 2098c2ecf20Sopenharmony_ci u16 next; 2108c2ecf20Sopenharmony_ci unsigned long *table; 2118c2ecf20Sopenharmony_ci}; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_cistruct qedi_itt_map { 2148c2ecf20Sopenharmony_ci __le32 itt; 2158c2ecf20Sopenharmony_ci struct qedi_cmd *p_cmd; 2168c2ecf20Sopenharmony_ci}; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci/* I/O tracing entry */ 2198c2ecf20Sopenharmony_ci#define QEDI_IO_TRACE_SIZE 2048 2208c2ecf20Sopenharmony_cistruct qedi_io_log { 2218c2ecf20Sopenharmony_ci#define QEDI_IO_TRACE_REQ 0 2228c2ecf20Sopenharmony_ci#define QEDI_IO_TRACE_RSP 1 2238c2ecf20Sopenharmony_ci u8 direction; 2248c2ecf20Sopenharmony_ci u16 task_id; 2258c2ecf20Sopenharmony_ci u32 cid; 2268c2ecf20Sopenharmony_ci u32 port_id; /* Remote port fabric ID */ 2278c2ecf20Sopenharmony_ci int lun; 2288c2ecf20Sopenharmony_ci u8 op; /* SCSI CDB */ 2298c2ecf20Sopenharmony_ci u8 lba[4]; 2308c2ecf20Sopenharmony_ci unsigned int bufflen; /* SCSI buffer length */ 2318c2ecf20Sopenharmony_ci unsigned int sg_count; /* Number of SG elements */ 2328c2ecf20Sopenharmony_ci u8 fast_sgs; /* number of fast sgls */ 2338c2ecf20Sopenharmony_ci u8 slow_sgs; /* number of slow sgls */ 2348c2ecf20Sopenharmony_ci u8 cached_sgs; /* number of cached sgls */ 2358c2ecf20Sopenharmony_ci int result; /* Result passed back to mid-layer */ 2368c2ecf20Sopenharmony_ci unsigned long jiffies; /* Time stamp when I/O logged */ 2378c2ecf20Sopenharmony_ci int refcount; /* Reference count for task id */ 2388c2ecf20Sopenharmony_ci unsigned int blk_req_cpu; /* CPU that the task is queued on by 2398c2ecf20Sopenharmony_ci * blk layer 2408c2ecf20Sopenharmony_ci */ 2418c2ecf20Sopenharmony_ci unsigned int req_cpu; /* CPU that the task is queued on */ 2428c2ecf20Sopenharmony_ci unsigned int intr_cpu; /* Interrupt CPU that the task is received on */ 2438c2ecf20Sopenharmony_ci unsigned int blk_rsp_cpu;/* CPU that task is actually processed and 2448c2ecf20Sopenharmony_ci * returned to blk layer 2458c2ecf20Sopenharmony_ci */ 2468c2ecf20Sopenharmony_ci bool cached_sge; 2478c2ecf20Sopenharmony_ci bool slow_sge; 2488c2ecf20Sopenharmony_ci bool fast_sge; 2498c2ecf20Sopenharmony_ci}; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci/* Number of entries in BDQ */ 2528c2ecf20Sopenharmony_ci#define QEDI_BDQ_NUM 256 2538c2ecf20Sopenharmony_ci#define QEDI_BDQ_BUF_SIZE 256 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci/* DMA coherent buffers for BDQ */ 2568c2ecf20Sopenharmony_cistruct qedi_bdq_buf { 2578c2ecf20Sopenharmony_ci void *buf_addr; 2588c2ecf20Sopenharmony_ci dma_addr_t buf_dma; 2598c2ecf20Sopenharmony_ci}; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci/* Main port level struct */ 2628c2ecf20Sopenharmony_cistruct qedi_ctx { 2638c2ecf20Sopenharmony_ci struct qedi_dbg_ctx dbg_ctx; 2648c2ecf20Sopenharmony_ci struct Scsi_Host *shost; 2658c2ecf20Sopenharmony_ci struct pci_dev *pdev; 2668c2ecf20Sopenharmony_ci struct qed_dev *cdev; 2678c2ecf20Sopenharmony_ci struct qed_dev_iscsi_info dev_info; 2688c2ecf20Sopenharmony_ci struct qed_int_info int_info; 2698c2ecf20Sopenharmony_ci struct qedi_glbl_q_params *p_cpuq; 2708c2ecf20Sopenharmony_ci struct global_queue **global_queues; 2718c2ecf20Sopenharmony_ci /* uio declaration */ 2728c2ecf20Sopenharmony_ci struct qedi_uio_dev *udev; 2738c2ecf20Sopenharmony_ci struct list_head ll2_skb_list; 2748c2ecf20Sopenharmony_ci spinlock_t ll2_lock; /* Light L2 lock */ 2758c2ecf20Sopenharmony_ci spinlock_t hba_lock; /* per port lock */ 2768c2ecf20Sopenharmony_ci struct task_struct *ll2_recv_thread; 2778c2ecf20Sopenharmony_ci unsigned long qedi_err_flags; 2788c2ecf20Sopenharmony_ci#define QEDI_ERR_ATTN_CLR_EN 0 2798c2ecf20Sopenharmony_ci#define QEDI_ERR_IS_RECOVERABLE 2 2808c2ecf20Sopenharmony_ci#define QEDI_ERR_OVERRIDE_EN 31 2818c2ecf20Sopenharmony_ci unsigned long flags; 2828c2ecf20Sopenharmony_ci#define UIO_DEV_OPENED 1 2838c2ecf20Sopenharmony_ci#define QEDI_IOTHREAD_WAKE 2 2848c2ecf20Sopenharmony_ci#define QEDI_IN_RECOVERY 5 2858c2ecf20Sopenharmony_ci#define QEDI_IN_OFFLINE 6 2868c2ecf20Sopenharmony_ci#define QEDI_IN_SHUTDOWN 7 2878c2ecf20Sopenharmony_ci#define QEDI_BLOCK_IO 8 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci u8 mac[ETH_ALEN]; 2908c2ecf20Sopenharmony_ci u32 src_ip[4]; 2918c2ecf20Sopenharmony_ci u8 ip_type; 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci /* Physical address of above array */ 2948c2ecf20Sopenharmony_ci dma_addr_t hw_p_cpuq; 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci struct qedi_bdq_buf bdq[QEDI_BDQ_NUM]; 2978c2ecf20Sopenharmony_ci void *bdq_pbl; 2988c2ecf20Sopenharmony_ci dma_addr_t bdq_pbl_dma; 2998c2ecf20Sopenharmony_ci size_t bdq_pbl_mem_size; 3008c2ecf20Sopenharmony_ci void *bdq_pbl_list; 3018c2ecf20Sopenharmony_ci dma_addr_t bdq_pbl_list_dma; 3028c2ecf20Sopenharmony_ci u8 bdq_pbl_list_num_entries; 3038c2ecf20Sopenharmony_ci struct qedi_nvm_iscsi_image *iscsi_image; 3048c2ecf20Sopenharmony_ci dma_addr_t nvm_buf_dma; 3058c2ecf20Sopenharmony_ci void __iomem *bdq_primary_prod; 3068c2ecf20Sopenharmony_ci void __iomem *bdq_secondary_prod; 3078c2ecf20Sopenharmony_ci u16 bdq_prod_idx; 3088c2ecf20Sopenharmony_ci u16 rq_num_entries; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci u32 max_sqes; 3118c2ecf20Sopenharmony_ci u8 num_queues; 3128c2ecf20Sopenharmony_ci u32 max_active_conns; 3138c2ecf20Sopenharmony_ci s32 msix_count; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci struct iscsi_cid_queue cid_que; 3168c2ecf20Sopenharmony_ci struct qedi_endpoint **ep_tbl; 3178c2ecf20Sopenharmony_ci struct qedi_portid_tbl lcl_port_tbl; 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci /* Rx fast path intr context */ 3208c2ecf20Sopenharmony_ci struct qed_sb_info *sb_array; 3218c2ecf20Sopenharmony_ci struct qedi_fastpath *fp_array; 3228c2ecf20Sopenharmony_ci struct qed_iscsi_tid tasks; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci#define QEDI_LINK_DOWN 0 3258c2ecf20Sopenharmony_ci#define QEDI_LINK_UP 1 3268c2ecf20Sopenharmony_ci atomic_t link_state; 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci#define QEDI_RESERVE_TASK_ID 0 3298c2ecf20Sopenharmony_ci#define MAX_ISCSI_TASK_ENTRIES 4096 3308c2ecf20Sopenharmony_ci#define QEDI_INVALID_TASK_ID (MAX_ISCSI_TASK_ENTRIES + 1) 3318c2ecf20Sopenharmony_ci unsigned long task_idx_map[MAX_ISCSI_TASK_ENTRIES / BITS_PER_LONG]; 3328c2ecf20Sopenharmony_ci struct qedi_itt_map *itt_map; 3338c2ecf20Sopenharmony_ci u16 tid_reuse_count[QEDI_MAX_ISCSI_TASK]; 3348c2ecf20Sopenharmony_ci struct qed_pf_params pf_params; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci struct workqueue_struct *tmf_thread; 3378c2ecf20Sopenharmony_ci struct workqueue_struct *offload_thread; 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci u16 ll2_mtu; 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ci struct workqueue_struct *dpc_wq; 3428c2ecf20Sopenharmony_ci struct delayed_work recovery_work; 3438c2ecf20Sopenharmony_ci struct delayed_work board_disable_work; 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ci spinlock_t task_idx_lock; /* To protect gbl context */ 3468c2ecf20Sopenharmony_ci s32 last_tidx_alloc; 3478c2ecf20Sopenharmony_ci s32 last_tidx_clear; 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci struct qedi_io_log io_trace_buf[QEDI_IO_TRACE_SIZE]; 3508c2ecf20Sopenharmony_ci spinlock_t io_trace_lock; /* prtect trace Log buf */ 3518c2ecf20Sopenharmony_ci u16 io_trace_idx; 3528c2ecf20Sopenharmony_ci unsigned int intr_cpu; 3538c2ecf20Sopenharmony_ci u32 cached_sgls; 3548c2ecf20Sopenharmony_ci bool use_cached_sge; 3558c2ecf20Sopenharmony_ci u32 slow_sgls; 3568c2ecf20Sopenharmony_ci bool use_slow_sge; 3578c2ecf20Sopenharmony_ci u32 fast_sgls; 3588c2ecf20Sopenharmony_ci bool use_fast_sge; 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci atomic_t num_offloads; 3618c2ecf20Sopenharmony_ci#define SYSFS_FLAG_FW_SEL_BOOT 2 3628c2ecf20Sopenharmony_ci#define IPV6_LEN 41 3638c2ecf20Sopenharmony_ci#define IPV4_LEN 17 3648c2ecf20Sopenharmony_ci struct iscsi_boot_kset *boot_kset; 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci /* Used for iscsi statistics */ 3678c2ecf20Sopenharmony_ci struct mutex stats_lock; 3688c2ecf20Sopenharmony_ci}; 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_cistruct qedi_work { 3718c2ecf20Sopenharmony_ci struct list_head list; 3728c2ecf20Sopenharmony_ci struct qedi_ctx *qedi; 3738c2ecf20Sopenharmony_ci union iscsi_cqe cqe; 3748c2ecf20Sopenharmony_ci u16 que_idx; 3758c2ecf20Sopenharmony_ci bool is_solicited; 3768c2ecf20Sopenharmony_ci}; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_cistruct qedi_percpu_s { 3798c2ecf20Sopenharmony_ci struct task_struct *iothread; 3808c2ecf20Sopenharmony_ci struct list_head work_list; 3818c2ecf20Sopenharmony_ci spinlock_t p_work_lock; /* Per cpu worker lock */ 3828c2ecf20Sopenharmony_ci}; 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_cistatic inline void *qedi_get_task_mem(struct qed_iscsi_tid *info, u32 tid) 3858c2ecf20Sopenharmony_ci{ 3868c2ecf20Sopenharmony_ci return (info->blocks[tid / info->num_tids_per_block] + 3878c2ecf20Sopenharmony_ci (tid % info->num_tids_per_block) * info->size); 3888c2ecf20Sopenharmony_ci} 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci#define QEDI_U64_HI(val) ((u32)(((u64)(val)) >> 32)) 3918c2ecf20Sopenharmony_ci#define QEDI_U64_LO(val) ((u32)(((u64)(val)) & 0xffffffff)) 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci#endif /* _QEDI_H_ */ 394