smartpqi(4)
β¨ smartpqi(4) β Microchip Smart Storage SCSI driver β¨
okay bestie, gather round π this is the manual page for smartpqi, a SCSI driver for Microchip Smart Storage controllers. It's a kernel interfaces manual page, so it's giving very much "the kernel's inner circle" energy. Let's get into it π«Ά
πΈ SYNOPSIS πΈ
modprobe smartpqi [disable_device_id_wildcards={0|1}]
[disable_heartbeat={0|1}]
[disable_ctrl_shutdown={0|1}]
[lockup_action={none|reboot|panic}]
[expose_ld_first={0|1}] [hide_vsep={0|1}]
[disable_managed_interrupts={0|1}]
[ctrl_ready_timeout={0|[30,1800]}]
like, yes, that's a lot of brackets. she contains multitudes π
π¦ DESCRIPTION π¦
So smartpqi is a SCSI driver for Microchip Smart Storage controllers. that's the whole vibe. iconic, honestly.
π« Supported ioctl() operations π«
Here's the tea: for compatibility with applications written for the cciss(4) and hpsa(4) drivers, many, but not all of the ioctl(2) operations that the hpsa driver supports are also supported by smartpqi. Read that again β many, but not all. don't come for me if your fave one isn't here π
The data structures used by these operations are described in the Linux kernel source file include/linux/cciss_ioctl.h. yes, go look. it's right there. iykyk πβ¨
CCISS_DEREGDISK,CCISS_REGNEWDISK,CCISS_REGNEWDβ okay so these three? they all do exactly the same thing, no cap. And that thing is: cause the driver to re-scan for new devices. This does exactly the same thing as writing to thesmartpqi-specific host rescan attribute. three names, one job. slay, i guess πCCISS_GETPCIINFOβ this one returns the PCI domain, bus, device, and function, plus the "board ID" (which is the PCI subsystem ID). cute lil identity card for your controller π³CCISS_GETDRIVVERβ this operation returns the driver version in four bytes, encoded as:
(major_version << 28) | (minor_version << 24) |
(release << 16) | revision
bit-shifting, bestie. it's giving computer science class but make it fashion π
CCISS_PASSTHRUβ allows BMIC and CISS commands to be passed through to the controller. passing notes in class, but make it firmware π
π Boot options π
these are the ones you hand to modprobe up there. let's go one by one, no skipping, i promised π«Ά
disable_device_id_wildcards={0|1}β disables support for device ID wildcards. The default value is0, which means wildcards are enabled. so like, leaving it alone = wildcards stay on, obviously πdisable_heartbeat={0|1}β disables support for the controller's heartbeat check. This parameter is used for debugging purposes. The default value is0(the controller's heartbeat check is enabled). yes she has a pulse πdisable_ctrl_shutdown={0|1}β disables support for shutting down the controller in the event of a controller lockup. The default value is0(controller will be shut down). so the default is "we DO shut it down", and1is "actually, don't" πlockup_action={none|reboot|panic}β specifies the action the driver takes when a controller lockup is detected. The default action isnone. Here's the breakdown:noneβ take controller offline onlyrebootβ reboot the system πpanicβ panic the system π
expose_ld_first={0|1}β this option exposes logical devices to the OS before physical devices. The default value is0(physical devices exposed first). so by default the physicals get to walk the runway first πhide_vsep={0|1}β this option disables exposure of the virtual SEP to the OS. The default value is0(virtual SEP is exposed).1= she's shy, she's hidden πdisable_managed_interrupts={0|1}β disables driver utilization of Linux kernel managed interrupts for controllers. The managed interrupts feature automatically distributes interrupts to all available CPUs and assigns SMP affinity. The default value is0(managed interrupts enabled). basically the kernel is like "i'll handle the interrupt choreography, you sit there and look pretty" β¨ctrl_ready_timeout={0|[30,1800]}β this option specifies the timeout in seconds for the driver to wait for the controller to be ready. The valid range is0or[30, 1800]. The default value is0, which causes the driver to use a timeout of 180 seconds. so like, either say0and get the automatic 180, or pick your own number between 30 and 1800. no in-between nonsense, she has rules π
part 1 done bestie, but we are NOT wrapping up β more parts are coming, so stay seated π
π FILES π
Device nodes ποΈ
Okay so bestie, here's how you actually talk to your devices:
- Disk drives? You reach them through the SCSI disk driver (
sd) β nodes live at/dev/sd* - Tape drives? That's the SCSI tape driver (
st) β nodes at/dev/st* - The RAID controller itself? That's the SCSI generic driver (
sg) β nodes at/dev/sg*
β¨ SmartPQI-specific host attribute files in /sys β¨
/sys/class/scsi_host/host*/rescan
This one is write-only, no take-backs. Write to it and the driver goes and scans for new, changed, or removed devices β think hot-plugged tape drives, or logical volumes that just got configured or deleted β and then tells the SCSI mid-layer about whatever it found. Usually config changes trigger this on their own, so you should not normally have to write here. But it's lowkey handy when you're hot-plugging stuff like tape drives or whole storage boxes that come with pre-configured logical volumes already loaded. π«Ά
/sys/class/scsi_host/host*/lockup_action
Read/write, bestie. This one makes the driver do a specific thing in the (unlikely!) event that a controller lockup gets detected. What are those specific things? Go look at OPTIONS up above for the lockup_action values. π
/sys/class/scsi_host/host*/driver_version
Read-only, and it holds the smartpqi driver version. Icons only.
$ cat /sys/class/scsi_host/host1/driver_version
1.1.2-126
/sys/class/scsi_host/host*/firmware_version
Read-only, holds the controller firmware version.
$ cat /sys/class/scsi_host/host1/firmware_version
1.29-112
/sys/class/scsi_host/host*/model
Read-only, contains the product identification string of the controller.
$ cat /sys/class/scsi_host/host1/model
1100-16i
/sys/class/scsi_host/host*/serial_number
Read-only, contains the controller's unique identification number β its little government name.
$ cat /sys/class/scsi_host/host1/serial_number
6A316373777
/sys/class/scsi_host/host*/vendor
Read-only, the vendor identification string of the controller.
$ cat /sys/class/scsi_host/host1/vendor
Adaptec
/sys/class/scsi_host/host*/enable_stream_detection
Read-write, bb. Turns stream detection in the driver on or off. Enabling it can improve sequential write performance for ioaccel-enabled volumes β and if you don't know what an ioaccel-enabled volume is, the ssd_smart_path_enabled disk attribute section below has the tea. The default value is 1 (stream detection enabled).
Enable example:
$ echo 1 > /sys/class/scsi_host/host1/enable_stream_detection
/sys/class/scsi_host/host*/enable_r5_writes
Read-write. Enables/disables RAID 5 write operations for ioaccel-enabled volumes. Turning it on can improve sequential write performance. Again, ssd_smart_path_enabled below explains ioaccel-enabled volumes. The default value is 1 (RAID 5 writes enabled).
Enable example:
$ echo 1 > /sys/class/scsi_host/host1/enable_r5_writes
/sys/class/scsi_host/host*/enable_r6_writes
Read-write, same energy as the R5 one but for RAID 6 write operations on ioaccel-enabled volumes. Enabling can improve sequential write performance. See the ssd_smart_path_enabled disk attribute section for the details on ioaccel-enabled volumes. The default value is 1 (RAID 6 writes enabled).
Enable example:
$ echo 1 > /sys/class/scsi_host/host1/enable_r6_writes
π¦ SmartPQI-specific disk attribute files in /sys π¦
Real quick, before we go through these: in the file specs below, c means the number of the appropriate SCSI controller, b is the bus number, t is the target number, and l is the logical unit number (LUN). Write that down bestie, you'll need it. βοΈ
/sys/class/scsi_disk/c:b:t:l/device/raid_level
Read-only. Holds the RAID level of the logical volume.
$ cat /sys/class/scsi_disk/4:0:0:0/device/raid_level
RAID 0
/sys/class/scsi_disk/c:b:t:l/device/sas_address
Read-only. The SAS address of the device.
$ cat /sys/class/scsi_disk/1:0:3:0/device/sas_address
0x5001173d028543a2
/sys/class/scsi_disk/c:b:t:l/device/ssd_smart_path_enabled
Read-only, and it's specifically for ioaccel-enabled volumes. And since you're probably like "what is ioaccel" β it's an alternative driver submission path that lets the driver send I/O requests straight to backend SCSI devices, bypassing the controller firmware. Result? Performance goes up. π It's used for HBA disks and for logical volumes built out of SSDs. The file contains 1 if ioaccel is enabled for the volume, and 0 otherwise.
$ cat /sys/class/scsi_disk/1:0:3:0/device/ssd_smart_path_enabled
0
/sys/class/scsi_disk/c:b:t:l/device/lunid
Read-only. The SCSI LUN ID for the device.
$ cat /sys/class/scsi_disk/13:1:0:3/device/lunid
0x0300004000000000
/sys/class/scsi_disk/c:b:t:l/device/unique_id
Read-only. Contains a 16-byte ID that uniquely identifies the device within the controller β its fingerprint, basically. π
$ cat /sys/class/scsi_disk/13:1:0:3/device/unique_id
600508B1001C6D4723A8E98D704FDB94
/sys/class/scsi_disk/c:b:t:l/device/path_info
Read-only. This one's packed: it gives you the c:b:t:l of the device, plus the device type, plus whether the device is Active or Inactive. And plot twist β if the device is an HBA device, path_info will also show you the PORT, BOX, and BAY it's plugged into. So much info, we love a thorough king. π
$ cat /sys/class/scsi_disk/13:1:0:3/device/path_info
[13:1:0:3] Direct-Access Active
$ cat /sys/class/scsi_disk/12:0:9:0/device/path_info
[12:0:9:0] Direct-Access PORT: C1 BOX: 1 BAY: 14 Inactive
[12:0:9:0] Direct-Access PORT: C0 BOX: 1 BAY: 14 Active
/sys/class/scsi_disk/c:b:t:l/device/raid_bypass_cnt
Read-only. This is the number of I/O requests that have gone through the ioaccel path for ioaccel-enabled volumes. Need the ioaccel details again? ssd_smart_path_enabled above, bestie.
$ cat /sys/class/scsi_disk/13:1:0:3/device/raid_bypass_cnt
0x300
/sys/class/scsi_disk/c:b:t:l/device/sas_ncq_prio_enable
Read/write. Enables SATA NCQ priority support. Heads up though β this one only works when the device has NCQ support and the controller firmware can handle IO with the NCQ priority attribute. Both conditions, no exceptions. πΈ
$ echo 1 > /sys/class/scsi_disk/13:1:0:3/device/sas_ncq_prio_enable
π VERSIONS π
The smartpqi driver was added in Linux 4.9. Vintage-ish but still slaying. β¨
π NOTES π
Configuration
To configure a Microchip Smart Storage controller, go read the User Guide for the controller β you can find it by searching for the specific controller at https://www.microchip.com/design-centers/storage. Yes, reading docs is part of the vibe. Do it. π«Ά
π HISTORY π
Plot twist in the lore: /sys/class/scsi_host/host*/version got replaced by two sysfs entries β it girlbossed too close to the sun and split into:
/sys/class/scsi_host/host*/driver_version/sys/class/scsi_host/host*/firmware_version
β SEE ALSO β
cciss(4),hpsa(4),sd(4),st(4),sg(4)Documentation/ABI/testing/sysfs-bus-pci-devices-ccissin the Linux kernel source tree.
And that's a wrap, bestie!! π This page came from Linux man-pages 6.20, dated 2026-02-08 β go forth and <rainbow>slay</rainbow> your storage controller. π¦β¨π
π¦ where this page comes from
- arch rolling: man-pages 6.20-1 Β· BSD-2-Clause AND BSD-3-Clause AND BSD-4.3TAHOE AND BSD-4-Clause-UC AND GPL-1.0-or-later AND GPL-2.0-only AND GPL-2.0-or-later AND GPL-3.0-or-later AND LGPL-3.0-linking-exception AND LGPL-3.0-or-later AND LicenseRef-Public-Domain AND LicenseRef-UltraPermissive AND Linux-man-pages-1-para AND Linux-man-pages-copyleft AND Linux-man-pages-copyleft-2-para AND Linux-man-pages-copyleft-var AND MIT AND Spencer-94
- nixpkgs unstable: man-pages 6.20
- π the page's license: GPL-2.0-only
- Copyright 2019-2023, Microchip Technology, Inc
- Copyright 2016-2018, Microsemi Corp
- Copyright 2016, PMC-Sierra, Inc
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms