f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * This file and its contents are supplied under the terms of the
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * Common Development and Distribution License ("CDDL"), version 1.0.
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * You may only use this file in accordance with the terms of version
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * 1.0 of the CDDL.
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta *
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * A full copy of the text of the CDDL should have accompanied this
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * source. A copy of the CDDL is also available via the Internet at
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * http://www.illumos.org/license/CDDL.
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * Copyright 2013 STEC, Inc. All rights reserved.
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#ifndef _SKD_H
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define _SKD_H
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/types.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/stropts.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/stream.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/cmn_err.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/kmem.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/modctl.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/ddi.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/sunddi.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/strsun.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/kstat.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/conf.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/debug.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/modctl.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/errno.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/pci.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/memlist.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/param.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#include <sys/queue.h>
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define DRV_NAME "skd"
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define DRV_VERSION "2.2.1"
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define DRV_BUILD_ID "0264"
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define PFX DRV_NAME ": "
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define DRV_BIN_VERSION 0x100
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define DRV_VER_COMPL DRV_VERSION "." DRV_BUILD_ID
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define VERSIONSTR DRV_VERSION
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SG_BOUNDARY 0x20000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#ifdef _BIG_ENDIAN
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define be64_to_cpu(x) (x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define be32_to_cpu(x) (x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define cpu_to_be64(x) (x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define cpu_to_be32(x) (x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#else
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define be64_to_cpu(x) BSWAP_64(x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define be32_to_cpu(x) BSWAP_32(x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define cpu_to_be64(x) BSWAP_64(x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define cpu_to_be32(x) BSWAP_32(x)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#endif
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define ATYPE_64BIT 0
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define ATYPE_32BIT 1
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_0 0x00001
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_1 0x00002
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_2 0x00004
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_3 0x00008
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_4 0x00010
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_5 0x00020
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_6 0x00040
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_7 0x00080
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_8 0x00100
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_9 0x00200
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_10 0x00400
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_11 0x00800
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_12 0x01000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_13 0x02000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_14 0x04000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_15 0x08000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_16 0x10000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_17 0x20000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_18 0x40000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define BIT_19 0x80000
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/* Attach progress flags */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ATTACHED BIT_0
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_SOFT_STATE_ALLOCED BIT_1
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_CONFIG_SPACE_SETUP BIT_3
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_IOBASE_MAPPED BIT_4
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_IOMAP_IOBASE_MAPPED BIT_5
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_REGS_MAPPED BIT_6
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DEV_IOBASE_MAPPED BIT_7
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_CONSTRUCTED BIT_8
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_PROBED BIT_9
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_INTR_ADDED BIT_10
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_PATHNAME_ALLOCED BIT_11
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_SUSPENDED BIT_12
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_CMD_ABORT_TMO BIT_13
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_MUTEX_INITED BIT_14
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_MUTEX_DESTROYED BIT_15
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_IODONE_WIOC 1 /* I/O done */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_IODONE_WNIOC 2 /* I/O NOT done */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_IODONE_WDEBUG 3 /* I/O - debug stuff */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#ifdef SKD_PM
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define MAX_POWER_LEVEL 0
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define LOW_POWER_LEVEL (BIT_1 | BIT_0)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#endif
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_MSIX_AIF 0x0
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_MSIX_RSPQ 0x1
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_MSIX_MAXAIF SKD_MSIX_RSPQ + 1
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * Stuff from Linux
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SAM_STAT_GOOD 0x00
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SAM_STAT_CHECK_CONDITION 0x02
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define TEST_UNIT_READY 0x00
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define INQUIRY 0x12
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define INQUIRY2 (0x12 + 0xe0)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define READ_CAPACITY 0x25
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define READ_CAPACITY_EXT 0x9e
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SYNCHRONIZE_CACHE 0x35
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * SENSE KEYS
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define NO_SENSE 0x00
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define RECOVERED_ERROR 0x01
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define UNIT_ATTENTION 0x06
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define ABORTED_COMMAND 0x0b
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetatypedef struct dma_mem_t {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta void *bp;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_acc_handle_t acc_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_dma_handle_t dma_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_dma_cookie_t cookie;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_dma_cookie_t *cookies;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t size;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta} dma_mem_t;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_WRITEL(DEV, VAL, OFF) skd_reg_write32(DEV, VAL, OFF)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_READL(DEV, OFF) skd_reg_read32(DEV, OFF)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_WRITEQ(DEV, VAL, OFF) skd_reg_write64(DEV, VAL, OFF)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/* Capability lists */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define PCI_CAP_ID_EXP 0x10 /* PCI Express */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * End Stuff from Linux
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_MAXXFER (2048 * DEV_BSIZE)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_LOW_ADDRESS (uint64_t)0
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_HIGH_64BIT_ADDRESS (uint64_t)0xffffffffffffffff
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_HIGH_32BIT_ADDRESS (uint64_t)0xffffffff
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_XFER_COUNTER (uint64_t)0xffffffff
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_ADDRESS_ALIGNMENT (uint64_t)SG_BOUNDARY
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_BURSTSIZES 0xff
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_MIN_XFER_SIZE 1
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_MAX_XFER_SIZE (uint64_t)0xfffffe00
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_SEGMENT_BOUNDARY (uint64_t)0xffffffff
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_SG_LIST_LENGTH 256
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_XFER_FLAGS 0
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DMA_GRANULARITY 512 /* 1 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define PCI_VENDOR_ID_STEC 0x1B39
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define PCI_DEVICE_ID_SUMO 0x0001
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_FITMSG_BYTES (512u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_SPECIAL_CONTEXT 64u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_SPECIAL_FITMSG_BYTES (128u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_SPECIAL_DATA_BYTES (8u*1024u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * SG elements are 32 bytes, so we can make this 4096 and still be under the
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * 128KB limit. That allows 4096*4K = 16M xfer size
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_SG_PER_REQ_DEFAULT 256u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_SG_PER_SPECIAL 256u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_COMPLETION_ENTRY 256u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_READ_CAP_BYTES (8u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_READ_CAP_EXT_BYTES (16)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_INTERNAL_BYTES (512u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/* 5 bits of uniqifier, 0xF800 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_INCR (0x400)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_TABLE_MASK (3u << 8u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_RW_REQUEST (0u << 8u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_INTERNAL (1u << 8u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_FIT_MSG (3u << 8u)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_SLOT_MASK 0x00FFu
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_ID_SLOT_AND_TABLE_MASK 0x03FFu
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_N_TIMEOUT_SLOT 8u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_TIMEOUT_SLOT_MASK 7u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_TIMER_SECONDS(seconds) (seconds)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_TIMER_MINUTES(minutes) ((minutes)*(60))
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/*
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * NOTE: INTR_LOCK() should be held prior to grabbing WAITQ_LOCK() if both
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta * are needed.
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define INTR_LOCK(skdev) mutex_enter(&skdev->skd_intr_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define INTR_UNLOCK(skdev) mutex_exit(&skdev->skd_intr_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define INTR_LOCK_HELD(skdev) MUTEX_HELD(&skdev->skd_intr_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define WAITQ_LOCK(skdev) \
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta mutex_enter(&skdev->waitqueue_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define WAITQ_UNLOCK(skdev) \
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta mutex_exit(&skdev->waitqueue_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define WAITQ_LOCK_HELD(skdev) \
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta MUTEX_HELD(&skdev->waitqueue_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define ADAPTER_STATE_LOCK(skdev) mutex_enter(&skdev->skd_lock_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define ADAPTER_STATE_UNLOCK(skdev) mutex_exit(&skdev->skd_lock_mutex)
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetaenum skd_drvr_state {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_LOAD, /* 0 when driver first loaded */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_IDLE, /* 1 when device goes offline */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_BUSY, /* 2 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_STARTING, /* 3 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_ONLINE, /* 4 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_PAUSING, /* 5 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_PAUSED, /* 6 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_DRAINING_TIMEOUT, /* 7 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_RESTARTING, /* 8 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_RESUMING, /* 9 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_STOPPING, /* 10 when driver is unloading */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_FAULT, /* 11 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_DISAPPEARED, /* 12 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_PROTOCOL_MISMATCH, /* 13 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_BUSY_ERASE, /* 14 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_BUSY_SANITIZE, /* 15 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_BUSY_IMMINENT, /* 16 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_WAIT_BOOT, /* 17 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_DRVR_STATE_SYNCING /* 18 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_WAIT_BOOT_TO 90u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_STARTING_TO 248u
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetaenum skd_req_state {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_REQ_STATE_IDLE,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_REQ_STATE_SETUP,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_REQ_STATE_BUSY,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_REQ_STATE_COMPLETED,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_REQ_STATE_TIMEOUT,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_REQ_STATE_ABORTED,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetaenum skd_fit_msg_state {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_MSG_STATE_IDLE,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_MSG_STATE_BUSY,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetaenum skd_check_status_action {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_CHECK_STATUS_REPORT_GOOD,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_CHECK_STATUS_REPORT_SMART_ALERT,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_CHECK_STATUS_REQUEUE_REQUEST,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_CHECK_STATUS_REPORT_ERROR,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SKD_CHECK_STATUS_BUSY_IMMINENT,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta/* NOTE: mbu_t users should name this field "mbu". */
f52228b83292315dabb975359cdcf9db662845b2Joe Betetatypedef union {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint8_t *mb8;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t *mb64;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta} mbu_t;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define msg_buf mbu.mb8
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define msg_buf64 mbu.mb64
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastruct skd_fitmsg_context {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta enum skd_fit_msg_state state;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_fitmsg_context *next;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t id;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint16_t outstanding;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t length;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t offset;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta mbu_t mbu; /* msg_buf & msg_buf64 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta dma_mem_t mb_dma_address;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastruct skd_request_context {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta enum skd_req_state state;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context *next;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint16_t did_complete;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint16_t id;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t fitmsg_id;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_buf_private *pbuf;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timeout_stamp;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint8_t sg_data_dir;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t n_sg;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_dma_handle_t io_dma_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct fit_sg_descriptor *sksg_list;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta dma_mem_t sksg_dma_address;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct fit_completion_entry_v1 completion;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct fit_comp_error_info err_info;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int total_sg_bcount;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DATA_DIR_HOST_TO_CARD 1
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#define SKD_DATA_DIR_CARD_TO_HOST 2
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastruct skd_special_context {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context req;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint8_t orphaned;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t sg_byte_count;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta void *data_buf;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta dma_mem_t db_dma_address;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta mbu_t mbu; /* msg_buf & msg_buf64 */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta dma_mem_t mb_dma_address;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int io_pending;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetatypedef struct skd_buf_private {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta SIMPLEQ_ENTRY(skd_buf_private) sq;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context *skreq;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta bd_xfer_t *x_xfer;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int dir;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta} skd_buf_private_t;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe BetetaSIMPLEQ_HEAD(waitqueue, skd_buf_private);
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetatypedef struct skd_device skd_device_t;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastruct skd_device {
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int irq_type;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int gendisk_on;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int sync_done;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char name[32];
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta enum skd_drvr_state state;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t drive_state;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t queue_depth_busy;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t queue_depth_limit;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t queue_depth_lowat;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t soft_queue_depth_limit;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t hard_queue_depth_limit;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t num_fitmsg_context;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t num_req_context;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timeout_slot[SKD_N_TIMEOUT_SLOT];
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timeout_stamp;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_fitmsg_context *skmsg_free_list;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_fitmsg_context *skmsg_table;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context *skreq_free_list;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context *skreq_table;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_special_context internal_skspcl;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t read_cap_last_lba;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t read_cap_blocksize;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int read_cap_is_valid;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int inquiry_is_valid;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char inq_serial_num[13]; /* 12 chars plus null term */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char inq_vendor_id[9];
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char inq_product_id[17];
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char inq_product_rev[5];
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char id_str[128]; /* holds a composite name (pci + sernum) */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint8_t skcomp_cycle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t skcomp_ix;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct fit_completion_entry_v1 *skcomp_table;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct fit_comp_error_info *skerr_table;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta dma_mem_t cq_dma_address;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timer_active;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timer_countdown;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timer_substate;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int sgs_per_request;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t last_mtd;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t proto_ver;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int dbg_level;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t timo_slot;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_acc_handle_t pci_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_acc_handle_t iobase_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_acc_handle_t iomap_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta caddr_t iobase;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta caddr_t iomap_iobase;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_acc_handle_t dev_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta caddr_t dev_iobase;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int dev_memsize;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char *pathname;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta dev_info_t *dip;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int instance;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint16_t vendor_id;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint16_t device_id;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta kmutex_t skd_lock_mutex;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta kmutex_t skd_intr_mutex;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta kmutex_t skd_fit_mutex;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t flags;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#ifdef SKD_PM
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint8_t power_level;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#endif
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta /* AIF (Advanced Interrupt Framework) support */
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_intr_handle_t *htable;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t hsize;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int32_t intr_cnt;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t intr_pri;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int32_t intr_cap;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t Nblocks;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_iblock_cookie_t iblock_cookie;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int n_req;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t progress;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t intr_cntr;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t fitmsg_sent1;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t fitmsg_sent2;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint64_t active_cmds;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta kmutex_t skd_internalio_mutex;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta kcondvar_t cv_waitq;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta kmutex_t waitqueue_mutex;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct waitqueue waitqueue;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int disks_initialized;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ddi_devid_t s1120_devid;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta char devid_str[80];
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta uint32_t d_blkshift;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int attached;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int ios_queued;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int ios_started;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int ios_completed;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int ios_errors;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int iodone_wioc;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int iodone_wnioc;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int iodone_wdebug;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int iodone_unknown;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta bd_handle_t s_bdh;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta int bd_attached;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#ifdef USE_SKE_EMULATOR
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta ske_device_t *ske_handle;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#endif
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta timeout_id_t skd_timer_timeout_id;
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta};
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_disable_interrupts(struct skd_device *skdev);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_isr_completion_posted(struct skd_device *skdev);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_recover_requests(struct skd_device *skdev);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_log_skdev(struct skd_device *skdev, const char *event);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_restart_device(struct skd_device *skdev);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_destruct(struct skd_device *skdev);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic int skd_unquiesce_dev(struct skd_device *skdev);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_send_special_fitmsg(struct skd_device *skdev,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_special_context *skspcl);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_end_request(struct skd_device *skdev,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context *skreq, int error);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_log_skmsg(struct skd_device *skdev,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_fitmsg_context *skmsg, const char *event);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_log_skreq(struct skd_device *skdev,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_request_context *skreq, const char *event);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic void skd_send_fitmsg(struct skd_device *skdev,
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta struct skd_fitmsg_context *skmsg);
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic const char *skd_drive_state_to_str(int state);
f52228b83292315dabb975359cdcf9db662845b2Joe Betetastatic const char *skd_skdev_state_to_str(enum skd_drvr_state state);
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta
f52228b83292315dabb975359cdcf9db662845b2Joe Beteta#endif /* _SKD_H */