1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2026 LeapIO Tech Inc. 4 * 5 * LeapRAID storage and RAID controller driver. 6 */ 7 #ifndef LEAPRAID_FUNC_H_INCLUDED 8 #define LEAPRAID_FUNC_H_INCLUDED 9 10 #include <linux/pci.h> 11 #include <linux/aer.h> 12 #include <linux/poll.h> 13 #include <linux/atomic.h> 14 #include <linux/errno.h> 15 #include <linux/ktime.h> 16 #include <linux/delay.h> 17 #include <linux/interrupt.h> 18 #include <scsi/scsi.h> 19 #include <scsi/scsi_eh.h> 20 #include <scsi/scsicam.h> 21 #include <scsi/scsi_tcq.h> 22 #include <scsi/scsi_dbg.h> 23 #include <scsi/scsi_host.h> 24 #include <scsi/scsi_cmnd.h> 25 #include <scsi/scsi_device.h> 26 #include <scsi/scsi_transport_sas.h> 27 28 #include "leapraid.h" 29 30 /* Request and reply buffer size. */ 31 #define LEAPRAID_REQUEST_SIZE 128 32 #define LEAPRAID_REPLY_SIZE 128 33 #define LEAPRAID_CHAIN_SEG_SIZE 128 34 #define LEAPRAID_MAX_SGES_IN_CHAIN 7 35 #define LEAPRAID_DEFAULT_CHAINS_PER_IO 19 36 #define LEAPRAID_DEFAULT_DIX_CHAINS_PER_IO \ 37 (2 * LEAPRAID_DEFAULT_CHAINS_PER_IO) /* TODO DIX */ 38 #define LEAPRAID_IEEE_SGE64_ENTRY_SIZE 16 39 #define LEAPRAID_REP_DESC_CHUNK_SIZE 16 40 #define LEAPRAID_REP_DESC_ENTRY_SIZE 8 41 #define LEAPRAID_REP_MSG_ADDR_SIZE 4 42 #define LEAPRAID_REP_RQ_CNT_SIZE 16 43 44 #define LEAPRAID_SYS_LOG_BUF_SIZE 0x200000 45 #define LEAPRAID_SYS_LOG_BUF_RESERVE 0x1000 46 47 /* Driver version and name. */ 48 #define LEAPRAID_DRIVER_NAME "LeapRAID" 49 #define LEAPRAID_NAME_LENGTH 48 50 #define LEAPRAID_BOARD_NAME_LENGTH 17 51 #define LEAPRAID_AUTHOR "LeapIO Inc." 52 #define LEAPRAID_DESCRIPTION "LeapRAID Driver" 53 #define LEAPRAID_DRIVER_VERSION "2.00.01.09" 54 #define LEAPRAID_MAJOR_VERSION 2 55 #define LEAPRAID_MINOR_VERSION 0 56 #define LEAPRAID_BUILD_VERSION 1 57 #define LEAPRAID_RELEASE_VERSION 9 58 #define LEAPRAID_MSG_VERSION 0x1021 59 #define LEAPRAID_HEADER_VERSION 0x0000 60 61 /* Device ID. */ 62 #define LEAPRAID_VENDOR_ID 0xD405 63 #define LEAPRAID_DEVID_HBA 0x8200 64 #define LEAPRAID_SUBVENDOR_ID 0xD405 65 #define LEAPRAID_SUBDEVID_HBA 0x8200 66 67 #define LEAPRAID_PCI_VENDOR_ID_MASK 0xFFFF 68 69 /* RAID virtual channel ID. */ 70 #define RAID_CHANNEL 1 71 72 /* Scatter-gather (SG) segment limits. */ 73 #define LEAPRAID_MAX_PHYS_SEGMENTS SG_CHUNK_SIZE 74 75 #define LEAPRAID_KDUMP_MIN_PHYS_SEGMENTS 32 76 #define LEAPRAID_SG_DEPTH LEAPRAID_MAX_PHYS_SEGMENTS 77 78 /* Firmware and config page operations. */ 79 #define LEAPRAID_CFG_REQ_RETRY_TIMES 2 80 81 /* Hardware access helpers. */ 82 #define leapraid_readl(addr) readl(addr) 83 #define leapraid_check_reset(status) \ 84 (!((status) & LEAPRAID_CMD_RESET)) 85 86 /* Polling intervals. */ 87 #define LEAPRAID_PCIE_LOG_POLLING_INTERVAL 1 88 #define LEAPRAID_FAULT_POLLING_INTERVAL 1000 89 90 /* Init mask. */ 91 #define LEAPRAID_RESET_IRQ_MASK 0x40000000 92 #define LEAPRAID_REPLY_INT_MASK 0x00000008 93 #define LEAPRAID_TO_SYS_DB_MASK 0x00000001 94 95 /* Queue depth. */ 96 #define LEAPRAID_SATA_QUEUE_DEPTH 32 97 #define LEAPRAID_SAS_QUEUE_DEPTH 64 98 #define LEAPRAID_RAID_QUEUE_DEPTH 64 99 100 /* Target probe flag. */ 101 #define LEAPRAID_NO_ULD_ATTACH_FLAG 1 102 103 /* SCSI device and queue limits. */ 104 #define LEAPRAID_MAX_SECTORS 2048 105 #define LEAPRAID_MAX_CDB_LEN 32 106 #define LEAPRAID_MAX_LUNS 16384 107 #define LEAPRAID_CAN_QUEUE_MIN 1 108 #define LEAPRAID_THIS_ID_NONE -1 109 #define LEAPRAID_CMD_PER_LUN 128 110 #define LEAPRAID_MAX_SEGMENT_SIZE 0xffffffff 111 112 /* SCSI sense and ASC/ASCQ and disk geometry configuration. */ 113 #define DESC_FORMAT_THRESHOLD 0x72 114 #define SENSE_KEY_MASK 0x0F 115 #define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F 116 #define ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5D 117 #define LEAPRAID_LARGE_DISK_THRESHOLD 0x200000UL 118 #define LEAPRAID_LARGE_DISK_HEADS 255 119 #define LEAPRAID_LARGE_DISK_SECTORS 63 120 #define LEAPRAID_SMALL_DISK_HEADS 64 121 #define LEAPRAID_SMALL_DISK_SECTORS 32 122 123 /* SMP (Serial Management Protocol). */ 124 #define LEAPRAID_SMP_PT_FLAG_SGL_PTR 0x80 125 #define LEAPRAID_SMP_FRAME_HEADER_SIZE 4 126 #define LEAPRAID_SCSI_HOST_SHIFT 16 127 #define LEAPRAID_SCSI_DRIVER_SHIFT 24 128 129 /* SCSI ASC/ASCQ definitions. */ 130 #define LEAPRAID_SCSI_ASCQ_DEFAULT 0x00 131 #define LEAPRAID_SCSI_ASC_POWER_ON_RESET 0x29 132 #define LEAPRAID_SCSI_ASC_INVALID_CMD_CODE 0x20 133 #define LEAPRAID_SCSI_ASCQ_POWER_ON_RESET 0x07 134 135 /* VPD Page 0x89 (ATA Information). */ 136 #define LEAPRAID_VPD_PAGE_ATA_INFO 0x89 137 #define LEAPRAID_VPD_PG89_MAX_LEN 255 138 #define LEAPRAID_VPD_PG89_MIN_LEN 214 139 140 /* Byte index for NCQ support flag in VPD page 0x89. */ 141 #define LEAPRAID_VPD_PG89_NCQ_BYTE_IDX 213 142 #define LEAPRAID_VPD_PG89_NCQ_BIT_SHIFT 4 143 #define LEAPRAID_VPD_PG89_NCQ_BIT_MASK 0x1 144 145 /* Readiness polling: max retries, sleep µs between. */ 146 #define LEAPRAID_ADAPTER_READY_MAX_RETRY 15000 147 #define LEAPRAID_ADAPTER_READY_SLEEP_MIN_US 1000 148 #define LEAPRAID_ADAPTER_READY_SLEEP_MAX_US 1100 149 150 /* Doorbell wait parameters. */ 151 #define LEAPRAID_DB_WAIT_MAX_RETRY 20000 152 #define LEAPRAID_DB_WAIT_DELAY_US 500 153 154 /* Basic data size definitions. */ 155 #define LEAPRAID_DWORDS_BYTE_SIZE 4 156 #define LEAPRAID_WORD_BYTE_SIZE 2 157 158 /* SGL threshold and chain offset. */ 159 #define LEAPRAID_SGL_INLINE_THRESHOLD 2 160 #define LEAPRAID_CHAIN_OFFSET_DWORDS 7 161 162 /* MSI-X group size and mask. */ 163 #define LEAPRAID_MSIX_GROUP_SIZE 8 164 #define LEAPRAID_MSIX_GROUP_MASK 7 165 166 /* Basic constants and limits. */ 167 #define LEAPRAID_BUSY_LIMIT 1 168 #define LEAPRAID_INVALID_HOST_DIAG_VAL 0xFFFFFFFF 169 170 /* Retry/Sleep configuration. */ 171 #define LEAPRAID_WRSEQ_FLUSH_KEY_VALUE 0x0 172 #define LEAPRAID_WRSEQ_1ST_KEY_VALUE 0xF 173 #define LEAPRAID_WRSEQ_2ND_KEY_VALUE 0x4 174 #define LEAPRAID_WRSEQ_3RD_KEY_VALUE 0xB 175 #define LEAPRAID_WRSEQ_4TH_KEY_VALUE 0x2 176 #define LEAPRAID_WRSEQ_5TH_KEY_VALUE 0x7 177 #define LEAPRAID_WRSEQ_6TH_KEY_VALUE 0xD 178 #define LEAPRAID_UNLOCK_RETRY_LIMIT 20 179 #define LEAPRAID_UNLOCK_SLEEP_MS 100 180 #define LEAPRAID_MSLEEP_NORMAL_MS 100 181 #define LEAPRAID_MSLEEP_EXTRA_LONG_MS 500 182 #define LEAPRAID_IO_POLL_DELAY_US 500 183 184 /* Device/Volume configuration. */ 185 #define LEAPRAID_MAX_VOLUMES_DEFAULT 32 186 #define LEAPRAID_MAX_DEV_HANDLE_DEFAULT 2048 187 #define LEAPRAID_INVALID_DEV_HANDLE 0xFFFF 188 189 /* Commands queue depth. */ 190 #define LEAPRAID_DEFAULT_CMD_QD_OFFSET 64 191 #define LEAPRAID_REPLY_QD_ALIGNMENT 16 192 /* Task ID offset. */ 193 #define LEAPRAID_TASKID_OFFSET_CTRL_CMD 1 194 #define LEAPRAID_TASKID_OFFSET_CFG_OP_CMD 1 195 #define LEAPRAID_TASKID_OFFSET_TRANSPORT_CMD 2 196 #define LEAPRAID_TASKID_OFFSET_ENC_CMD 3 197 #define LEAPRAID_TASKID_OFFSET_NOTIFY_EVENT_CMD 4 198 199 /* Task ID offset for high-priority. */ 200 #define LEAPRAID_HP_TASKID_OFFSET_CTL_CMD 0 201 #define LEAPRAID_HP_TASKID_OFFSET_TM_CMD 1 202 203 /* Event/Boot configuration. */ 204 #define LEAPRAID_EVT_MASK_COUNT 4 205 #define LEAPRAID_BOOT_DEV_SIZE 24 206 207 /* Commands timeout. */ 208 #define LEAPRAID_UNIFIED_TIMEOUT 30 209 #define LEAPRAID_CFG_OP_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 210 #define LEAPRAID_CTL_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 211 #define LEAPRAID_SCAN_DEV_CMD_TIMEOUT 300 212 #define LEAPRAID_ENC_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 213 #define LEAPRAID_IO_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 214 #define LEAPRAID_NOTIFY_EVENT_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 215 #define LEAPRAID_TM_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 216 #define LEAPRAID_TRANSPORT_CMD_TIMEOUT LEAPRAID_UNIFIED_TIMEOUT 217 218 /* Host DMA cap. */ 219 #define DMA_32_BITS 32 220 #define DMA_64_BITS 64 221 #define LEAPRAID_DMA_ALIGN 16 222 223 /* Values used to represent an invalid. */ 224 #define LEAPRAID_INVALID_INDEX -1 225 #define LEAPRAID_INVALID_MSIX_VECTORS -1 226 #define LEAPRAID_INVALID_INITIAL_VALUE -1 227 #define LEAPRAID_OPERATION_FAILED -1 228 229 /* Version shift and mask. */ 230 #define LEAPRAID_VER_MAJOR_SHIFT 24 231 #define LEAPRAID_VER_MINOR_SHIFT 16 232 #define LEAPRAID_VER_BUILD_SHIFT 8 233 #define LEAPRAID_VER_MASK 0xFF 234 235 /* Interrupt type. */ 236 #define LEAPRAID_INTERRUPT_MODE_MSIX 0 237 #define LEAPRAID_INTERRUPT_MODE_MSI 1 238 #define LEAPRAID_INTERRUPT_MODE_LEGACY 2 239 240 /* SMP link reset. */ 241 #define SMP_PHY_CONTROL_LINK_RESET 0x01 242 #define SMP_PHY_CONTROL_HARD_RESET 0x02 243 #define SMP_PHY_CONTROL_DISABLE 0x03 244 245 /** 246 * struct leapraid_adapter_features - Adapter features/capabilities. 247 * 248 * @req_slot: Number of request slots supported by the adapter. 249 * @hp_slot: Number of high-priority slots supported by the adapter. 250 * @adapter_caps: Adapter capabilities. 251 * @fw_version: Firmware version of the adapter. 252 * @max_dev_handle: Maximum device handle supported by the adapter. 253 * @min_dev_handle: Minimum device handle supported by the adapter. 254 */ 255 struct leapraid_adapter_features { 256 u16 req_slot; 257 u16 hp_slot; 258 u32 adapter_caps; 259 u32 fw_version; 260 u8 max_msix_vectors; 261 u8 max_volumes; 262 u16 max_dev_handle; 263 u16 min_dev_handle; 264 u16 msg_ver; 265 u16 product_id; 266 }; 267 268 /** 269 * struct leapraid_adapter_attr - Adapter attributes and capabilities 270 * 271 * @id: Adapter identifier. 272 * @raid_support: Indicates if RAID is supported. 273 * @bios_version: Version of the adapter BIOS. 274 * @enable_mp: Indicates if multipath (MP) support is enabled. 275 * @wideport_max_queue_depth: Maximum queue depth for wide ports. 276 * @narrowport_max_queue_depth: Maximum queue depth for narrow ports. 277 * @sata_max_queue_depth: Maximum queue depth for SATA. 278 * @raid_volume_max_queue_depth: Maximum queue depth for RAID volumes. 279 * @features: Detailed features of the adapter. 280 * @adapter_total_qd: Total queue depth available on the adapter. 281 * @io_qd: Queue depth allocated for I/O operations. 282 * @rep_msg_qd: Queue depth for reply messages. 283 * @rep_desc_qd: Queue depth for reply descriptors. 284 * @rep_desc_q_seg_cnt: Number of segments in a reply descriptor queue. 285 * @rq_cnt: Number of request queues. 286 * @task_desc_dma_size: Size of task descriptor DMA memory. 287 * @use_32_dma_mask: Indicates if 32-bit DMA mask is used. 288 * @name: Adapter name string. 289 * @board_name: Board name retrieved from manufacturing page 0. 290 */ 291 struct leapraid_adapter_attr { 292 u8 id; 293 u8 raid_support; 294 u32 bios_version; 295 u8 enable_mp; 296 u32 wideport_max_queue_depth; 297 u32 narrowport_max_queue_depth; 298 u32 sata_max_queue_depth; 299 u32 raid_volume_max_queue_depth; 300 struct leapraid_adapter_features features; 301 u32 adapter_total_qd; 302 u32 io_qd; 303 u32 rep_msg_qd; 304 u32 rep_desc_qd; 305 u32 rep_desc_q_seg_cnt; 306 u16 rq_cnt; 307 u32 task_desc_dma_size; 308 u8 use_32_dma_mask; 309 char name[LEAPRAID_NAME_LENGTH]; 310 char board_name[LEAPRAID_BOARD_NAME_LENGTH]; 311 }; 312 313 /** 314 * struct leapraid_io_req_tracker - Track a SCSI I/O request for the adapter 315 * 316 * @taskid: Unique task ID for this I/O request. 317 * @scmd: Pointer to the associated SCSI command. 318 * @chain_list: List of chain frames associated with this request. 319 * @msix_io: MSI-X vector assigned to this I/O request. 320 * @chain: Pointer to the chain memory for this request. 321 * @chain_dma: DMA address of the chain memory. 322 */ 323 struct leapraid_io_req_tracker { 324 u16 taskid; 325 struct scsi_cmnd *scmd; 326 struct list_head chain_list; 327 u16 msix_io; 328 void *chain; 329 dma_addr_t chain_dma; 330 }; 331 332 /** 333 * struct leapraid_task_tracker - Tracks a task in the adapter 334 * 335 * @taskid: Unique task ID for this tracker. 336 * @cb_idx: Callback index associated with this task. 337 * @tracker_list: Linked list node to chain this tracker in lists. 338 */ 339 struct leapraid_task_tracker { 340 u16 taskid; 341 u8 cb_idx; 342 struct list_head tracker_list; 343 }; 344 345 /** 346 * struct leapraid_rep_desc_maint - Maintains reply descriptor memory 347 * 348 * @rep_desc: Pointer to the reply descriptor. 349 * @rep_desc_dma: DMA address of the reply descriptor. 350 */ 351 struct leapraid_rep_desc_maint { 352 union leapraid_rep_desc_union *rep_desc; 353 dma_addr_t rep_desc_dma; 354 }; 355 356 /** 357 * struct leapraid_rep_desc_seg_maint - 358 * Maintains reply descriptor segment memory 359 * 360 * @rep_desc_seg: Pointer to the reply descriptor segment. 361 * @rep_desc_seg_dma: DMA address of the reply descriptor segment. 362 * @rep_desc_maint: Pointer to the main reply descriptor structure. 363 */ 364 struct leapraid_rep_desc_seg_maint { 365 void *rep_desc_seg; 366 dma_addr_t rep_desc_seg_dma; 367 struct leapraid_rep_desc_maint *rep_desc_maint; 368 }; 369 370 /** 371 * struct leapraid_mem_desc - Memory descriptor for LeapRAID adapter 372 * 373 * @task_desc: Pointer to task descriptor. 374 * @task_desc_dma: DMA address of task descriptor. 375 * @sg_chain_pool: DMA pool for SGL chain allocations. 376 * @sg_chain_pool_size: Size of the sg_chain_pool. 377 * @taskid_to_uniq_tag: Mapping from task ID to unique tag. 378 * @sense_data: Buffer for SCSI sense data. 379 * @sense_data_dma: DMA address of sense_data buffer. 380 * @rep_msg: Buffer for reply message. 381 * @rep_msg_dma: DMA address of reply message buffer. 382 * @rep_msg_addr: Pointer to reply message address. 383 * @rep_msg_addr_dma: DMA address of reply message address. 384 * @rep_desc_seg_maint: Pointer to reply descriptor segment. 385 * @rep_desc_q_arr: Pointer to reply descriptor queue array. 386 * @rep_desc_q_arr_dma: DMA address of reply descriptor queue array. 387 */ 388 struct leapraid_mem_desc { 389 void *task_desc; 390 dma_addr_t task_desc_dma; 391 struct dma_pool *sg_chain_pool; 392 u16 sg_chain_pool_size; 393 u16 *taskid_to_uniq_tag; 394 u8 *sense_data; 395 dma_addr_t sense_data_dma; 396 u8 *rep_msg; 397 dma_addr_t rep_msg_dma; 398 __le32 *rep_msg_addr; 399 dma_addr_t rep_msg_addr_dma; 400 struct leapraid_rep_desc_seg_maint *rep_desc_seg_maint; 401 struct leapraid_rep_desc_q_arr *rep_desc_q_arr; 402 dma_addr_t rep_desc_q_arr_dma; 403 }; 404 405 /* internal cmd description */ 406 #define LEAPRAID_FIXED_INTER_CMDS 5 407 #define LEAPRAID_FIXED_HP_CMDS 2 408 409 #define LEAPRAID_CMD_NOT_USED 0x8000 410 #define LEAPRAID_CMD_DONE 0x0001 411 #define LEAPRAID_CMD_PENDING 0x0002 412 #define LEAPRAID_CMD_REPLY_VALID 0x0004 413 #define LEAPRAID_CMD_RESET 0x0008 414 415 /** 416 * enum LEAPRAID_CB_INDEX - Callback index for LeapRAID driver 417 * 418 * @LEAPRAID_SCAN_DEV_CB_IDX: Scan device callback index. 419 * @LEAPRAID_CONFIG_CB_IDX: Configuration callback index. 420 * @LEAPRAID_TRANSPORT_CB_IDX: Transport callback index. 421 * @LEAPRAID_SAS_CTRL_CB_IDX: SAS controller callback index. 422 * @LEAPRAID_ENC_CB_IDX: Encryption callback index. 423 * @LEAPRAID_NOTIFY_EVENT_CB_IDX: Notify event callback index. 424 * @LEAPRAID_CTL_CB_IDX: Control callback index. 425 * @LEAPRAID_TM_CB_IDX: Task management callback index. 426 */ 427 enum LEAPRAID_CB_INDEX { 428 LEAPRAID_SCAN_DEV_CB_IDX = 0x1, 429 LEAPRAID_CONFIG_CB_IDX = 0x2, 430 LEAPRAID_TRANSPORT_CB_IDX = 0x3, 431 LEAPRAID_SAS_CTRL_CB_IDX = 0x5, 432 LEAPRAID_ENC_CB_IDX = 0x6, 433 LEAPRAID_NOTIFY_EVENT_CB_IDX = 0x7, 434 LEAPRAID_CTL_CB_IDX = 0x8, 435 LEAPRAID_TM_CB_IDX = 0x9, 436 LEAPRAID_NUM_CB_IDXS 437 }; 438 439 /** 440 * struct leapraid_default_reply - Default reply frame buffer 441 * @pad: Raw reply data buffer returned by firmware. 442 * 443 * This structure represents a generic reply frame used by the firmware 444 * when no specific reply format is required. The buffer size is defined 445 * by LEAPRAID_REPLY_SIZE and stores the raw reply data. 446 */ 447 struct leapraid_default_reply { 448 u8 pad[LEAPRAID_REPLY_SIZE]; 449 }; 450 451 /** 452 * struct leapraid_sense_buffer - SCSI sense data buffer 453 * @pad: Buffer used to store sense data returned by a SCSI command. 454 * 455 * This buffer holds the sense data provided by a device.The size is 456 * defined by SCSI_SENSE_BUFFERSIZE. 457 */ 458 struct leapraid_sense_buffer { 459 u8 pad[SCSI_SENSE_BUFFERSIZE]; 460 }; 461 462 /** 463 * struct leapraid_driver_cmd - Driver command tracking structure 464 * 465 * @reply: Default reply structure returned by the adapter. 466 * @done: Completion object used to signal command completion. 467 * @status: Status code returned by the firmware. 468 * @taskid: Unique task identifier for this command. 469 * @hp_taskid: Task identifier for high-priority commands. 470 * @inter_taskid: Task identifier for internal commands. 471 * @cb_idx: Callback index used to identify completion context. 472 * @async_scan_dev: True if this command is for asynchronous device scan. 473 * @sense: Sense buffer holding error information from device. 474 * @mutex: Mutex to protect access to this command structure. 475 * @list: List node for linking driver commands into lists. 476 */ 477 struct leapraid_driver_cmd { 478 struct leapraid_default_reply reply; 479 struct completion done; 480 u16 status; 481 u16 taskid; 482 u16 hp_taskid; 483 u16 inter_taskid; 484 u8 cb_idx; 485 u8 async_scan_dev; 486 struct leapraid_sense_buffer sense; 487 struct mutex mutex; /* Mutex for driver cmd */ 488 struct list_head list; 489 }; 490 491 /** 492 * struct leapraid_driver_cmds - Collection of driver command objects 493 * 494 * @special_cmd_list: List head for tracking special driver commands. 495 * @scan_dev_cmd: Command used for asynchronous device scan operations. 496 * @cfg_op_cmd: Command for configuration operations. 497 * @transport_cmd: Command for transport-level operations. 498 * @enc_cmd: Command for enclosure management operations. 499 * @notify_event_cmd: Command for asynchronous event notification handling. 500 * @ctl_cmd: Command for generic control or maintenance operations. 501 * @tm_cmd: Task management command. 502 */ 503 struct leapraid_driver_cmds { 504 struct list_head special_cmd_list; 505 struct leapraid_driver_cmd scan_dev_cmd; 506 struct leapraid_driver_cmd cfg_op_cmd; 507 struct leapraid_driver_cmd transport_cmd; 508 struct leapraid_driver_cmd enc_cmd; 509 struct leapraid_driver_cmd notify_event_cmd; 510 struct leapraid_driver_cmd ctl_cmd; 511 struct leapraid_driver_cmd tm_cmd; 512 }; 513 514 /** 515 * struct leapraid_dynamic_task_desc - Dynamic task descriptor 516 * 517 * @task_lock: Spinlock to protect concurrent access. 518 * @hp_taskid: Current high-priority task ID. 519 * @hp_cmd_qd: Fixed command queue depth for high-priority tasks. 520 * @inter_taskid: Current internal task ID. 521 * @inter_cmd_qd: Fixed command queue depth for internal tasks. 522 */ 523 struct leapraid_dynamic_task_desc { 524 spinlock_t task_lock; /* protects dynamic task */ 525 u16 hp_taskid; 526 u16 hp_cmd_qd; 527 u16 inter_taskid; 528 u16 inter_cmd_qd; 529 }; 530 531 /** 532 * struct leapraid_fw_evt_work - Firmware event work structure 533 * 534 * @list: Linked list node for queuing the work. 535 * @adapter: Pointer to the associated LeapRAID adapter. 536 * @work: Work structure used by the kernel workqueue. 537 * @refcnt: Reference counter for managing the lifetime of this work. 538 * @evt_data: Pointer to firmware event data. 539 * @dev_handle: Device handle associated with the event. 540 * @evt_type: Type of firmware event. 541 * @ignore: Flag indicating whether the event should be ignored. 542 */ 543 struct leapraid_fw_evt_work { 544 struct list_head list; 545 struct leapraid_adapter *adapter; 546 struct work_struct work; 547 struct kref refcnt; 548 void *evt_data; 549 u16 dev_handle; 550 u16 evt_type; 551 u8 ignore; 552 }; 553 554 /** 555 * struct leapraid_fw_evt_struct - Firmware event handling structure 556 * 557 * @fw_evt_name: Name of the firmware event. 558 * @fw_evt_thread: Workqueue used for processing firmware events. 559 * @fw_evt_lock: Spinlock protecting access to the firmware event list. 560 * @fw_evt_list: Linked list of pending firmware events. 561 * @cur_evt: Pointer to the currently processing firmware event. 562 * @cur_evt_task: Task currently executing @cur_evt work. 563 * @fw_evt_cleanup: Flag indicating whether cleanup of events is in progress. 564 * @leapraid_evt_masks: Array of event masks for filtering firmware events. 565 */ 566 struct leapraid_fw_evt_struct { 567 u32 leapraid_evt_masks[4]; 568 char fw_evt_name[48]; 569 struct workqueue_struct *fw_evt_thread; 570 spinlock_t fw_evt_lock; /* protects firmware event */ 571 struct list_head fw_evt_list; 572 struct leapraid_fw_evt_work *cur_evt; 573 struct task_struct *cur_evt_task; 574 u8 fw_evt_cleanup; 575 }; 576 577 /** 578 * struct leapraid_rq - Represents a LeapRAID request queue 579 * 580 * @adapter: Pointer to the associated LeapRAID adapter. 581 * @msix_idx: MSI-X vector index used by this queue. 582 * @rep_post_host_idx: Index of the last processed reply descriptor. 583 * @rep_desc: Pointer to the reply descriptor associated with this queue. 584 * @name: Name of the request queue. 585 * @busy: Atomic counter indicating if the queue is busy. 586 */ 587 struct leapraid_rq { 588 struct leapraid_adapter *adapter; 589 u8 msix_idx; 590 u32 rep_post_host_idx; 591 union leapraid_rep_desc_union *rep_desc; 592 char name[LEAPRAID_NAME_LENGTH]; 593 atomic_t busy; 594 }; 595 596 /** 597 * struct leapraid_int_rq - Internal request queue for a CPU 598 * 599 * @affinity_hint: CPU affinity mask for the queue. 600 * @rq: Underlying LeapRAID request queue structure. 601 */ 602 struct leapraid_int_rq { 603 cpumask_var_t affinity_hint; 604 struct leapraid_rq rq; 605 }; 606 607 /** 608 * struct leapraid_blk_mq_poll_rq - Polling request for LeapRAID blk-mq 609 * 610 * @busy: Atomic flag indicating request is being processed. 611 * @pause: Atomic flag to temporarily suspend polling. 612 * @rq: The underlying LeapRAID request structure. 613 */ 614 struct leapraid_blk_mq_poll_rq { 615 atomic_t busy; 616 atomic_t pause; 617 struct leapraid_rq rq; 618 }; 619 620 /** 621 * struct leapraid_notification_desc - Notification descriptor for LeapRAID 622 * 623 * @iopoll_qdex: Index of the I/O polling queue. 624 * @iopoll_qcnt: Count of I/O polling queues. 625 * @msix_enable: Flag indicating MSI-X is enabled. 626 * @irq_vectors_allocated: Flag indicating PCI IRQ vectors are allocated. 627 * @irq_mode: Actual interrupt mode used for allocated PCI IRQ vectors. 628 * @msix_cpu_map: CPU-ID indexed MSI-X queue map. 629 * @msix_cpu_map_sz: Number of CPU-ID slots allocated in @msix_cpu_map. 630 * @int_rqs: Array of interrupt request queues. 631 * @int_rqs_allocated: Count of allocated interrupt request queues. 632 * @blk_mq_poll_rqs: Array of blk-mq polling requests. 633 */ 634 struct leapraid_notification_desc { 635 u32 iopoll_qdex; 636 u32 iopoll_qcnt; 637 u8 msix_enable; 638 u8 irq_vectors_allocated; 639 u8 irq_mode; 640 u8 *msix_cpu_map; 641 u32 msix_cpu_map_sz; 642 struct leapraid_int_rq *int_rqs; 643 u32 int_rqs_allocated; 644 struct leapraid_blk_mq_poll_rq *blk_mq_poll_rqs; 645 }; 646 647 /** 648 * struct leapraid_overheat_desc - Overheat descriptor for LeapRAID 649 * 650 * @fault_overheat_wq: Workqueue for adapter thermal overheat operations. 651 * @fault_overheat_work: Work structure for thermal overheat. 652 * @thermal_alert: Flag indicating if adapter thermal alert is active. 653 * @fault_overheat_wq_name: Name of the fault overheat workqueue. 654 */ 655 struct leapraid_overheat_desc { 656 struct workqueue_struct *fault_overheat_wq; 657 struct work_struct fault_overheat_work; 658 atomic_t thermal_alert; 659 char fault_overheat_wq_name[48]; 660 }; 661 662 /** 663 * struct leapraid_reset_desc - Reset descriptor for LeapRAID 664 * 665 * @fault_reset_wq: Workqueue for fault reset operations. 666 * @fault_reset_work: Delayed work structure for fault reset. 667 * @fault_reset_wq_name: Name of the fault reset workqueue. 668 * @host_diag_mutex: Mutex for host diagnostic operations. 669 * @adapter_reset_lock: Spinlock for adapter reset operations. 670 * @adapter_reset_mutex: Mutex for adapter reset operations. 671 * @adapter_link_resetting: Flag indicating if adapter link is resetting. 672 * @adapter_reset_results: Results of the adapter reset operation. 673 * @pending_io_cnt: Count of pending I/O operations. 674 * @reset_wait_queue: Wait queue for reset operations. 675 * @reset_cnt: Counter for reset operations. 676 */ 677 struct leapraid_reset_desc { 678 struct workqueue_struct *fault_reset_wq; 679 struct delayed_work fault_reset_work; 680 char fault_reset_wq_name[48]; 681 struct mutex host_diag_mutex; /* Mutex for operations. */ 682 spinlock_t adapter_reset_lock; /* Protects adapter reset state. */ 683 struct mutex adapter_reset_mutex; /* Serializes adapter reset. */ 684 u8 adapter_link_resetting; 685 int adapter_reset_results; 686 int pending_io_cnt; 687 wait_queue_head_t reset_wait_queue; 688 u32 reset_cnt; 689 }; 690 691 /** 692 * struct leapraid_scan_dev_desc - Scan device descriptor for LeapRAID 693 * 694 * @wait_scan_dev_done: Flag indicating if scan device operation is done. 695 * @driver_loading: Flag indicating if driver is loading. 696 * @first_scan_dev_fired: Flag indicating if first scan device operation fired. 697 * @scan_dev_failed: Flag indicating if scan device operation failed. 698 * @scan_start: Flag indicating if scan operation started. 699 * @scan_start_failed: Count of failed scan start operations. 700 */ 701 struct leapraid_scan_dev_desc { 702 u8 wait_scan_dev_done; 703 u8 driver_loading; 704 wait_queue_head_t wait_driver_loading; 705 u8 first_scan_dev_fired; 706 u8 scan_dev_failed; 707 u8 scan_start; 708 u16 scan_start_failed; 709 }; 710 711 /** 712 * struct leapraid_access_ctrl - Access control structure for LeapRAID 713 * 714 * @pci_access_lock: Mutex for PCI access control. 715 * @shost_recovering: Flag indicating if host is recovering. 716 * @shost_recover_async: Flag indicating if host is recovering 717 * and the 0xFFFF event. 718 * @shost_recover_wq: Wait queue for threads waiting on shost_recover_async. 719 * @host_removing: Flag indicating if host is being removed. 720 * @pcie_recovering: Flag indicating if PCIe is recovering. 721 */ 722 struct leapraid_access_ctrl { 723 struct mutex pci_access_lock; /* serializes PCI register access. */ 724 u8 shost_recovering; 725 wait_queue_head_t recovery_waitq; 726 u8 shost_recover_async; 727 wait_queue_head_t shost_recover_wq; 728 u8 host_removing; 729 u8 pcie_recovering; 730 }; 731 732 /** 733 * struct leapraid_fw_log_desc - Firmware log descriptor for LeapRAID 734 * 735 * @fw_log_buffer: Buffer for firmware log data. 736 * @fw_log_buffer_dma: DMA address of the firmware log buffer. 737 * @fw_log_wq_name: Name of the firmware log workqueue. 738 * @fw_log_wq: Workqueue for firmware log operations. 739 * @fw_log_work: Delayed work structure for firmware log. 740 * @open_pcie_trace: Flag indicating if PCIe tracing is open. 741 * @fw_log_init_flag: Flag indicating if firmware log is initialized. 742 * @mmap_refcnt: Number of active user VMAs on fw_log_buffer. 743 * @mmap_waitq: Waitqueue for fw_log_buffer VMA teardown. 744 */ 745 struct leapraid_fw_log_desc { 746 u8 *fw_log_buffer; 747 dma_addr_t fw_log_buffer_dma; 748 char fw_log_wq_name[48]; 749 struct workqueue_struct *fw_log_wq; 750 struct delayed_work fw_log_work; 751 int open_pcie_trace; 752 int fw_log_init_flag; 753 atomic_t mmap_refcnt; 754 wait_queue_head_t mmap_waitq; 755 }; 756 757 #define LEAPRAID_CARD_PORT_FLG_DIRTY 0x01 758 #define LEAPRAID_CARD_PORT_FLG_NEW 0x02 759 #define LEAPRAID_DISABLE_MP_PORT_ID 0xFF 760 /** 761 * struct leapraid_card_port - Card port structure for LeapRAID 762 * 763 * @list: List head for card port. 764 * @vphys_list: List head for virtual PHY list. 765 * @port_id: Port ID. 766 * @sas_address: SAS address. 767 * @phy_mask: Mask of PHY. 768 * @vphys_mask: Mask of virtual PHY. 769 * @flg: Flags for the port. 770 */ 771 struct leapraid_card_port { 772 struct list_head list; 773 struct list_head vphys_list; 774 u8 port_id; 775 u64 sas_address; 776 u32 phy_mask; 777 u32 vphys_mask; 778 u8 flg; 779 }; 780 781 /** 782 * struct leapraid_card_phy - Card PHY structure for LeapRAID 783 * 784 * @port_siblings: List head for port siblings. 785 * @card_port: Pointer to the card port. 786 * @identify: SAS identify structure. 787 * @remote_identify: Remote SAS identify structure. 788 * @phy: SAS PHY structure. 789 * @phy_id: PHY ID. 790 * @hdl: Handle for the port. 791 * @attached_hdl: Handle for the attached port. 792 * @phy_is_assigned: Flag indicating if PHY is assigned. 793 * @vphy: Flag indicating if virtual PHY. 794 */ 795 struct leapraid_card_phy { 796 struct list_head port_siblings; 797 struct leapraid_card_port *card_port; 798 struct sas_identify identify; 799 struct sas_identify remote_identify; 800 struct sas_phy *phy; 801 u8 phy_id; 802 u16 hdl; 803 u16 attached_hdl; 804 u8 phy_is_assigned; 805 u8 vphy; 806 }; 807 808 /** 809 * struct leapraid_topo_node - SAS topology node for LeapRAID 810 * 811 * @list: List head for linking nodes. 812 * @sas_port_list: List of SAS ports. 813 * @card_port: Associated card port. 814 * @card_phy: Associated card PHY. 815 * @rphy: SAS remote PHY device. 816 * @parent_dev: Parent device pointer. 817 * @sas_address: SAS address of this node. 818 * @sas_address_parent: Parent node's SAS address. 819 * @phys_num: Number of physical links. 820 * @hdl: Handle identifier. 821 * @enc_hdl: Enclosure handle. 822 * @enc_lid: Enclosure logical identifier. 823 * @resp: Response status flag. 824 */ 825 struct leapraid_topo_node { 826 struct list_head list; 827 struct list_head sas_port_list; 828 struct leapraid_card_port *card_port; 829 struct leapraid_card_phy *card_phy; 830 struct sas_rphy *rphy; 831 struct device *parent_dev; 832 u64 sas_address; 833 u64 sas_address_parent; 834 u8 phys_num; 835 u16 hdl; 836 u16 enc_hdl; 837 u64 enc_lid; 838 u8 resp; 839 }; 840 841 /** 842 * struct leapraid_dev_topo - LeapRAID device topology management structure 843 * 844 * @topo_node_lock: Spinlock for protecting topology node operations. 845 * @sas_dev_lock: Spinlock for SAS device list access. 846 * @raid_volume_lock: Spinlock for RAID volume list access. 847 * @enc_lock: Spinlock for enclosure device list access. 848 * @sas_id: SAS domain identifier. 849 * @card: Main card topology node. 850 * @exp_list: List of expander devices. 851 * @enc_list: List of enclosure devices. 852 * @sas_dev_list: List of SAS devices. 853 * @sas_dev_init_list: List of SAS devices being initialized. 854 * @raid_volume_list: List of RAID volumes. 855 * @card_port_list: List of card ports. 856 * @pd_hdls: Array of physical disk handles. 857 * @blocking_hdls: Array of blocking handles. 858 */ 859 struct leapraid_dev_topo { 860 spinlock_t topo_node_lock; /* Protects topology node. */ 861 spinlock_t sas_dev_lock; /* Protects SAS device list access. */ 862 spinlock_t raid_volume_lock; /* Protects RAID volume list access. */ 863 spinlock_t enc_lock; /* Protects enclosure device list access. */ 864 int sas_id; 865 struct leapraid_topo_node card; 866 struct list_head exp_list; 867 struct list_head enc_list; 868 struct list_head sas_dev_list; 869 struct list_head sas_dev_init_list; 870 struct list_head raid_volume_list; 871 struct list_head card_port_list; 872 u16 pd_hdls_sz; 873 unsigned long *pd_hdls; 874 unsigned long *blocking_hdls; 875 }; 876 877 /** 878 * struct leapraid_boot_dev - Boot device structure for LeapRAID 879 * 880 * @dev: Device pointer. 881 * @chnl: Channel number. 882 * @form: Form factor. 883 * @pg_dev: Config page device content. 884 */ 885 struct leapraid_boot_dev { 886 void *dev; 887 u8 chnl; 888 u8 form; 889 u8 pg_dev[24]; 890 }; 891 892 /** 893 * struct leapraid_boot_devs - Boot device management structure 894 * 895 * @lock: Spinlock protecting boot device cache access. 896 * @requested_boot_dev: Requested primary boot device. 897 * @requested_alt_boot_dev: Requested alternate boot device. 898 * @current_boot_dev: Currently active boot device. 899 */ 900 struct leapraid_boot_devs { 901 spinlock_t lock; /* protects boot dev */ 902 struct leapraid_boot_dev requested_boot_dev; 903 struct leapraid_boot_dev requested_alt_boot_dev; 904 struct leapraid_boot_dev current_boot_dev; 905 }; 906 907 /** 908 * struct leapraid_adapter - Main LeapRAID adapter structure 909 * 910 * @list: List head for adapter management. 911 * @shost: SCSI host structure. 912 * @pdev: PCI device structure. 913 * @iomem_base: I/O memory mapped base address. 914 * @rep_msg_host_idx: Host index for reply messages. 915 * @mask_int: Interrupt masking flag. 916 * @adapter_attr: Adapter attributes. 917 * @mem_desc: Memory descriptor. 918 * @driver_cmds: Driver commands. 919 * @dynamic_task_desc: Dynamic task descriptor. 920 * @fw_evt_s: Firmware event structure. 921 * @notification_desc: Notification descriptor. 922 * @reset_desc: Reset descriptor. 923 * @scan_dev_desc: Device scan descriptor. 924 * @access_ctrl: Access control. 925 * @fw_log_desc: Firmware log descriptor. 926 * @dev_topo: Device topology. 927 * @boot_devs: Boot devices. 928 * @overheat_desc: Overheat processing descriptor. 929 */ 930 struct leapraid_adapter { 931 struct list_head list; 932 struct Scsi_Host *shost; 933 struct pci_dev *pdev; 934 struct leapraid_reg_base __iomem *iomem_base; 935 u32 rep_msg_host_idx; 936 u8 mask_int; 937 938 struct leapraid_adapter_attr adapter_attr; 939 struct leapraid_mem_desc mem_desc; 940 struct leapraid_driver_cmds driver_cmds; 941 struct leapraid_dynamic_task_desc dynamic_task_desc; 942 struct leapraid_fw_evt_struct fw_evt_s; 943 struct leapraid_notification_desc notification_desc; 944 struct leapraid_reset_desc reset_desc; 945 struct leapraid_scan_dev_desc scan_dev_desc; 946 struct leapraid_access_ctrl access_ctrl; 947 struct leapraid_fw_log_desc fw_log_desc; 948 struct leapraid_dev_topo dev_topo; 949 struct leapraid_boot_devs boot_devs; 950 struct leapraid_overheat_desc overheat_desc; 951 }; 952 953 union cfg_param_1 { 954 u32 form; 955 u32 size; 956 u32 phy_number; 957 }; 958 959 union cfg_param_2 { 960 u32 handle; 961 u32 form_specific; 962 }; 963 964 enum config_page_action { 965 GET_BIOS_PG2, 966 GET_BIOS_PG3, 967 GET_MANUFACTURING_PG0, 968 GET_SAS_DEVICE_PG0, 969 GET_SAS_IOUNIT_PG0, 970 GET_SAS_IOUNIT_PG1, 971 GET_SAS_EXPANDER_PG0, 972 GET_SAS_EXPANDER_PG1, 973 GET_SAS_ENCLOSURE_PG0, 974 GET_PHY_PG0, 975 GET_RAID_VOLUME_PG0, 976 GET_RAID_VOLUME_PG1, 977 GET_PHY_DISK_PG0, 978 }; 979 980 /** 981 * struct leapraid_enc_node - Enclosure node structure 982 * 983 * @list: List head for enclosure management. 984 * @pg0: Enclosure page 0 data. 985 */ 986 struct leapraid_enc_node { 987 struct list_head list; 988 struct leapraid_enc_p0 pg0; 989 }; 990 991 /** 992 * struct leapraid_raid_volume - RAID volume structure 993 * 994 * @list: List head for volume management. 995 * @refcnt: Reference count. 996 * @starget: SCSI target structure. 997 * @sdev: SCSI device structure. 998 * @id: Volume ID. 999 * @channel: SCSI channel. 1000 * @wwid: World wide Identifier. 1001 * @hdl: Volume handle. 1002 * @vol_type: Volume type. 1003 * @pd_num: Number of physical disks. 1004 * @resp: Response status. 1005 * @dev_info: Device information. 1006 */ 1007 struct leapraid_raid_volume { 1008 struct list_head list; 1009 struct kref refcnt; 1010 struct scsi_target *starget; 1011 struct scsi_device *sdev; 1012 unsigned int id; 1013 unsigned int channel; 1014 u64 wwid; 1015 u16 hdl; 1016 u8 vol_type; 1017 u8 pd_num; 1018 u8 resp; 1019 u32 dev_info; 1020 }; 1021 1022 static inline void leapraid_raid_volume_free(struct kref *ref) 1023 { 1024 kfree(container_of(ref, struct leapraid_raid_volume, refcnt)); 1025 } 1026 1027 #define leapraid_raid_volume_get(volume) \ 1028 kref_get(&(volume)->refcnt) 1029 #define leapraid_raid_volume_put(volume) \ 1030 kref_put(&(volume)->refcnt, leapraid_raid_volume_free) 1031 1032 #define LEAPRAID_TGT_FLG_RAID_MEMBER 0x01 1033 #define LEAPRAID_TGT_FLG_VOLUME 0x02 1034 #define LEAPRAID_NO_ULD_ATTACH 1 1035 /** 1036 * struct leapraid_starget_priv - SCSI target private data 1037 * 1038 * @starget: SCSI target structure. 1039 * @sas_address: SAS address. 1040 * @hdl: Device handle. 1041 * @num_luns: Number of LUNs. 1042 * @flg: Flags. 1043 * @deleted: Deletion flag. 1044 * @tm_busy: Task management busy flag. 1045 * @card_port: Associated card port. 1046 * @sas_dev: SAS device structure. 1047 */ 1048 struct leapraid_starget_priv { 1049 struct scsi_target *starget; 1050 u64 sas_address; 1051 u16 hdl; 1052 int num_luns; 1053 u32 flg; 1054 u8 deleted; 1055 u8 tm_busy; 1056 struct leapraid_card_port *card_port; 1057 struct leapraid_sas_dev *sas_dev; 1058 }; 1059 1060 #define LEAPRAID_DEVICE_FLG_INIT 0x01 1061 /** 1062 * struct leapraid_sdev_priv - SCSI device private data 1063 * 1064 * @starget_priv: Associated target private data. 1065 * @lun: Logical Unit Number. 1066 * @flg: Flags. 1067 * @ncq_prio_enable: Enables NCQ command priority for RT I/O. 1068 * @block: Block flag. 1069 * @deleted: Deletion flag. 1070 * @sep: SEP flag. 1071 */ 1072 struct leapraid_sdev_priv { 1073 struct leapraid_starget_priv *starget_priv; 1074 unsigned int lun; 1075 u32 flg; 1076 u8 ncq_prio_enable; 1077 u8 block; 1078 u8 deleted; 1079 u8 sep; 1080 }; 1081 1082 /** 1083 * struct leapraid_sas_dev - SAS device structure 1084 * 1085 * @list: List head for device management. 1086 * @starget: SCSI target structure. 1087 * @card_port: Associated card port. 1088 * @rphy: SAS remote PHY. 1089 * @refcnt: Reference count. 1090 * @id: Device ID. 1091 * @channel: SCSI channel. 1092 * @slot: Slot number. 1093 * @phy: PHY identifier. 1094 * @resp: Response status. 1095 * @led_on: LED state. 1096 * @sas_addr: SAS address. 1097 * @dev_name: Device name. 1098 * @hdl: Device handle. 1099 * @parent_sas_addr: Parent SAS address. 1100 * @enc_hdl: Enclosure handle. 1101 * @enc_lid: Enclosure logical ID. 1102 * @volume_hdl: Volume handle. 1103 * @volume_wwid: Volume WWID. 1104 * @dev_info: Device information. 1105 * @pend_sas_rphy_add: Pending SAS remote PHY addition flag. 1106 * @enc_level: Enclosure level. 1107 * @port_connection: Port connection. 1108 * @connector_name: Connector name. 1109 */ 1110 struct leapraid_sas_dev { 1111 struct list_head list; 1112 struct scsi_target *starget; 1113 struct leapraid_card_port *card_port; 1114 struct sas_rphy *rphy; 1115 struct kref refcnt; 1116 unsigned int id; 1117 unsigned int channel; 1118 u16 slot; 1119 u8 phy; 1120 u8 resp; 1121 u8 led_on; 1122 u64 sas_addr; 1123 u64 dev_name; 1124 u16 hdl; 1125 u64 parent_sas_addr; 1126 u16 enc_hdl; 1127 u64 enc_lid; 1128 u16 volume_hdl; 1129 u64 volume_wwid; 1130 u32 dev_info; 1131 u8 pend_sas_rphy_add; 1132 u8 enc_level; 1133 u8 port_connection; 1134 u8 connector_name[LEAPRAID_SAS_DEV_P0_CON_NAME_LEN + 1]; 1135 }; 1136 1137 static inline void leapraid_sdev_free(struct kref *ref) 1138 { 1139 kfree(container_of(ref, struct leapraid_sas_dev, refcnt)); 1140 } 1141 1142 #define leapraid_sdev_get(sdev) kref_get(&(sdev)->refcnt) 1143 #define leapraid_sdev_put(sdev) kref_put(&(sdev)->refcnt, leapraid_sdev_free) 1144 1145 void leapraid_boot_dev_get(void *dev, u32 chnl); 1146 void leapraid_boot_dev_put(void *dev, u32 chnl); 1147 1148 /** 1149 * struct leapraid_sas_port - SAS port structure 1150 * 1151 * @port_list: List head for port management. 1152 * @phy_list: List of PHYs in this port. 1153 * @port: SAS port structure. 1154 * @card_port: Associated card port. 1155 * @remote_identify: Remote device identification. 1156 * @rphy: SAS remote PHY. 1157 * @phys_num: Number of PHYs in this port. 1158 */ 1159 struct leapraid_sas_port { 1160 struct list_head port_list; 1161 struct list_head phy_list; 1162 struct sas_port *port; 1163 struct leapraid_card_port *card_port; 1164 struct sas_identify remote_identify; 1165 struct sas_rphy *rphy; 1166 u8 phys_num; 1167 }; 1168 1169 #define LEAPRAID_VPHY_FLG_DIRTY 0x01 1170 /** 1171 * struct leapraid_vphy - Virtual PHY structure 1172 * 1173 * @list: List head for PHY management. 1174 * @sas_address: SAS address. 1175 * @phy_mask: PHY mask. 1176 * @flg: Flags. 1177 */ 1178 struct leapraid_vphy { 1179 struct list_head list; 1180 u64 sas_address; 1181 u32 phy_mask; 1182 u8 flg; 1183 }; 1184 1185 /** 1186 * struct leapraid_tgt_rst_list - Target reset tracking entry 1187 * @list: List node used to link reset entries. 1188 * @handle: Device handle of the target being reset. 1189 * @state: Current state of the target reset operation. 1190 * 1191 * Each entry represents a target device that is undergoing or has 1192 * undergone a target reset operation. 1193 */ 1194 struct leapraid_tgt_rst_list { 1195 struct list_head list; 1196 u16 handle; 1197 u16 state; 1198 }; 1199 1200 /** 1201 * struct sense_info - Parsed SCSI sense information 1202 * @sense_key: Sense key extracted from sense data. 1203 * @asc: Additional Sense Code (ASC). 1204 * @ascq: Additional Sense Code Qualifier (ASCQ). 1205 * 1206 * This structure stores key fields parsed from SCSI sense data to 1207 * simplify error handling and reporting. 1208 */ 1209 struct sense_info { 1210 u8 sense_key; 1211 u8 asc; 1212 u8 ascq; 1213 }; 1214 1215 /** 1216 * struct leapraid_fw_log_info - Firmware log position information 1217 * @user_position: Current log read position used by the driver. 1218 * @adapter_position: Current log write position maintained by firmware. 1219 * 1220 * This structure tracks firmware log buffer positions used for retrieving 1221 * log entries from the adapter. 1222 */ 1223 struct leapraid_fw_log_info { 1224 u32 user_position; 1225 u32 adapter_position; 1226 }; 1227 1228 /** 1229 * enum reset_type - Reset type enumeration 1230 * 1231 * @FULL_RESET: Full hardware reset. 1232 * @PART_RESET: Partial reset. 1233 */ 1234 enum reset_type { 1235 FULL_RESET, 1236 PART_RESET, 1237 }; 1238 1239 enum leapraid_card_port_checking_flg { 1240 CARD_PORT_FURTHER_CHECKING_NEEDED = 0, 1241 CARD_PORT_SKIP_CHECKING, 1242 }; 1243 1244 enum leapraid_port_checking_state { 1245 NEW_CARD_PORT = 0, 1246 SAME_PORT_WITH_NOTHING_CHANGED, 1247 SAME_PORT_WITH_PARTIALLY_CHANGED_PHYS, 1248 SAME_ADDR_WITH_PARTIALLY_CHANGED_PHYS, 1249 SAME_ADDR_ONLY, 1250 }; 1251 1252 /** 1253 * struct leapraid_card_port_feature - Card port feature 1254 * 1255 * @dirty_flg: Dirty flag indicator. 1256 * @same_addr: Same address flag. 1257 * @exact_phy: Exact PHY match flag. 1258 * @phy_overlap: PHY overlap bitmap. 1259 * @same_port: Same port flag. 1260 * @cur_chking_old_port: Current checking old port. 1261 * @expected_old_port: Expected old port. 1262 * @same_addr_port_count: Same address port count. 1263 * @checking_state: Port checking state. 1264 */ 1265 struct leapraid_card_port_feature { 1266 u8 dirty_flg; 1267 u8 same_addr; 1268 u8 exact_phy; 1269 u32 phy_overlap; 1270 u8 same_port; 1271 struct leapraid_card_port *cur_chking_old_port; 1272 struct leapraid_card_port *expected_old_port; 1273 int same_addr_port_count; 1274 enum leapraid_port_checking_state checking_state; 1275 }; 1276 1277 #define SMP_REPORT_MANUFACTURER_INFORMATION_FRAME_TYPE 0x40 1278 #define SMP_REPORT_MANUFACTURER_INFORMATION_FUNC 0x01 1279 1280 /** 1281 * ref: SAS-2(INCITS 457-2010) 10.4.3.5 1282 */ 1283 struct leapraid_rep_manu_request { 1284 u8 smp_frame_type; 1285 u8 function; 1286 u8 allocated_response_length; 1287 u8 request_length; 1288 }; 1289 1290 /** 1291 * ref: SAS-2(INCITS 457-2010) 10.4.3.5 1292 */ 1293 struct leapraid_rep_manu_reply { 1294 u8 smp_frame_type; 1295 u8 function; 1296 u8 function_result; 1297 u8 response_length; 1298 u16 expander_change_count; 1299 u8 r1[2]; 1300 u8 sas_format; 1301 u8 r2[3]; 1302 u8 vendor_identification[SAS_EXPANDER_VENDOR_ID_LEN]; 1303 u8 product_identification[SAS_EXPANDER_PRODUCT_ID_LEN]; 1304 u8 product_revision_level[SAS_EXPANDER_PRODUCT_REV_LEN]; 1305 u8 comp_vendor_identification[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN]; 1306 u16 component_id; 1307 u8 component_revision_level; 1308 u8 r3; 1309 u8 vendor_specific[8]; 1310 }; 1311 1312 extern struct list_head leapraid_adapter_list; 1313 extern spinlock_t leapraid_adapter_lock; 1314 extern char driver_name[LEAPRAID_NAME_LENGTH]; 1315 1316 int leapraid_ctrl_init(struct leapraid_adapter *adapter); 1317 void leapraid_remove_ctrl(struct leapraid_adapter *adapter); 1318 void leapraid_check_scheduled_fault_start(struct leapraid_adapter *adapter); 1319 void leapraid_check_scheduled_fault_stop(struct leapraid_adapter *adapter); 1320 void leapraid_fw_log_start(struct leapraid_adapter *adapter); 1321 void leapraid_fw_log_stop(struct leapraid_adapter *adapter); 1322 int leapraid_set_pcie_and_notification(struct leapraid_adapter *adapter); 1323 void leapraid_disable_controller(struct leapraid_adapter *adapter); 1324 int leapraid_hard_reset_handler(struct leapraid_adapter *adapter, 1325 enum reset_type type); 1326 void leapraid_mask_int(struct leapraid_adapter *adapter); 1327 void leapraid_unmask_int(struct leapraid_adapter *adapter); 1328 u32 leapraid_get_adapter_state(struct leapraid_adapter *adapter); 1329 bool leapraid_pci_removed(struct leapraid_adapter *adapter); 1330 int leapraid_check_adapter_is_op(struct leapraid_adapter *adapter, int wait, 1331 const char *caller); 1332 void *leapraid_get_task_desc(struct leapraid_adapter *adapter, u16 taskid); 1333 void *leapraid_get_sense_buffer(struct leapraid_adapter *adapter, u16 taskid); 1334 __le32 leapraid_get_sense_buffer_dma(struct leapraid_adapter *adapter, 1335 u16 taskid); 1336 void *leapraid_get_reply_vaddr(struct leapraid_adapter *adapter, 1337 u32 phys_addr); 1338 u16 leapraid_alloc_scsiio_taskid(struct leapraid_adapter *adapter, 1339 struct scsi_cmnd *scmd); 1340 void leapraid_free_taskid(struct leapraid_adapter *adapter, u16 taskid); 1341 struct leapraid_io_req_tracker *leapraid_get_io_tracker_from_taskid( 1342 struct leapraid_adapter *adapter, u16 taskid); 1343 struct scsi_cmnd *leapraid_get_scmd_from_taskid( 1344 struct leapraid_adapter *adapter, u16 taskid); 1345 int leapraid_scan_dev(struct leapraid_adapter *adapter, bool async_scan_dev); 1346 void leapraid_scan_dev_done(struct leapraid_adapter *adapter); 1347 void leapraid_cleanup_lists(struct leapraid_adapter *adapter); 1348 void leapraid_wait_cmds_done(struct leapraid_adapter *adapter); 1349 void leapraid_clean_active_scsi_cmds(struct leapraid_adapter *adapter); 1350 void leapraid_sync_irqs(struct leapraid_adapter *adapter, bool poll); 1351 int leapraid_rep_queue_handler(struct leapraid_rq *rq); 1352 int leapraid_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num); 1353 void leapraid_mq_polling_pause(struct leapraid_adapter *adapter); 1354 void leapraid_mq_polling_resume(struct leapraid_adapter *adapter); 1355 void leapraid_set_tm_flg(struct leapraid_adapter *adapter, u16 handle); 1356 void leapraid_clear_tm_flg(struct leapraid_adapter *adapter, u16 handle); 1357 void leapraid_async_turn_on_led(struct leapraid_adapter *adapter, u16 handle); 1358 int leapraid_issue_locked_tm(struct leapraid_adapter *adapter, u16 handle, 1359 uint channel, uint id, uint lun, u8 type, 1360 u16 taskid_task, u8 tr_method); 1361 int leapraid_issue_tm(struct leapraid_adapter *adapter, u16 handle, 1362 uint channel, uint id, uint lun, u8 type, 1363 u16 taskid_task, u8 tr_method); 1364 bool leapraid_scsiio_done(struct leapraid_adapter *adapter, u16 taskid, 1365 u8 msix_index, u32 rep); 1366 int leapraid_get_volume_cap(struct leapraid_adapter *adapter, 1367 struct leapraid_raid_volume *raid_volume); 1368 int leapraid_internal_init_cmd_priv( 1369 struct leapraid_adapter *adapter, 1370 struct leapraid_io_req_tracker *io_tracker); 1371 void leapraid_internal_exit_cmd_priv( 1372 struct leapraid_adapter *adapter, 1373 struct leapraid_io_req_tracker *io_tracker); 1374 void leapraid_clean_active_fw_evt(struct leapraid_adapter *adapter); 1375 bool leapraid_scmd_find_by_lun(struct leapraid_adapter *adapter, 1376 uint id, unsigned int lun, uint channel); 1377 bool leapraid_scmd_find_by_tgt(struct leapraid_adapter *adapter, 1378 uint id, uint channel); 1379 struct leapraid_vphy *leapraid_get_vphy_by_phy(struct leapraid_card_port *port, 1380 u32 phy); 1381 struct leapraid_raid_volume *leapraid_raid_volume_find_by_id( 1382 struct leapraid_adapter *adapter, uint id, uint channel); 1383 struct leapraid_raid_volume *leapraid_raid_volume_find_by_hdl( 1384 struct leapraid_adapter *adapter, u16 handle); 1385 struct leapraid_topo_node *leapraid_exp_find_by_sas_address( 1386 struct leapraid_adapter *adapter, u64 sas_address, 1387 struct leapraid_card_port *port); 1388 struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_by_addr_and_rphy( 1389 struct leapraid_adapter *adapter, 1390 u64 sas_address, struct sas_rphy *rphy); 1391 struct leapraid_sas_dev *leapraid_get_sas_dev_by_addr( 1392 struct leapraid_adapter *adapter, u64 sas_address, 1393 struct leapraid_card_port *port); 1394 struct leapraid_sas_dev *leapraid_get_sas_dev_by_hdl( 1395 struct leapraid_adapter *adapter, u16 handle); 1396 struct leapraid_sas_dev *leapraid_get_sas_dev_from_tgt( 1397 struct leapraid_adapter *adapter, 1398 struct leapraid_starget_priv *tgt_priv); 1399 struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_from_tgt( 1400 struct leapraid_adapter *adapter, 1401 struct leapraid_starget_priv *tgt_priv); 1402 struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_by_hdl( 1403 struct leapraid_adapter *adapter, u16 handle); 1404 struct leapraid_sas_dev *leapraid_hold_lock_get_sas_dev_by_addr( 1405 struct leapraid_adapter *adapter, u64 sas_address, 1406 struct leapraid_card_port *port); 1407 struct leapraid_sas_dev *leapraid_get_next_sas_dev_from_init_list( 1408 struct leapraid_adapter *adapter); 1409 void leapraid_sas_dev_remove_by_sas_address( 1410 struct leapraid_adapter *adapter, 1411 u64 sas_address, struct leapraid_card_port *port); 1412 void leapraid_sas_dev_remove(struct leapraid_adapter *adapter, 1413 struct leapraid_sas_dev *sas_dev); 1414 void leapraid_raid_volume_remove(struct leapraid_adapter *adapter, 1415 struct leapraid_raid_volume *raid_volume); 1416 void leapraid_exp_rm(struct leapraid_adapter *adapter, 1417 u64 sas_address, struct leapraid_card_port *port); 1418 void leapraid_build_mpi_sg(struct leapraid_adapter *adapter, 1419 void *sge, dma_addr_t h2c_dma_addr, size_t h2c_size, 1420 dma_addr_t c2h_dma_addr, size_t c2h_size); 1421 void leapraid_build_ieee_nodata_sg(struct leapraid_adapter *adapter, 1422 void *sge); 1423 void leapraid_build_ieee_sg(struct leapraid_adapter *adapter, 1424 void *psge, dma_addr_t h2c_dma_addr, 1425 size_t h2c_size, dma_addr_t c2h_dma_addr, 1426 size_t c2h_size); 1427 int leapraid_build_scmd_ieee_sg(struct leapraid_adapter *adapter, 1428 struct scsi_cmnd *scmd, u16 taskid); 1429 void leapraid_fire_scsi_io(struct leapraid_adapter *adapter, 1430 u16 taskid, u16 handle); 1431 void leapraid_fire_hpr_task(struct leapraid_adapter *adapter, u16 taskid, 1432 u16 msix_task); 1433 void leapraid_fire_task(struct leapraid_adapter *adapter, u16 taskid); 1434 int leapraid_cfg_get_volume_hdl(struct leapraid_adapter *adapter, 1435 u16 pd_handle, u16 *volume_handle); 1436 int leapraid_cfg_get_volume_wwid(struct leapraid_adapter *adapter, 1437 u16 volume_handle, u64 *wwid); 1438 int leapraid_op_config_page(struct leapraid_adapter *adapter, 1439 void *cfgp, union cfg_param_1 cfgp1, 1440 union cfg_param_2 cfgp2, 1441 enum config_page_action cfg_op); 1442 void leapraid_log_req_context(struct leapraid_adapter *adapter, u16 smid, 1443 const void *req_data); 1444 1445 int leapraid_change_queue_depth(struct scsi_device *sdev, int qdepth); 1446 1447 int leapraid_ctl_release(struct inode *inode, struct file *filep); 1448 int leapraid_ctl_init(void); 1449 void leapraid_ctl_exit(void); 1450 1451 extern struct sas_function_template leapraid_transport_functions; 1452 extern struct scsi_transport_template *leapraid_transport_template; 1453 struct leapraid_sas_port *leapraid_transport_port_add( 1454 struct leapraid_adapter *adapter, u16 handle, u64 sas_address, 1455 struct leapraid_card_port *card_port); 1456 void leapraid_transport_port_remove(struct leapraid_adapter *adapter, 1457 u64 sas_address, u64 sas_address_parent, 1458 struct leapraid_card_port *card_port); 1459 void leapraid_transport_add_card_phy(struct leapraid_adapter *adapter, 1460 struct leapraid_card_phy *card_phy, 1461 struct leapraid_sas_phy_p0 *phy_pg0, 1462 struct device *parent_dev); 1463 int leapraid_transport_add_exp_phy(struct leapraid_adapter *adapter, 1464 struct leapraid_card_phy *card_phy, 1465 struct leapraid_exp_p1 *exp_pg1, 1466 struct device *parent_dev); 1467 void leapraid_transport_update_links(struct leapraid_adapter *adapter, 1468 u64 sas_address, u16 handle, 1469 u8 phy_number, u8 link_rate, 1470 struct leapraid_card_port *card_port); 1471 void leapraid_transport_detach_phy_to_port( 1472 struct leapraid_adapter *adapter, 1473 struct leapraid_topo_node *topo_node, 1474 struct leapraid_card_phy *card_phy); 1475 void leapraid_transport_attach_phy_to_port( 1476 struct leapraid_adapter *adapter, 1477 struct leapraid_topo_node *sas_node, 1478 struct leapraid_card_phy *card_phy, 1479 u64 sas_address, 1480 struct leapraid_card_port *card_port); 1481 enum scsi_qc_status leapraid_queuecommand(struct Scsi_Host *shost, 1482 struct scsi_cmnd *scmd); 1483 void leapraid_overheat_cleanup(struct leapraid_adapter *adapter); 1484 void leapraid_smart_fault_detect(struct leapraid_adapter *adapter, u16 hdl); 1485 1486 #endif /* LEAPRAID_FUNC_H_INCLUDED */ 1487