162306a36Sopenharmony_ci/* bnx2i.h: QLogic NetXtreme II iSCSI driver. 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (c) 2006 - 2013 Broadcom Corporation 462306a36Sopenharmony_ci * Copyright (c) 2007, 2008 Red Hat, Inc. All rights reserved. 562306a36Sopenharmony_ci * Copyright (c) 2007, 2008 Mike Christie 662306a36Sopenharmony_ci * Copyright (c) 2014, QLogic Corporation 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 962306a36Sopenharmony_ci * it under the terms of the GNU General Public License as published by 1062306a36Sopenharmony_ci * the Free Software Foundation. 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) 1362306a36Sopenharmony_ci * Previously Maintained by: Eddie Wai (eddie.wai@broadcom.com) 1462306a36Sopenharmony_ci * Maintained by: QLogic-Storage-Upstream@qlogic.com 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef _BNX2I_H_ 1862306a36Sopenharmony_ci#define _BNX2I_H_ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <linux/module.h> 2162306a36Sopenharmony_ci#include <linux/moduleparam.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <linux/errno.h> 2462306a36Sopenharmony_ci#include <linux/pci.h> 2562306a36Sopenharmony_ci#include <linux/spinlock.h> 2662306a36Sopenharmony_ci#include <linux/interrupt.h> 2762306a36Sopenharmony_ci#include <linux/delay.h> 2862306a36Sopenharmony_ci#include <linux/sched/signal.h> 2962306a36Sopenharmony_ci#include <linux/in.h> 3062306a36Sopenharmony_ci#include <linux/kfifo.h> 3162306a36Sopenharmony_ci#include <linux/netdevice.h> 3262306a36Sopenharmony_ci#include <linux/completion.h> 3362306a36Sopenharmony_ci#include <linux/kthread.h> 3462306a36Sopenharmony_ci#include <linux/cpu.h> 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h> 3762306a36Sopenharmony_ci#include <scsi/scsi_device.h> 3862306a36Sopenharmony_ci#include <scsi/scsi_eh.h> 3962306a36Sopenharmony_ci#include <scsi/scsi_host.h> 4062306a36Sopenharmony_ci#include <scsi/scsi.h> 4162306a36Sopenharmony_ci#include <scsi/iscsi_proto.h> 4262306a36Sopenharmony_ci#include <scsi/libiscsi.h> 4362306a36Sopenharmony_ci#include <scsi/scsi_transport_iscsi.h> 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#include "../../net/ethernet/broadcom/cnic_if.h" 4662306a36Sopenharmony_ci#include "57xx_iscsi_hsi.h" 4762306a36Sopenharmony_ci#include "57xx_iscsi_constants.h" 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#include "../../net/ethernet/broadcom/bnx2x/bnx2x_mfw_req.h" 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define BNX2_ISCSI_DRIVER_NAME "bnx2i" 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define BNX2I_MAX_ADAPTERS 8 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define ISCSI_MAX_CONNS_PER_HBA 128 5662306a36Sopenharmony_ci#define ISCSI_MAX_SESS_PER_HBA ISCSI_MAX_CONNS_PER_HBA 5762306a36Sopenharmony_ci#define ISCSI_MAX_CMDS_PER_SESS 128 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* Total active commands across all connections supported by devices */ 6062306a36Sopenharmony_ci#define ISCSI_MAX_CMDS_PER_HBA_5708 (28 * (ISCSI_MAX_CMDS_PER_SESS - 1)) 6162306a36Sopenharmony_ci#define ISCSI_MAX_CMDS_PER_HBA_5709 (128 * (ISCSI_MAX_CMDS_PER_SESS - 1)) 6262306a36Sopenharmony_ci#define ISCSI_MAX_CMDS_PER_HBA_57710 (256 * (ISCSI_MAX_CMDS_PER_SESS - 1)) 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#define ISCSI_MAX_BDS_PER_CMD 32 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define MAX_PAGES_PER_CTRL_STRUCT_POOL 8 6762306a36Sopenharmony_ci#define BNX2I_RESERVED_SLOW_PATH_CMD_SLOTS 4 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define BNX2X_DB_SHIFT 3 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* 5706/08 hardware has limit on maximum buffer size per BD it can handle */ 7262306a36Sopenharmony_ci#define MAX_BD_LENGTH 65535 7362306a36Sopenharmony_ci#define BD_SPLIT_SIZE 32768 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* min, max & default values for SQ/RQ/CQ size, configurable via' modparam */ 7662306a36Sopenharmony_ci#define BNX2I_SQ_WQES_MIN 16 7762306a36Sopenharmony_ci#define BNX2I_570X_SQ_WQES_MAX 128 7862306a36Sopenharmony_ci#define BNX2I_5770X_SQ_WQES_MAX 512 7962306a36Sopenharmony_ci#define BNX2I_570X_SQ_WQES_DEFAULT 128 8062306a36Sopenharmony_ci#define BNX2I_5770X_SQ_WQES_DEFAULT 128 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define BNX2I_570X_CQ_WQES_MAX 128 8362306a36Sopenharmony_ci#define BNX2I_5770X_CQ_WQES_MAX 512 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define BNX2I_RQ_WQES_MIN 16 8662306a36Sopenharmony_ci#define BNX2I_RQ_WQES_MAX 32 8762306a36Sopenharmony_ci#define BNX2I_RQ_WQES_DEFAULT 16 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* CCELLs per conn */ 9062306a36Sopenharmony_ci#define BNX2I_CCELLS_MIN 16 9162306a36Sopenharmony_ci#define BNX2I_CCELLS_MAX 96 9262306a36Sopenharmony_ci#define BNX2I_CCELLS_DEFAULT 64 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define ITT_INVALID_SIGNATURE 0xFFFF 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define ISCSI_CMD_CLEANUP_TIMEOUT 100 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#define BNX2I_CONN_CTX_BUF_SIZE 16384 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define BNX2I_SQ_WQE_SIZE 64 10162306a36Sopenharmony_ci#define BNX2I_RQ_WQE_SIZE 256 10262306a36Sopenharmony_ci#define BNX2I_CQE_SIZE 64 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#define MB_KERNEL_CTX_SHIFT 8 10562306a36Sopenharmony_ci#define MB_KERNEL_CTX_SIZE (1 << MB_KERNEL_CTX_SHIFT) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define CTX_SHIFT 7 10862306a36Sopenharmony_ci#define GET_CID_NUM(cid_addr) ((cid_addr) >> CTX_SHIFT) 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define CTX_OFFSET 0x10000 11162306a36Sopenharmony_ci#define MAX_CID_CNT 0x4000 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define BNX2I_570X_PAGE_SIZE_DEFAULT 4096 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* 5709 context registers */ 11662306a36Sopenharmony_ci#define BNX2_MQ_CONFIG2 0x00003d00 11762306a36Sopenharmony_ci#define BNX2_MQ_CONFIG2_CONT_SZ (0x7L<<4) 11862306a36Sopenharmony_ci#define BNX2_MQ_CONFIG2_FIRST_L4L5 (0x1fL<<8) 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci/* 57710's BAR2 is mapped to doorbell registers */ 12162306a36Sopenharmony_ci#define BNX2X_DOORBELL_PCI_BAR 2 12262306a36Sopenharmony_ci#define BNX2X_MAX_CQS 8 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define CNIC_ARM_CQE 1 12562306a36Sopenharmony_ci#define CNIC_ARM_CQE_FP 2 12662306a36Sopenharmony_ci#define CNIC_DISARM_CQE 0 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci#define REG_RD(__hba, offset) \ 12962306a36Sopenharmony_ci readl(__hba->regview + offset) 13062306a36Sopenharmony_ci#define REG_WR(__hba, offset, val) \ 13162306a36Sopenharmony_ci writel(val, __hba->regview + offset) 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#ifdef CONFIG_32BIT 13462306a36Sopenharmony_ci#define GET_STATS_64(__hba, dst, field) \ 13562306a36Sopenharmony_ci do { \ 13662306a36Sopenharmony_ci spin_lock_bh(&__hba->stat_lock); \ 13762306a36Sopenharmony_ci dst->field##_lo = __hba->stats.field##_lo; \ 13862306a36Sopenharmony_ci dst->field##_hi = __hba->stats.field##_hi; \ 13962306a36Sopenharmony_ci spin_unlock_bh(&__hba->stat_lock); \ 14062306a36Sopenharmony_ci } while (0) 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#define ADD_STATS_64(__hba, field, len) \ 14362306a36Sopenharmony_ci do { \ 14462306a36Sopenharmony_ci if (spin_trylock(&__hba->stat_lock)) { \ 14562306a36Sopenharmony_ci if (__hba->stats.field##_lo + len < \ 14662306a36Sopenharmony_ci __hba->stats.field##_lo) \ 14762306a36Sopenharmony_ci __hba->stats.field##_hi++; \ 14862306a36Sopenharmony_ci __hba->stats.field##_lo += len; \ 14962306a36Sopenharmony_ci spin_unlock(&__hba->stat_lock); \ 15062306a36Sopenharmony_ci } \ 15162306a36Sopenharmony_ci } while (0) 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci#else 15462306a36Sopenharmony_ci#define GET_STATS_64(__hba, dst, field) \ 15562306a36Sopenharmony_ci do { \ 15662306a36Sopenharmony_ci u64 val, *out; \ 15762306a36Sopenharmony_ci \ 15862306a36Sopenharmony_ci val = __hba->bnx2i_stats.field; \ 15962306a36Sopenharmony_ci out = (u64 *)&__hba->stats.field##_lo; \ 16062306a36Sopenharmony_ci *out = cpu_to_le64(val); \ 16162306a36Sopenharmony_ci out = (u64 *)&dst->field##_lo; \ 16262306a36Sopenharmony_ci *out = cpu_to_le64(val); \ 16362306a36Sopenharmony_ci } while (0) 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci#define ADD_STATS_64(__hba, field, len) \ 16662306a36Sopenharmony_ci do { \ 16762306a36Sopenharmony_ci __hba->bnx2i_stats.field += len; \ 16862306a36Sopenharmony_ci } while (0) 16962306a36Sopenharmony_ci#endif 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci/** 17262306a36Sopenharmony_ci * struct generic_pdu_resc - login pdu resource structure 17362306a36Sopenharmony_ci * 17462306a36Sopenharmony_ci * @req_buf: driver buffer used to stage payload associated with 17562306a36Sopenharmony_ci * the login request 17662306a36Sopenharmony_ci * @req_dma_addr: dma address for iscsi login request payload buffer 17762306a36Sopenharmony_ci * @req_buf_size: actual login request payload length 17862306a36Sopenharmony_ci * @req_wr_ptr: pointer into login request buffer when next data is 17962306a36Sopenharmony_ci * to be written 18062306a36Sopenharmony_ci * @resp_hdr: iscsi header where iscsi login response header is to 18162306a36Sopenharmony_ci * be recreated 18262306a36Sopenharmony_ci * @resp_buf: buffer to stage login response payload 18362306a36Sopenharmony_ci * @resp_dma_addr: login response payload buffer dma address 18462306a36Sopenharmony_ci * @resp_buf_size: login response paylod length 18562306a36Sopenharmony_ci * @resp_wr_ptr: pointer into login response buffer when next data is 18662306a36Sopenharmony_ci * to be written 18762306a36Sopenharmony_ci * @req_bd_tbl: iscsi login request payload BD table 18862306a36Sopenharmony_ci * @req_bd_dma: login request BD table dma address 18962306a36Sopenharmony_ci * @resp_bd_tbl: iscsi login response payload BD table 19062306a36Sopenharmony_ci * @resp_bd_dma: login request BD table dma address 19162306a36Sopenharmony_ci * 19262306a36Sopenharmony_ci * following structure defines buffer info for generic pdus such as iSCSI Login, 19362306a36Sopenharmony_ci * Logout and NOP 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_cistruct generic_pdu_resc { 19662306a36Sopenharmony_ci char *req_buf; 19762306a36Sopenharmony_ci dma_addr_t req_dma_addr; 19862306a36Sopenharmony_ci u32 req_buf_size; 19962306a36Sopenharmony_ci char *req_wr_ptr; 20062306a36Sopenharmony_ci struct iscsi_hdr resp_hdr; 20162306a36Sopenharmony_ci char *resp_buf; 20262306a36Sopenharmony_ci dma_addr_t resp_dma_addr; 20362306a36Sopenharmony_ci u32 resp_buf_size; 20462306a36Sopenharmony_ci char *resp_wr_ptr; 20562306a36Sopenharmony_ci char *req_bd_tbl; 20662306a36Sopenharmony_ci dma_addr_t req_bd_dma; 20762306a36Sopenharmony_ci char *resp_bd_tbl; 20862306a36Sopenharmony_ci dma_addr_t resp_bd_dma; 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci/** 21362306a36Sopenharmony_ci * struct bd_resc_page - tracks DMA'able memory allocated for BD tables 21462306a36Sopenharmony_ci * 21562306a36Sopenharmony_ci * @link: list head to link elements 21662306a36Sopenharmony_ci * @max_ptrs: maximun pointers that can be stored in this page 21762306a36Sopenharmony_ci * @num_valid: number of pointer valid in this page 21862306a36Sopenharmony_ci * @page: base addess for page pointer array 21962306a36Sopenharmony_ci * 22062306a36Sopenharmony_ci * structure to track DMA'able memory allocated for command BD tables 22162306a36Sopenharmony_ci */ 22262306a36Sopenharmony_cistruct bd_resc_page { 22362306a36Sopenharmony_ci struct list_head link; 22462306a36Sopenharmony_ci u32 max_ptrs; 22562306a36Sopenharmony_ci u32 num_valid; 22662306a36Sopenharmony_ci void *page[1]; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci/** 23162306a36Sopenharmony_ci * struct io_bdt - I/O buffer destricptor table 23262306a36Sopenharmony_ci * 23362306a36Sopenharmony_ci * @bd_tbl: BD table's virtual address 23462306a36Sopenharmony_ci * @bd_tbl_dma: BD table's dma address 23562306a36Sopenharmony_ci * @bd_valid: num valid BD entries 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * IO BD table 23862306a36Sopenharmony_ci */ 23962306a36Sopenharmony_cistruct io_bdt { 24062306a36Sopenharmony_ci struct iscsi_bd *bd_tbl; 24162306a36Sopenharmony_ci dma_addr_t bd_tbl_dma; 24262306a36Sopenharmony_ci u16 bd_valid; 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci/** 24762306a36Sopenharmony_ci * bnx2i_cmd - iscsi command structure 24862306a36Sopenharmony_ci * 24962306a36Sopenharmony_ci * @hdr: iSCSI header 25062306a36Sopenharmony_ci * @conn: iscsi_conn pointer 25162306a36Sopenharmony_ci * @scsi_cmd: SCSI-ML task pointer corresponding to this iscsi cmd 25262306a36Sopenharmony_ci * @sg: SG list 25362306a36Sopenharmony_ci * @io_tbl: buffer descriptor (BD) table 25462306a36Sopenharmony_ci * @bd_tbl_dma: buffer descriptor (BD) table's dma address 25562306a36Sopenharmony_ci * @req: bnx2i specific command request struct 25662306a36Sopenharmony_ci */ 25762306a36Sopenharmony_cistruct bnx2i_cmd { 25862306a36Sopenharmony_ci struct iscsi_hdr hdr; 25962306a36Sopenharmony_ci struct bnx2i_conn *conn; 26062306a36Sopenharmony_ci struct scsi_cmnd *scsi_cmd; 26162306a36Sopenharmony_ci struct scatterlist *sg; 26262306a36Sopenharmony_ci struct io_bdt io_tbl; 26362306a36Sopenharmony_ci dma_addr_t bd_tbl_dma; 26462306a36Sopenharmony_ci struct bnx2i_cmd_request req; 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci/** 26962306a36Sopenharmony_ci * struct bnx2i_conn - iscsi connection structure 27062306a36Sopenharmony_ci * 27162306a36Sopenharmony_ci * @cls_conn: pointer to iscsi cls conn 27262306a36Sopenharmony_ci * @hba: adapter structure pointer 27362306a36Sopenharmony_ci * @iscsi_conn_cid: iscsi conn id 27462306a36Sopenharmony_ci * @fw_cid: firmware iscsi context id 27562306a36Sopenharmony_ci * @ep: endpoint structure pointer 27662306a36Sopenharmony_ci * @gen_pdu: login/nopout/logout pdu resources 27762306a36Sopenharmony_ci * @violation_notified: bit mask used to track iscsi error/warning messages 27862306a36Sopenharmony_ci * already printed out 27962306a36Sopenharmony_ci * @work_cnt: keeps track of the number of outstanding work 28062306a36Sopenharmony_ci * 28162306a36Sopenharmony_ci * iSCSI connection structure 28262306a36Sopenharmony_ci */ 28362306a36Sopenharmony_cistruct bnx2i_conn { 28462306a36Sopenharmony_ci struct iscsi_cls_conn *cls_conn; 28562306a36Sopenharmony_ci struct bnx2i_hba *hba; 28662306a36Sopenharmony_ci struct completion cmd_cleanup_cmpl; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci u32 iscsi_conn_cid; 28962306a36Sopenharmony_ci#define BNX2I_CID_RESERVED 0x5AFF 29062306a36Sopenharmony_ci u32 fw_cid; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci struct timer_list poll_timer; 29362306a36Sopenharmony_ci /* 29462306a36Sopenharmony_ci * Queue Pair (QP) related structure elements. 29562306a36Sopenharmony_ci */ 29662306a36Sopenharmony_ci struct bnx2i_endpoint *ep; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci /* 29962306a36Sopenharmony_ci * Buffer for login negotiation process 30062306a36Sopenharmony_ci */ 30162306a36Sopenharmony_ci struct generic_pdu_resc gen_pdu; 30262306a36Sopenharmony_ci u64 violation_notified; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci atomic_t work_cnt; 30562306a36Sopenharmony_ci}; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci/** 31062306a36Sopenharmony_ci * struct iscsi_cid_queue - Per adapter iscsi cid queue 31162306a36Sopenharmony_ci * 31262306a36Sopenharmony_ci * @cid_que_base: queue base memory 31362306a36Sopenharmony_ci * @cid_que: queue memory pointer 31462306a36Sopenharmony_ci * @cid_q_prod_idx: produce index 31562306a36Sopenharmony_ci * @cid_q_cons_idx: consumer index 31662306a36Sopenharmony_ci * @cid_q_max_idx: max index. used to detect wrap around condition 31762306a36Sopenharmony_ci * @cid_free_cnt: queue size 31862306a36Sopenharmony_ci * @conn_cid_tbl: iscsi cid to conn structure mapping table 31962306a36Sopenharmony_ci * 32062306a36Sopenharmony_ci * Per adapter iSCSI CID Queue 32162306a36Sopenharmony_ci */ 32262306a36Sopenharmony_cistruct iscsi_cid_queue { 32362306a36Sopenharmony_ci void *cid_que_base; 32462306a36Sopenharmony_ci u32 *cid_que; 32562306a36Sopenharmony_ci u32 cid_q_prod_idx; 32662306a36Sopenharmony_ci u32 cid_q_cons_idx; 32762306a36Sopenharmony_ci u32 cid_q_max_idx; 32862306a36Sopenharmony_ci u32 cid_free_cnt; 32962306a36Sopenharmony_ci struct bnx2i_conn **conn_cid_tbl; 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistruct bnx2i_stats_info { 33462306a36Sopenharmony_ci u64 rx_pdus; 33562306a36Sopenharmony_ci u64 rx_bytes; 33662306a36Sopenharmony_ci u64 tx_pdus; 33762306a36Sopenharmony_ci u64 tx_bytes; 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/** 34262306a36Sopenharmony_ci * struct bnx2i_hba - bnx2i adapter structure 34362306a36Sopenharmony_ci * 34462306a36Sopenharmony_ci * @link: list head to link elements 34562306a36Sopenharmony_ci * @cnic: pointer to cnic device 34662306a36Sopenharmony_ci * @pcidev: pointer to pci dev 34762306a36Sopenharmony_ci * @netdev: pointer to netdev structure 34862306a36Sopenharmony_ci * @regview: mapped PCI register space 34962306a36Sopenharmony_ci * @age: age, incremented by every recovery 35062306a36Sopenharmony_ci * @cnic_dev_type: cnic device type, 5706/5708/5709/57710 35162306a36Sopenharmony_ci * @mail_queue_access: mailbox queue access mode, applicable to 5709 only 35262306a36Sopenharmony_ci * @reg_with_cnic: indicates whether the device is register with CNIC 35362306a36Sopenharmony_ci * @adapter_state: adapter state, UP, GOING_DOWN, LINK_DOWN 35462306a36Sopenharmony_ci * @mtu_supported: Ethernet MTU supported 35562306a36Sopenharmony_ci * @shost: scsi host pointer 35662306a36Sopenharmony_ci * @max_sqes: SQ size 35762306a36Sopenharmony_ci * @max_rqes: RQ size 35862306a36Sopenharmony_ci * @max_cqes: CQ size 35962306a36Sopenharmony_ci * @num_ccell: number of command cells per connection 36062306a36Sopenharmony_ci * @ofld_conns_active: active connection list 36162306a36Sopenharmony_ci * @eh_wait: wait queue for the endpoint to shutdown 36262306a36Sopenharmony_ci * @max_active_conns: max offload connections supported by this device 36362306a36Sopenharmony_ci * @cid_que: iscsi cid queue 36462306a36Sopenharmony_ci * @ep_rdwr_lock: read / write lock to synchronize various ep lists 36562306a36Sopenharmony_ci * @ep_ofld_list: connection list for pending offload completion 36662306a36Sopenharmony_ci * @ep_active_list: connection list for active offload endpoints 36762306a36Sopenharmony_ci * @ep_destroy_list: connection list for pending offload completion 36862306a36Sopenharmony_ci * @mp_bd_tbl: BD table to be used with middle path requests 36962306a36Sopenharmony_ci * @mp_bd_dma: DMA address of 'mp_bd_tbl' memory buffer 37062306a36Sopenharmony_ci * @dummy_buffer: Dummy buffer to be used with zero length scsicmd reqs 37162306a36Sopenharmony_ci * @dummy_buf_dma: DMA address of 'dummy_buffer' memory buffer 37262306a36Sopenharmony_ci * @lock: lock to synchonize access to hba structure 37362306a36Sopenharmony_ci * @hba_shutdown_tmo: Timeout value to shutdown each connection 37462306a36Sopenharmony_ci * @conn_teardown_tmo: Timeout value to tear down each connection 37562306a36Sopenharmony_ci * @conn_ctx_destroy_tmo: Timeout value to destroy context of each connection 37662306a36Sopenharmony_ci * @pci_did: PCI device ID 37762306a36Sopenharmony_ci * @pci_vid: PCI vendor ID 37862306a36Sopenharmony_ci * @pci_sdid: PCI subsystem device ID 37962306a36Sopenharmony_ci * @pci_svid: PCI subsystem vendor ID 38062306a36Sopenharmony_ci * @pci_func: PCI function number in system pci tree 38162306a36Sopenharmony_ci * @pci_devno: PCI device number in system pci tree 38262306a36Sopenharmony_ci * @num_wqe_sent: statistic counter, total wqe's sent 38362306a36Sopenharmony_ci * @num_cqe_rcvd: statistic counter, total cqe's received 38462306a36Sopenharmony_ci * @num_intr_claimed: statistic counter, total interrupts claimed 38562306a36Sopenharmony_ci * @link_changed_count: statistic counter, num of link change notifications 38662306a36Sopenharmony_ci * received 38762306a36Sopenharmony_ci * @ipaddr_changed_count: statistic counter, num times IP address changed while 38862306a36Sopenharmony_ci * at least one connection is offloaded 38962306a36Sopenharmony_ci * @num_sess_opened: statistic counter, total num sessions opened 39062306a36Sopenharmony_ci * @num_conn_opened: statistic counter, total num conns opened on this hba 39162306a36Sopenharmony_ci * @ctx_ccell_tasks: captures number of ccells and tasks supported by 39262306a36Sopenharmony_ci * currently offloaded connection, used to decode 39362306a36Sopenharmony_ci * context memory 39462306a36Sopenharmony_ci * @stat_lock: spin lock used by the statistic collector (32 bit) 39562306a36Sopenharmony_ci * @stats: local iSCSI statistic collection place holder 39662306a36Sopenharmony_ci * 39762306a36Sopenharmony_ci * Adapter Data Structure 39862306a36Sopenharmony_ci */ 39962306a36Sopenharmony_cistruct bnx2i_hba { 40062306a36Sopenharmony_ci struct list_head link; 40162306a36Sopenharmony_ci struct cnic_dev *cnic; 40262306a36Sopenharmony_ci struct pci_dev *pcidev; 40362306a36Sopenharmony_ci struct net_device *netdev; 40462306a36Sopenharmony_ci void __iomem *regview; 40562306a36Sopenharmony_ci resource_size_t reg_base; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci u32 age; 40862306a36Sopenharmony_ci unsigned long cnic_dev_type; 40962306a36Sopenharmony_ci #define BNX2I_NX2_DEV_5706 0x0 41062306a36Sopenharmony_ci #define BNX2I_NX2_DEV_5708 0x1 41162306a36Sopenharmony_ci #define BNX2I_NX2_DEV_5709 0x2 41262306a36Sopenharmony_ci #define BNX2I_NX2_DEV_57710 0x3 41362306a36Sopenharmony_ci u32 mail_queue_access; 41462306a36Sopenharmony_ci #define BNX2I_MQ_KERNEL_MODE 0x0 41562306a36Sopenharmony_ci #define BNX2I_MQ_KERNEL_BYPASS_MODE 0x1 41662306a36Sopenharmony_ci #define BNX2I_MQ_BIN_MODE 0x2 41762306a36Sopenharmony_ci unsigned long reg_with_cnic; 41862306a36Sopenharmony_ci #define BNX2I_CNIC_REGISTERED 1 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci unsigned long adapter_state; 42162306a36Sopenharmony_ci #define ADAPTER_STATE_UP 0 42262306a36Sopenharmony_ci #define ADAPTER_STATE_GOING_DOWN 1 42362306a36Sopenharmony_ci #define ADAPTER_STATE_LINK_DOWN 2 42462306a36Sopenharmony_ci #define ADAPTER_STATE_INIT_FAILED 31 42562306a36Sopenharmony_ci unsigned int mtu_supported; 42662306a36Sopenharmony_ci #define BNX2I_MAX_MTU_SUPPORTED 9000 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci struct Scsi_Host *shost; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci u32 max_sqes; 43162306a36Sopenharmony_ci u32 max_rqes; 43262306a36Sopenharmony_ci u32 max_cqes; 43362306a36Sopenharmony_ci u32 num_ccell; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci int ofld_conns_active; 43662306a36Sopenharmony_ci wait_queue_head_t eh_wait; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci int max_active_conns; 43962306a36Sopenharmony_ci struct iscsi_cid_queue cid_que; 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci rwlock_t ep_rdwr_lock; 44262306a36Sopenharmony_ci struct list_head ep_ofld_list; 44362306a36Sopenharmony_ci struct list_head ep_active_list; 44462306a36Sopenharmony_ci struct list_head ep_destroy_list; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci /* 44762306a36Sopenharmony_ci * BD table to be used with MP (Middle Path requests. 44862306a36Sopenharmony_ci */ 44962306a36Sopenharmony_ci char *mp_bd_tbl; 45062306a36Sopenharmony_ci dma_addr_t mp_bd_dma; 45162306a36Sopenharmony_ci char *dummy_buffer; 45262306a36Sopenharmony_ci dma_addr_t dummy_buf_dma; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci spinlock_t lock; /* protects hba structure access */ 45562306a36Sopenharmony_ci struct mutex net_dev_lock;/* sync net device access */ 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci int hba_shutdown_tmo; 45862306a36Sopenharmony_ci int conn_teardown_tmo; 45962306a36Sopenharmony_ci int conn_ctx_destroy_tmo; 46062306a36Sopenharmony_ci /* 46162306a36Sopenharmony_ci * PCI related info. 46262306a36Sopenharmony_ci */ 46362306a36Sopenharmony_ci u16 pci_did; 46462306a36Sopenharmony_ci u16 pci_vid; 46562306a36Sopenharmony_ci u16 pci_sdid; 46662306a36Sopenharmony_ci u16 pci_svid; 46762306a36Sopenharmony_ci u16 pci_func; 46862306a36Sopenharmony_ci u16 pci_devno; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci /* 47162306a36Sopenharmony_ci * Following are a bunch of statistics useful during development 47262306a36Sopenharmony_ci * and later stage for score boarding. 47362306a36Sopenharmony_ci */ 47462306a36Sopenharmony_ci u32 num_wqe_sent; 47562306a36Sopenharmony_ci u32 num_cqe_rcvd; 47662306a36Sopenharmony_ci u32 num_intr_claimed; 47762306a36Sopenharmony_ci u32 link_changed_count; 47862306a36Sopenharmony_ci u32 ipaddr_changed_count; 47962306a36Sopenharmony_ci u32 num_sess_opened; 48062306a36Sopenharmony_ci u32 num_conn_opened; 48162306a36Sopenharmony_ci unsigned int ctx_ccell_tasks; 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci#ifdef CONFIG_32BIT 48462306a36Sopenharmony_ci spinlock_t stat_lock; 48562306a36Sopenharmony_ci#endif 48662306a36Sopenharmony_ci struct bnx2i_stats_info bnx2i_stats; 48762306a36Sopenharmony_ci struct iscsi_stats_info stats; 48862306a36Sopenharmony_ci}; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci/******************************************************************************* 49262306a36Sopenharmony_ci * QP [ SQ / RQ / CQ ] info. 49362306a36Sopenharmony_ci ******************************************************************************/ 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci/* 49662306a36Sopenharmony_ci * SQ/RQ/CQ generic structure definition 49762306a36Sopenharmony_ci */ 49862306a36Sopenharmony_cistruct sqe { 49962306a36Sopenharmony_ci u8 sqe_byte[BNX2I_SQ_WQE_SIZE]; 50062306a36Sopenharmony_ci}; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_cistruct rqe { 50362306a36Sopenharmony_ci u8 rqe_byte[BNX2I_RQ_WQE_SIZE]; 50462306a36Sopenharmony_ci}; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistruct cqe { 50762306a36Sopenharmony_ci u8 cqe_byte[BNX2I_CQE_SIZE]; 50862306a36Sopenharmony_ci}; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_cienum { 51262306a36Sopenharmony_ci#if defined(__LITTLE_ENDIAN) 51362306a36Sopenharmony_ci CNIC_EVENT_COAL_INDEX = 0x0, 51462306a36Sopenharmony_ci CNIC_SEND_DOORBELL = 0x4, 51562306a36Sopenharmony_ci CNIC_EVENT_CQ_ARM = 0x7, 51662306a36Sopenharmony_ci CNIC_RECV_DOORBELL = 0x8 51762306a36Sopenharmony_ci#elif defined(__BIG_ENDIAN) 51862306a36Sopenharmony_ci CNIC_EVENT_COAL_INDEX = 0x2, 51962306a36Sopenharmony_ci CNIC_SEND_DOORBELL = 0x6, 52062306a36Sopenharmony_ci CNIC_EVENT_CQ_ARM = 0x4, 52162306a36Sopenharmony_ci CNIC_RECV_DOORBELL = 0xa 52262306a36Sopenharmony_ci#endif 52362306a36Sopenharmony_ci}; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci/* 52762306a36Sopenharmony_ci * CQ DB 52862306a36Sopenharmony_ci */ 52962306a36Sopenharmony_cistruct bnx2x_iscsi_cq_pend_cmpl { 53062306a36Sopenharmony_ci /* CQ producer, updated by Ustorm */ 53162306a36Sopenharmony_ci u16 ustrom_prod; 53262306a36Sopenharmony_ci /* CQ pending completion counter */ 53362306a36Sopenharmony_ci u16 pend_cntr; 53462306a36Sopenharmony_ci}; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_cistruct bnx2i_5771x_cq_db { 53862306a36Sopenharmony_ci struct bnx2x_iscsi_cq_pend_cmpl qp_pend_cmpl[BNX2X_MAX_CQS]; 53962306a36Sopenharmony_ci /* CQ pending completion ITT array */ 54062306a36Sopenharmony_ci u16 itt[BNX2X_MAX_CQS]; 54162306a36Sopenharmony_ci /* Cstorm CQ sequence to notify array, updated by driver */; 54262306a36Sopenharmony_ci u16 sqn[BNX2X_MAX_CQS]; 54362306a36Sopenharmony_ci u32 reserved[4] /* 16 byte allignment */; 54462306a36Sopenharmony_ci}; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_cistruct bnx2i_5771x_sq_rq_db { 54862306a36Sopenharmony_ci u16 prod_idx; 54962306a36Sopenharmony_ci u8 reserved0[62]; /* Pad structure size to 64 bytes */ 55062306a36Sopenharmony_ci}; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_cistruct bnx2i_5771x_dbell_hdr { 55462306a36Sopenharmony_ci u8 header; 55562306a36Sopenharmony_ci /* 1 for rx doorbell, 0 for tx doorbell */ 55662306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_RX (0x1<<0) 55762306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_RX_SHIFT 0 55862306a36Sopenharmony_ci /* 0 for normal doorbell, 1 for advertise wnd doorbell */ 55962306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_DB_TYPE (0x1<<1) 56062306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_DB_TYPE_SHIFT 1 56162306a36Sopenharmony_ci /* rdma tx only: DPM transaction size specifier (64/128/256/512B) */ 56262306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_DPM_SIZE (0x3<<2) 56362306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_DPM_SIZE_SHIFT 2 56462306a36Sopenharmony_ci /* connection type */ 56562306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_CONN_TYPE (0xF<<4) 56662306a36Sopenharmony_ci#define B577XX_DOORBELL_HDR_CONN_TYPE_SHIFT 4 56762306a36Sopenharmony_ci}; 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_cistruct bnx2i_5771x_dbell { 57062306a36Sopenharmony_ci struct bnx2i_5771x_dbell_hdr dbell; 57162306a36Sopenharmony_ci u8 pad[3]; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci}; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci/** 57662306a36Sopenharmony_ci * struct qp_info - QP (share queue region) atrributes structure 57762306a36Sopenharmony_ci * 57862306a36Sopenharmony_ci * @ctx_base: ioremapped pci register base to access doorbell register 57962306a36Sopenharmony_ci * pertaining to this offloaded connection 58062306a36Sopenharmony_ci * @sq_virt: virtual address of send queue (SQ) region 58162306a36Sopenharmony_ci * @sq_phys: DMA address of SQ memory region 58262306a36Sopenharmony_ci * @sq_mem_size: SQ size 58362306a36Sopenharmony_ci * @sq_prod_qe: SQ producer entry pointer 58462306a36Sopenharmony_ci * @sq_cons_qe: SQ consumer entry pointer 58562306a36Sopenharmony_ci * @sq_first_qe: virtual address of first entry in SQ 58662306a36Sopenharmony_ci * @sq_last_qe: virtual address of last entry in SQ 58762306a36Sopenharmony_ci * @sq_prod_idx: SQ producer index 58862306a36Sopenharmony_ci * @sq_cons_idx: SQ consumer index 58962306a36Sopenharmony_ci * @sqe_left: number sq entry left 59062306a36Sopenharmony_ci * @sq_pgtbl_virt: page table describing buffer consituting SQ region 59162306a36Sopenharmony_ci * @sq_pgtbl_phys: dma address of 'sq_pgtbl_virt' 59262306a36Sopenharmony_ci * @sq_pgtbl_size: SQ page table size 59362306a36Sopenharmony_ci * @cq_virt: virtual address of completion queue (CQ) region 59462306a36Sopenharmony_ci * @cq_phys: DMA address of RQ memory region 59562306a36Sopenharmony_ci * @cq_mem_size: CQ size 59662306a36Sopenharmony_ci * @cq_prod_qe: CQ producer entry pointer 59762306a36Sopenharmony_ci * @cq_cons_qe: CQ consumer entry pointer 59862306a36Sopenharmony_ci * @cq_first_qe: virtual address of first entry in CQ 59962306a36Sopenharmony_ci * @cq_last_qe: virtual address of last entry in CQ 60062306a36Sopenharmony_ci * @cq_prod_idx: CQ producer index 60162306a36Sopenharmony_ci * @cq_cons_idx: CQ consumer index 60262306a36Sopenharmony_ci * @cqe_left: number cq entry left 60362306a36Sopenharmony_ci * @cqe_size: size of each CQ entry 60462306a36Sopenharmony_ci * @cqe_exp_seq_sn: next expected CQE sequence number 60562306a36Sopenharmony_ci * @cq_pgtbl_virt: page table describing buffer consituting CQ region 60662306a36Sopenharmony_ci * @cq_pgtbl_phys: dma address of 'cq_pgtbl_virt' 60762306a36Sopenharmony_ci * @cq_pgtbl_size: CQ page table size 60862306a36Sopenharmony_ci * @rq_virt: virtual address of receive queue (RQ) region 60962306a36Sopenharmony_ci * @rq_phys: DMA address of RQ memory region 61062306a36Sopenharmony_ci * @rq_mem_size: RQ size 61162306a36Sopenharmony_ci * @rq_prod_qe: RQ producer entry pointer 61262306a36Sopenharmony_ci * @rq_cons_qe: RQ consumer entry pointer 61362306a36Sopenharmony_ci * @rq_first_qe: virtual address of first entry in RQ 61462306a36Sopenharmony_ci * @rq_last_qe: virtual address of last entry in RQ 61562306a36Sopenharmony_ci * @rq_prod_idx: RQ producer index 61662306a36Sopenharmony_ci * @rq_cons_idx: RQ consumer index 61762306a36Sopenharmony_ci * @rqe_left: number rq entry left 61862306a36Sopenharmony_ci * @rq_pgtbl_virt: page table describing buffer consituting RQ region 61962306a36Sopenharmony_ci * @rq_pgtbl_phys: dma address of 'rq_pgtbl_virt' 62062306a36Sopenharmony_ci * @rq_pgtbl_size: RQ page table size 62162306a36Sopenharmony_ci * 62262306a36Sopenharmony_ci * queue pair (QP) is a per connection shared data structure which is used 62362306a36Sopenharmony_ci * to send work requests (SQ), receive completion notifications (CQ) 62462306a36Sopenharmony_ci * and receive asynchoronous / scsi sense info (RQ). 'qp_info' structure 62562306a36Sopenharmony_ci * below holds queue memory, consumer/producer indexes and page table 62662306a36Sopenharmony_ci * information 62762306a36Sopenharmony_ci */ 62862306a36Sopenharmony_cistruct qp_info { 62962306a36Sopenharmony_ci void __iomem *ctx_base; 63062306a36Sopenharmony_ci#define DPM_TRIGER_TYPE 0x40 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci#define BNX2I_570x_QUE_DB_SIZE 0 63362306a36Sopenharmony_ci#define BNX2I_5771x_QUE_DB_SIZE 16 63462306a36Sopenharmony_ci struct sqe *sq_virt; 63562306a36Sopenharmony_ci dma_addr_t sq_phys; 63662306a36Sopenharmony_ci u32 sq_mem_size; 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_ci struct sqe *sq_prod_qe; 63962306a36Sopenharmony_ci struct sqe *sq_cons_qe; 64062306a36Sopenharmony_ci struct sqe *sq_first_qe; 64162306a36Sopenharmony_ci struct sqe *sq_last_qe; 64262306a36Sopenharmony_ci u16 sq_prod_idx; 64362306a36Sopenharmony_ci u16 sq_cons_idx; 64462306a36Sopenharmony_ci u32 sqe_left; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci void *sq_pgtbl_virt; 64762306a36Sopenharmony_ci dma_addr_t sq_pgtbl_phys; 64862306a36Sopenharmony_ci u32 sq_pgtbl_size; /* set to PAGE_SIZE for 5708 & 5709 */ 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci struct cqe *cq_virt; 65162306a36Sopenharmony_ci dma_addr_t cq_phys; 65262306a36Sopenharmony_ci u32 cq_mem_size; 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci struct cqe *cq_prod_qe; 65562306a36Sopenharmony_ci struct cqe *cq_cons_qe; 65662306a36Sopenharmony_ci struct cqe *cq_first_qe; 65762306a36Sopenharmony_ci struct cqe *cq_last_qe; 65862306a36Sopenharmony_ci u16 cq_prod_idx; 65962306a36Sopenharmony_ci u16 cq_cons_idx; 66062306a36Sopenharmony_ci u32 cqe_left; 66162306a36Sopenharmony_ci u32 cqe_size; 66262306a36Sopenharmony_ci u32 cqe_exp_seq_sn; 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci void *cq_pgtbl_virt; 66562306a36Sopenharmony_ci dma_addr_t cq_pgtbl_phys; 66662306a36Sopenharmony_ci u32 cq_pgtbl_size; /* set to PAGE_SIZE for 5708 & 5709 */ 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_ci struct rqe *rq_virt; 66962306a36Sopenharmony_ci dma_addr_t rq_phys; 67062306a36Sopenharmony_ci u32 rq_mem_size; 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci struct rqe *rq_prod_qe; 67362306a36Sopenharmony_ci struct rqe *rq_cons_qe; 67462306a36Sopenharmony_ci struct rqe *rq_first_qe; 67562306a36Sopenharmony_ci struct rqe *rq_last_qe; 67662306a36Sopenharmony_ci u16 rq_prod_idx; 67762306a36Sopenharmony_ci u16 rq_cons_idx; 67862306a36Sopenharmony_ci u32 rqe_left; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci void *rq_pgtbl_virt; 68162306a36Sopenharmony_ci dma_addr_t rq_pgtbl_phys; 68262306a36Sopenharmony_ci u32 rq_pgtbl_size; /* set to PAGE_SIZE for 5708 & 5709 */ 68362306a36Sopenharmony_ci}; 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci/* 68862306a36Sopenharmony_ci * CID handles 68962306a36Sopenharmony_ci */ 69062306a36Sopenharmony_cistruct ep_handles { 69162306a36Sopenharmony_ci u32 fw_cid; 69262306a36Sopenharmony_ci u32 drv_iscsi_cid; 69362306a36Sopenharmony_ci u16 pg_cid; 69462306a36Sopenharmony_ci u16 rsvd; 69562306a36Sopenharmony_ci}; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_cienum { 69962306a36Sopenharmony_ci EP_STATE_IDLE = 0x0, 70062306a36Sopenharmony_ci EP_STATE_PG_OFLD_START = 0x1, 70162306a36Sopenharmony_ci EP_STATE_PG_OFLD_COMPL = 0x2, 70262306a36Sopenharmony_ci EP_STATE_OFLD_START = 0x4, 70362306a36Sopenharmony_ci EP_STATE_OFLD_COMPL = 0x8, 70462306a36Sopenharmony_ci EP_STATE_CONNECT_START = 0x10, 70562306a36Sopenharmony_ci EP_STATE_CONNECT_COMPL = 0x20, 70662306a36Sopenharmony_ci EP_STATE_ULP_UPDATE_START = 0x40, 70762306a36Sopenharmony_ci EP_STATE_ULP_UPDATE_COMPL = 0x80, 70862306a36Sopenharmony_ci EP_STATE_DISCONN_START = 0x100, 70962306a36Sopenharmony_ci EP_STATE_DISCONN_COMPL = 0x200, 71062306a36Sopenharmony_ci EP_STATE_CLEANUP_START = 0x400, 71162306a36Sopenharmony_ci EP_STATE_CLEANUP_CMPL = 0x800, 71262306a36Sopenharmony_ci EP_STATE_TCP_FIN_RCVD = 0x1000, 71362306a36Sopenharmony_ci EP_STATE_TCP_RST_RCVD = 0x2000, 71462306a36Sopenharmony_ci EP_STATE_LOGOUT_SENT = 0x4000, 71562306a36Sopenharmony_ci EP_STATE_LOGOUT_RESP_RCVD = 0x8000, 71662306a36Sopenharmony_ci EP_STATE_PG_OFLD_FAILED = 0x1000000, 71762306a36Sopenharmony_ci EP_STATE_ULP_UPDATE_FAILED = 0x2000000, 71862306a36Sopenharmony_ci EP_STATE_CLEANUP_FAILED = 0x4000000, 71962306a36Sopenharmony_ci EP_STATE_OFLD_FAILED = 0x8000000, 72062306a36Sopenharmony_ci EP_STATE_CONNECT_FAILED = 0x10000000, 72162306a36Sopenharmony_ci EP_STATE_DISCONN_TIMEDOUT = 0x20000000, 72262306a36Sopenharmony_ci EP_STATE_OFLD_FAILED_CID_BUSY = 0x80000000, 72362306a36Sopenharmony_ci}; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci/** 72662306a36Sopenharmony_ci * struct bnx2i_endpoint - representation of tcp connection in NX2 world 72762306a36Sopenharmony_ci * 72862306a36Sopenharmony_ci * @link: list head to link elements 72962306a36Sopenharmony_ci * @hba: adapter to which this connection belongs 73062306a36Sopenharmony_ci * @conn: iscsi connection this EP is linked to 73162306a36Sopenharmony_ci * @cls_ep: associated iSCSI endpoint pointer 73262306a36Sopenharmony_ci * @cm_sk: cnic sock struct 73362306a36Sopenharmony_ci * @hba_age: age to detect if 'iscsid' issues ep_disconnect() 73462306a36Sopenharmony_ci * after HBA reset is completed by bnx2i/cnic/bnx2 73562306a36Sopenharmony_ci * modules 73662306a36Sopenharmony_ci * @state: tracks offload connection state machine 73762306a36Sopenharmony_ci * @timestamp: tracks the start time when the ep begins to connect 73862306a36Sopenharmony_ci * @num_active_cmds: tracks the number of outstanding commands for this ep 73962306a36Sopenharmony_ci * @ec_shift: the amount of shift as part of the event coal calc 74062306a36Sopenharmony_ci * @qp: QP information 74162306a36Sopenharmony_ci * @ids: contains chip allocated *context id* & driver assigned 74262306a36Sopenharmony_ci * *iscsi cid* 74362306a36Sopenharmony_ci * @ofld_timer: offload timer to detect timeout 74462306a36Sopenharmony_ci * @ofld_wait: wait queue 74562306a36Sopenharmony_ci * 74662306a36Sopenharmony_ci * Endpoint Structure - equivalent of tcp socket structure 74762306a36Sopenharmony_ci */ 74862306a36Sopenharmony_cistruct bnx2i_endpoint { 74962306a36Sopenharmony_ci struct list_head link; 75062306a36Sopenharmony_ci struct bnx2i_hba *hba; 75162306a36Sopenharmony_ci struct bnx2i_conn *conn; 75262306a36Sopenharmony_ci struct iscsi_endpoint *cls_ep; 75362306a36Sopenharmony_ci struct cnic_sock *cm_sk; 75462306a36Sopenharmony_ci u32 hba_age; 75562306a36Sopenharmony_ci u32 state; 75662306a36Sopenharmony_ci unsigned long timestamp; 75762306a36Sopenharmony_ci atomic_t num_active_cmds; 75862306a36Sopenharmony_ci u32 ec_shift; 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci struct qp_info qp; 76162306a36Sopenharmony_ci struct ep_handles ids; 76262306a36Sopenharmony_ci #define ep_iscsi_cid ids.drv_iscsi_cid 76362306a36Sopenharmony_ci #define ep_cid ids.fw_cid 76462306a36Sopenharmony_ci #define ep_pg_cid ids.pg_cid 76562306a36Sopenharmony_ci struct timer_list ofld_timer; 76662306a36Sopenharmony_ci wait_queue_head_t ofld_wait; 76762306a36Sopenharmony_ci}; 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_cistruct bnx2i_work { 77162306a36Sopenharmony_ci struct list_head list; 77262306a36Sopenharmony_ci struct iscsi_session *session; 77362306a36Sopenharmony_ci struct bnx2i_conn *bnx2i_conn; 77462306a36Sopenharmony_ci struct cqe cqe; 77562306a36Sopenharmony_ci}; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_cistruct bnx2i_percpu_s { 77862306a36Sopenharmony_ci struct task_struct *iothread; 77962306a36Sopenharmony_ci struct list_head work_list; 78062306a36Sopenharmony_ci spinlock_t p_work_lock; 78162306a36Sopenharmony_ci}; 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci/* Global variables */ 78562306a36Sopenharmony_ciextern unsigned int error_mask1, error_mask2; 78662306a36Sopenharmony_ciextern u64 iscsi_error_mask; 78762306a36Sopenharmony_ciextern unsigned int en_tcp_dack; 78862306a36Sopenharmony_ciextern unsigned int event_coal_div; 78962306a36Sopenharmony_ciextern unsigned int event_coal_min; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ciextern struct scsi_transport_template *bnx2i_scsi_xport_template; 79262306a36Sopenharmony_ciextern struct iscsi_transport bnx2i_iscsi_transport; 79362306a36Sopenharmony_ciextern struct cnic_ulp_ops bnx2i_cnic_cb; 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_ciextern unsigned int sq_size; 79662306a36Sopenharmony_ciextern unsigned int rq_size; 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ciextern const struct attribute_group *bnx2i_dev_groups[]; 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_ci/* 80362306a36Sopenharmony_ci * Function Prototypes 80462306a36Sopenharmony_ci */ 80562306a36Sopenharmony_ciextern void bnx2i_identify_device(struct bnx2i_hba *hba, struct cnic_dev *dev); 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_ciextern void bnx2i_ulp_init(struct cnic_dev *dev); 80862306a36Sopenharmony_ciextern void bnx2i_ulp_exit(struct cnic_dev *dev); 80962306a36Sopenharmony_ciextern void bnx2i_start(void *handle); 81062306a36Sopenharmony_ciextern void bnx2i_stop(void *handle); 81162306a36Sopenharmony_ciextern int bnx2i_get_stats(void *handle); 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ciextern struct bnx2i_hba *get_adapter_list_head(void); 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_cistruct bnx2i_conn *bnx2i_get_conn_from_id(struct bnx2i_hba *hba, 81662306a36Sopenharmony_ci u16 iscsi_cid); 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_ciint bnx2i_alloc_ep_pool(void); 81962306a36Sopenharmony_civoid bnx2i_release_ep_pool(void); 82062306a36Sopenharmony_cistruct bnx2i_endpoint *bnx2i_ep_ofld_list_next(struct bnx2i_hba *hba); 82162306a36Sopenharmony_cistruct bnx2i_endpoint *bnx2i_ep_destroy_list_next(struct bnx2i_hba *hba); 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_cistruct bnx2i_hba *bnx2i_find_hba_for_cnic(struct cnic_dev *cnic); 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_cistruct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic); 82662306a36Sopenharmony_civoid bnx2i_free_hba(struct bnx2i_hba *hba); 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_civoid bnx2i_get_rq_buf(struct bnx2i_conn *conn, char *ptr, int len); 82962306a36Sopenharmony_civoid bnx2i_put_rq_buf(struct bnx2i_conn *conn, int count); 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_civoid bnx2i_iscsi_unmap_sg_list(struct bnx2i_cmd *cmd); 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_civoid bnx2i_drop_session(struct iscsi_cls_session *session); 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ciextern int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba); 83662306a36Sopenharmony_ciextern int bnx2i_send_iscsi_login(struct bnx2i_conn *conn, 83762306a36Sopenharmony_ci struct iscsi_task *mtask); 83862306a36Sopenharmony_ciextern int bnx2i_send_iscsi_tmf(struct bnx2i_conn *conn, 83962306a36Sopenharmony_ci struct iscsi_task *mtask); 84062306a36Sopenharmony_ciextern int bnx2i_send_iscsi_text(struct bnx2i_conn *conn, 84162306a36Sopenharmony_ci struct iscsi_task *mtask); 84262306a36Sopenharmony_ciextern int bnx2i_send_iscsi_scsicmd(struct bnx2i_conn *conn, 84362306a36Sopenharmony_ci struct bnx2i_cmd *cmnd); 84462306a36Sopenharmony_ciextern int bnx2i_send_iscsi_nopout(struct bnx2i_conn *conn, 84562306a36Sopenharmony_ci struct iscsi_task *mtask, 84662306a36Sopenharmony_ci char *datap, int data_len, int unsol); 84762306a36Sopenharmony_ciextern int bnx2i_send_iscsi_logout(struct bnx2i_conn *conn, 84862306a36Sopenharmony_ci struct iscsi_task *mtask); 84962306a36Sopenharmony_ciextern void bnx2i_send_cmd_cleanup_req(struct bnx2i_hba *hba, 85062306a36Sopenharmony_ci struct bnx2i_cmd *cmd); 85162306a36Sopenharmony_ciextern int bnx2i_send_conn_ofld_req(struct bnx2i_hba *hba, 85262306a36Sopenharmony_ci struct bnx2i_endpoint *ep); 85362306a36Sopenharmony_ciextern void bnx2i_update_iscsi_conn(struct iscsi_conn *conn); 85462306a36Sopenharmony_ciextern int bnx2i_send_conn_destroy(struct bnx2i_hba *hba, 85562306a36Sopenharmony_ci struct bnx2i_endpoint *ep); 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ciextern int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba, 85862306a36Sopenharmony_ci struct bnx2i_endpoint *ep); 85962306a36Sopenharmony_ciextern void bnx2i_free_qp_resc(struct bnx2i_hba *hba, 86062306a36Sopenharmony_ci struct bnx2i_endpoint *ep); 86162306a36Sopenharmony_ciextern void bnx2i_ep_ofld_timer(struct timer_list *t); 86262306a36Sopenharmony_ciextern struct bnx2i_endpoint *bnx2i_find_ep_in_ofld_list( 86362306a36Sopenharmony_ci struct bnx2i_hba *hba, u32 iscsi_cid); 86462306a36Sopenharmony_ciextern struct bnx2i_endpoint *bnx2i_find_ep_in_destroy_list( 86562306a36Sopenharmony_ci struct bnx2i_hba *hba, u32 iscsi_cid); 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_ciextern int bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep); 86862306a36Sopenharmony_ciextern int bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action); 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ciextern int bnx2i_hw_ep_disconnect(struct bnx2i_endpoint *bnx2i_ep); 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci/* Debug related function prototypes */ 87362306a36Sopenharmony_ciextern void bnx2i_print_pend_cmd_queue(struct bnx2i_conn *conn); 87462306a36Sopenharmony_ciextern void bnx2i_print_active_cmd_queue(struct bnx2i_conn *conn); 87562306a36Sopenharmony_ciextern void bnx2i_print_xmit_pdu_queue(struct bnx2i_conn *conn); 87662306a36Sopenharmony_ciextern void bnx2i_print_recv_state(struct bnx2i_conn *conn); 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_ciextern int bnx2i_percpu_io_thread(void *arg); 87962306a36Sopenharmony_ciextern int bnx2i_process_scsi_cmd_resp(struct iscsi_session *session, 88062306a36Sopenharmony_ci struct bnx2i_conn *bnx2i_conn, 88162306a36Sopenharmony_ci struct cqe *cqe); 88262306a36Sopenharmony_ci#endif 883