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