1*4882a593Smuzhiyun /* bnx2fc.h: QLogic Linux FCoE offload driver. 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright (c) 2008-2013 Broadcom Corporation 4*4882a593Smuzhiyun * Copyright (c) 2014-2016 QLogic Corporation 5*4882a593Smuzhiyun * Copyright (c) 2016-2017 Cavium Inc. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 8*4882a593Smuzhiyun * it under the terms of the GNU General Public License as published by 9*4882a593Smuzhiyun * the Free Software Foundation. 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * Written by: Bhanu Prakash Gollapudi (bprakash@broadcom.com) 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef _BNX2FC_H_ 15*4882a593Smuzhiyun #define _BNX2FC_H_ 16*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <linux/module.h> 19*4882a593Smuzhiyun #include <linux/moduleparam.h> 20*4882a593Smuzhiyun #include <linux/kernel.h> 21*4882a593Smuzhiyun #include <linux/skbuff.h> 22*4882a593Smuzhiyun #include <linux/netdevice.h> 23*4882a593Smuzhiyun #include <linux/etherdevice.h> 24*4882a593Smuzhiyun #include <linux/if_ether.h> 25*4882a593Smuzhiyun #include <linux/if_vlan.h> 26*4882a593Smuzhiyun #include <linux/kthread.h> 27*4882a593Smuzhiyun #include <linux/crc32.h> 28*4882a593Smuzhiyun #include <linux/cpu.h> 29*4882a593Smuzhiyun #include <linux/types.h> 30*4882a593Smuzhiyun #include <linux/list.h> 31*4882a593Smuzhiyun #include <linux/delay.h> 32*4882a593Smuzhiyun #include <linux/timer.h> 33*4882a593Smuzhiyun #include <linux/errno.h> 34*4882a593Smuzhiyun #include <linux/pci.h> 35*4882a593Smuzhiyun #include <linux/init.h> 36*4882a593Smuzhiyun #include <linux/dma-mapping.h> 37*4882a593Smuzhiyun #include <linux/workqueue.h> 38*4882a593Smuzhiyun #include <linux/mutex.h> 39*4882a593Smuzhiyun #include <linux/spinlock.h> 40*4882a593Smuzhiyun #include <linux/bitops.h> 41*4882a593Smuzhiyun #include <linux/log2.h> 42*4882a593Smuzhiyun #include <linux/interrupt.h> 43*4882a593Smuzhiyun #include <linux/sched/signal.h> 44*4882a593Smuzhiyun #include <linux/io.h> 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #include <scsi/scsi.h> 47*4882a593Smuzhiyun #include <scsi/scsi_host.h> 48*4882a593Smuzhiyun #include <scsi/scsi_device.h> 49*4882a593Smuzhiyun #include <scsi/scsi_cmnd.h> 50*4882a593Smuzhiyun #include <scsi/scsi_eh.h> 51*4882a593Smuzhiyun #include <scsi/scsi_tcq.h> 52*4882a593Smuzhiyun #include <scsi/libfc.h> 53*4882a593Smuzhiyun #include <scsi/libfcoe.h> 54*4882a593Smuzhiyun #include <scsi/fc_encode.h> 55*4882a593Smuzhiyun #include <scsi/scsi_transport.h> 56*4882a593Smuzhiyun #include <scsi/scsi_transport_fc.h> 57*4882a593Smuzhiyun #include <scsi/fc/fc_fip.h> 58*4882a593Smuzhiyun #include <scsi/fc/fc_fc2.h> 59*4882a593Smuzhiyun #include <scsi/fc_frame.h> 60*4882a593Smuzhiyun #include <scsi/fc/fc_fcoe.h> 61*4882a593Smuzhiyun #include <scsi/fc/fc_fcp.h> 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #include "57xx_hsi_bnx2fc.h" 64*4882a593Smuzhiyun #include "../../net/ethernet/broadcom/cnic_if.h" 65*4882a593Smuzhiyun #include "../../net/ethernet/broadcom/bnx2x/bnx2x_mfw_req.h" 66*4882a593Smuzhiyun #include "bnx2fc_constants.h" 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define BNX2FC_NAME "bnx2fc" 69*4882a593Smuzhiyun #define BNX2FC_VERSION "2.12.13" 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define PFX "bnx2fc: " 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define BCM_CHIP_LEN 16 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define BNX2X_DOORBELL_PCI_BAR 2 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define BNX2FC_MAX_BD_LEN 0xffff 78*4882a593Smuzhiyun #define BNX2FC_BD_SPLIT_SZ 0xffff 79*4882a593Smuzhiyun #define BNX2FC_MAX_BDS_PER_CMD 255 80*4882a593Smuzhiyun #define BNX2FC_FW_MAX_BDS_PER_CMD 255 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define BNX2FC_SQ_WQES_MAX 256 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define BNX2FC_SCSI_MAX_SQES ((3 * BNX2FC_SQ_WQES_MAX) / 8) 85*4882a593Smuzhiyun #define BNX2FC_TM_MAX_SQES ((BNX2FC_SQ_WQES_MAX) / 2) 86*4882a593Smuzhiyun #define BNX2FC_ELS_MAX_SQES (BNX2FC_TM_MAX_SQES - 1) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define BNX2FC_RQ_WQES_MAX 16 89*4882a593Smuzhiyun #define BNX2FC_CQ_WQES_MAX (BNX2FC_SQ_WQES_MAX + BNX2FC_RQ_WQES_MAX) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define BNX2FC_NUM_MAX_SESS 1024 92*4882a593Smuzhiyun #define BNX2FC_NUM_MAX_SESS_LOG (ilog2(BNX2FC_NUM_MAX_SESS)) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define BNX2FC_MAX_NPIV 256 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define BNX2FC_MIN_PAYLOAD 256 97*4882a593Smuzhiyun #define BNX2FC_MAX_PAYLOAD 2048 98*4882a593Smuzhiyun #define BNX2FC_MFS \ 99*4882a593Smuzhiyun (BNX2FC_MAX_PAYLOAD + sizeof(struct fc_frame_header)) 100*4882a593Smuzhiyun #define BNX2FC_MINI_JUMBO_MTU 2500 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define BNX2FC_RQ_BUF_SZ 256 104*4882a593Smuzhiyun #define BNX2FC_RQ_BUF_LOG_SZ (ilog2(BNX2FC_RQ_BUF_SZ)) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define BNX2FC_SQ_WQE_SIZE (sizeof(struct fcoe_sqe)) 107*4882a593Smuzhiyun #define BNX2FC_CQ_WQE_SIZE (sizeof(struct fcoe_cqe)) 108*4882a593Smuzhiyun #define BNX2FC_RQ_WQE_SIZE (BNX2FC_RQ_BUF_SZ) 109*4882a593Smuzhiyun #define BNX2FC_XFERQ_WQE_SIZE (sizeof(struct fcoe_xfrqe)) 110*4882a593Smuzhiyun #define BNX2FC_CONFQ_WQE_SIZE (sizeof(struct fcoe_confqe)) 111*4882a593Smuzhiyun #define BNX2X_DB_SHIFT 3 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define BNX2FC_TASK_SIZE 128 114*4882a593Smuzhiyun #define BNX2FC_TASKS_PER_PAGE (PAGE_SIZE/BNX2FC_TASK_SIZE) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define BNX2FC_MAX_ROWS_IN_HASH_TBL 8 117*4882a593Smuzhiyun #define BNX2FC_HASH_TBL_CHUNK_SIZE (16 * 1024) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define BNX2FC_MAX_SEQS 255 120*4882a593Smuzhiyun #define BNX2FC_MAX_RETRY_CNT 3 121*4882a593Smuzhiyun #define BNX2FC_MAX_RPORT_RETRY_CNT 255 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define BNX2FC_READ (1 << 1) 124*4882a593Smuzhiyun #define BNX2FC_WRITE (1 << 0) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define BNX2FC_MIN_XID 0 127*4882a593Smuzhiyun #define FCOE_MAX_NUM_XIDS 0x2000 128*4882a593Smuzhiyun #define FCOE_MAX_XID_OFFSET (FCOE_MAX_NUM_XIDS - 1) 129*4882a593Smuzhiyun #define FCOE_XIDS_PER_CPU_OFFSET ((512 * nr_cpu_ids) - 1) 130*4882a593Smuzhiyun #define BNX2FC_MAX_LUN 0xFFFF 131*4882a593Smuzhiyun #define BNX2FC_MAX_FCP_TGT 256 132*4882a593Smuzhiyun #define BNX2FC_MAX_CMD_LEN 16 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define BNX2FC_TM_TIMEOUT 60 /* secs */ 135*4882a593Smuzhiyun #define BNX2FC_IO_TIMEOUT 20000UL /* msecs */ 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define BNX2FC_WAIT_CNT 1200 138*4882a593Smuzhiyun #define BNX2FC_FW_TIMEOUT (3 * HZ) 139*4882a593Smuzhiyun #define PORT_MAX 2 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define CMD_SCSI_STATUS(Cmnd) ((Cmnd)->SCp.Status) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* FC FCP Status */ 144*4882a593Smuzhiyun #define FC_GOOD 0 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define BNX2FC_RNID_HBA 0x7 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define SRR_RETRY_COUNT 5 149*4882a593Smuzhiyun #define REC_RETRY_COUNT 1 150*4882a593Smuzhiyun #define BNX2FC_NUM_ERR_BITS 63 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define BNX2FC_RELOGIN_WAIT_TIME 200 153*4882a593Smuzhiyun #define BNX2FC_RELOGIN_WAIT_CNT 10 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #define BNX2FC_STATS(hba, stat, cnt) \ 156*4882a593Smuzhiyun do { \ 157*4882a593Smuzhiyun u32 val; \ 158*4882a593Smuzhiyun \ 159*4882a593Smuzhiyun val = fw_stats->stat.cnt; \ 160*4882a593Smuzhiyun if (hba->prev_stats.stat.cnt <= val) \ 161*4882a593Smuzhiyun val -= hba->prev_stats.stat.cnt; \ 162*4882a593Smuzhiyun else \ 163*4882a593Smuzhiyun val += (0xfffffff - hba->prev_stats.stat.cnt); \ 164*4882a593Smuzhiyun hba->bfw_stats.cnt += val; \ 165*4882a593Smuzhiyun } while (0) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* bnx2fc driver uses only one instance of fcoe_percpu_s */ 168*4882a593Smuzhiyun extern struct fcoe_percpu_s bnx2fc_global; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun extern struct workqueue_struct *bnx2fc_wq; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun struct bnx2fc_percpu_s { 173*4882a593Smuzhiyun struct task_struct *iothread; 174*4882a593Smuzhiyun struct list_head work_list; 175*4882a593Smuzhiyun spinlock_t fp_work_lock; 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun struct bnx2fc_fw_stats { 179*4882a593Smuzhiyun u64 fc_crc_cnt; 180*4882a593Smuzhiyun u64 fcoe_tx_pkt_cnt; 181*4882a593Smuzhiyun u64 fcoe_rx_pkt_cnt; 182*4882a593Smuzhiyun u64 fcoe_tx_byte_cnt; 183*4882a593Smuzhiyun u64 fcoe_rx_byte_cnt; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct bnx2fc_hba { 187*4882a593Smuzhiyun struct list_head list; 188*4882a593Smuzhiyun struct cnic_dev *cnic; 189*4882a593Smuzhiyun struct pci_dev *pcidev; 190*4882a593Smuzhiyun struct net_device *phys_dev; 191*4882a593Smuzhiyun unsigned long reg_with_cnic; 192*4882a593Smuzhiyun #define BNX2FC_CNIC_REGISTERED 1 193*4882a593Smuzhiyun struct bnx2fc_cmd_mgr *cmd_mgr; 194*4882a593Smuzhiyun spinlock_t hba_lock; 195*4882a593Smuzhiyun struct mutex hba_mutex; 196*4882a593Smuzhiyun struct mutex hba_stats_mutex; 197*4882a593Smuzhiyun unsigned long adapter_state; 198*4882a593Smuzhiyun #define ADAPTER_STATE_UP 0 199*4882a593Smuzhiyun #define ADAPTER_STATE_GOING_DOWN 1 200*4882a593Smuzhiyun #define ADAPTER_STATE_LINK_DOWN 2 201*4882a593Smuzhiyun #define ADAPTER_STATE_READY 3 202*4882a593Smuzhiyun unsigned long flags; 203*4882a593Smuzhiyun #define BNX2FC_FLAG_FW_INIT_DONE 0 204*4882a593Smuzhiyun #define BNX2FC_FLAG_DESTROY_CMPL 1 205*4882a593Smuzhiyun u32 next_conn_id; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* xid resources */ 208*4882a593Smuzhiyun u16 max_xid; 209*4882a593Smuzhiyun u32 max_tasks; 210*4882a593Smuzhiyun u32 max_outstanding_cmds; 211*4882a593Smuzhiyun u32 elstm_xids; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun struct fcoe_task_ctx_entry **task_ctx; 214*4882a593Smuzhiyun dma_addr_t *task_ctx_dma; 215*4882a593Smuzhiyun struct regpair *task_ctx_bd_tbl; 216*4882a593Smuzhiyun dma_addr_t task_ctx_bd_dma; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun int hash_tbl_segment_count; 219*4882a593Smuzhiyun void **hash_tbl_segments; 220*4882a593Smuzhiyun void *hash_tbl_pbl; 221*4882a593Smuzhiyun dma_addr_t hash_tbl_pbl_dma; 222*4882a593Smuzhiyun struct fcoe_t2_hash_table_entry *t2_hash_tbl; 223*4882a593Smuzhiyun dma_addr_t t2_hash_tbl_dma; 224*4882a593Smuzhiyun char *t2_hash_tbl_ptr; 225*4882a593Smuzhiyun dma_addr_t t2_hash_tbl_ptr_dma; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun char *dummy_buffer; 228*4882a593Smuzhiyun dma_addr_t dummy_buf_dma; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun /* Active list of offloaded sessions */ 231*4882a593Smuzhiyun struct bnx2fc_rport **tgt_ofld_list; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* statistics */ 234*4882a593Smuzhiyun struct bnx2fc_fw_stats bfw_stats; 235*4882a593Smuzhiyun struct fcoe_statistics_params prev_stats; 236*4882a593Smuzhiyun struct fcoe_statistics_params *stats_buffer; 237*4882a593Smuzhiyun dma_addr_t stats_buf_dma; 238*4882a593Smuzhiyun struct completion stat_req_done; 239*4882a593Smuzhiyun struct fcoe_capabilities fcoe_cap; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /*destroy handling */ 242*4882a593Smuzhiyun struct timer_list destroy_timer; 243*4882a593Smuzhiyun wait_queue_head_t destroy_wait; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* linkdown handling */ 246*4882a593Smuzhiyun wait_queue_head_t shutdown_wait; 247*4882a593Smuzhiyun int wait_for_link_down; 248*4882a593Smuzhiyun int num_ofld_sess; 249*4882a593Smuzhiyun struct list_head vports; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun char chip_num[BCM_CHIP_LEN]; 252*4882a593Smuzhiyun }; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun struct bnx2fc_interface { 255*4882a593Smuzhiyun struct list_head list; 256*4882a593Smuzhiyun unsigned long if_flags; 257*4882a593Smuzhiyun #define BNX2FC_CTLR_INIT_DONE 0 258*4882a593Smuzhiyun struct bnx2fc_hba *hba; 259*4882a593Smuzhiyun struct net_device *netdev; 260*4882a593Smuzhiyun struct packet_type fcoe_packet_type; 261*4882a593Smuzhiyun struct packet_type fip_packet_type; 262*4882a593Smuzhiyun struct workqueue_struct *timer_work_queue; 263*4882a593Smuzhiyun struct kref kref; 264*4882a593Smuzhiyun u8 vlan_enabled; 265*4882a593Smuzhiyun int vlan_id; 266*4882a593Smuzhiyun bool enabled; 267*4882a593Smuzhiyun u8 tm_timeout; 268*4882a593Smuzhiyun }; 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun #define bnx2fc_from_ctlr(x) \ 271*4882a593Smuzhiyun ((struct bnx2fc_interface *)((x) + 1)) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #define bnx2fc_to_ctlr(x) \ 274*4882a593Smuzhiyun ((struct fcoe_ctlr *)(((struct fcoe_ctlr *)(x)) - 1)) 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun struct bnx2fc_lport { 277*4882a593Smuzhiyun struct list_head list; 278*4882a593Smuzhiyun struct fc_lport *lport; 279*4882a593Smuzhiyun }; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun struct bnx2fc_cmd_mgr { 282*4882a593Smuzhiyun struct bnx2fc_hba *hba; 283*4882a593Smuzhiyun u16 next_idx; 284*4882a593Smuzhiyun struct list_head *free_list; 285*4882a593Smuzhiyun spinlock_t *free_list_lock; 286*4882a593Smuzhiyun struct io_bdt **io_bdt_pool; 287*4882a593Smuzhiyun struct bnx2fc_cmd **cmds; 288*4882a593Smuzhiyun }; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun struct bnx2fc_rport { 291*4882a593Smuzhiyun struct fcoe_port *port; 292*4882a593Smuzhiyun struct fc_rport *rport; 293*4882a593Smuzhiyun struct fc_rport_priv *rdata; 294*4882a593Smuzhiyun void __iomem *ctx_base; 295*4882a593Smuzhiyun #define DPM_TRIGER_TYPE 0x40 296*4882a593Smuzhiyun u32 io_timeout; 297*4882a593Smuzhiyun u32 fcoe_conn_id; 298*4882a593Smuzhiyun u32 context_id; 299*4882a593Smuzhiyun u32 sid; 300*4882a593Smuzhiyun int dev_type; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun unsigned long flags; 303*4882a593Smuzhiyun #define BNX2FC_FLAG_SESSION_READY 0x1 304*4882a593Smuzhiyun #define BNX2FC_FLAG_OFFLOADED 0x2 305*4882a593Smuzhiyun #define BNX2FC_FLAG_DISABLED 0x3 306*4882a593Smuzhiyun #define BNX2FC_FLAG_DESTROYED 0x4 307*4882a593Smuzhiyun #define BNX2FC_FLAG_OFLD_REQ_CMPL 0x5 308*4882a593Smuzhiyun #define BNX2FC_FLAG_CTX_ALLOC_FAILURE 0x6 309*4882a593Smuzhiyun #define BNX2FC_FLAG_UPLD_REQ_COMPL 0x7 310*4882a593Smuzhiyun #define BNX2FC_FLAG_DISABLE_FAILED 0x9 311*4882a593Smuzhiyun #define BNX2FC_FLAG_ENABLED 0xa 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun u8 src_addr[ETH_ALEN]; 314*4882a593Smuzhiyun u32 max_sqes; 315*4882a593Smuzhiyun u32 max_rqes; 316*4882a593Smuzhiyun u32 max_cqes; 317*4882a593Smuzhiyun atomic_t free_sqes; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun struct b577xx_doorbell_set_prod sq_db; 320*4882a593Smuzhiyun struct b577xx_fcoe_rx_doorbell rx_db; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun struct fcoe_sqe *sq; 323*4882a593Smuzhiyun dma_addr_t sq_dma; 324*4882a593Smuzhiyun u16 sq_prod_idx; 325*4882a593Smuzhiyun u8 sq_curr_toggle_bit; 326*4882a593Smuzhiyun u32 sq_mem_size; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun struct fcoe_cqe *cq; 329*4882a593Smuzhiyun dma_addr_t cq_dma; 330*4882a593Smuzhiyun u16 cq_cons_idx; 331*4882a593Smuzhiyun u8 cq_curr_toggle_bit; 332*4882a593Smuzhiyun u32 cq_mem_size; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun void *rq; 335*4882a593Smuzhiyun dma_addr_t rq_dma; 336*4882a593Smuzhiyun u32 rq_prod_idx; 337*4882a593Smuzhiyun u32 rq_cons_idx; 338*4882a593Smuzhiyun u32 rq_mem_size; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun void *rq_pbl; 341*4882a593Smuzhiyun dma_addr_t rq_pbl_dma; 342*4882a593Smuzhiyun u32 rq_pbl_size; 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun struct fcoe_xfrqe *xferq; 345*4882a593Smuzhiyun dma_addr_t xferq_dma; 346*4882a593Smuzhiyun u32 xferq_mem_size; 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun struct fcoe_confqe *confq; 349*4882a593Smuzhiyun dma_addr_t confq_dma; 350*4882a593Smuzhiyun u32 confq_mem_size; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun void *confq_pbl; 353*4882a593Smuzhiyun dma_addr_t confq_pbl_dma; 354*4882a593Smuzhiyun u32 confq_pbl_size; 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun struct fcoe_conn_db *conn_db; 357*4882a593Smuzhiyun dma_addr_t conn_db_dma; 358*4882a593Smuzhiyun u32 conn_db_mem_size; 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun struct fcoe_sqe *lcq; 361*4882a593Smuzhiyun dma_addr_t lcq_dma; 362*4882a593Smuzhiyun u32 lcq_mem_size; 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun void *ofld_req[4]; 365*4882a593Smuzhiyun dma_addr_t ofld_req_dma[4]; 366*4882a593Smuzhiyun void *enbl_req; 367*4882a593Smuzhiyun dma_addr_t enbl_req_dma; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun spinlock_t tgt_lock; 370*4882a593Smuzhiyun spinlock_t cq_lock; 371*4882a593Smuzhiyun atomic_t num_active_ios; 372*4882a593Smuzhiyun u32 flush_in_prog; 373*4882a593Smuzhiyun unsigned long timestamp; 374*4882a593Smuzhiyun unsigned long retry_delay_timestamp; 375*4882a593Smuzhiyun struct list_head free_task_list; 376*4882a593Smuzhiyun struct bnx2fc_cmd *pending_queue[BNX2FC_SQ_WQES_MAX+1]; 377*4882a593Smuzhiyun struct list_head active_cmd_queue; 378*4882a593Smuzhiyun struct list_head els_queue; 379*4882a593Smuzhiyun struct list_head io_retire_queue; 380*4882a593Smuzhiyun struct list_head active_tm_queue; 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun struct timer_list ofld_timer; 383*4882a593Smuzhiyun wait_queue_head_t ofld_wait; 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun struct timer_list upld_timer; 386*4882a593Smuzhiyun wait_queue_head_t upld_wait; 387*4882a593Smuzhiyun }; 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun struct bnx2fc_mp_req { 390*4882a593Smuzhiyun u8 tm_flags; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun u32 req_len; 393*4882a593Smuzhiyun void *req_buf; 394*4882a593Smuzhiyun dma_addr_t req_buf_dma; 395*4882a593Smuzhiyun struct fcoe_bd_ctx *mp_req_bd; 396*4882a593Smuzhiyun dma_addr_t mp_req_bd_dma; 397*4882a593Smuzhiyun struct fc_frame_header req_fc_hdr; 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun u32 resp_len; 400*4882a593Smuzhiyun void *resp_buf; 401*4882a593Smuzhiyun dma_addr_t resp_buf_dma; 402*4882a593Smuzhiyun struct fcoe_bd_ctx *mp_resp_bd; 403*4882a593Smuzhiyun dma_addr_t mp_resp_bd_dma; 404*4882a593Smuzhiyun struct fc_frame_header resp_fc_hdr; 405*4882a593Smuzhiyun }; 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun struct bnx2fc_els_cb_arg { 408*4882a593Smuzhiyun struct bnx2fc_cmd *aborted_io_req; 409*4882a593Smuzhiyun struct bnx2fc_cmd *io_req; 410*4882a593Smuzhiyun u16 l2_oxid; 411*4882a593Smuzhiyun u32 offset; 412*4882a593Smuzhiyun enum fc_rctl r_ctl; 413*4882a593Smuzhiyun }; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* bnx2fc command structure */ 416*4882a593Smuzhiyun struct bnx2fc_cmd { 417*4882a593Smuzhiyun struct list_head link; 418*4882a593Smuzhiyun u8 on_active_queue; 419*4882a593Smuzhiyun u8 on_tmf_queue; 420*4882a593Smuzhiyun u8 cmd_type; 421*4882a593Smuzhiyun #define BNX2FC_SCSI_CMD 1 422*4882a593Smuzhiyun #define BNX2FC_TASK_MGMT_CMD 2 423*4882a593Smuzhiyun #define BNX2FC_ABTS 3 424*4882a593Smuzhiyun #define BNX2FC_ELS 4 425*4882a593Smuzhiyun #define BNX2FC_CLEANUP 5 426*4882a593Smuzhiyun #define BNX2FC_SEQ_CLEANUP 6 427*4882a593Smuzhiyun u8 io_req_flags; 428*4882a593Smuzhiyun struct kref refcount; 429*4882a593Smuzhiyun struct fcoe_port *port; 430*4882a593Smuzhiyun struct bnx2fc_rport *tgt; 431*4882a593Smuzhiyun struct scsi_cmnd *sc_cmd; 432*4882a593Smuzhiyun struct bnx2fc_cmd_mgr *cmd_mgr; 433*4882a593Smuzhiyun struct bnx2fc_mp_req mp_req; 434*4882a593Smuzhiyun void (*cb_func)(struct bnx2fc_els_cb_arg *cb_arg); 435*4882a593Smuzhiyun struct bnx2fc_els_cb_arg *cb_arg; 436*4882a593Smuzhiyun struct delayed_work timeout_work; /* timer for ULP timeouts */ 437*4882a593Smuzhiyun struct completion abts_done; 438*4882a593Smuzhiyun struct completion cleanup_done; 439*4882a593Smuzhiyun int wait_for_abts_comp; 440*4882a593Smuzhiyun int wait_for_cleanup_comp; 441*4882a593Smuzhiyun u16 xid; 442*4882a593Smuzhiyun struct fcoe_err_report_entry err_entry; 443*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task; 444*4882a593Smuzhiyun struct io_bdt *bd_tbl; 445*4882a593Smuzhiyun struct fcp_rsp *rsp; 446*4882a593Smuzhiyun size_t data_xfer_len; 447*4882a593Smuzhiyun unsigned long req_flags; 448*4882a593Smuzhiyun #define BNX2FC_FLAG_ISSUE_RRQ 0x1 449*4882a593Smuzhiyun #define BNX2FC_FLAG_ISSUE_ABTS 0x2 450*4882a593Smuzhiyun #define BNX2FC_FLAG_ABTS_DONE 0x3 451*4882a593Smuzhiyun #define BNX2FC_FLAG_TM_COMPL 0x4 452*4882a593Smuzhiyun #define BNX2FC_FLAG_TM_TIMEOUT 0x5 453*4882a593Smuzhiyun #define BNX2FC_FLAG_IO_CLEANUP 0x6 454*4882a593Smuzhiyun #define BNX2FC_FLAG_RETIRE_OXID 0x7 455*4882a593Smuzhiyun #define BNX2FC_FLAG_EH_ABORT 0x8 456*4882a593Smuzhiyun #define BNX2FC_FLAG_IO_COMPL 0x9 457*4882a593Smuzhiyun #define BNX2FC_FLAG_ELS_DONE 0xa 458*4882a593Smuzhiyun #define BNX2FC_FLAG_ELS_TIMEOUT 0xb 459*4882a593Smuzhiyun #define BNX2FC_FLAG_CMD_LOST 0xc 460*4882a593Smuzhiyun #define BNX2FC_FLAG_SRR_SENT 0xd 461*4882a593Smuzhiyun #define BNX2FC_FLAG_ISSUE_CLEANUP_REQ 0xe 462*4882a593Smuzhiyun u8 rec_retry; 463*4882a593Smuzhiyun u8 srr_retry; 464*4882a593Smuzhiyun u32 srr_offset; 465*4882a593Smuzhiyun u8 srr_rctl; 466*4882a593Smuzhiyun u32 fcp_resid; 467*4882a593Smuzhiyun u32 fcp_rsp_len; 468*4882a593Smuzhiyun u32 fcp_sns_len; 469*4882a593Smuzhiyun u8 cdb_status; /* SCSI IO status */ 470*4882a593Smuzhiyun u8 fcp_status; /* FCP IO status */ 471*4882a593Smuzhiyun u8 fcp_rsp_code; 472*4882a593Smuzhiyun u8 scsi_comp_flags; 473*4882a593Smuzhiyun }; 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun struct io_bdt { 476*4882a593Smuzhiyun struct bnx2fc_cmd *io_req; 477*4882a593Smuzhiyun struct fcoe_bd_ctx *bd_tbl; 478*4882a593Smuzhiyun dma_addr_t bd_tbl_dma; 479*4882a593Smuzhiyun u16 bd_valid; 480*4882a593Smuzhiyun }; 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun struct bnx2fc_work { 483*4882a593Smuzhiyun struct list_head list; 484*4882a593Smuzhiyun struct bnx2fc_rport *tgt; 485*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task; 486*4882a593Smuzhiyun unsigned char rq_data[BNX2FC_RQ_BUF_SZ]; 487*4882a593Smuzhiyun u16 wqe; 488*4882a593Smuzhiyun u8 num_rq; 489*4882a593Smuzhiyun }; 490*4882a593Smuzhiyun struct bnx2fc_unsol_els { 491*4882a593Smuzhiyun struct fc_lport *lport; 492*4882a593Smuzhiyun struct fc_frame *fp; 493*4882a593Smuzhiyun struct bnx2fc_hba *hba; 494*4882a593Smuzhiyun struct work_struct unsol_els_work; 495*4882a593Smuzhiyun }; 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun struct bnx2fc_cmd *bnx2fc_cmd_alloc(struct bnx2fc_rport *tgt); 500*4882a593Smuzhiyun struct bnx2fc_cmd *bnx2fc_elstm_alloc(struct bnx2fc_rport *tgt, int type); 501*4882a593Smuzhiyun void bnx2fc_cmd_release(struct kref *ref); 502*4882a593Smuzhiyun int bnx2fc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc_cmd); 503*4882a593Smuzhiyun int bnx2fc_send_fw_fcoe_init_msg(struct bnx2fc_hba *hba); 504*4882a593Smuzhiyun int bnx2fc_send_fw_fcoe_destroy_msg(struct bnx2fc_hba *hba); 505*4882a593Smuzhiyun int bnx2fc_send_session_ofld_req(struct fcoe_port *port, 506*4882a593Smuzhiyun struct bnx2fc_rport *tgt); 507*4882a593Smuzhiyun int bnx2fc_send_session_enable_req(struct fcoe_port *port, 508*4882a593Smuzhiyun struct bnx2fc_rport *tgt); 509*4882a593Smuzhiyun int bnx2fc_send_session_disable_req(struct fcoe_port *port, 510*4882a593Smuzhiyun struct bnx2fc_rport *tgt); 511*4882a593Smuzhiyun int bnx2fc_send_session_destroy_req(struct bnx2fc_hba *hba, 512*4882a593Smuzhiyun struct bnx2fc_rport *tgt); 513*4882a593Smuzhiyun int bnx2fc_map_doorbell(struct bnx2fc_rport *tgt); 514*4882a593Smuzhiyun void bnx2fc_indicate_kcqe(void *context, struct kcqe *kcq[], 515*4882a593Smuzhiyun u32 num_cqe); 516*4882a593Smuzhiyun int bnx2fc_setup_task_ctx(struct bnx2fc_hba *hba); 517*4882a593Smuzhiyun void bnx2fc_free_task_ctx(struct bnx2fc_hba *hba); 518*4882a593Smuzhiyun int bnx2fc_setup_fw_resc(struct bnx2fc_hba *hba); 519*4882a593Smuzhiyun void bnx2fc_free_fw_resc(struct bnx2fc_hba *hba); 520*4882a593Smuzhiyun struct bnx2fc_cmd_mgr *bnx2fc_cmd_mgr_alloc(struct bnx2fc_hba *hba); 521*4882a593Smuzhiyun void bnx2fc_cmd_mgr_free(struct bnx2fc_cmd_mgr *cmgr); 522*4882a593Smuzhiyun void bnx2fc_get_link_state(struct bnx2fc_hba *hba); 523*4882a593Smuzhiyun char *bnx2fc_get_next_rqe(struct bnx2fc_rport *tgt, u8 num_items); 524*4882a593Smuzhiyun void bnx2fc_return_rqe(struct bnx2fc_rport *tgt, u8 num_items); 525*4882a593Smuzhiyun int bnx2fc_get_paged_crc_eof(struct sk_buff *skb, int tlen); 526*4882a593Smuzhiyun int bnx2fc_send_rrq(struct bnx2fc_cmd *aborted_io_req); 527*4882a593Smuzhiyun int bnx2fc_send_adisc(struct bnx2fc_rport *tgt, struct fc_frame *fp); 528*4882a593Smuzhiyun int bnx2fc_send_logo(struct bnx2fc_rport *tgt, struct fc_frame *fp); 529*4882a593Smuzhiyun int bnx2fc_send_rls(struct bnx2fc_rport *tgt, struct fc_frame *fp); 530*4882a593Smuzhiyun int bnx2fc_initiate_cleanup(struct bnx2fc_cmd *io_req); 531*4882a593Smuzhiyun int bnx2fc_initiate_abts(struct bnx2fc_cmd *io_req); 532*4882a593Smuzhiyun void bnx2fc_cmd_timer_set(struct bnx2fc_cmd *io_req, 533*4882a593Smuzhiyun unsigned int timer_msec); 534*4882a593Smuzhiyun int bnx2fc_init_mp_req(struct bnx2fc_cmd *io_req); 535*4882a593Smuzhiyun void bnx2fc_init_cleanup_task(struct bnx2fc_cmd *io_req, 536*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 537*4882a593Smuzhiyun u16 orig_xid); 538*4882a593Smuzhiyun void bnx2fc_init_seq_cleanup_task(struct bnx2fc_cmd *seq_clnup_req, 539*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 540*4882a593Smuzhiyun struct bnx2fc_cmd *orig_io_req, 541*4882a593Smuzhiyun u32 offset); 542*4882a593Smuzhiyun void bnx2fc_init_mp_task(struct bnx2fc_cmd *io_req, 543*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task); 544*4882a593Smuzhiyun void bnx2fc_init_task(struct bnx2fc_cmd *io_req, 545*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task); 546*4882a593Smuzhiyun void bnx2fc_add_2_sq(struct bnx2fc_rport *tgt, u16 xid); 547*4882a593Smuzhiyun void bnx2fc_ring_doorbell(struct bnx2fc_rport *tgt); 548*4882a593Smuzhiyun int bnx2fc_eh_abort(struct scsi_cmnd *sc_cmd); 549*4882a593Smuzhiyun int bnx2fc_eh_target_reset(struct scsi_cmnd *sc_cmd); 550*4882a593Smuzhiyun int bnx2fc_eh_device_reset(struct scsi_cmnd *sc_cmd); 551*4882a593Smuzhiyun void bnx2fc_rport_event_handler(struct fc_lport *lport, 552*4882a593Smuzhiyun struct fc_rport_priv *rport, 553*4882a593Smuzhiyun enum fc_rport_event event); 554*4882a593Smuzhiyun void bnx2fc_process_scsi_cmd_compl(struct bnx2fc_cmd *io_req, 555*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 556*4882a593Smuzhiyun u8 num_rq, unsigned char *rq_data); 557*4882a593Smuzhiyun void bnx2fc_process_cleanup_compl(struct bnx2fc_cmd *io_req, 558*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 559*4882a593Smuzhiyun u8 num_rq); 560*4882a593Smuzhiyun void bnx2fc_process_abts_compl(struct bnx2fc_cmd *io_req, 561*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 562*4882a593Smuzhiyun u8 num_rq); 563*4882a593Smuzhiyun void bnx2fc_process_tm_compl(struct bnx2fc_cmd *io_req, 564*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 565*4882a593Smuzhiyun u8 num_rq, unsigned char *rq_data); 566*4882a593Smuzhiyun void bnx2fc_process_els_compl(struct bnx2fc_cmd *els_req, 567*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 568*4882a593Smuzhiyun u8 num_rq); 569*4882a593Smuzhiyun void bnx2fc_build_fcp_cmnd(struct bnx2fc_cmd *io_req, 570*4882a593Smuzhiyun struct fcp_cmnd *fcp_cmnd); 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun void bnx2fc_flush_active_ios(struct bnx2fc_rport *tgt); 575*4882a593Smuzhiyun struct fc_seq *bnx2fc_elsct_send(struct fc_lport *lport, u32 did, 576*4882a593Smuzhiyun struct fc_frame *fp, unsigned int op, 577*4882a593Smuzhiyun void (*resp)(struct fc_seq *, 578*4882a593Smuzhiyun struct fc_frame *, 579*4882a593Smuzhiyun void *), 580*4882a593Smuzhiyun void *arg, u32 timeout); 581*4882a593Smuzhiyun void bnx2fc_arm_cq(struct bnx2fc_rport *tgt); 582*4882a593Smuzhiyun int bnx2fc_process_new_cqes(struct bnx2fc_rport *tgt); 583*4882a593Smuzhiyun void bnx2fc_process_cq_compl(struct bnx2fc_rport *tgt, u16 wqe, 584*4882a593Smuzhiyun unsigned char *rq_data, u8 num_rq, 585*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task); 586*4882a593Smuzhiyun struct bnx2fc_rport *bnx2fc_tgt_lookup(struct fcoe_port *port, 587*4882a593Smuzhiyun u32 port_id); 588*4882a593Smuzhiyun void bnx2fc_process_l2_frame_compl(struct bnx2fc_rport *tgt, 589*4882a593Smuzhiyun unsigned char *buf, 590*4882a593Smuzhiyun u32 frame_len, u16 l2_oxid); 591*4882a593Smuzhiyun int bnx2fc_send_stat_req(struct bnx2fc_hba *hba); 592*4882a593Smuzhiyun int bnx2fc_post_io_req(struct bnx2fc_rport *tgt, struct bnx2fc_cmd *io_req); 593*4882a593Smuzhiyun int bnx2fc_send_rec(struct bnx2fc_cmd *orig_io_req); 594*4882a593Smuzhiyun int bnx2fc_send_srr(struct bnx2fc_cmd *orig_io_req, u32 offset, u8 r_ctl); 595*4882a593Smuzhiyun void bnx2fc_process_seq_cleanup_compl(struct bnx2fc_cmd *seq_clnup_req, 596*4882a593Smuzhiyun struct fcoe_task_ctx_entry *task, 597*4882a593Smuzhiyun u8 rx_state); 598*4882a593Smuzhiyun int bnx2fc_initiate_seq_cleanup(struct bnx2fc_cmd *orig_io_req, u32 offset, 599*4882a593Smuzhiyun enum fc_rctl r_ctl); 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun #include "bnx2fc_debug.h" 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun #endif 605