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