15597088cSDongdong Hao /* SPDX-License-Identifier: GPL-2.0 */
25597088cSDongdong Hao /*
35597088cSDongdong Hao * Copyright (C) 2026 LeapIO Tech Inc.
45597088cSDongdong Hao *
55597088cSDongdong Hao * LeapRAID storage and RAID controller driver.
65597088cSDongdong Hao */
75597088cSDongdong Hao #ifndef LEAPRAID_FUNC_H_INCLUDED
85597088cSDongdong Hao #define LEAPRAID_FUNC_H_INCLUDED
95597088cSDongdong Hao
105597088cSDongdong Hao #include <linux/pci.h>
115597088cSDongdong Hao #include <linux/aer.h>
125597088cSDongdong Hao #include <linux/poll.h>
135597088cSDongdong Hao #include <linux/atomic.h>
145597088cSDongdong Hao #include <linux/errno.h>
155597088cSDongdong Hao #include <linux/ktime.h>
165597088cSDongdong Hao #include <linux/delay.h>
175597088cSDongdong Hao #include <linux/interrupt.h>
185597088cSDongdong Hao #include <scsi/scsi.h>
195597088cSDongdong Hao #include <scsi/scsi_eh.h>
205597088cSDongdong Hao #include <scsi/scsicam.h>
215597088cSDongdong Hao #include <scsi/scsi_tcq.h>
225597088cSDongdong Hao #include <scsi/scsi_dbg.h>
235597088cSDongdong Hao #include <scsi/scsi_host.h>
245597088cSDongdong Hao #include <scsi/scsi_cmnd.h>
255597088cSDongdong Hao #include <scsi/scsi_device.h>
265597088cSDongdong Hao #include <scsi/scsi_transport_sas.h>
275597088cSDongdong Hao
285597088cSDongdong Hao #include "leapraid.h"
295597088cSDongdong Hao
305597088cSDongdong Hao /* Request and reply buffer size. */
315597088cSDongdong Hao #define LEAPRAID_REQUEST_SIZE 128
325597088cSDongdong Hao #define LEAPRAID_REPLY_SIZE 128
335597088cSDongdong Hao #define LEAPRAID_CHAIN_SEG_SIZE 128
345597088cSDongdong Hao #define LEAPRAID_MAX_SGES_IN_CHAIN 7
355597088cSDongdong Hao #define LEAPRAID_DEFAULT_CHAINS_PER_IO 19
365597088cSDongdong Hao #define LEAPRAID_DEFAULT_DIX_CHAINS_PER_IO \
375597088cSDongdong Hao (2 * LEAPRAID_DEFAULT_CHAINS_PER_IO) /* TODO DIX */
385597088cSDongdong Hao #define LEAPRAID_IEEE_SGE64_ENTRY_SIZE 16
395597088cSDongdong Hao #define LEAPRAID_REP_DESC_CHUNK_SIZE 16
405597088cSDongdong Hao #define LEAPRAID_REP_DESC_ENTRY_SIZE 8
415597088cSDongdong Hao #define LEAPRAID_REP_MSG_ADDR_SIZE 4
425597088cSDongdong Hao #define LEAPRAID_REP_RQ_CNT_SIZE 16
435597088cSDongdong Hao
445597088cSDongdong Hao #define LEAPRAID_SYS_LOG_BUF_SIZE 0x200000
455597088cSDongdong Hao #define LEAPRAID_SYS_LOG_BUF_RESERVE 0x1000
465597088cSDongdong Hao
475597088cSDongdong Hao /* Driver version and name. */
485597088cSDongdong Hao #define LEAPRAID_DRIVER_NAME "LeapRAID"
495597088cSDongdong Hao #define LEAPRAID_NAME_LENGTH 48
505597088cSDongdong Hao #define LEAPRAID_BOARD_NAME_LENGTH 17
515597088cSDongdong Hao #define LEAPRAID_AUTHOR "LeapIO Inc."
525597088cSDongdong Hao #define LEAPRAID_DESCRIPTION "LeapRAID Driver"
535597088cSDongdong Hao #define LEAPRAID_DRIVER_VERSION "2.00.01.09"
545597088cSDongdong Hao #define LEAPRAID_MAJOR_VERSION 2
555597088cSDongdong Hao #define LEAPRAID_MINOR_VERSION 0
565597088cSDongdong Hao #define LEAPRAID_BUILD_VERSION 1
575597088cSDongdong Hao #define LEAPRAID_RELEASE_VERSION 9
585597088cSDongdong Hao #define LEAPRAID_MSG_VERSION 0x1021
595597088cSDongdong Hao #define LEAPRAID_HEADER_VERSION 0x0000
605597088cSDongdong Hao
615597088cSDongdong Hao /* Device ID. */
625597088cSDongdong Hao #define LEAPRAID_VENDOR_ID 0xD405
635597088cSDongdong Hao #define LEAPRAID_DEVID_HBA 0x8200
645597088cSDongdong Hao #define LEAPRAID_SUBVENDOR_ID 0xD405
655597088cSDongdong Hao #define LEAPRAID_SUBDEVID_HBA 0x8200
665597088cSDongdong Hao
675597088cSDongdong Hao #define LEAPRAID_PCI_VENDOR_ID_MASK 0xFFFF
685597088cSDongdong Hao
695597088cSDongdong Hao /* RAID virtual channel ID. */
705597088cSDongdong Hao #define RAID_CHANNEL 1
715597088cSDongdong Hao
725597088cSDongdong Hao /* Scatter-gather (SG) segment limits. */
735597088cSDongdong Hao #define LEAPRAID_MAX_PHYS_SEGMENTS SG_CHUNK_SIZE
745597088cSDongdong Hao
755597088cSDongdong Hao #define LEAPRAID_KDUMP_MIN_PHYS_SEGMENTS 32
765597088cSDongdong Hao #define LEAPRAID_SG_DEPTH LEAPRAID_MAX_PHYS_SEGMENTS
775597088cSDongdong Hao
785597088cSDongdong Hao /* Firmware and config page operations. */
795597088cSDongdong Hao #define LEAPRAID_CFG_REQ_RETRY_TIMES 2
805597088cSDongdong Hao
815597088cSDongdong Hao /* Hardware access helpers. */
825597088cSDongdong Hao #define leapraid_readl(addr) readl(addr)
835597088cSDongdong Hao #define leapraid_check_reset(status) \
845597088cSDongdong Hao (!((status) & LEAPRAID_CMD_RESET))
855597088cSDongdong Hao
865597088cSDongdong Hao /* Polling intervals. */
875597088cSDongdong Hao #define LEAPRAID_PCIE_LOG_POLLING_INTERVAL 1
885597088cSDongdong Hao #define LEAPRAID_FAULT_POLLING_INTERVAL 1000
895597088cSDongdong Hao
905597088cSDongdong Hao /* Init mask. */
915597088cSDongdong Hao #define LEAPRAID_RESET_IRQ_MASK 0x40000000
925597088cSDongdong Hao #define LEAPRAID_REPLY_INT_MASK 0x00000008
935597088cSDongdong Hao #define LEAPRAID_TO_SYS_DB_MASK 0x00000001
945597088cSDongdong Hao
955597088cSDongdong Hao /* Queue depth. */
965597088cSDongdong Hao #define LEAPRAID_SATA_QUEUE_DEPTH 32
975597088cSDongdong Hao #define LEAPRAID_SAS_QUEUE_DEPTH 64
985597088cSDongdong Hao #define LEAPRAID_RAID_QUEUE_DEPTH 64
995597088cSDongdong Hao
1005597088cSDongdong Hao /* Target probe flag. */
1015597088cSDongdong Hao #define LEAPRAID_NO_ULD_ATTACH_FLAG 1
1025597088cSDongdong Hao
1035597088cSDongdong Hao /* SCSI device and queue limits. */
1045597088cSDongdong Hao #define LEAPRAID_MAX_SECTORS 2048
1055597088cSDongdong Hao #define LEAPRAID_MAX_CDB_LEN 32
1065597088cSDongdong Hao #define LEAPRAID_MAX_LUNS 16384
1075597088cSDongdong Hao #define LEAPRAID_CAN_QUEUE_MIN 1
1085597088cSDongdong Hao #define LEAPRAID_THIS_ID_NONE -1
1095597088cSDongdong Hao #define LEAPRAID_CMD_PER_LUN 128
1105597088cSDongdong Hao #define LEAPRAID_MAX_SEGMENT_SIZE 0xffffffff
1115597088cSDongdong Hao
1125597088cSDongdong Hao /* SCSI sense and ASC/ASCQ and disk geometry configuration. */
1135597088cSDongdong Hao #define DESC_FORMAT_THRESHOLD 0x72
1145597088cSDongdong Hao #define SENSE_KEY_MASK 0x0F
1155597088cSDongdong Hao #define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F
1165597088cSDongdong Hao #define ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5D
1175597088cSDongdong Hao #define LEAPRAID_LARGE_DISK_THRESHOLD 0x200000UL
1185597088cSDongdong Hao #define LEAPRAID_LARGE_DISK_HEADS 255
1195597088cSDongdong Hao #define LEAPRAID_LARGE_DISK_SECTORS 63
1205597088cSDongdong Hao #define LEAPRAID_SMALL_DISK_HEADS 64
1215597088cSDongdong Hao #define LEAPRAID_SMALL_DISK_SECTORS 32
1225597088cSDongdong Hao
1235597088cSDongdong Hao /* SMP (Serial Management Protocol). */
1245597088cSDongdong Hao #define LEAPRAID_SMP_PT_FLAG_SGL_PTR 0x80
1255597088cSDongdong Hao #define LEAPRAID_SMP_FRAME_HEADER_SIZE 4
1265597088cSDongdong Hao #define LEAPRAID_SCSI_HOST_SHIFT 16
1275597088cSDongdong Hao #define LEAPRAID_SCSI_DRIVER_SHIFT 24
1285597088cSDongdong Hao
1295597088cSDongdong Hao /* SCSI ASC/ASCQ definitions. */
1305597088cSDongdong Hao #define LEAPRAID_SCSI_ASCQ_DEFAULT 0x00
1315597088cSDongdong Hao #define LEAPRAID_SCSI_ASC_POWER_ON_RESET 0x29
1325597088cSDongdong Hao #define LEAPRAID_SCSI_ASC_INVALID_CMD_CODE 0x20
1335597088cSDongdong Hao #define LEAPRAID_SCSI_ASCQ_POWER_ON_RESET 0x07
1345597088cSDongdong Hao
1355597088cSDongdong Hao /* VPD Page 0x89 (ATA Information). */
1365597088cSDongdong Hao #define LEAPRAID_VPD_PAGE_ATA_INFO 0x89
1375597088cSDongdong Hao #define LEAPRAID_VPD_PG89_MAX_LEN 255
1385597088cSDongdong Hao #define LEAPRAID_VPD_PG89_MIN_LEN 214
1395597088cSDongdong Hao
1405597088cSDongdong Hao /* Byte index for NCQ support flag in VPD page 0x89. */
1415597088cSDongdong Hao #define LEAPRAID_VPD_PG89_NCQ_BYTE_IDX 213
1425597088cSDongdong Hao #define LEAPRAID_VPD_PG89_NCQ_BIT_SHIFT 4
1435597088cSDongdong Hao #define LEAPRAID_VPD_PG89_NCQ_BIT_MASK 0x1
1445597088cSDongdong Hao
1455597088cSDongdong Hao /* Readiness polling: max retries, sleep µs between. */
1465597088cSDongdong Hao #define LEAPRAID_ADAPTER_READY_MAX_RETRY 15000
1475597088cSDongdong Hao #define LEAPRAID_ADAPTER_READY_SLEEP_MIN_US 1000
1485597088cSDongdong Hao #define LEAPRAID_ADAPTER_READY_SLEEP_MAX_US 1100
1495597088cSDongdong Hao
1505597088cSDongdong Hao /* Doorbell wait parameters. */
1515597088cSDongdong Hao #define LEAPRAID_DB_WAIT_MAX_RETRY 20000
1525597088cSDongdong Hao #define LEAPRAID_DB_WAIT_DELAY_US 500
1535597088cSDongdong Hao
1545597088cSDongdong Hao /* Basic data size definitions. */
1555597088cSDongdong Hao #define LEAPRAID_DWORDS_BYTE_SIZE 4
1565597088cSDongdong Hao #define LEAPRAID_WORD_BYTE_SIZE 2
1575597088cSDongdong Hao
1585597088cSDongdong Hao /* SGL threshold and chain offset. */
1595597088cSDongdong Hao #define LEAPRAID_SGL_INLINE_THRESHOLD 2
1605597088cSDongdong Hao #define LEAPRAID_CHAIN_OFFSET_DWORDS 7
1615597088cSDongdong Hao
1625597088cSDongdong Hao /* MSI-X group size and mask. */
1635597088cSDongdong Hao #define LEAPRAID_MSIX_GROUP_SIZE 8
1645597088cSDongdong Hao #define LEAPRAID_MSIX_GROUP_MASK 7
1655597088cSDongdong Hao
1665597088cSDongdong Hao /* Basic constants and limits. */
1675597088cSDongdong Hao #define LEAPRAID_BUSY_LIMIT 1
1685597088cSDongdong Hao #define LEAPRAID_INVALID_HOST_DIAG_VAL 0xFFFFFFFF
1695597088cSDongdong Hao
1705597088cSDongdong Hao /* Retry/Sleep configuration. */
1715597088cSDongdong Hao #define LEAPRAID_WRSEQ_FLUSH_KEY_VALUE 0x0
1725597088cSDongdong Hao #define LEAPRAID_WRSEQ_1ST_KEY_VALUE 0xF
1735597088cSDongdong Hao #define LEAPRAID_WRSEQ_2ND_KEY_VALUE 0x4
1745597088cSDongdong Hao #define LEAPRAID_WRSEQ_3RD_KEY_VALUE 0xB
1755597088cSDongdong Hao #define LEAPRAID_WRSEQ_4TH_KEY_VALUE 0x2
1765597088cSDongdong Hao #define LEAPRAID_WRSEQ_5TH_KEY_VALUE 0x7
1775597088cSDongdong Hao #define LEAPRAID_WRSEQ_6TH_KEY_VALUE 0xD
1785597088cSDongdong Hao #define LEAPRAID_UNLOCK_RETRY_LIMIT 20
1795597088cSDongdong Hao #define LEAPRAID_UNLOCK_SLEEP_MS 100
1805597088cSDongdong Hao #define LEAPRAID_MSLEEP_NORMAL_MS 100
1815597088cSDongdong Hao #define LEAPRAID_MSLEEP_EXTRA_LONG_MS 500
1825597088cSDongdong Hao #define LEAPRAID_IO_POLL_DELAY_US 500
1835597088cSDongdong Hao
1845597088cSDongdong Hao /* Device/Volume configuration. */
1855597088cSDongdong Hao #define LEAPRAID_MAX_VOLUMES_DEFAULT 32
1865597088cSDongdong Hao #define LEAPRAID_MAX_DEV_HANDLE_DEFAULT 2048
1875597088cSDongdong Hao #define LEAPRAID_INVALID_DEV_HANDLE 0xFFFF
1885597088cSDongdong Hao
1895597088cSDongdong Hao /* Commands queue depth. */
1905597088cSDongdong Hao #define LEAPRAID_DEFAULT_CMD_QD_OFFSET 64
1915597088cSDongdong Hao #define LEAPRAID_REPLY_QD_ALIGNMENT 16
1925597088cSDongdong Hao /* Task ID offset. */
1935597088cSDongdong Hao #define LEAPRAID_TASKID_OFFSET_CTRL_CMD 1
1945597088cSDongdong Hao #define LEAPRAID_TASKID_OFFSET_CFG_OP_CMD 1
1955597088cSDongdong Hao #define LEAPRAID_TASKID_OFFSET_TRANSPORT_CMD 2
1965597088cSDongdong Hao #define LEAPRAID_TASKID_OFFSET_ENC_CMD 3
1975597088cSDongdong Hao #define LEAPRAID_TASKID_OFFSET_NOTIFY_EVENT_CMD 4
1985597088cSDongdong Hao
1995597088cSDongdong Hao /* Task ID offset for high-priority. */
2005597088cSDongdong Hao #define LEAPRAID_HP_TASKID_OFFSET_CTL_CMD 0
2015597088cSDongdong Hao #define LEAPRAID_HP_TASKID_OFFSET_TM_CMD 1
2025597088cSDongdong Hao
2035597088cSDongdong Hao /* Event/Boot configuration. */
2045597088cSDongdong Hao #define LEAPRAID_EVT_MASK_COUNT 4
2055597088cSDongdong Hao #define LEAPRAID_BOOT_DEV_SIZE 24
2065597088cSDongdong Hao
2075597088cSDongdong Hao /* Commands timeout. */
2085597088cSDongdong Hao #define LEAPRAID_UNIFIED_TIMEOUT 30
2095597088cSDongdong Hao #define LEAPRAID_CFG_OP_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2105597088cSDongdong Hao #define LEAPRAID_CTL_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2115597088cSDongdong Hao #define LEAPRAID_SCAN_DEV_CMD_TIMEOUT 300
2125597088cSDongdong Hao #define LEAPRAID_ENC_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2135597088cSDongdong Hao #define LEAPRAID_IO_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2145597088cSDongdong Hao #define LEAPRAID_NOTIFY_EVENT_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2155597088cSDongdong Hao #define LEAPRAID_TM_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2165597088cSDongdong Hao #define LEAPRAID_TRANSPORT_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT
2175597088cSDongdong Hao
2185597088cSDongdong Hao /* Host DMA cap. */
2195597088cSDongdong Hao #define DMA_32_BITS 32
2205597088cSDongdong Hao #define DMA_64_BITS 64
2215597088cSDongdong Hao #define LEAPRAID_DMA_ALIGN 16
2225597088cSDongdong Hao
2235597088cSDongdong Hao /* Values used to represent an invalid. */
2245597088cSDongdong Hao #define LEAPRAID_INVALID_INDEX -1
2255597088cSDongdong Hao #define LEAPRAID_INVALID_MSIX_VECTORS -1
2265597088cSDongdong Hao #define LEAPRAID_INVALID_INITIAL_VALUE -1
2275597088cSDongdong Hao #define LEAPRAID_OPERATION_FAILED -1
2285597088cSDongdong Hao
2295597088cSDongdong Hao /* Version shift and mask. */
2305597088cSDongdong Hao #define LEAPRAID_VER_MAJOR_SHIFT 24
2315597088cSDongdong Hao #define LEAPRAID_VER_MINOR_SHIFT 16
2325597088cSDongdong Hao #define LEAPRAID_VER_BUILD_SHIFT 8
2335597088cSDongdong Hao #define LEAPRAID_VER_MASK 0xFF
2345597088cSDongdong Hao
2355597088cSDongdong Hao /* Interrupt type. */
2365597088cSDongdong Hao #define LEAPRAID_INTERRUPT_MODE_MSIX 0
2375597088cSDongdong Hao #define LEAPRAID_INTERRUPT_MODE_MSI 1
2385597088cSDongdong Hao #define LEAPRAID_INTERRUPT_MODE_LEGACY 2
2395597088cSDongdong Hao
2405597088cSDongdong Hao /* SMP link reset. */
2415597088cSDongdong Hao #define SMP_PHY_CONTROL_LINK_RESET 0x01
2425597088cSDongdong Hao #define SMP_PHY_CONTROL_HARD_RESET 0x02
2435597088cSDongdong Hao #define SMP_PHY_CONTROL_DISABLE 0x03
2445597088cSDongdong Hao
2455597088cSDongdong Hao /**
2465597088cSDongdong Hao * struct leapraid_adapter_features - Adapter features/capabilities.
2475597088cSDongdong Hao *
2485597088cSDongdong Hao * @req_slot: Number of request slots supported by the adapter.
2495597088cSDongdong Hao * @hp_slot: Number of high-priority slots supported by the adapter.
2505597088cSDongdong Hao * @adapter_caps: Adapter capabilities.
2515597088cSDongdong Hao * @fw_version: Firmware version of the adapter.
2525597088cSDongdong Hao * @max_dev_handle: Maximum device handle supported by the adapter.
2535597088cSDongdong Hao * @min_dev_handle: Minimum device handle supported by the adapter.
2545597088cSDongdong Hao */
2555597088cSDongdong Hao struct leapraid_adapter_features {
2565597088cSDongdong Hao u16 req_slot;
2575597088cSDongdong Hao u16 hp_slot;
2585597088cSDongdong Hao u32 adapter_caps;
2595597088cSDongdong Hao u32 fw_version;
2605597088cSDongdong Hao u8 max_msix_vectors;
2615597088cSDongdong Hao u8 max_volumes;
2625597088cSDongdong Hao u16 max_dev_handle;
2635597088cSDongdong Hao u16 min_dev_handle;
2645597088cSDongdong Hao u16 msg_ver;
2655597088cSDongdong Hao u16 product_id;
2665597088cSDongdong Hao };
2675597088cSDongdong Hao
2685597088cSDongdong Hao /**
2695597088cSDongdong Hao * struct leapraid_adapter_attr - Adapter attributes and capabilities
2705597088cSDongdong Hao *
2715597088cSDongdong Hao * @id: Adapter identifier.
2725597088cSDongdong Hao * @raid_support: Indicates if RAID is supported.
2735597088cSDongdong Hao * @bios_version: Version of the adapter BIOS.
2745597088cSDongdong Hao * @enable_mp: Indicates if multipath (MP) support is enabled.
2755597088cSDongdong Hao * @wideport_max_queue_depth: Maximum queue depth for wide ports.
2765597088cSDongdong Hao * @narrowport_max_queue_depth: Maximum queue depth for narrow ports.
2775597088cSDongdong Hao * @sata_max_queue_depth: Maximum queue depth for SATA.
2785597088cSDongdong Hao * @raid_volume_max_queue_depth: Maximum queue depth for RAID volumes.
2795597088cSDongdong Hao * @features: Detailed features of the adapter.
2805597088cSDongdong Hao * @adapter_total_qd: Total queue depth available on the adapter.
2815597088cSDongdong Hao * @io_qd: Queue depth allocated for I/O operations.
2825597088cSDongdong Hao * @rep_msg_qd: Queue depth for reply messages.
2835597088cSDongdong Hao * @rep_desc_qd: Queue depth for reply descriptors.
2845597088cSDongdong Hao * @rep_desc_q_seg_cnt: Number of segments in a reply descriptor queue.
2855597088cSDongdong Hao * @rq_cnt: Number of request queues.
2865597088cSDongdong Hao * @task_desc_dma_size: Size of task descriptor DMA memory.
2875597088cSDongdong Hao * @use_32_dma_mask: Indicates if 32-bit DMA mask is used.
2885597088cSDongdong Hao * @name: Adapter name string.
2895597088cSDongdong Hao * @board_name: Board name retrieved from manufacturing page 0.
2905597088cSDongdong Hao */
2915597088cSDongdong Hao struct leapraid_adapter_attr {
2925597088cSDongdong Hao u8 id;
2935597088cSDongdong Hao u8 raid_support;
2945597088cSDongdong Hao u32 bios_version;
2955597088cSDongdong Hao u8 enable_mp;
2965597088cSDongdong Hao u32 wideport_max_queue_depth;
2975597088cSDongdong Hao u32 narrowport_max_queue_depth;
2985597088cSDongdong Hao u32 sata_max_queue_depth;
2995597088cSDongdong Hao u32 raid_volume_max_queue_depth;
3005597088cSDongdong Hao struct leapraid_adapter_features features;
3015597088cSDongdong Hao u32 adapter_total_qd;
3025597088cSDongdong Hao u32 io_qd;
3035597088cSDongdong Hao u32 rep_msg_qd;
3045597088cSDongdong Hao u32 rep_desc_qd;
3055597088cSDongdong Hao u32 rep_desc_q_seg_cnt;
3065597088cSDongdong Hao u16 rq_cnt;
3075597088cSDongdong Hao u32 task_desc_dma_size;
3085597088cSDongdong Hao u8 use_32_dma_mask;
3095597088cSDongdong Hao char name[LEAPRAID_NAME_LENGTH];
3105597088cSDongdong Hao char board_name[LEAPRAID_BOARD_NAME_LENGTH];
3115597088cSDongdong Hao };
3125597088cSDongdong Hao
3135597088cSDongdong Hao /**
3145597088cSDongdong Hao * struct leapraid_io_req_tracker - Track a SCSI I/O request for the adapter
3155597088cSDongdong Hao *
3165597088cSDongdong Hao * @taskid: Unique task ID for this I/O request.
3175597088cSDongdong Hao * @scmd: Pointer to the associated SCSI command.
3185597088cSDongdong Hao * @chain_list: List of chain frames associated with this request.
3195597088cSDongdong Hao * @msix_io: MSI-X vector assigned to this I/O request.
3205597088cSDongdong Hao * @chain: Pointer to the chain memory for this request.
3215597088cSDongdong Hao * @chain_dma: DMA address of the chain memory.
3225597088cSDongdong Hao */
3235597088cSDongdong Hao struct leapraid_io_req_tracker {
3245597088cSDongdong Hao u16 taskid;
3255597088cSDongdong Hao struct scsi_cmnd *scmd;
3265597088cSDongdong Hao struct list_head chain_list;
3275597088cSDongdong Hao u16 msix_io;
3285597088cSDongdong Hao void *chain;
3295597088cSDongdong Hao dma_addr_t chain_dma;
3305597088cSDongdong Hao };
3315597088cSDongdong Hao
3325597088cSDongdong Hao /**
3335597088cSDongdong Hao * struct leapraid_task_tracker - Tracks a task in the adapter
3345597088cSDongdong Hao *
3355597088cSDongdong Hao * @taskid: Unique task ID for this tracker.
3365597088cSDongdong Hao * @cb_idx: Callback index associated with this task.
3375597088cSDongdong Hao * @tracker_list: Linked list node to chain this tracker in lists.
3385597088cSDongdong Hao */
3395597088cSDongdong Hao struct leapraid_task_tracker {
3405597088cSDongdong Hao u16 taskid;
3415597088cSDongdong Hao u8 cb_idx;
3425597088cSDongdong Hao struct list_head tracker_list;
3435597088cSDongdong Hao };
3445597088cSDongdong Hao
3455597088cSDongdong Hao /**
3465597088cSDongdong Hao * struct leapraid_rep_desc_maint - Maintains reply descriptor memory
3475597088cSDongdong Hao *
3485597088cSDongdong Hao * @rep_desc: Pointer to the reply descriptor.
3495597088cSDongdong Hao * @rep_desc_dma: DMA address of the reply descriptor.
3505597088cSDongdong Hao */
3515597088cSDongdong Hao struct leapraid_rep_desc_maint {
3525597088cSDongdong Hao union leapraid_rep_desc_union *rep_desc;
3535597088cSDongdong Hao dma_addr_t rep_desc_dma;
3545597088cSDongdong Hao };
3555597088cSDongdong Hao
3565597088cSDongdong Hao /**
3575597088cSDongdong Hao * struct leapraid_rep_desc_seg_maint -
3585597088cSDongdong Hao * Maintains reply descriptor segment memory
3595597088cSDongdong Hao *
3605597088cSDongdong Hao * @rep_desc_seg: Pointer to the reply descriptor segment.
3615597088cSDongdong Hao * @rep_desc_seg_dma: DMA address of the reply descriptor segment.
3625597088cSDongdong Hao * @rep_desc_maint: Pointer to the main reply descriptor structure.
3635597088cSDongdong Hao */
3645597088cSDongdong Hao struct leapraid_rep_desc_seg_maint {
3655597088cSDongdong Hao void *rep_desc_seg;
3665597088cSDongdong Hao dma_addr_t rep_desc_seg_dma;
3675597088cSDongdong Hao struct leapraid_rep_desc_maint *rep_desc_maint;
3685597088cSDongdong Hao };
3695597088cSDongdong Hao
3705597088cSDongdong Hao /**
3715597088cSDongdong Hao * struct leapraid_mem_desc - Memory descriptor for LeapRAID adapter
3725597088cSDongdong Hao *
3735597088cSDongdong Hao * @task_desc: Pointer to task descriptor.
3745597088cSDongdong Hao * @task_desc_dma: DMA address of task descriptor.
3755597088cSDongdong Hao * @sg_chain_pool: DMA pool for SGL chain allocations.
3765597088cSDongdong Hao * @sg_chain_pool_size: Size of the sg_chain_pool.
3775597088cSDongdong Hao * @taskid_to_uniq_tag: Mapping from task ID to unique tag.
3785597088cSDongdong Hao * @sense_data: Buffer for SCSI sense data.
3795597088cSDongdong Hao * @sense_data_dma: DMA address of sense_data buffer.
3805597088cSDongdong Hao * @rep_msg: Buffer for reply message.
3815597088cSDongdong Hao * @rep_msg_dma: DMA address of reply message buffer.
3825597088cSDongdong Hao * @rep_msg_addr: Pointer to reply message address.
3835597088cSDongdong Hao * @rep_msg_addr_dma: DMA address of reply message address.
3845597088cSDongdong Hao * @rep_desc_seg_maint: Pointer to reply descriptor segment.
3855597088cSDongdong Hao * @rep_desc_q_arr: Pointer to reply descriptor queue array.
3865597088cSDongdong Hao * @rep_desc_q_arr_dma: DMA address of reply descriptor queue array.
3875597088cSDongdong Hao */
3885597088cSDongdong Hao struct leapraid_mem_desc {
3895597088cSDongdong Hao void *task_desc;
3905597088cSDongdong Hao dma_addr_t task_desc_dma;
3915597088cSDongdong Hao struct dma_pool *sg_chain_pool;
3925597088cSDongdong Hao u16 sg_chain_pool_size;
3935597088cSDongdong Hao u16 *taskid_to_uniq_tag;
3945597088cSDongdong Hao u8 *sense_data;
3955597088cSDongdong Hao dma_addr_t sense_data_dma;
3965597088cSDongdong Hao u8 *rep_msg;
3975597088cSDongdong Hao dma_addr_t rep_msg_dma;
3985597088cSDongdong Hao __le32 *rep_msg_addr;
3995597088cSDongdong Hao dma_addr_t rep_msg_addr_dma;
4005597088cSDongdong Hao struct leapraid_rep_desc_seg_maint *rep_desc_seg_maint;
4015597088cSDongdong Hao struct leapraid_rep_desc_q_arr *rep_desc_q_arr;
4025597088cSDongdong Hao dma_addr_t rep_desc_q_arr_dma;
4035597088cSDongdong Hao };
4045597088cSDongdong Hao
4055597088cSDongdong Hao /* internal cmd description */
4065597088cSDongdong Hao #define LEAPRAID_FIXED_INTER_CMDS 5
4075597088cSDongdong Hao #define LEAPRAID_FIXED_HP_CMDS 2
4085597088cSDongdong Hao
4095597088cSDongdong Hao #define LEAPRAID_CMD_NOT_USED 0x8000
4105597088cSDongdong Hao #define LEAPRAID_CMD_DONE 0x0001
4115597088cSDongdong Hao #define LEAPRAID_CMD_PENDING 0x0002
4125597088cSDongdong Hao #define LEAPRAID_CMD_REPLY_VALID 0x0004
4135597088cSDongdong Hao #define LEAPRAID_CMD_RESET 0x0008
4145597088cSDongdong Hao
4155597088cSDongdong Hao /**
4165597088cSDongdong Hao * enum LEAPRAID_CB_INDEX - Callback index for LeapRAID driver
4175597088cSDongdong Hao *
4185597088cSDongdong Hao * @LEAPRAID_SCAN_DEV_CB_IDX: Scan device callback index.
4195597088cSDongdong Hao * @LEAPRAID_CONFIG_CB_IDX: Configuration callback index.
4205597088cSDongdong Hao * @LEAPRAID_TRANSPORT_CB_IDX: Transport callback index.
4215597088cSDongdong Hao * @LEAPRAID_SAS_CTRL_CB_IDX: SAS controller callback index.
4225597088cSDongdong Hao * @LEAPRAID_ENC_CB_IDX: Encryption callback index.
4235597088cSDongdong Hao * @LEAPRAID_NOTIFY_EVENT_CB_IDX: Notify event callback index.
4245597088cSDongdong Hao * @LEAPRAID_CTL_CB_IDX: Control callback index.
4255597088cSDongdong Hao * @LEAPRAID_TM_CB_IDX: Task management callback index.
4265597088cSDongdong Hao */
4275597088cSDongdong Hao enum LEAPRAID_CB_INDEX {
4285597088cSDongdong Hao LEAPRAID_SCAN_DEV_CB_IDX = 0x1,
4295597088cSDongdong Hao LEAPRAID_CONFIG_CB_IDX = 0x2,
4305597088cSDongdong Hao LEAPRAID_TRANSPORT_CB_IDX = 0x3,
4315597088cSDongdong Hao LEAPRAID_SAS_CTRL_CB_IDX = 0x5,
4325597088cSDongdong Hao LEAPRAID_ENC_CB_IDX = 0x6,
4335597088cSDongdong Hao LEAPRAID_NOTIFY_EVENT_CB_IDX = 0x7,
4345597088cSDongdong Hao LEAPRAID_CTL_CB_IDX = 0x8,
4355597088cSDongdong Hao LEAPRAID_TM_CB_IDX = 0x9,
4365597088cSDongdong Hao LEAPRAID_NUM_CB_IDXS
4375597088cSDongdong Hao };
4385597088cSDongdong Hao
4395597088cSDongdong Hao /**
4405597088cSDongdong Hao * struct leapraid_default_reply - Default reply frame buffer
4415597088cSDongdong Hao * @pad: Raw reply data buffer returned by firmware.
4425597088cSDongdong Hao *
4435597088cSDongdong Hao * This structure represents a generic reply frame used by the firmware
4445597088cSDongdong Hao * when no specific reply format is required. The buffer size is defined
4455597088cSDongdong Hao * by LEAPRAID_REPLY_SIZE and stores the raw reply data.
4465597088cSDongdong Hao */
4475597088cSDongdong Hao struct leapraid_default_reply {
4485597088cSDongdong Hao u8 pad[LEAPRAID_REPLY_SIZE];
4495597088cSDongdong Hao };
4505597088cSDongdong Hao
4515597088cSDongdong Hao /**
4525597088cSDongdong Hao * struct leapraid_sense_buffer - SCSI sense data buffer
4535597088cSDongdong Hao * @pad: Buffer used to store sense data returned by a SCSI command.
4545597088cSDongdong Hao *
4555597088cSDongdong Hao * This buffer holds the sense data provided by a device.The size is
4565597088cSDongdong Hao * defined by SCSI_SENSE_BUFFERSIZE.
4575597088cSDongdong Hao */
4585597088cSDongdong Hao struct leapraid_sense_buffer {
4595597088cSDongdong Hao u8 pad[SCSI_SENSE_BUFFERSIZE];
4605597088cSDongdong Hao };
4615597088cSDongdong Hao
4625597088cSDongdong Hao /**
4635597088cSDongdong Hao * struct leapraid_driver_cmd - Driver command tracking structure
4645597088cSDongdong Hao *
4655597088cSDongdong Hao * @reply: Default reply structure returned by the adapter.
4665597088cSDongdong Hao * @done: Completion object used to signal command completion.
4675597088cSDongdong Hao * @status: Status code returned by the firmware.
4685597088cSDongdong Hao * @taskid: Unique task identifier for this command.
4695597088cSDongdong Hao * @hp_taskid: Task identifier for high-priority commands.
4705597088cSDongdong Hao * @inter_taskid: Task identifier for internal commands.
4715597088cSDongdong Hao * @cb_idx: Callback index used to identify completion context.
4725597088cSDongdong Hao * @async_scan_dev: True if this command is for asynchronous device scan.
4735597088cSDongdong Hao * @sense: Sense buffer holding error information from device.
4745597088cSDongdong Hao * @mutex: Mutex to protect access to this command structure.
4755597088cSDongdong Hao * @list: List node for linking driver commands into lists.
4765597088cSDongdong Hao */
4775597088cSDongdong Hao struct leapraid_driver_cmd {
4785597088cSDongdong Hao struct leapraid_default_reply reply;
4795597088cSDongdong Hao struct completion done;
4805597088cSDongdong Hao u16 status;
4815597088cSDongdong Hao u16 taskid;
4825597088cSDongdong Hao u16 hp_taskid;
4835597088cSDongdong Hao u16 inter_taskid;
4845597088cSDongdong Hao u8 cb_idx;
4855597088cSDongdong Hao u8 async_scan_dev;
4865597088cSDongdong Hao struct leapraid_sense_buffer sense;
4875597088cSDongdong Hao struct mutex mutex; /* Mutex for driver cmd */
4885597088cSDongdong Hao struct list_head list;
4895597088cSDongdong Hao };
4905597088cSDongdong Hao
4915597088cSDongdong Hao /**
4925597088cSDongdong Hao * struct leapraid_driver_cmds - Collection of driver command objects
4935597088cSDongdong Hao *
4945597088cSDongdong Hao * @special_cmd_list: List head for tracking special driver commands.
4955597088cSDongdong Hao * @scan_dev_cmd: Command used for asynchronous device scan operations.
4965597088cSDongdong Hao * @cfg_op_cmd: Command for configuration operations.
4975597088cSDongdong Hao * @transport_cmd: Command for transport-level operations.
4985597088cSDongdong Hao * @enc_cmd: Command for enclosure management operations.
4995597088cSDongdong Hao * @notify_event_cmd: Command for asynchronous event notification handling.
5005597088cSDongdong Hao * @ctl_cmd: Command for generic control or maintenance operations.
5015597088cSDongdong Hao * @tm_cmd: Task management command.
5025597088cSDongdong Hao */
5035597088cSDongdong Hao struct leapraid_driver_cmds {
5045597088cSDongdong Hao struct list_head special_cmd_list;
5055597088cSDongdong Hao struct leapraid_driver_cmd scan_dev_cmd;
5065597088cSDongdong Hao struct leapraid_driver_cmd cfg_op_cmd;
5075597088cSDongdong Hao struct leapraid_driver_cmd transport_cmd;
5085597088cSDongdong Hao struct leapraid_driver_cmd enc_cmd;
5095597088cSDongdong Hao struct leapraid_driver_cmd notify_event_cmd;
5105597088cSDongdong Hao struct leapraid_driver_cmd ctl_cmd;
5115597088cSDongdong Hao struct leapraid_driver_cmd tm_cmd;
5125597088cSDongdong Hao };
5135597088cSDongdong Hao
5145597088cSDongdong Hao /**
5155597088cSDongdong Hao * struct leapraid_dynamic_task_desc - Dynamic task descriptor
5165597088cSDongdong Hao *
5175597088cSDongdong Hao * @task_lock: Spinlock to protect concurrent access.
5185597088cSDongdong Hao * @hp_taskid: Current high-priority task ID.
5195597088cSDongdong Hao * @hp_cmd_qd: Fixed command queue depth for high-priority tasks.
5205597088cSDongdong Hao * @inter_taskid: Current internal task ID.
5215597088cSDongdong Hao * @inter_cmd_qd: Fixed command queue depth for internal tasks.
5225597088cSDongdong Hao */
5235597088cSDongdong Hao struct leapraid_dynamic_task_desc {
5245597088cSDongdong Hao spinlock_t task_lock; /* protects dynamic task */
5255597088cSDongdong Hao u16 hp_taskid;
5265597088cSDongdong Hao u16 hp_cmd_qd;
5275597088cSDongdong Hao u16 inter_taskid;
5285597088cSDongdong Hao u16 inter_cmd_qd;
5295597088cSDongdong Hao };
5305597088cSDongdong Hao
5315597088cSDongdong Hao /**
5325597088cSDongdong Hao * struct leapraid_fw_evt_work - Firmware event work structure
5335597088cSDongdong Hao *
5345597088cSDongdong Hao * @list: Linked list node for queuing the work.
5355597088cSDongdong Hao * @adapter: Pointer to the associated LeapRAID adapter.
5365597088cSDongdong Hao * @work: Work structure used by the kernel workqueue.
5375597088cSDongdong Hao * @refcnt: Reference counter for managing the lifetime of this work.
5385597088cSDongdong Hao * @evt_data: Pointer to firmware event data.
5395597088cSDongdong Hao * @dev_handle: Device handle associated with the event.
5405597088cSDongdong Hao * @evt_type: Type of firmware event.
5415597088cSDongdong Hao * @ignore: Flag indicating whether the event should be ignored.
5425597088cSDongdong Hao */
5435597088cSDongdong Hao struct leapraid_fw_evt_work {
5445597088cSDongdong Hao struct list_head list;
5455597088cSDongdong Hao struct leapraid_adapter *adapter;
5465597088cSDongdong Hao struct work_struct work;
5475597088cSDongdong Hao struct kref refcnt;
5485597088cSDongdong Hao void *evt_data;
5495597088cSDongdong Hao u16 dev_handle;
5505597088cSDongdong Hao u16 evt_type;
5515597088cSDongdong Hao u8 ignore;
5525597088cSDongdong Hao };
5535597088cSDongdong Hao
5545597088cSDongdong Hao /**
5555597088cSDongdong Hao * struct leapraid_fw_evt_struct - Firmware event handling structure
5565597088cSDongdong Hao *
5575597088cSDongdong Hao * @fw_evt_name: Name of the firmware event.
5585597088cSDongdong Hao * @fw_evt_thread: Workqueue used for processing firmware events.
5595597088cSDongdong Hao * @fw_evt_lock: Spinlock protecting access to the firmware event list.
5605597088cSDongdong Hao * @fw_evt_list: Linked list of pending firmware events.
5615597088cSDongdong Hao * @cur_evt: Pointer to the currently processing firmware event.
5625597088cSDongdong Hao * @cur_evt_task: Task currently executing @cur_evt work.
5635597088cSDongdong Hao * @fw_evt_cleanup: Flag indicating whether cleanup of events is in progress.
5645597088cSDongdong Hao * @leapraid_evt_masks: Array of event masks for filtering firmware events.
5655597088cSDongdong Hao */
5665597088cSDongdong Hao struct leapraid_fw_evt_struct {
5675597088cSDongdong Hao u32 leapraid_evt_masks[4];
5685597088cSDongdong Hao char fw_evt_name[48];
5695597088cSDongdong Hao struct workqueue_struct *fw_evt_thread;
5705597088cSDongdong Hao spinlock_t fw_evt_lock; /* protects firmware event */
5715597088cSDongdong Hao struct list_head fw_evt_list;
5725597088cSDongdong Hao struct leapraid_fw_evt_work *cur_evt;
5735597088cSDongdong Hao struct task_struct *cur_evt_task;
5745597088cSDongdong Hao u8 fw_evt_cleanup;
5755597088cSDongdong Hao };
5765597088cSDongdong Hao
5775597088cSDongdong Hao /**
5785597088cSDongdong Hao * struct leapraid_rq - Represents a LeapRAID request queue
5795597088cSDongdong Hao *
5805597088cSDongdong Hao * @adapter: Pointer to the associated LeapRAID adapter.
5815597088cSDongdong Hao * @msix_idx: MSI-X vector index used by this queue.
5825597088cSDongdong Hao * @rep_post_host_idx: Index of the last processed reply descriptor.
5835597088cSDongdong Hao * @rep_desc: Pointer to the reply descriptor associated with this queue.
5845597088cSDongdong Hao * @name: Name of the request queue.
5855597088cSDongdong Hao * @busy: Atomic counter indicating if the queue is busy.
5865597088cSDongdong Hao */
5875597088cSDongdong Hao struct leapraid_rq {
5885597088cSDongdong Hao struct leapraid_adapter *adapter;
5895597088cSDongdong Hao u8 msix_idx;
5905597088cSDongdong Hao u32 rep_post_host_idx;
5915597088cSDongdong Hao union leapraid_rep_desc_union *rep_desc;
5925597088cSDongdong Hao char name[LEAPRAID_NAME_LENGTH];
5935597088cSDongdong Hao atomic_t busy;
5945597088cSDongdong Hao };
5955597088cSDongdong Hao
5965597088cSDongdong Hao /**
5975597088cSDongdong Hao * struct leapraid_int_rq - Internal request queue for a CPU
5985597088cSDongdong Hao *
5995597088cSDongdong Hao * @affinity_hint: CPU affinity mask for the queue.
6005597088cSDongdong Hao * @rq: Underlying LeapRAID request queue structure.
6015597088cSDongdong Hao */
6025597088cSDongdong Hao struct leapraid_int_rq {
6035597088cSDongdong Hao cpumask_var_t affinity_hint;
6045597088cSDongdong Hao struct leapraid_rq rq;
6055597088cSDongdong Hao };
6065597088cSDongdong Hao
6075597088cSDongdong Hao /**
6085597088cSDongdong Hao * struct leapraid_blk_mq_poll_rq - Polling request for LeapRAID blk-mq
6095597088cSDongdong Hao *
6105597088cSDongdong Hao * @busy: Atomic flag indicating request is being processed.
6115597088cSDongdong Hao * @pause: Atomic flag to temporarily suspend polling.
6125597088cSDongdong Hao * @rq: The underlying LeapRAID request structure.
6135597088cSDongdong Hao */
6145597088cSDongdong Hao struct leapraid_blk_mq_poll_rq {
6155597088cSDongdong Hao atomic_t busy;
6165597088cSDongdong Hao atomic_t pause;
6175597088cSDongdong Hao struct leapraid_rq rq;
6185597088cSDongdong Hao };
6195597088cSDongdong Hao
6205597088cSDongdong Hao /**
6215597088cSDongdong Hao * struct leapraid_notification_desc - Notification descriptor for LeapRAID
6225597088cSDongdong Hao *
6235597088cSDongdong Hao * @iopoll_qdex: Index of the I/O polling queue.
6245597088cSDongdong Hao * @iopoll_qcnt: Count of I/O polling queues.
6255597088cSDongdong Hao * @msix_enable: Flag indicating MSI-X is enabled.
6265597088cSDongdong Hao * @irq_vectors_allocated: Flag indicating PCI IRQ vectors are allocated.
6275597088cSDongdong Hao * @irq_mode: Actual interrupt mode used for allocated PCI IRQ vectors.
6285597088cSDongdong Hao * @msix_cpu_map: CPU-ID indexed MSI-X queue map.
6295597088cSDongdong Hao * @msix_cpu_map_sz: Number of CPU-ID slots allocated in @msix_cpu_map.
6305597088cSDongdong Hao * @int_rqs: Array of interrupt request queues.
6315597088cSDongdong Hao * @int_rqs_allocated: Count of allocated interrupt request queues.
6325597088cSDongdong Hao * @blk_mq_poll_rqs: Array of blk-mq polling requests.
6335597088cSDongdong Hao */
6345597088cSDongdong Hao struct leapraid_notification_desc {
6355597088cSDongdong Hao u32 iopoll_qdex;
6365597088cSDongdong Hao u32 iopoll_qcnt;
6375597088cSDongdong Hao u8 msix_enable;
6385597088cSDongdong Hao u8 irq_vectors_allocated;
6395597088cSDongdong Hao u8 irq_mode;
6405597088cSDongdong Hao u8 *msix_cpu_map;
6415597088cSDongdong Hao u32 msix_cpu_map_sz;
6425597088cSDongdong Hao struct leapraid_int_rq *int_rqs;
6435597088cSDongdong Hao u32 int_rqs_allocated;
6445597088cSDongdong Hao struct leapraid_blk_mq_poll_rq *blk_mq_poll_rqs;
6455597088cSDongdong Hao };
6465597088cSDongdong Hao
6475597088cSDongdong Hao /**
6485597088cSDongdong Hao * struct leapraid_overheat_desc - Overheat descriptor for LeapRAID
6495597088cSDongdong Hao *
6505597088cSDongdong Hao * @fault_overheat_wq: Workqueue for adapter thermal overheat operations.
6515597088cSDongdong Hao * @fault_overheat_work: Work structure for thermal overheat.
6525597088cSDongdong Hao * @thermal_alert: Flag indicating if adapter thermal alert is active.
6535597088cSDongdong Hao * @fault_overheat_wq_name: Name of the fault overheat workqueue.
6545597088cSDongdong Hao */
6555597088cSDongdong Hao struct leapraid_overheat_desc {
6565597088cSDongdong Hao struct workqueue_struct *fault_overheat_wq;
6575597088cSDongdong Hao struct work_struct fault_overheat_work;
6585597088cSDongdong Hao atomic_t thermal_alert;
6595597088cSDongdong Hao char fault_overheat_wq_name[48];
6605597088cSDongdong Hao };
6615597088cSDongdong Hao
6625597088cSDongdong Hao /**
6635597088cSDongdong Hao * struct leapraid_reset_desc - Reset descriptor for LeapRAID
6645597088cSDongdong Hao *
6655597088cSDongdong Hao * @fault_reset_wq: Workqueue for fault reset operations.
6665597088cSDongdong Hao * @fault_reset_work: Delayed work structure for fault reset.
6675597088cSDongdong Hao * @fault_reset_wq_name: Name of the fault reset workqueue.
6685597088cSDongdong Hao * @host_diag_mutex: Mutex for host diagnostic operations.
6695597088cSDongdong Hao * @adapter_reset_lock: Spinlock for adapter reset operations.
6705597088cSDongdong Hao * @adapter_reset_mutex: Mutex for adapter reset operations.
6715597088cSDongdong Hao * @adapter_link_resetting: Flag indicating if adapter link is resetting.
6725597088cSDongdong Hao * @adapter_reset_results: Results of the adapter reset operation.
6735597088cSDongdong Hao * @pending_io_cnt: Count of pending I/O operations.
6745597088cSDongdong Hao * @reset_wait_queue: Wait queue for reset operations.
6755597088cSDongdong Hao * @reset_cnt: Counter for reset operations.
6765597088cSDongdong Hao */
6775597088cSDongdong Hao struct leapraid_reset_desc {
6785597088cSDongdong Hao struct workqueue_struct *fault_reset_wq;
6795597088cSDongdong Hao struct delayed_work fault_reset_work;
6805597088cSDongdong Hao char fault_reset_wq_name[48];
6815597088cSDongdong Hao struct mutex host_diag_mutex; /* Mutex for operations. */
6825597088cSDongdong Hao spinlock_t adapter_reset_lock; /* Protects adapter reset state. */
6835597088cSDongdong Hao struct mutex adapter_reset_mutex; /* Serializes adapter reset. */
6845597088cSDongdong Hao u8 adapter_link_resetting;
6855597088cSDongdong Hao int adapter_reset_results;
6865597088cSDongdong Hao int pending_io_cnt;
6875597088cSDongdong Hao wait_queue_head_t reset_wait_queue;
6885597088cSDongdong Hao u32 reset_cnt;
6895597088cSDongdong Hao };
6905597088cSDongdong Hao
6915597088cSDongdong Hao /**
6925597088cSDongdong Hao * struct leapraid_scan_dev_desc - Scan device descriptor for LeapRAID
6935597088cSDongdong Hao *
6945597088cSDongdong Hao * @wait_scan_dev_done: Flag indicating if scan device operation is done.
6955597088cSDongdong Hao * @driver_loading: Flag indicating if driver is loading.
6965597088cSDongdong Hao * @first_scan_dev_fired: Flag indicating if first scan device operation fired.
6975597088cSDongdong Hao * @scan_dev_failed: Flag indicating if scan device operation failed.
6985597088cSDongdong Hao * @scan_start: Flag indicating if scan operation started.
6995597088cSDongdong Hao * @scan_start_failed: Count of failed scan start operations.
7005597088cSDongdong Hao */
7015597088cSDongdong Hao struct leapraid_scan_dev_desc {
7025597088cSDongdong Hao u8 wait_scan_dev_done;
7035597088cSDongdong Hao u8 driver_loading;
7045597088cSDongdong Hao wait_queue_head_t wait_driver_loading;
7055597088cSDongdong Hao u8 first_scan_dev_fired;
7065597088cSDongdong Hao u8 scan_dev_failed;
7075597088cSDongdong Hao u8 scan_start;
7085597088cSDongdong Hao u16 scan_start_failed;
7095597088cSDongdong Hao };
7105597088cSDongdong Hao
7115597088cSDongdong Hao /**
7125597088cSDongdong Hao * struct leapraid_access_ctrl - Access control structure for LeapRAID
7135597088cSDongdong Hao *
7145597088cSDongdong Hao * @pci_access_lock: Mutex for PCI access control.
7155597088cSDongdong Hao * @shost_recovering: Flag indicating if host is recovering.
7165597088cSDongdong Hao * @shost_recover_async: Flag indicating if host is recovering
7175597088cSDongdong Hao * and the 0xFFFF event.
7185597088cSDongdong Hao * @shost_recover_wq: Wait queue for threads waiting on shost_recover_async.
7195597088cSDongdong Hao * @host_removing: Flag indicating if host is being removed.
7205597088cSDongdong Hao * @pcie_recovering: Flag indicating if PCIe is recovering.
7215597088cSDongdong Hao */
7225597088cSDongdong Hao struct leapraid_access_ctrl {
7235597088cSDongdong Hao struct mutex pci_access_lock; /* serializes PCI register access. */
7245597088cSDongdong Hao u8 shost_recovering;
7255597088cSDongdong Hao wait_queue_head_t recovery_waitq;
7265597088cSDongdong Hao u8 shost_recover_async;
7275597088cSDongdong Hao wait_queue_head_t shost_recover_wq;
7285597088cSDongdong Hao u8 host_removing;
7295597088cSDongdong Hao u8 pcie_recovering;
7305597088cSDongdong Hao };
7315597088cSDongdong Hao
7325597088cSDongdong Hao /**
7335597088cSDongdong Hao * struct leapraid_fw_log_desc - Firmware log descriptor for LeapRAID
7345597088cSDongdong Hao *
7355597088cSDongdong Hao * @fw_log_buffer: Buffer for firmware log data.
7365597088cSDongdong Hao * @fw_log_buffer_dma: DMA address of the firmware log buffer.
7375597088cSDongdong Hao * @fw_log_wq_name: Name of the firmware log workqueue.
7385597088cSDongdong Hao * @fw_log_wq: Workqueue for firmware log operations.
7395597088cSDongdong Hao * @fw_log_work: Delayed work structure for firmware log.
7405597088cSDongdong Hao * @open_pcie_trace: Flag indicating if PCIe tracing is open.
7415597088cSDongdong Hao * @fw_log_init_flag: Flag indicating if firmware log is initialized.
7425597088cSDongdong Hao * @mmap_refcnt: Number of active user VMAs on fw_log_buffer.
7435597088cSDongdong Hao * @mmap_waitq: Waitqueue for fw_log_buffer VMA teardown.
7445597088cSDongdong Hao */
7455597088cSDongdong Hao struct leapraid_fw_log_desc {
7465597088cSDongdong Hao u8 *fw_log_buffer;
7475597088cSDongdong Hao dma_addr_t fw_log_buffer_dma;
7485597088cSDongdong Hao char fw_log_wq_name[48];
7495597088cSDongdong Hao struct workqueue_struct *fw_log_wq;
7505597088cSDongdong Hao struct delayed_work fw_log_work;
7515597088cSDongdong Hao int open_pcie_trace;
7525597088cSDongdong Hao int fw_log_init_flag;
7535597088cSDongdong Hao atomic_t mmap_refcnt;
7545597088cSDongdong Hao wait_queue_head_t mmap_waitq;
7555597088cSDongdong Hao };
7565597088cSDongdong Hao
7575597088cSDongdong Hao #define LEAPRAID_CARD_PORT_FLG_DIRTY 0x01
7585597088cSDongdong Hao #define LEAPRAID_CARD_PORT_FLG_NEW 0x02
7595597088cSDongdong Hao #define LEAPRAID_DISABLE_MP_PORT_ID 0xFF
7605597088cSDongdong Hao /**
7615597088cSDongdong Hao * struct leapraid_card_port - Card port structure for LeapRAID
7625597088cSDongdong Hao *
7635597088cSDongdong Hao * @list: List head for card port.
7645597088cSDongdong Hao * @vphys_list: List head for virtual PHY list.
7655597088cSDongdong Hao * @port_id: Port ID.
7665597088cSDongdong Hao * @sas_address: SAS address.
7675597088cSDongdong Hao * @phy_mask: Mask of PHY.
7685597088cSDongdong Hao * @vphys_mask: Mask of virtual PHY.
7695597088cSDongdong Hao * @flg: Flags for the port.
7705597088cSDongdong Hao */
7715597088cSDongdong Hao struct leapraid_card_port {
7725597088cSDongdong Hao struct list_head list;
7735597088cSDongdong Hao struct list_head vphys_list;
7745597088cSDongdong Hao u8 port_id;
7755597088cSDongdong Hao u64 sas_address;
7765597088cSDongdong Hao u32 phy_mask;
7775597088cSDongdong Hao u32 vphys_mask;
7785597088cSDongdong Hao u8 flg;
7795597088cSDongdong Hao };
7805597088cSDongdong Hao
7815597088cSDongdong Hao /**
7825597088cSDongdong Hao * struct leapraid_card_phy - Card PHY structure for LeapRAID
7835597088cSDongdong Hao *
7845597088cSDongdong Hao * @port_siblings: List head for port siblings.
7855597088cSDongdong Hao * @card_port: Pointer to the card port.
7865597088cSDongdong Hao * @identify: SAS identify structure.
7875597088cSDongdong Hao * @remote_identify: Remote SAS identify structure.
7885597088cSDongdong Hao * @phy: SAS PHY structure.
7895597088cSDongdong Hao * @phy_id: PHY ID.
7905597088cSDongdong Hao * @hdl: Handle for the port.
7915597088cSDongdong Hao * @attached_hdl: Handle for the attached port.
7925597088cSDongdong Hao * @phy_is_assigned: Flag indicating if PHY is assigned.
7935597088cSDongdong Hao * @vphy: Flag indicating if virtual PHY.
7945597088cSDongdong Hao */
7955597088cSDongdong Hao struct leapraid_card_phy {
7965597088cSDongdong Hao struct list_head port_siblings;
7975597088cSDongdong Hao struct leapraid_card_port *card_port;
7985597088cSDongdong Hao struct sas_identify identify;
7995597088cSDongdong Hao struct sas_identify remote_identify;
8005597088cSDongdong Hao struct sas_phy *phy;
8015597088cSDongdong Hao u8 phy_id;
8025597088cSDongdong Hao u16 hdl;
8035597088cSDongdong Hao u16 attached_hdl;
8045597088cSDongdong Hao u8 phy_is_assigned;
8055597088cSDongdong Hao u8 vphy;
8065597088cSDongdong Hao };
8075597088cSDongdong Hao
8085597088cSDongdong Hao /**
8095597088cSDongdong Hao * struct leapraid_topo_node - SAS topology node for LeapRAID
8105597088cSDongdong Hao *
8115597088cSDongdong Hao * @list: List head for linking nodes.
8125597088cSDongdong Hao * @sas_port_list: List of SAS ports.
8135597088cSDongdong Hao * @card_port: Associated card port.
8145597088cSDongdong Hao * @card_phy: Associated card PHY.
8155597088cSDongdong Hao * @rphy: SAS remote PHY device.
8165597088cSDongdong Hao * @parent_dev: Parent device pointer.
8175597088cSDongdong Hao * @sas_address: SAS address of this node.
8185597088cSDongdong Hao * @sas_address_parent: Parent node's SAS address.
8195597088cSDongdong Hao * @phys_num: Number of physical links.
8205597088cSDongdong Hao * @hdl: Handle identifier.
8215597088cSDongdong Hao * @enc_hdl: Enclosure handle.
8225597088cSDongdong Hao * @enc_lid: Enclosure logical identifier.
8235597088cSDongdong Hao * @resp: Response status flag.
8245597088cSDongdong Hao */
8255597088cSDongdong Hao struct leapraid_topo_node {
8265597088cSDongdong Hao struct list_head list;
8275597088cSDongdong Hao struct list_head sas_port_list;
8285597088cSDongdong Hao struct leapraid_card_port *card_port;
8295597088cSDongdong Hao struct leapraid_card_phy *card_phy;
8305597088cSDongdong Hao struct sas_rphy *rphy;
8315597088cSDongdong Hao struct device *parent_dev;
8325597088cSDongdong Hao u64 sas_address;
8335597088cSDongdong Hao u64 sas_address_parent;
8345597088cSDongdong Hao u8 phys_num;
8355597088cSDongdong Hao u16 hdl;
8365597088cSDongdong Hao u16 enc_hdl;
8375597088cSDongdong Hao u64 enc_lid;
8385597088cSDongdong Hao u8 resp;
8395597088cSDongdong Hao };
8405597088cSDongdong Hao
8415597088cSDongdong Hao /**
8425597088cSDongdong Hao * struct leapraid_dev_topo - LeapRAID device topology management structure
8435597088cSDongdong Hao *
8445597088cSDongdong Hao * @topo_node_lock: Spinlock for protecting topology node operations.
8455597088cSDongdong Hao * @sas_dev_lock: Spinlock for SAS device list access.
8465597088cSDongdong Hao * @raid_volume_lock: Spinlock for RAID volume list access.
8475597088cSDongdong Hao * @enc_lock: Spinlock for enclosure device list access.
8485597088cSDongdong Hao * @sas_id: SAS domain identifier.
8495597088cSDongdong Hao * @card: Main card topology node.
8505597088cSDongdong Hao * @exp_list: List of expander devices.
8515597088cSDongdong Hao * @enc_list: List of enclosure devices.
8525597088cSDongdong Hao * @sas_dev_list: List of SAS devices.
8535597088cSDongdong Hao * @sas_dev_init_list: List of SAS devices being initialized.
8545597088cSDongdong Hao * @raid_volume_list: List of RAID volumes.
8555597088cSDongdong Hao * @card_port_list: List of card ports.
8565597088cSDongdong Hao * @pd_hdls: Array of physical disk handles.
8575597088cSDongdong Hao * @blocking_hdls: Array of blocking handles.
8585597088cSDongdong Hao */
8595597088cSDongdong Hao struct leapraid_dev_topo {
8605597088cSDongdong Hao spinlock_t topo_node_lock; /* Protects topology node. */
8615597088cSDongdong Hao spinlock_t sas_dev_lock; /* Protects SAS device list access. */
8625597088cSDongdong Hao spinlock_t raid_volume_lock; /* Protects RAID volume list access. */
8635597088cSDongdong Hao spinlock_t enc_lock; /* Protects enclosure device list access. */
8645597088cSDongdong Hao int sas_id;
8655597088cSDongdong Hao struct leapraid_topo_node card;
8665597088cSDongdong Hao struct list_head exp_list;
8675597088cSDongdong Hao struct list_head enc_list;
8685597088cSDongdong Hao struct list_head sas_dev_list;
8695597088cSDongdong Hao struct list_head sas_dev_init_list;
8705597088cSDongdong Hao struct list_head raid_volume_list;
8715597088cSDongdong Hao struct list_head card_port_list;
8725597088cSDongdong Hao u16 pd_hdls_sz;
8735597088cSDongdong Hao unsigned long *pd_hdls;
8745597088cSDongdong Hao unsigned long *blocking_hdls;
8755597088cSDongdong Hao };
8765597088cSDongdong Hao
8775597088cSDongdong Hao /**
8785597088cSDongdong Hao * struct leapraid_boot_dev - Boot device structure for LeapRAID
8795597088cSDongdong Hao *
8805597088cSDongdong Hao * @dev: Device pointer.
8815597088cSDongdong Hao * @chnl: Channel number.
8825597088cSDongdong Hao * @form: Form factor.
8835597088cSDongdong Hao * @pg_dev: Config page device content.
8845597088cSDongdong Hao */
8855597088cSDongdong Hao struct leapraid_boot_dev {
8865597088cSDongdong Hao void *dev;
8875597088cSDongdong Hao u8 chnl;
8885597088cSDongdong Hao u8 form;
8895597088cSDongdong Hao u8 pg_dev[24];
8905597088cSDongdong Hao };
8915597088cSDongdong Hao
8925597088cSDongdong Hao /**
8935597088cSDongdong Hao * struct leapraid_boot_devs - Boot device management structure
8945597088cSDongdong Hao *
8955597088cSDongdong Hao * @lock: Spinlock protecting boot device cache access.
8965597088cSDongdong Hao * @requested_boot_dev: Requested primary boot device.
8975597088cSDongdong Hao * @requested_alt_boot_dev: Requested alternate boot device.
8985597088cSDongdong Hao * @current_boot_dev: Currently active boot device.
8995597088cSDongdong Hao */
9005597088cSDongdong Hao struct leapraid_boot_devs {
9015597088cSDongdong Hao spinlock_t lock; /* protects boot dev */
9025597088cSDongdong Hao struct leapraid_boot_dev requested_boot_dev;
9035597088cSDongdong Hao struct leapraid_boot_dev requested_alt_boot_dev;
9045597088cSDongdong Hao struct leapraid_boot_dev current_boot_dev;
9055597088cSDongdong Hao };
9065597088cSDongdong Hao
9075597088cSDongdong Hao /**
9085597088cSDongdong Hao * struct leapraid_adapter - Main LeapRAID adapter structure
9095597088cSDongdong Hao *
9105597088cSDongdong Hao * @list: List head for adapter management.
9115597088cSDongdong Hao * @shost: SCSI host structure.
9125597088cSDongdong Hao * @pdev: PCI device structure.
9135597088cSDongdong Hao * @iomem_base: I/O memory mapped base address.
9145597088cSDongdong Hao * @rep_msg_host_idx: Host index for reply messages.
9155597088cSDongdong Hao * @mask_int: Interrupt masking flag.
9165597088cSDongdong Hao * @adapter_attr: Adapter attributes.
9175597088cSDongdong Hao * @mem_desc: Memory descriptor.
9185597088cSDongdong Hao * @driver_cmds: Driver commands.
9195597088cSDongdong Hao * @dynamic_task_desc: Dynamic task descriptor.
9205597088cSDongdong Hao * @fw_evt_s: Firmware event structure.
9215597088cSDongdong Hao * @notification_desc: Notification descriptor.
9225597088cSDongdong Hao * @reset_desc: Reset descriptor.
9235597088cSDongdong Hao * @scan_dev_desc: Device scan descriptor.
9245597088cSDongdong Hao * @access_ctrl: Access control.
9255597088cSDongdong Hao * @fw_log_desc: Firmware log descriptor.
9265597088cSDongdong Hao * @dev_topo: Device topology.
9275597088cSDongdong Hao * @boot_devs: Boot devices.
9285597088cSDongdong Hao * @overheat_desc: Overheat processing descriptor.
9295597088cSDongdong Hao */
9305597088cSDongdong Hao struct leapraid_adapter {
9315597088cSDongdong Hao struct list_head list;
9325597088cSDongdong Hao struct Scsi_Host *shost;
9335597088cSDongdong Hao struct pci_dev *pdev;
9345597088cSDongdong Hao struct leapraid_reg_base __iomem *iomem_base;
9355597088cSDongdong Hao u32 rep_msg_host_idx;
9365597088cSDongdong Hao u8 mask_int;
9375597088cSDongdong Hao
9385597088cSDongdong Hao struct leapraid_adapter_attr adapter_attr;
9395597088cSDongdong Hao struct leapraid_mem_desc mem_desc;
9405597088cSDongdong Hao struct leapraid_driver_cmds driver_cmds;
9415597088cSDongdong Hao struct leapraid_dynamic_task_desc dynamic_task_desc;
9425597088cSDongdong Hao struct leapraid_fw_evt_struct fw_evt_s;
9435597088cSDongdong Hao struct leapraid_notification_desc notification_desc;
9445597088cSDongdong Hao struct leapraid_reset_desc reset_desc;
9455597088cSDongdong Hao struct leapraid_scan_dev_desc scan_dev_desc;
9465597088cSDongdong Hao struct leapraid_access_ctrl access_ctrl;
9475597088cSDongdong Hao struct leapraid_fw_log_desc fw_log_desc;
9485597088cSDongdong Hao struct leapraid_dev_topo dev_topo;
9495597088cSDongdong Hao struct leapraid_boot_devs boot_devs;
9505597088cSDongdong Hao struct leapraid_overheat_desc overheat_desc;
9515597088cSDongdong Hao };
9525597088cSDongdong Hao
9535597088cSDongdong Hao union cfg_param_1 {
9545597088cSDongdong Hao u32 form;
9555597088cSDongdong Hao u32 size;
9565597088cSDongdong Hao u32 phy_number;
9575597088cSDongdong Hao };
9585597088cSDongdong Hao
9595597088cSDongdong Hao union cfg_param_2 {
9605597088cSDongdong Hao u32 handle;
9615597088cSDongdong Hao u32 form_specific;
9625597088cSDongdong Hao };
9635597088cSDongdong Hao
9645597088cSDongdong Hao enum config_page_action {
9655597088cSDongdong Hao GET_BIOS_PG2,
9665597088cSDongdong Hao GET_BIOS_PG3,
9675597088cSDongdong Hao GET_MANUFACTURING_PG0,
9685597088cSDongdong Hao GET_SAS_DEVICE_PG0,
9695597088cSDongdong Hao GET_SAS_IOUNIT_PG0,
9705597088cSDongdong Hao GET_SAS_IOUNIT_PG1,
9715597088cSDongdong Hao GET_SAS_EXPANDER_PG0,
9725597088cSDongdong Hao GET_SAS_EXPANDER_PG1,
9735597088cSDongdong Hao GET_SAS_ENCLOSURE_PG0,
9745597088cSDongdong Hao GET_PHY_PG0,
9755597088cSDongdong Hao GET_RAID_VOLUME_PG0,
9765597088cSDongdong Hao GET_RAID_VOLUME_PG1,
9775597088cSDongdong Hao GET_PHY_DISK_PG0,
9785597088cSDongdong Hao };
9795597088cSDongdong Hao
9805597088cSDongdong Hao /**
9815597088cSDongdong Hao * struct leapraid_enc_node - Enclosure node structure
9825597088cSDongdong Hao *
9835597088cSDongdong Hao * @list: List head for enclosure management.
9845597088cSDongdong Hao * @pg0: Enclosure page 0 data.
9855597088cSDongdong Hao */
9865597088cSDongdong Hao struct leapraid_enc_node {
9875597088cSDongdong Hao struct list_head list;
9885597088cSDongdong Hao struct leapraid_enc_p0 pg0;
9895597088cSDongdong Hao };
9905597088cSDongdong Hao
9915597088cSDongdong Hao /**
9925597088cSDongdong Hao * struct leapraid_raid_volume - RAID volume structure
9935597088cSDongdong Hao *
9945597088cSDongdong Hao * @list: List head for volume management.
9955597088cSDongdong Hao * @refcnt: Reference count.
9965597088cSDongdong Hao * @starget: SCSI target structure.
9975597088cSDongdong Hao * @sdev: SCSI device structure.
9985597088cSDongdong Hao * @id: Volume ID.
9995597088cSDongdong Hao * @channel: SCSI channel.
10005597088cSDongdong Hao * @wwid: World wide Identifier.
10015597088cSDongdong Hao * @hdl: Volume handle.
10025597088cSDongdong Hao * @vol_type: Volume type.
10035597088cSDongdong Hao * @pd_num: Number of physical disks.
10045597088cSDongdong Hao * @resp: Response status.
10055597088cSDongdong Hao * @dev_info: Device information.
10065597088cSDongdong Hao */
10075597088cSDongdong Hao struct leapraid_raid_volume {
10085597088cSDongdong Hao struct list_head list;
10095597088cSDongdong Hao struct kref refcnt;
10105597088cSDongdong Hao struct scsi_target *starget;
10115597088cSDongdong Hao struct scsi_device *sdev;
10125597088cSDongdong Hao unsigned int id;
10135597088cSDongdong Hao unsigned int channel;
10145597088cSDongdong Hao u64 wwid;
10155597088cSDongdong Hao u16 hdl;
10165597088cSDongdong Hao u8 vol_type;
10175597088cSDongdong Hao u8 pd_num;
10185597088cSDongdong Hao u8 resp;
10195597088cSDongdong Hao u32 dev_info;
10205597088cSDongdong Hao };
10215597088cSDongdong Hao
leapraid_raid_volume_free(struct kref * ref)10225597088cSDongdong Hao static inline void leapraid_raid_volume_free(struct kref *ref)
10235597088cSDongdong Hao {
10245597088cSDongdong Hao kfree(container_of(ref, struct leapraid_raid_volume, refcnt));
10255597088cSDongdong Hao }
10265597088cSDongdong Hao
10275597088cSDongdong Hao #define leapraid_raid_volume_get(volume) \
10285597088cSDongdong Hao kref_get(&(volume)->refcnt)
10295597088cSDongdong Hao #define leapraid_raid_volume_put(volume) \
10305597088cSDongdong Hao kref_put(&(volume)->refcnt, leapraid_raid_volume_free)
10315597088cSDongdong Hao
10325597088cSDongdong Hao #define LEAPRAID_TGT_FLG_RAID_MEMBER 0x01
10335597088cSDongdong Hao #define LEAPRAID_TGT_FLG_VOLUME 0x02
10345597088cSDongdong Hao #define LEAPRAID_NO_ULD_ATTACH 1
10355597088cSDongdong Hao /**
10365597088cSDongdong Hao * struct leapraid_starget_priv - SCSI target private data
10375597088cSDongdong Hao *
10385597088cSDongdong Hao * @starget: SCSI target structure.
10395597088cSDongdong Hao * @sas_address: SAS address.
10405597088cSDongdong Hao * @hdl: Device handle.
10415597088cSDongdong Hao * @num_luns: Number of LUNs.
10425597088cSDongdong Hao * @flg: Flags.
10435597088cSDongdong Hao * @deleted: Deletion flag.
10445597088cSDongdong Hao * @tm_busy: Task management busy flag.
10455597088cSDongdong Hao * @card_port: Associated card port.
10465597088cSDongdong Hao * @sas_dev: SAS device structure.
10475597088cSDongdong Hao */
10485597088cSDongdong Hao struct leapraid_starget_priv {
10495597088cSDongdong Hao struct scsi_target *starget;
10505597088cSDongdong Hao u64 sas_address;
10515597088cSDongdong Hao u16 hdl;
10525597088cSDongdong Hao int num_luns;
10535597088cSDongdong Hao u32 flg;
10545597088cSDongdong Hao u8 deleted;
10555597088cSDongdong Hao u8 tm_busy;
10565597088cSDongdong Hao struct leapraid_card_port *card_port;
10575597088cSDongdong Hao struct leapraid_sas_dev *sas_dev;
10585597088cSDongdong Hao };
10595597088cSDongdong Hao
10605597088cSDongdong Hao #define LEAPRAID_DEVICE_FLG_INIT 0x01
10615597088cSDongdong Hao /**
10625597088cSDongdong Hao * struct leapraid_sdev_priv - SCSI device private data
10635597088cSDongdong Hao *
10645597088cSDongdong Hao * @starget_priv: Associated target private data.
10655597088cSDongdong Hao * @lun: Logical Unit Number.
10665597088cSDongdong Hao * @flg: Flags.
1067*46f861d3SDongdong Hao * @ncq_prio_enable: Enables NCQ command priority for RT I/O.
10685597088cSDongdong Hao * @block: Block flag.
10695597088cSDongdong Hao * @deleted: Deletion flag.
10705597088cSDongdong Hao * @sep: SEP flag.
10715597088cSDongdong Hao */
10725597088cSDongdong Hao struct leapraid_sdev_priv {
10735597088cSDongdong Hao struct leapraid_starget_priv *starget_priv;
10745597088cSDongdong Hao unsigned int lun;
10755597088cSDongdong Hao u32 flg;
1076*46f861d3SDongdong Hao u8 ncq_prio_enable;
10775597088cSDongdong Hao u8 block;
10785597088cSDongdong Hao u8 deleted;
10795597088cSDongdong Hao u8 sep;
10805597088cSDongdong Hao };
10815597088cSDongdong Hao
10825597088cSDongdong Hao /**
10835597088cSDongdong Hao * struct leapraid_sas_dev - SAS device structure
10845597088cSDongdong Hao *
10855597088cSDongdong Hao * @list: List head for device management.
10865597088cSDongdong Hao * @starget: SCSI target structure.
10875597088cSDongdong Hao * @card_port: Associated card port.
10885597088cSDongdong Hao * @rphy: SAS remote PHY.
10895597088cSDongdong Hao * @refcnt: Reference count.
10905597088cSDongdong Hao * @id: Device ID.
10915597088cSDongdong Hao * @channel: SCSI channel.
10925597088cSDongdong Hao * @slot: Slot number.
10935597088cSDongdong Hao * @phy: PHY identifier.
10945597088cSDongdong Hao * @resp: Response status.
10955597088cSDongdong Hao * @led_on: LED state.
10965597088cSDongdong Hao * @sas_addr: SAS address.
10975597088cSDongdong Hao * @dev_name: Device name.
10985597088cSDongdong Hao * @hdl: Device handle.
10995597088cSDongdong Hao * @parent_sas_addr: Parent SAS address.
11005597088cSDongdong Hao * @enc_hdl: Enclosure handle.
11015597088cSDongdong Hao * @enc_lid: Enclosure logical ID.
11025597088cSDongdong Hao * @volume_hdl: Volume handle.
11035597088cSDongdong Hao * @volume_wwid: Volume WWID.
11045597088cSDongdong Hao * @dev_info: Device information.
11055597088cSDongdong Hao * @pend_sas_rphy_add: Pending SAS remote PHY addition flag.
11065597088cSDongdong Hao * @enc_level: Enclosure level.
11075597088cSDongdong Hao * @port_connection: Port connection.
11085597088cSDongdong Hao * @connector_name: Connector name.
11095597088cSDongdong Hao */
11105597088cSDongdong Hao struct leapraid_sas_dev {
11115597088cSDongdong Hao struct list_head list;
11125597088cSDongdong Hao struct scsi_target *starget;
11135597088cSDongdong Hao struct leapraid_card_port *card_port;
11145597088cSDongdong Hao struct sas_rphy *rphy;
11155597088cSDongdong Hao struct kref refcnt;
11165597088cSDongdong Hao unsigned int id;
11175597088cSDongdong Hao unsigned int channel;
11185597088cSDongdong Hao u16 slot;
11195597088cSDongdong Hao u8 phy;
11205597088cSDongdong Hao u8 resp;
11215597088cSDongdong Hao u8 led_on;
11225597088cSDongdong Hao u64 sas_addr;
11235597088cSDongdong Hao u64 dev_name;
11245597088cSDongdong Hao u16 hdl;
11255597088cSDongdong Hao u64 parent_sas_addr;
11265597088cSDongdong Hao u16 enc_hdl;
11275597088cSDongdong Hao u64 enc_lid;
11285597088cSDongdong Hao u16 volume_hdl;
11295597088cSDongdong Hao u64 volume_wwid;
11305597088cSDongdong Hao u32 dev_info;
11315597088cSDongdong Hao u8 pend_sas_rphy_add;
11325597088cSDongdong Hao u8 enc_level;
11335597088cSDongdong Hao u8 port_connection;
11345597088cSDongdong Hao u8 connector_name[LEAPRAID_SAS_DEV_P0_CON_NAME_LEN + 1];
11355597088cSDongdong Hao };
11365597088cSDongdong Hao
leapraid_sdev_free(struct kref * ref)11375597088cSDongdong Hao static inline void leapraid_sdev_free(struct kref *ref)
11385597088cSDongdong Hao {
11395597088cSDongdong Hao kfree(container_of(ref, struct leapraid_sas_dev, refcnt));
11405597088cSDongdong Hao }
11415597088cSDongdong Hao
11425597088cSDongdong Hao #define leapraid_sdev_get(sdev) kref_get(&(sdev)->refcnt)
11435597088cSDongdong Hao #define leapraid_sdev_put(sdev) kref_put(&(sdev)->refcnt, leapraid_sdev_free)
11445597088cSDongdong Hao
11455597088cSDongdong Hao void leapraid_boot_dev_get(void *dev, u32 chnl);
11465597088cSDongdong Hao void leapraid_boot_dev_put(void *dev, u32 chnl);
11475597088cSDongdong Hao
11485597088cSDongdong Hao /**
11495597088cSDongdong Hao * struct leapraid_sas_port - SAS port structure
11505597088cSDongdong Hao *
11515597088cSDongdong Hao * @port_list: List head for port management.
11525597088cSDongdong Hao * @phy_list: List of PHYs in this port.
11535597088cSDongdong Hao * @port: SAS port structure.
11545597088cSDongdong Hao * @card_port: Associated card port.
11555597088cSDongdong Hao * @remote_identify: Remote device identification.
11565597088cSDongdong Hao * @rphy: SAS remote PHY.
11575597088cSDongdong Hao * @phys_num: Number of PHYs in this port.
11585597088cSDongdong Hao */
11595597088cSDongdong Hao struct leapraid_sas_port {
11605597088cSDongdong Hao struct list_head port_list;
11615597088cSDongdong Hao struct list_head phy_list;
11625597088cSDongdong Hao struct sas_port *port;
11635597088cSDongdong Hao struct leapraid_card_port *card_port;
11645597088cSDongdong Hao struct sas_identify remote_identify;
11655597088cSDongdong Hao struct sas_rphy *rphy;
11665597088cSDongdong Hao u8 phys_num;
11675597088cSDongdong Hao };
11685597088cSDongdong Hao
11695597088cSDongdong Hao #define LEAPRAID_VPHY_FLG_DIRTY 0x01
11705597088cSDongdong Hao /**
11715597088cSDongdong Hao * struct leapraid_vphy - Virtual PHY structure
11725597088cSDongdong Hao *
11735597088cSDongdong Hao * @list: List head for PHY management.
11745597088cSDongdong Hao * @sas_address: SAS address.
11755597088cSDongdong Hao * @phy_mask: PHY mask.
11765597088cSDongdong Hao * @flg: Flags.
11775597088cSDongdong Hao */
11785597088cSDongdong Hao struct leapraid_vphy {
11795597088cSDongdong Hao struct list_head list;
11805597088cSDongdong Hao u64 sas_address;
11815597088cSDongdong Hao u32 phy_mask;
11825597088cSDongdong Hao u8 flg;
11835597088cSDongdong Hao };
11845597088cSDongdong Hao
11855597088cSDongdong Hao /**
11865597088cSDongdong Hao * struct leapraid_tgt_rst_list - Target reset tracking entry
11875597088cSDongdong Hao * @list: List node used to link reset entries.
11885597088cSDongdong Hao * @handle: Device handle of the target being reset.
11895597088cSDongdong Hao * @state: Current state of the target reset operation.
11905597088cSDongdong Hao *
11915597088cSDongdong Hao * Each entry represents a target device that is undergoing or has
11925597088cSDongdong Hao * undergone a target reset operation.
11935597088cSDongdong Hao */
11945597088cSDongdong Hao struct leapraid_tgt_rst_list {
11955597088cSDongdong Hao struct list_head list;
11965597088cSDongdong Hao u16 handle;
11975597088cSDongdong Hao u16 state;
11985597088cSDongdong Hao };
11995597088cSDongdong Hao
12005597088cSDongdong Hao /**
12015597088cSDongdong Hao * struct sense_info - Parsed SCSI sense information
12025597088cSDongdong Hao * @sense_key: Sense key extracted from sense data.
12035597088cSDongdong Hao * @asc: Additional Sense Code (ASC).
12045597088cSDongdong Hao * @ascq: Additional Sense Code Qualifier (ASCQ).
12055597088cSDongdong Hao *
12065597088cSDongdong Hao * This structure stores key fields parsed from SCSI sense data to
12075597088cSDongdong Hao * simplify error handling and reporting.
12085597088cSDongdong Hao */
12095597088cSDongdong Hao struct sense_info {
12105597088cSDongdong Hao u8 sense_key;
12115597088cSDongdong Hao u8 asc;
12125597088cSDongdong Hao u8 ascq;
12135597088cSDongdong Hao };
12145597088cSDongdong Hao
12155597088cSDongdong Hao /**
12165597088cSDongdong Hao * struct leapraid_fw_log_info - Firmware log position information
12175597088cSDongdong Hao * @user_position: Current log read position used by the driver.
12185597088cSDongdong Hao * @adapter_position: Current log write position maintained by firmware.
12195597088cSDongdong Hao *
12205597088cSDongdong Hao * This structure tracks firmware log buffer positions used for retrieving
12215597088cSDongdong Hao * log entries from the adapter.
12225597088cSDongdong Hao */
12235597088cSDongdong Hao struct leapraid_fw_log_info {
12245597088cSDongdong Hao u32 user_position;
12255597088cSDongdong Hao u32 adapter_position;
12265597088cSDongdong Hao };
12275597088cSDongdong Hao
12285597088cSDongdong Hao /**
12295597088cSDongdong Hao * enum reset_type - Reset type enumeration
12305597088cSDongdong Hao *
12315597088cSDongdong Hao * @FULL_RESET: Full hardware reset.
12325597088cSDongdong Hao * @PART_RESET: Partial reset.
12335597088cSDongdong Hao */
12345597088cSDongdong Hao enum reset_type {
12355597088cSDongdong Hao FULL_RESET,
12365597088cSDongdong Hao PART_RESET,
12375597088cSDongdong Hao };
12385597088cSDongdong Hao
12395597088cSDongdong Hao enum leapraid_card_port_checking_flg {
12405597088cSDongdong Hao CARD_PORT_FURTHER_CHECKING_NEEDED = 0,
12415597088cSDongdong Hao CARD_PORT_SKIP_CHECKING,
12425597088cSDongdong Hao };
12435597088cSDongdong Hao
12445597088cSDongdong Hao enum leapraid_port_checking_state {
12455597088cSDongdong Hao NEW_CARD_PORT = 0,
12465597088cSDongdong Hao SAME_PORT_WITH_NOTHING_CHANGED,
12475597088cSDongdong Hao SAME_PORT_WITH_PARTIALLY_CHANGED_PHYS,
12485597088cSDongdong Hao SAME_ADDR_WITH_PARTIALLY_CHANGED_PHYS,
12495597088cSDongdong Hao SAME_ADDR_ONLY,
12505597088cSDongdong Hao };
12515597088cSDongdong Hao
12525597088cSDongdong Hao /**
12535597088cSDongdong Hao * struct leapraid_card_port_feature - Card port feature
12545597088cSDongdong Hao *
12555597088cSDongdong Hao * @dirty_flg: Dirty flag indicator.
12565597088cSDongdong Hao * @same_addr: Same address flag.
12575597088cSDongdong Hao * @exact_phy: Exact PHY match flag.
12585597088cSDongdong Hao * @phy_overlap: PHY overlap bitmap.
12595597088cSDongdong Hao * @same_port: Same port flag.
12605597088cSDongdong Hao * @cur_chking_old_port: Current checking old port.
12615597088cSDongdong Hao * @expected_old_port: Expected old port.
12625597088cSDongdong Hao * @same_addr_port_count: Same address port count.
12635597088cSDongdong Hao * @checking_state: Port checking state.
12645597088cSDongdong Hao */
12655597088cSDongdong Hao struct leapraid_card_port_feature {
12665597088cSDongdong Hao u8 dirty_flg;
12675597088cSDongdong Hao u8 same_addr;
12685597088cSDongdong Hao u8 exact_phy;
12695597088cSDongdong Hao u32 phy_overlap;
12705597088cSDongdong Hao u8 same_port;
12715597088cSDongdong Hao struct leapraid_card_port *cur_chking_old_port;
12725597088cSDongdong Hao struct leapraid_card_port *expected_old_port;
12735597088cSDongdong Hao int same_addr_port_count;
12745597088cSDongdong Hao enum leapraid_port_checking_state checking_state;
12755597088cSDongdong Hao };
12765597088cSDongdong Hao
12775597088cSDongdong Hao #define SMP_REPORT_MANUFACTURER_INFORMATION_FRAME_TYPE 0x40
12785597088cSDongdong Hao #define SMP_REPORT_MANUFACTURER_INFORMATION_FUNC 0x01
12795597088cSDongdong Hao
12805597088cSDongdong Hao /**
12815597088cSDongdong Hao * ref: SAS-2(INCITS 457-2010) 10.4.3.5
12825597088cSDongdong Hao */
12835597088cSDongdong Hao struct leapraid_rep_manu_request {
12845597088cSDongdong Hao u8 smp_frame_type;
12855597088cSDongdong Hao u8 function;
12865597088cSDongdong Hao u8 allocated_response_length;
12875597088cSDongdong Hao u8 request_length;
12885597088cSDongdong Hao };
12895597088cSDongdong Hao
12905597088cSDongdong Hao /**
12915597088cSDongdong Hao * ref: SAS-2(INCITS 457-2010) 10.4.3.5
12925597088cSDongdong Hao */
12935597088cSDongdong Hao struct leapraid_rep_manu_reply {
12945597088cSDongdong Hao u8 smp_frame_type;
12955597088cSDongdong Hao u8 function;
12965597088cSDongdong Hao u8 function_result;
12975597088cSDongdong Hao u8 response_length;
12985597088cSDongdong Hao u16 expander_change_count;
12995597088cSDongdong Hao u8 r1[2];
13005597088cSDongdong Hao u8 sas_format;
13015597088cSDongdong Hao u8 r2[3];
13025597088cSDongdong Hao u8 vendor_identification[SAS_EXPANDER_VENDOR_ID_LEN];
13035597088cSDongdong Hao u8 product_identification[SAS_EXPANDER_PRODUCT_ID_LEN];
13045597088cSDongdong Hao u8 product_revision_level[SAS_EXPANDER_PRODUCT_REV_LEN];
13055597088cSDongdong Hao u8 comp_vendor_identification[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN];
13065597088cSDongdong Hao u16 component_id;
13075597088cSDongdong Hao u8 component_revision_level;
13085597088cSDongdong Hao u8 r3;
13095597088cSDongdong Hao u8 vendor_specific[8];
13105597088cSDongdong Hao };
13115597088cSDongdong Hao
13125597088cSDongdong Hao extern struct list_head leapraid_adapter_list;
13135597088cSDongdong Hao extern spinlock_t leapraid_adapter_lock;
13145597088cSDongdong Hao extern char driver_name[LEAPRAID_NAME_LENGTH];
13155597088cSDongdong Hao
13165597088cSDongdong Hao int leapraid_ctrl_init(struct leapraid_adapter *adapter);
13175597088cSDongdong Hao void leapraid_remove_ctrl(struct leapraid_adapter *adapter);
13185597088cSDongdong Hao void leapraid_check_scheduled_fault_start(struct leapraid_adapter *adapter);
13195597088cSDongdong Hao void leapraid_check_scheduled_fault_stop(struct leapraid_adapter *adapter);
13205597088cSDongdong Hao void leapraid_fw_log_start(struct leapraid_adapter *adapter);
13215597088cSDongdong Hao void leapraid_fw_log_stop(struct leapraid_adapter *adapter);
13225597088cSDongdong Hao int leapraid_set_pcie_and_notification(struct leapraid_adapter *adapter);
13235597088cSDongdong Hao void leapraid_disable_controller(struct leapraid_adapter *adapter);
13245597088cSDongdong Hao int leapraid_hard_reset_handler(struct leapraid_adapter *adapter,
13255597088cSDongdong Hao enum reset_type type);
13265597088cSDongdong Hao void leapraid_mask_int(struct leapraid_adapter *adapter);
13275597088cSDongdong Hao void leapraid_unmask_int(struct leapraid_adapter *adapter);
13285597088cSDongdong Hao u32 leapraid_get_adapter_state(struct leapraid_adapter *adapter);
13295597088cSDongdong Hao bool leapraid_pci_removed(struct leapraid_adapter *adapter);
13305597088cSDongdong Hao int leapraid_check_adapter_is_op(struct leapraid_adapter *adapter, int wait,
13315597088cSDongdong Hao const char *caller);
13325597088cSDongdong Hao void *leapraid_get_task_desc(struct leapraid_adapter *adapter, u16 taskid);
13335597088cSDongdong Hao void *leapraid_get_sense_buffer(struct leapraid_adapter *adapter, u16 taskid);
13345597088cSDongdong Hao __le32 leapraid_get_sense_buffer_dma(struct leapraid_adapter *adapter,
13355597088cSDongdong Hao u16 taskid);
13365597088cSDongdong Hao void *leapraid_get_reply_vaddr(struct leapraid_adapter *adapter,
13375597088cSDongdong Hao u32 phys_addr);
13385597088cSDongdong Hao u16 leapraid_alloc_scsiio_taskid(struct leapraid_adapter *adapter,
13395597088cSDongdong Hao struct scsi_cmnd *scmd);
13405597088cSDongdong Hao void leapraid_free_taskid(struct leapraid_adapter *adapter, u16 taskid);
13415597088cSDongdong Hao struct leapraid_io_req_tracker *leapraid_get_io_tracker_from_taskid(
13425597088cSDongdong Hao struct leapraid_adapter *adapter, u16 taskid);
13435597088cSDongdong Hao struct scsi_cmnd *leapraid_get_scmd_from_taskid(
13445597088cSDongdong Hao struct leapraid_adapter *adapter, u16 taskid);
13455597088cSDongdong Hao int leapraid_scan_dev(struct leapraid_adapter *adapter, bool async_scan_dev);
13465597088cSDongdong Hao void leapraid_scan_dev_done(struct leapraid_adapter *adapter);
13475597088cSDongdong Hao void leapraid_cleanup_lists(struct leapraid_adapter *adapter);
13485597088cSDongdong Hao void leapraid_wait_cmds_done(struct leapraid_adapter *adapter);
13495597088cSDongdong Hao void leapraid_clean_active_scsi_cmds(struct leapraid_adapter *adapter);
13505597088cSDongdong Hao void leapraid_sync_irqs(struct leapraid_adapter *adapter, bool poll);
13515597088cSDongdong Hao int leapraid_rep_queue_handler(struct leapraid_rq *rq);
13525597088cSDongdong Hao int leapraid_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
13535597088cSDongdong Hao void leapraid_mq_polling_pause(struct leapraid_adapter *adapter);
13545597088cSDongdong Hao void leapraid_mq_polling_resume(struct leapraid_adapter *adapter);
13555597088cSDongdong Hao void leapraid_set_tm_flg(struct leapraid_adapter *adapter, u16 handle);
13565597088cSDongdong Hao void leapraid_clear_tm_flg(struct leapraid_adapter *adapter, u16 handle);
13575597088cSDongdong Hao void leapraid_async_turn_on_led(struct leapraid_adapter *adapter, u16 handle);
13585597088cSDongdong Hao int leapraid_issue_locked_tm(struct leapraid_adapter *adapter, u16 handle,
13595597088cSDongdong Hao uint channel, uint id, uint lun, u8 type,
13605597088cSDongdong Hao u16 taskid_task, u8 tr_method);
13615597088cSDongdong Hao int leapraid_issue_tm(struct leapraid_adapter *adapter, u16 handle,
13625597088cSDongdong Hao uint channel, uint id, uint lun, u8 type,
13635597088cSDongdong Hao u16 taskid_task, u8 tr_method);
13645597088cSDongdong Hao bool leapraid_scsiio_done(struct leapraid_adapter *adapter, u16 taskid,
13655597088cSDongdong Hao u8 msix_index, u32 rep);
13665597088cSDongdong Hao int leapraid_get_volume_cap(struct leapraid_adapter *adapter,
13675597088cSDongdong Hao struct leapraid_raid_volume *raid_volume);
13685597088cSDongdong Hao int leapraid_internal_init_cmd_priv(
13695597088cSDongdong Hao struct leapraid_adapter *adapter,
13705597088cSDongdong Hao struct leapraid_io_req_tracker *io_tracker);
13715597088cSDongdong Hao void leapraid_internal_exit_cmd_priv(
13725597088cSDongdong Hao struct leapraid_adapter *adapter,
13735597088cSDongdong Hao struct leapraid_io_req_tracker *io_tracker);
13745597088cSDongdong Hao void leapraid_clean_active_fw_evt(struct leapraid_adapter *adapter);
13755597088cSDongdong Hao bool leapraid_scmd_find_by_lun(struct leapraid_adapter *adapter,
13765597088cSDongdong Hao uint id, unsigned int lun, uint channel);
13775597088cSDongdong Hao bool leapraid_scmd_find_by_tgt(struct leapraid_adapter *adapter,
13785597088cSDongdong Hao uint id, uint channel);
13795597088cSDongdong Hao struct leapraid_vphy *leapraid_get_vphy_by_phy(struct leapraid_card_port *port,
13805597088cSDongdong Hao u32 phy);
13815597088cSDongdong Hao struct leapraid_raid_volume *leapraid_raid_volume_find_by_id(
13825597088cSDongdong Hao struct leapraid_adapter *adapter, uint id, uint channel);
13835597088cSDongdong Hao struct leapraid_raid_volume *leapraid_raid_volume_find_by_hdl(
13845597088cSDongdong Hao struct leapraid_adapter *adapter, u16 handle);
13855597088cSDongdong Hao struct leapraid_topo_node *leapraid_exp_find_by_sas_address(
13865597088cSDongdong Hao struct leapraid_adapter *adapter, u64 sas_address,
13875597088cSDongdong Hao struct leapraid_card_port *port);
13885597088cSDongdong Hao struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_by_addr_and_rphy(
13895597088cSDongdong Hao struct leapraid_adapter *adapter,
13905597088cSDongdong Hao u64 sas_address, struct sas_rphy *rphy);
13915597088cSDongdong Hao struct leapraid_sas_dev *leapraid_get_sas_dev_by_addr(
13925597088cSDongdong Hao struct leapraid_adapter *adapter, u64 sas_address,
13935597088cSDongdong Hao struct leapraid_card_port *port);
13945597088cSDongdong Hao struct leapraid_sas_dev *leapraid_get_sas_dev_by_hdl(
13955597088cSDongdong Hao struct leapraid_adapter *adapter, u16 handle);
13965597088cSDongdong Hao struct leapraid_sas_dev *leapraid_get_sas_dev_from_tgt(
13975597088cSDongdong Hao struct leapraid_adapter *adapter,
13985597088cSDongdong Hao struct leapraid_starget_priv *tgt_priv);
13995597088cSDongdong Hao struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_from_tgt(
14005597088cSDongdong Hao struct leapraid_adapter *adapter,
14015597088cSDongdong Hao struct leapraid_starget_priv *tgt_priv);
14025597088cSDongdong Hao struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_by_hdl(
14035597088cSDongdong Hao struct leapraid_adapter *adapter, u16 handle);
14045597088cSDongdong Hao struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_by_addr(
14055597088cSDongdong Hao struct leapraid_adapter *adapter, u64 sas_address,
14065597088cSDongdong Hao struct leapraid_card_port *port);
14075597088cSDongdong Hao struct leapraid_sas_dev *leapraid_get_next_sas_dev_from_init_list(
14085597088cSDongdong Hao struct leapraid_adapter *adapter);
14095597088cSDongdong Hao void leapraid_sas_dev_remove_by_sas_address(
14105597088cSDongdong Hao struct leapraid_adapter *adapter,
14115597088cSDongdong Hao u64 sas_address, struct leapraid_card_port *port);
14125597088cSDongdong Hao void leapraid_sas_dev_remove(struct leapraid_adapter *adapter,
14135597088cSDongdong Hao struct leapraid_sas_dev *sas_dev);
14145597088cSDongdong Hao void leapraid_raid_volume_remove(struct leapraid_adapter *adapter,
14155597088cSDongdong Hao struct leapraid_raid_volume *raid_volume);
14165597088cSDongdong Hao void leapraid_exp_rm(struct leapraid_adapter *adapter,
14175597088cSDongdong Hao u64 sas_address, struct leapraid_card_port *port);
14185597088cSDongdong Hao void leapraid_build_mpi_sg(struct leapraid_adapter *adapter,
14195597088cSDongdong Hao void *sge, dma_addr_t h2c_dma_addr, size_t h2c_size,
14205597088cSDongdong Hao dma_addr_t c2h_dma_addr, size_t c2h_size);
14215597088cSDongdong Hao void leapraid_build_ieee_nodata_sg(struct leapraid_adapter *adapter,
14225597088cSDongdong Hao void *sge);
14235597088cSDongdong Hao void leapraid_build_ieee_sg(struct leapraid_adapter *adapter,
14245597088cSDongdong Hao void *psge, dma_addr_t h2c_dma_addr,
14255597088cSDongdong Hao size_t h2c_size, dma_addr_t c2h_dma_addr,
14265597088cSDongdong Hao size_t c2h_size);
14275597088cSDongdong Hao int leapraid_build_scmd_ieee_sg(struct leapraid_adapter *adapter,
14285597088cSDongdong Hao struct scsi_cmnd *scmd, u16 taskid);
14295597088cSDongdong Hao void leapraid_fire_scsi_io(struct leapraid_adapter *adapter,
14305597088cSDongdong Hao u16 taskid, u16 handle);
14315597088cSDongdong Hao void leapraid_fire_hpr_task(struct leapraid_adapter *adapter, u16 taskid,
14325597088cSDongdong Hao u16 msix_task);
14335597088cSDongdong Hao void leapraid_fire_task(struct leapraid_adapter *adapter, u16 taskid);
14345597088cSDongdong Hao int leapraid_cfg_get_volume_hdl(struct leapraid_adapter *adapter,
14355597088cSDongdong Hao u16 pd_handle, u16 *volume_handle);
14365597088cSDongdong Hao int leapraid_cfg_get_volume_wwid(struct leapraid_adapter *adapter,
14375597088cSDongdong Hao u16 volume_handle, u64 *wwid);
14385597088cSDongdong Hao int leapraid_op_config_page(struct leapraid_adapter *adapter,
14395597088cSDongdong Hao void *cfgp, union cfg_param_1 cfgp1,
14405597088cSDongdong Hao union cfg_param_2 cfgp2,
14415597088cSDongdong Hao enum config_page_action cfg_op);
14425597088cSDongdong Hao void leapraid_log_req_context(struct leapraid_adapter *adapter, u16 smid,
14435597088cSDongdong Hao const void *req_data);
14445597088cSDongdong Hao
14455597088cSDongdong Hao int leapraid_change_queue_depth(struct scsi_device *sdev, int qdepth);
14465597088cSDongdong Hao
14475597088cSDongdong Hao int leapraid_ctl_release(struct inode *inode, struct file *filep);
14485597088cSDongdong Hao int leapraid_ctl_init(void);
14495597088cSDongdong Hao void leapraid_ctl_exit(void);
14505597088cSDongdong Hao
14515597088cSDongdong Hao extern struct sas_function_template leapraid_transport_functions;
14525597088cSDongdong Hao extern struct scsi_transport_template *leapraid_transport_template;
14535597088cSDongdong Hao struct leapraid_sas_port *leapraid_transport_port_add(
14545597088cSDongdong Hao struct leapraid_adapter *adapter, u16 handle, u64 sas_address,
14555597088cSDongdong Hao struct leapraid_card_port *card_port);
14565597088cSDongdong Hao void leapraid_transport_port_remove(struct leapraid_adapter *adapter,
14575597088cSDongdong Hao u64 sas_address, u64 sas_address_parent,
14585597088cSDongdong Hao struct leapraid_card_port *card_port);
14595597088cSDongdong Hao void leapraid_transport_add_card_phy(struct leapraid_adapter *adapter,
14605597088cSDongdong Hao struct leapraid_card_phy *card_phy,
14615597088cSDongdong Hao struct leapraid_sas_phy_p0 *phy_pg0,
14625597088cSDongdong Hao struct device *parent_dev);
14635597088cSDongdong Hao int leapraid_transport_add_exp_phy(struct leapraid_adapter *adapter,
14645597088cSDongdong Hao struct leapraid_card_phy *card_phy,
14655597088cSDongdong Hao struct leapraid_exp_p1 *exp_pg1,
14665597088cSDongdong Hao struct device *parent_dev);
14675597088cSDongdong Hao void leapraid_transport_update_links(struct leapraid_adapter *adapter,
14685597088cSDongdong Hao u64 sas_address, u16 handle,
14695597088cSDongdong Hao u8 phy_number, u8 link_rate,
14705597088cSDongdong Hao struct leapraid_card_port *card_port);
14715597088cSDongdong Hao void leapraid_transport_detach_phy_to_port(
14725597088cSDongdong Hao struct leapraid_adapter *adapter,
14735597088cSDongdong Hao struct leapraid_topo_node *topo_node,
14745597088cSDongdong Hao struct leapraid_card_phy *card_phy);
14755597088cSDongdong Hao void leapraid_transport_attach_phy_to_port(
14765597088cSDongdong Hao struct leapraid_adapter *adapter,
14775597088cSDongdong Hao struct leapraid_topo_node *sas_node,
14785597088cSDongdong Hao struct leapraid_card_phy *card_phy,
14795597088cSDongdong Hao u64 sas_address,
14805597088cSDongdong Hao struct leapraid_card_port *card_port);
14815597088cSDongdong Hao enum scsi_qc_status leapraid_queuecommand(struct Scsi_Host *shost,
14825597088cSDongdong Hao struct scsi_cmnd *scmd);
14835597088cSDongdong Hao void leapraid_overheat_cleanup(struct leapraid_adapter *adapter);
14845597088cSDongdong Hao void leapraid_smart_fault_detect(struct leapraid_adapter *adapter, u16 hdl);
14855597088cSDongdong Hao
14865597088cSDongdong Hao #endif /* LEAPRAID_FUNC_H_INCLUDED */
1487