1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2014 Cisco Systems, Inc. All rights reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This program is free software; you may redistribute it and/or modify 5*4882a593Smuzhiyun * it under the terms of the GNU General Public License as published by 6*4882a593Smuzhiyun * the Free Software Foundation; version 2 of the License. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15*4882a593Smuzhiyun * SOFTWARE. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef _SNIC_H_ 19*4882a593Smuzhiyun #define _SNIC_H_ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <linux/module.h> 22*4882a593Smuzhiyun #include <linux/netdevice.h> 23*4882a593Smuzhiyun #include <linux/workqueue.h> 24*4882a593Smuzhiyun #include <linux/bitops.h> 25*4882a593Smuzhiyun #include <linux/mempool.h> 26*4882a593Smuzhiyun #include <scsi/scsi_cmnd.h> 27*4882a593Smuzhiyun #include <scsi/scsi.h> 28*4882a593Smuzhiyun #include <scsi/scsi_host.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include "snic_disc.h" 31*4882a593Smuzhiyun #include "snic_io.h" 32*4882a593Smuzhiyun #include "snic_res.h" 33*4882a593Smuzhiyun #include "snic_trc.h" 34*4882a593Smuzhiyun #include "snic_stats.h" 35*4882a593Smuzhiyun #include "vnic_dev.h" 36*4882a593Smuzhiyun #include "vnic_wq.h" 37*4882a593Smuzhiyun #include "vnic_cq.h" 38*4882a593Smuzhiyun #include "vnic_intr.h" 39*4882a593Smuzhiyun #include "vnic_stats.h" 40*4882a593Smuzhiyun #include "vnic_snic.h" 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define SNIC_DRV_NAME "snic" 43*4882a593Smuzhiyun #define SNIC_DRV_DESCRIPTION "Cisco SCSI NIC Driver" 44*4882a593Smuzhiyun #define SNIC_DRV_VERSION "0.0.1.18" 45*4882a593Smuzhiyun #define PFX SNIC_DRV_NAME ":" 46*4882a593Smuzhiyun #define DFX SNIC_DRV_NAME "%d: " 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define DESC_CLEAN_LOW_WATERMARK 8 49*4882a593Smuzhiyun #define SNIC_UCSM_DFLT_THROTTLE_CNT_BLD 16 /* UCSM default throttle count */ 50*4882a593Smuzhiyun #define SNIC_MAX_IO_REQ 50 /* scsi_cmnd tag map entries */ 51*4882a593Smuzhiyun #define SNIC_MIN_IO_REQ 8 /* Min IO throttle count */ 52*4882a593Smuzhiyun #define SNIC_IO_LOCKS 64 /* IO locks: power of 2 */ 53*4882a593Smuzhiyun #define SNIC_DFLT_QUEUE_DEPTH 32 /* Default Queue Depth */ 54*4882a593Smuzhiyun #define SNIC_MAX_QUEUE_DEPTH 64 /* Max Queue Depth */ 55*4882a593Smuzhiyun #define SNIC_DFLT_CMD_TIMEOUT 90 /* Extended tmo for FW */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* 58*4882a593Smuzhiyun * Tag bits used for special requests. 59*4882a593Smuzhiyun */ 60*4882a593Smuzhiyun #define SNIC_TAG_ABORT BIT(30) /* Tag indicating abort */ 61*4882a593Smuzhiyun #define SNIC_TAG_DEV_RST BIT(29) /* Tag for device reset */ 62*4882a593Smuzhiyun #define SNIC_TAG_IOCTL_DEV_RST BIT(28) /* Tag for User Device Reset */ 63*4882a593Smuzhiyun #define SNIC_TAG_MASK (BIT(24) - 1) /* Mask for lookup */ 64*4882a593Smuzhiyun #define SNIC_NO_TAG -1 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* 67*4882a593Smuzhiyun * Command flags to identify the type of command and for other future use 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun #define SNIC_NO_FLAGS 0 70*4882a593Smuzhiyun #define SNIC_IO_INITIALIZED BIT(0) 71*4882a593Smuzhiyun #define SNIC_IO_ISSUED BIT(1) 72*4882a593Smuzhiyun #define SNIC_IO_DONE BIT(2) 73*4882a593Smuzhiyun #define SNIC_IO_REQ_NULL BIT(3) 74*4882a593Smuzhiyun #define SNIC_IO_ABTS_PENDING BIT(4) 75*4882a593Smuzhiyun #define SNIC_IO_ABORTED BIT(5) 76*4882a593Smuzhiyun #define SNIC_IO_ABTS_ISSUED BIT(6) 77*4882a593Smuzhiyun #define SNIC_IO_TERM_ISSUED BIT(7) 78*4882a593Smuzhiyun #define SNIC_IO_ABTS_TIMEDOUT BIT(8) 79*4882a593Smuzhiyun #define SNIC_IO_ABTS_TERM_DONE BIT(9) 80*4882a593Smuzhiyun #define SNIC_IO_ABTS_TERM_REQ_NULL BIT(10) 81*4882a593Smuzhiyun #define SNIC_IO_ABTS_TERM_TIMEDOUT BIT(11) 82*4882a593Smuzhiyun #define SNIC_IO_INTERNAL_TERM_PENDING BIT(12) 83*4882a593Smuzhiyun #define SNIC_IO_INTERNAL_TERM_ISSUED BIT(13) 84*4882a593Smuzhiyun #define SNIC_DEVICE_RESET BIT(14) 85*4882a593Smuzhiyun #define SNIC_DEV_RST_ISSUED BIT(15) 86*4882a593Smuzhiyun #define SNIC_DEV_RST_TIMEDOUT BIT(16) 87*4882a593Smuzhiyun #define SNIC_DEV_RST_ABTS_ISSUED BIT(17) 88*4882a593Smuzhiyun #define SNIC_DEV_RST_TERM_ISSUED BIT(18) 89*4882a593Smuzhiyun #define SNIC_DEV_RST_DONE BIT(19) 90*4882a593Smuzhiyun #define SNIC_DEV_RST_REQ_NULL BIT(20) 91*4882a593Smuzhiyun #define SNIC_DEV_RST_ABTS_DONE BIT(21) 92*4882a593Smuzhiyun #define SNIC_DEV_RST_TERM_DONE BIT(22) 93*4882a593Smuzhiyun #define SNIC_DEV_RST_ABTS_PENDING BIT(23) 94*4882a593Smuzhiyun #define SNIC_DEV_RST_PENDING BIT(24) 95*4882a593Smuzhiyun #define SNIC_DEV_RST_NOTSUP BIT(25) 96*4882a593Smuzhiyun #define SNIC_SCSI_CLEANUP BIT(26) 97*4882a593Smuzhiyun #define SNIC_HOST_RESET_ISSUED BIT(27) 98*4882a593Smuzhiyun #define SNIC_HOST_RESET_CMD_TERM \ 99*4882a593Smuzhiyun (SNIC_DEV_RST_NOTSUP | SNIC_SCSI_CLEANUP | SNIC_HOST_RESET_ISSUED) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define SNIC_ABTS_TIMEOUT 30000 /* msec */ 102*4882a593Smuzhiyun #define SNIC_LUN_RESET_TIMEOUT 30000 /* msec */ 103*4882a593Smuzhiyun #define SNIC_HOST_RESET_TIMEOUT 30000 /* msec */ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* 107*4882a593Smuzhiyun * These are protected by the hashed req_lock. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun #define CMD_SP(Cmnd) \ 110*4882a593Smuzhiyun (((struct snic_internal_io_state *)scsi_cmd_priv(Cmnd))->rqi) 111*4882a593Smuzhiyun #define CMD_STATE(Cmnd) \ 112*4882a593Smuzhiyun (((struct snic_internal_io_state *)scsi_cmd_priv(Cmnd))->state) 113*4882a593Smuzhiyun #define CMD_ABTS_STATUS(Cmnd) \ 114*4882a593Smuzhiyun (((struct snic_internal_io_state *)scsi_cmd_priv(Cmnd))->abts_status) 115*4882a593Smuzhiyun #define CMD_LR_STATUS(Cmnd) \ 116*4882a593Smuzhiyun (((struct snic_internal_io_state *)scsi_cmd_priv(Cmnd))->lr_status) 117*4882a593Smuzhiyun #define CMD_FLAGS(Cmnd) \ 118*4882a593Smuzhiyun (((struct snic_internal_io_state *)scsi_cmd_priv(Cmnd))->flags) 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define SNIC_INVALID_CODE 0x100 /* Hdr Status val unused by firmware */ 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define SNIC_MAX_TARGET 256 123*4882a593Smuzhiyun #define SNIC_FLAGS_NONE (0) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* snic module params */ 126*4882a593Smuzhiyun extern unsigned int snic_max_qdepth; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* snic debugging */ 129*4882a593Smuzhiyun extern unsigned int snic_log_level; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define SNIC_MAIN_LOGGING 0x1 132*4882a593Smuzhiyun #define SNIC_SCSI_LOGGING 0x2 133*4882a593Smuzhiyun #define SNIC_ISR_LOGGING 0x8 134*4882a593Smuzhiyun #define SNIC_DESC_LOGGING 0x10 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define SNIC_CHECK_LOGGING(LEVEL, CMD) \ 137*4882a593Smuzhiyun do { \ 138*4882a593Smuzhiyun if (unlikely(snic_log_level & LEVEL)) \ 139*4882a593Smuzhiyun do { \ 140*4882a593Smuzhiyun CMD; \ 141*4882a593Smuzhiyun } while (0); \ 142*4882a593Smuzhiyun } while (0) 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #define SNIC_MAIN_DBG(host, fmt, args...) \ 145*4882a593Smuzhiyun SNIC_CHECK_LOGGING(SNIC_MAIN_LOGGING, \ 146*4882a593Smuzhiyun shost_printk(KERN_INFO, host, fmt, ## args);) 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define SNIC_SCSI_DBG(host, fmt, args...) \ 149*4882a593Smuzhiyun SNIC_CHECK_LOGGING(SNIC_SCSI_LOGGING, \ 150*4882a593Smuzhiyun shost_printk(KERN_INFO, host, fmt, ##args);) 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define SNIC_DISC_DBG(host, fmt, args...) \ 153*4882a593Smuzhiyun SNIC_CHECK_LOGGING(SNIC_SCSI_LOGGING, \ 154*4882a593Smuzhiyun shost_printk(KERN_INFO, host, fmt, ##args);) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define SNIC_ISR_DBG(host, fmt, args...) \ 157*4882a593Smuzhiyun SNIC_CHECK_LOGGING(SNIC_ISR_LOGGING, \ 158*4882a593Smuzhiyun shost_printk(KERN_INFO, host, fmt, ##args);) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define SNIC_HOST_ERR(host, fmt, args...) \ 161*4882a593Smuzhiyun shost_printk(KERN_ERR, host, fmt, ##args) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define SNIC_HOST_INFO(host, fmt, args...) \ 164*4882a593Smuzhiyun shost_printk(KERN_INFO, host, fmt, ##args) 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #define SNIC_INFO(fmt, args...) \ 167*4882a593Smuzhiyun pr_info(PFX fmt, ## args) 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define SNIC_DBG(fmt, args...) \ 170*4882a593Smuzhiyun pr_info(PFX fmt, ## args) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define SNIC_ERR(fmt, args...) \ 173*4882a593Smuzhiyun pr_err(PFX fmt, ## args) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #ifdef DEBUG 176*4882a593Smuzhiyun #define SNIC_BUG_ON(EXPR) \ 177*4882a593Smuzhiyun ({ \ 178*4882a593Smuzhiyun if (EXPR) { \ 179*4882a593Smuzhiyun SNIC_ERR("SNIC BUG(%s)\n", #EXPR); \ 180*4882a593Smuzhiyun BUG_ON(EXPR); \ 181*4882a593Smuzhiyun } \ 182*4882a593Smuzhiyun }) 183*4882a593Smuzhiyun #else 184*4882a593Smuzhiyun #define SNIC_BUG_ON(EXPR) \ 185*4882a593Smuzhiyun ({ \ 186*4882a593Smuzhiyun if (EXPR) { \ 187*4882a593Smuzhiyun SNIC_ERR("SNIC BUG(%s) at %s : %d\n", \ 188*4882a593Smuzhiyun #EXPR, __func__, __LINE__); \ 189*4882a593Smuzhiyun WARN_ON_ONCE(EXPR); \ 190*4882a593Smuzhiyun } \ 191*4882a593Smuzhiyun }) 192*4882a593Smuzhiyun #endif 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* Soft assert */ 195*4882a593Smuzhiyun #define SNIC_ASSERT_NOT_IMPL(EXPR) \ 196*4882a593Smuzhiyun ({ \ 197*4882a593Smuzhiyun if (EXPR) {\ 198*4882a593Smuzhiyun SNIC_INFO("Functionality not impl'ed at %s:%d\n", \ 199*4882a593Smuzhiyun __func__, __LINE__); \ 200*4882a593Smuzhiyun WARN_ON_ONCE(EXPR); \ 201*4882a593Smuzhiyun } \ 202*4882a593Smuzhiyun }) 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun extern const char *snic_state_str[]; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun enum snic_intx_intr_index { 208*4882a593Smuzhiyun SNIC_INTX_WQ_RQ_COPYWQ, 209*4882a593Smuzhiyun SNIC_INTX_ERR, 210*4882a593Smuzhiyun SNIC_INTX_NOTIFY, 211*4882a593Smuzhiyun SNIC_INTX_INTR_MAX, 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun enum snic_msix_intr_index { 215*4882a593Smuzhiyun SNIC_MSIX_WQ, 216*4882a593Smuzhiyun SNIC_MSIX_IO_CMPL, 217*4882a593Smuzhiyun SNIC_MSIX_ERR_NOTIFY, 218*4882a593Smuzhiyun SNIC_MSIX_INTR_MAX, 219*4882a593Smuzhiyun }; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #define SNIC_INTRHDLR_NAMSZ (2 * IFNAMSIZ) 222*4882a593Smuzhiyun struct snic_msix_entry { 223*4882a593Smuzhiyun int requested; 224*4882a593Smuzhiyun char devname[SNIC_INTRHDLR_NAMSZ]; 225*4882a593Smuzhiyun irqreturn_t (*isr)(int, void *); 226*4882a593Smuzhiyun void *devid; 227*4882a593Smuzhiyun }; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun enum snic_state { 230*4882a593Smuzhiyun SNIC_INIT = 0, 231*4882a593Smuzhiyun SNIC_ERROR, 232*4882a593Smuzhiyun SNIC_ONLINE, 233*4882a593Smuzhiyun SNIC_OFFLINE, 234*4882a593Smuzhiyun SNIC_FWRESET, 235*4882a593Smuzhiyun }; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun #define SNIC_WQ_MAX 1 238*4882a593Smuzhiyun #define SNIC_CQ_IO_CMPL_MAX 1 239*4882a593Smuzhiyun #define SNIC_CQ_MAX (SNIC_WQ_MAX + SNIC_CQ_IO_CMPL_MAX) 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /* firmware version information */ 242*4882a593Smuzhiyun struct snic_fw_info { 243*4882a593Smuzhiyun u32 fw_ver; 244*4882a593Smuzhiyun u32 hid; /* u16 hid | u16 vnic id */ 245*4882a593Smuzhiyun u32 max_concur_ios; /* max concurrent ios */ 246*4882a593Smuzhiyun u32 max_sgs_per_cmd; /* max sgls per IO */ 247*4882a593Smuzhiyun u32 max_io_sz; /* max io size supported */ 248*4882a593Smuzhiyun u32 hba_cap; /* hba capabilities */ 249*4882a593Smuzhiyun u32 max_tgts; /* max tgts supported */ 250*4882a593Smuzhiyun u16 io_tmo; /* FW Extended timeout */ 251*4882a593Smuzhiyun struct completion *wait; /* protected by snic lock*/ 252*4882a593Smuzhiyun }; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun /* 255*4882a593Smuzhiyun * snic_work item : defined to process asynchronous events 256*4882a593Smuzhiyun */ 257*4882a593Smuzhiyun struct snic_work { 258*4882a593Smuzhiyun struct work_struct work; 259*4882a593Smuzhiyun u16 ev_id; 260*4882a593Smuzhiyun u64 *ev_data; 261*4882a593Smuzhiyun }; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* 264*4882a593Smuzhiyun * snic structure to represent SCSI vNIC 265*4882a593Smuzhiyun */ 266*4882a593Smuzhiyun struct snic { 267*4882a593Smuzhiyun /* snic specific members */ 268*4882a593Smuzhiyun struct list_head list; 269*4882a593Smuzhiyun char name[IFNAMSIZ]; 270*4882a593Smuzhiyun atomic_t state; 271*4882a593Smuzhiyun spinlock_t snic_lock; 272*4882a593Smuzhiyun struct completion *remove_wait; 273*4882a593Smuzhiyun bool in_remove; 274*4882a593Smuzhiyun bool stop_link_events; /* stop processing link events */ 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* discovery related */ 277*4882a593Smuzhiyun struct snic_disc disc; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* Scsi Host info */ 280*4882a593Smuzhiyun struct Scsi_Host *shost; 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /* vnic related structures */ 283*4882a593Smuzhiyun struct vnic_dev_bar bar0; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun struct vnic_stats *stats; 286*4882a593Smuzhiyun unsigned long stats_time; 287*4882a593Smuzhiyun unsigned long stats_reset_time; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun struct vnic_dev *vdev; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun /* hw resource info */ 292*4882a593Smuzhiyun unsigned int wq_count; 293*4882a593Smuzhiyun unsigned int cq_count; 294*4882a593Smuzhiyun unsigned int intr_count; 295*4882a593Smuzhiyun unsigned int err_intr_offset; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun int link_status; /* retrieved from svnic_dev_link_status() */ 298*4882a593Smuzhiyun u32 link_down_cnt; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /* pci related */ 301*4882a593Smuzhiyun struct pci_dev *pdev; 302*4882a593Smuzhiyun struct snic_msix_entry msix[SNIC_MSIX_INTR_MAX]; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* io related info */ 305*4882a593Smuzhiyun mempool_t *req_pool[SNIC_REQ_MAX_CACHES]; /* (??) */ 306*4882a593Smuzhiyun ____cacheline_aligned spinlock_t io_req_lock[SNIC_IO_LOCKS]; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun /* Maintain snic specific commands, cmds with no tag in spl_cmd_list */ 309*4882a593Smuzhiyun ____cacheline_aligned spinlock_t spl_cmd_lock; 310*4882a593Smuzhiyun struct list_head spl_cmd_list; 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun unsigned int max_tag_id; 313*4882a593Smuzhiyun atomic_t ios_inflight; /* io in flight counter */ 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun struct vnic_snic_config config; 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun struct work_struct link_work; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* firmware information */ 320*4882a593Smuzhiyun struct snic_fw_info fwinfo; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun /* Work for processing Target related work */ 323*4882a593Smuzhiyun struct work_struct tgt_work; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun /* Work for processing Discovery */ 326*4882a593Smuzhiyun struct work_struct disc_work; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun /* stats related */ 329*4882a593Smuzhiyun unsigned int reset_stats; 330*4882a593Smuzhiyun atomic64_t io_cmpl_skip; 331*4882a593Smuzhiyun struct snic_stats s_stats; /* Per SNIC driver stats */ 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* platform specific */ 334*4882a593Smuzhiyun #ifdef CONFIG_SCSI_SNIC_DEBUG_FS 335*4882a593Smuzhiyun struct dentry *stats_host; /* Per snic debugfs root */ 336*4882a593Smuzhiyun struct dentry *stats_file; /* Per snic debugfs file */ 337*4882a593Smuzhiyun struct dentry *reset_stats_file;/* Per snic reset stats file */ 338*4882a593Smuzhiyun #endif 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun /* completion queue cache line section */ 341*4882a593Smuzhiyun ____cacheline_aligned struct vnic_cq cq[SNIC_CQ_MAX]; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun /* work queue cache line section */ 344*4882a593Smuzhiyun ____cacheline_aligned struct vnic_wq wq[SNIC_WQ_MAX]; 345*4882a593Smuzhiyun spinlock_t wq_lock[SNIC_WQ_MAX]; 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /* interrupt resource cache line section */ 348*4882a593Smuzhiyun ____cacheline_aligned struct vnic_intr intr[SNIC_MSIX_INTR_MAX]; 349*4882a593Smuzhiyun }; /* end of snic structure */ 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /* 352*4882a593Smuzhiyun * SNIC Driver's Global Data 353*4882a593Smuzhiyun */ 354*4882a593Smuzhiyun struct snic_global { 355*4882a593Smuzhiyun struct list_head snic_list; 356*4882a593Smuzhiyun spinlock_t snic_list_lock; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun struct kmem_cache *req_cache[SNIC_REQ_MAX_CACHES]; 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun struct workqueue_struct *event_q; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun #ifdef CONFIG_SCSI_SNIC_DEBUG_FS 363*4882a593Smuzhiyun /* debugfs related global data */ 364*4882a593Smuzhiyun struct dentry *trc_root; 365*4882a593Smuzhiyun struct dentry *stats_root; 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun struct snic_trc trc ____cacheline_aligned; 368*4882a593Smuzhiyun #endif 369*4882a593Smuzhiyun }; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun extern struct snic_global *snic_glob; 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun int snic_glob_init(void); 374*4882a593Smuzhiyun void snic_glob_cleanup(void); 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun extern struct workqueue_struct *snic_event_queue; 377*4882a593Smuzhiyun extern struct device_attribute *snic_attrs[]; 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun int snic_queuecommand(struct Scsi_Host *, struct scsi_cmnd *); 380*4882a593Smuzhiyun int snic_abort_cmd(struct scsi_cmnd *); 381*4882a593Smuzhiyun int snic_device_reset(struct scsi_cmnd *); 382*4882a593Smuzhiyun int snic_host_reset(struct scsi_cmnd *); 383*4882a593Smuzhiyun int snic_reset(struct Scsi_Host *, struct scsi_cmnd *); 384*4882a593Smuzhiyun void snic_shutdown_scsi_cleanup(struct snic *); 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun int snic_request_intr(struct snic *); 388*4882a593Smuzhiyun void snic_free_intr(struct snic *); 389*4882a593Smuzhiyun int snic_set_intr_mode(struct snic *); 390*4882a593Smuzhiyun void snic_clear_intr_mode(struct snic *); 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun int snic_fwcq_cmpl_handler(struct snic *, int); 393*4882a593Smuzhiyun int snic_wq_cmpl_handler(struct snic *, int); 394*4882a593Smuzhiyun void snic_free_wq_buf(struct vnic_wq *, struct vnic_wq_buf *); 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun void snic_log_q_error(struct snic *); 398*4882a593Smuzhiyun void snic_handle_link_event(struct snic *); 399*4882a593Smuzhiyun void snic_handle_link(struct work_struct *); 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun int snic_queue_exch_ver_req(struct snic *); 402*4882a593Smuzhiyun void snic_io_exch_ver_cmpl_handler(struct snic *, struct snic_fw_req *); 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun int snic_queue_wq_desc(struct snic *, void *os_buf, u16 len); 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun void snic_handle_untagged_req(struct snic *, struct snic_req_info *); 407*4882a593Smuzhiyun void snic_release_untagged_req(struct snic *, struct snic_req_info *); 408*4882a593Smuzhiyun void snic_free_all_untagged_reqs(struct snic *); 409*4882a593Smuzhiyun int snic_get_conf(struct snic *); 410*4882a593Smuzhiyun void snic_set_state(struct snic *, enum snic_state); 411*4882a593Smuzhiyun int snic_get_state(struct snic *); 412*4882a593Smuzhiyun const char *snic_state_to_str(unsigned int); 413*4882a593Smuzhiyun void snic_hex_dump(char *, char *, int); 414*4882a593Smuzhiyun void snic_print_desc(const char *fn, char *os_buf, int len); 415*4882a593Smuzhiyun const char *show_opcode_name(int val); 416*4882a593Smuzhiyun #endif /* _SNIC_H */ 417