SCSI Interfaces Guide James Bottomley
James.Bottomley@hansenpartnership.com
Rob Landley
rob@landley.net
2007 Linux Foundation This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details see the file COPYING in the source distribution of Linux.
Introduction Protocol vs bus Once upon a time, the Small Computer Systems Interface defined both a parallel I/O bus and a data protocol to connect a wide variety of peripherals (disk drives, tape drives, modems, printers, scanners, optical drives, test equipment, and medical devices) to a host computer. Although the old parallel (fast/wide/ultra) SCSI bus has largely fallen out of use, the SCSI command set is more widely used than ever to communicate with devices over a number of different busses. The SCSI protocol is a big-endian peer-to-peer packet based protocol. SCSI commands are 6, 10, 12, or 16 bytes long, often followed by an associated data payload. SCSI commands can be transported over just about any kind of bus, and are the default protocol for storage devices attached to USB, SATA, SAS, Fibre Channel, FireWire, and ATAPI devices. SCSI packets are also commonly exchanged over Infiniband, I20, TCP/IP (iSCSI), even Parallel ports. Design of the Linux SCSI subsystem The SCSI subsystem uses a three layer design, with upper, mid, and low layers. Every operation involving the SCSI subsystem (such as reading a sector from a disk) uses one driver at each of the 3 levels: one upper layer driver, one lower layer driver, and the SCSI midlayer. The SCSI upper layer provides the interface between userspace and the kernel, in the form of block and char device nodes for I/O and ioctl(). The SCSI lower layer contains drivers for specific hardware devices. In between is the SCSI mid-layer, analogous to a network routing layer such as the IPv4 stack. The SCSI mid-layer routes a packet based data protocol between the upper layer's /dev nodes and the corresponding devices in the lower layer. It manages command queues, provides error handling and power management functions, and responds to ioctl() requests. SCSI upper layer The upper layer supports the user-kernel interface by providing device nodes. sd (SCSI Disk) sd (sd_mod.o) sr (SCSI CD-ROM) sr (sr_mod.o) st (SCSI Tape) st (st.o) sg (SCSI Generic) sg (sg.o) ch (SCSI Media Changer) ch (ch.c) SCSI mid layer SCSI midlayer implementation include/scsi/scsi_device.h LINUX Kernel Hackers Manual July 2017 shost_for_each_device 9 4.1.27 shost_for_each_device iterate over all devices of a host Synopsis shost_for_each_device sdev shost Arguments sdev the struct scsi_device to use as a cursor shost the struct scsi_host to iterate over Description Iterator that returns each device attached to shost. This loop takes a reference on each device and releases it at the end. If you break out of the loop, you must call scsi_device_put(sdev). LINUX Kernel Hackers Manual July 2017 __shost_for_each_device 9 4.1.27 __shost_for_each_device iterate over all devices of a host (UNLOCKED) Synopsis __shost_for_each_device sdev shost Arguments sdev the struct scsi_device to use as a cursor shost the struct scsi_host to iterate over Description Iterator that returns each device attached to shost. It does _not_ take a reference on the scsi_device, so the whole loop must be protected by shost->host_lock. Note The only reason to use this is because you need to access the device list in interrupt context. Otherwise you really want to use shost_for_each_device instead. drivers/scsi/scsi.c Main file for the SCSI midlayer. LINUX Kernel Hackers Manual July 2017 scsi_device_type 9 4.1.27 scsi_device_type Return 17 char string indicating device type. Synopsis const char * scsi_device_type unsigned type Arguments type type number to look up LINUX Kernel Hackers Manual July 2017 scsi_cmd_get_serial 9 4.1.27 scsi_cmd_get_serial Assign a serial number to a command Synopsis void scsi_cmd_get_serial struct Scsi_Host * host struct scsi_cmnd * cmd Arguments host the scsi host cmd command to assign serial number to Description a serial number identifies a request for error recovery and debugging purposes. Protected by the Host_Lock of host. LINUX Kernel Hackers Manual July 2017 scsi_change_queue_depth 9 4.1.27 scsi_change_queue_depth change a device's queue depth Synopsis int scsi_change_queue_depth struct scsi_device * sdev int depth Arguments sdev SCSI Device in question depth number of commands allowed to be queued to the driver Description Sets the device queue depth and returns the new value. LINUX Kernel Hackers Manual July 2017 scsi_track_queue_full 9 4.1.27 scsi_track_queue_full track QUEUE_FULL events to adjust queue depth Synopsis int scsi_track_queue_full struct scsi_device * sdev int depth Arguments sdev SCSI Device in question depth Current number of outstanding SCSI commands on this device, not counting the one returned as QUEUE_FULL. Description This function will track successive QUEUE_FULL events on a specific SCSI device to determine if and when there is a need to adjust the queue depth on the device. Returns 0 - No change needed, >0 - Adjust queue depth to this new depth, -1 - Drop back to untagged operation using host->cmd_per_lun as the untagged command depth Lock Status None held on entry Notes Low level drivers may call this at any time and we will do The Right Thing. We are interrupt context safe. LINUX Kernel Hackers Manual July 2017 scsi_get_vpd_page 9 4.1.27 scsi_get_vpd_page Get Vital Product Data from a SCSI device Synopsis int scsi_get_vpd_page struct scsi_device * sdev u8 page unsigned char * buf int buf_len Arguments sdev The device to ask page Which Vital Product Data to return buf where to store the VPD buf_len number of bytes in the VPD buffer area Description SCSI devices may optionally supply Vital Product Data. Each 'page' of VPD is defined in the appropriate SCSI document (eg SPC, SBC). If the device supports this VPD page, this routine returns a pointer to a buffer containing the data from that page. The caller is responsible for calling kfree on this pointer when it is no longer needed. If we cannot retrieve the VPD page this routine returns NULL. LINUX Kernel Hackers Manual July 2017 scsi_report_opcode 9 4.1.27 scsi_report_opcode Find out if a given command opcode is supported Synopsis int scsi_report_opcode struct scsi_device * sdev unsigned char * buffer unsigned int len unsigned char opcode Arguments sdev scsi device to query buffer scratch buffer (must be at least 20 bytes long) len length of buffer opcode opcode for command to look up Description Uses the REPORT SUPPORTED OPERATION CODES to look up the given opcode. Returns -EINVAL if RSOC fails, 0 if the command opcode is unsupported and 1 if the device claims to support the command. LINUX Kernel Hackers Manual July 2017 scsi_device_get 9 4.1.27 scsi_device_get get an additional reference to a scsi_device Synopsis int scsi_device_get struct scsi_device * sdev Arguments sdev device to get a reference to Description Gets a reference to the scsi_device and increments the use count of the underlying LLDD module. You must hold host_lock of the parent Scsi_Host or already have a reference when calling this. This will fail if a device is deleted or cancelled, or when the LLD module is in the process of being unloaded. LINUX Kernel Hackers Manual July 2017 scsi_device_put 9 4.1.27 scsi_device_put release a reference to a scsi_device Synopsis void scsi_device_put struct scsi_device * sdev Arguments sdev device to release a reference on. Description Release a reference to the scsi_device and decrements the use count of the underlying LLDD module. The device is freed once the last user vanishes. LINUX Kernel Hackers Manual July 2017 starget_for_each_device 9 4.1.27 starget_for_each_device helper to walk all devices of a target Synopsis void starget_for_each_device struct scsi_target * starget void * data void (*fn) struct scsi_device *, void * Arguments starget target whose devices we want to iterate over. data Opaque passed to each function call. fn Function to call on each device Description This traverses over each device of starget. The devices have a reference that must be released by scsi_host_put when breaking out of the loop. LINUX Kernel Hackers Manual July 2017 __starget_for_each_device 9 4.1.27 __starget_for_each_device helper to walk all devices of a target (UNLOCKED) Synopsis void __starget_for_each_device struct scsi_target * starget void * data void (*fn) struct scsi_device *, void * Arguments starget target whose devices we want to iterate over. data parameter for callback fn() fn callback function that is invoked for each device Description This traverses over each device of starget. It does _not_ take a reference on the scsi_device, so the whole loop must be protected by shost->host_lock. Note The only reason why drivers would want to use this is because they need to access the device list in irq context. Otherwise you really want to use starget_for_each_device instead. LINUX Kernel Hackers Manual July 2017 __scsi_device_lookup_by_target 9 4.1.27 __scsi_device_lookup_by_target find a device given the target (UNLOCKED) Synopsis struct scsi_device * __scsi_device_lookup_by_target struct scsi_target * starget u64 lun Arguments starget SCSI target pointer lun SCSI Logical Unit Number Description Looks up the scsi_device with the specified lun for a given starget. The returned scsi_device does not have an additional reference. You must hold the host's host_lock over this call and any access to the returned scsi_device. A scsi_device in state SDEV_DEL is skipped. Note The only reason why drivers should use this is because they need to access the device list in irq context. Otherwise you really want to use scsi_device_lookup_by_target instead. LINUX Kernel Hackers Manual July 2017 scsi_device_lookup_by_target 9 4.1.27 scsi_device_lookup_by_target find a device given the target Synopsis struct scsi_device * scsi_device_lookup_by_target struct scsi_target * starget u64 lun Arguments starget SCSI target pointer lun SCSI Logical Unit Number Description Looks up the scsi_device with the specified lun for a given starget. The returned scsi_device has an additional reference that needs to be released with scsi_device_put once you're done with it. LINUX Kernel Hackers Manual July 2017 __scsi_device_lookup 9 4.1.27 __scsi_device_lookup find a device given the host (UNLOCKED) Synopsis struct scsi_device * __scsi_device_lookup struct Scsi_Host * shost uint channel uint id u64 lun Arguments shost SCSI host pointer channel SCSI channel (zero if only one channel) id SCSI target number (physical unit number) lun SCSI Logical Unit Number Description Looks up the scsi_device with the specified channel, id, lun for a given host. The returned scsi_device does not have an additional reference. You must hold the host's host_lock over this call and any access to the returned scsi_device. Note The only reason why drivers would want to use this is because they need to access the device list in irq context. Otherwise you really want to use scsi_device_lookup instead. LINUX Kernel Hackers Manual July 2017 scsi_device_lookup 9 4.1.27 scsi_device_lookup find a device given the host Synopsis struct scsi_device * scsi_device_lookup struct Scsi_Host * shost uint channel uint id u64 lun Arguments shost SCSI host pointer channel SCSI channel (zero if only one channel) id SCSI target number (physical unit number) lun SCSI Logical Unit Number Description Looks up the scsi_device with the specified channel, id, lun for a given host. The returned scsi_device has an additional reference that needs to be released with scsi_device_put once you're done with it. drivers/scsi/scsicam.c SCSI Common Access Method support functions, for use with HDIO_GETGEO, etc. LINUX Kernel Hackers Manual July 2017 scsi_bios_ptable 9 4.1.27 scsi_bios_ptable Read PC partition table out of first sector of device. Synopsis unsigned char * scsi_bios_ptable struct block_device * dev Arguments dev from this device Description Reads the first sector from the device and returns 0x42 bytes starting at offset 0x1be. Returns partition table in kmalloc(GFP_KERNEL) memory, or NULL on error. LINUX Kernel Hackers Manual July 2017 scsicam_bios_param 9 4.1.27 scsicam_bios_param Determine geometry of a disk in cylinders/heads/sectors. Synopsis int scsicam_bios_param struct block_device * bdev sector_t capacity int * ip Arguments bdev which device capacity size of the disk in sectors ip return value: ip[0]=heads, ip[1]=sectors, ip[2]=cylinders Description determine the BIOS mapping/geometry used for a drive in a SCSI-CAM system, storing the results in ip as required by the HDIO_GETGEO ioctl. Returns -1 on failure, 0 on success. LINUX Kernel Hackers Manual July 2017 scsi_partsize 9 4.1.27 scsi_partsize Parse cylinders/heads/sectors from PC partition table Synopsis int scsi_partsize unsigned char * buf unsigned long capacity unsigned int * cyls unsigned int * hds unsigned int * secs Arguments buf partition table, see scsi_bios_ptable capacity size of the disk in sectors cyls put cylinders here hds put heads here secs put sectors here Description determine the BIOS mapping/geometry used to create the partition table, storing the results in *cyls, *hds, and *secs Returns -1 on failure, 0 on success. drivers/scsi/scsi_error.c Common SCSI error/timeout handling routines. LINUX Kernel Hackers Manual July 2017 scsi_schedule_eh 9 4.1.27 scsi_schedule_eh schedule EH for SCSI host Synopsis void scsi_schedule_eh struct Scsi_Host * shost Arguments shost SCSI host to invoke error handling on. Description Schedule SCSI EH without scmd. LINUX Kernel Hackers Manual July 2017 scsi_block_when_processing_errors 9 4.1.27 scsi_block_when_processing_errors Prevent cmds from being queued. Synopsis int scsi_block_when_processing_errors struct scsi_device * sdev Arguments sdev Device on which we are performing recovery. Description We block until the host is out of error recovery, and then check to see whether the host or the device is offline. Return value 0 when dev was taken offline by error recovery. 1 OK to proceed. LINUX Kernel Hackers Manual July 2017 scsi_eh_prep_cmnd 9 4.1.27 scsi_eh_prep_cmnd Save a scsi command info as part of error recovery Synopsis void scsi_eh_prep_cmnd struct scsi_cmnd * scmd struct scsi_eh_save * ses unsigned char * cmnd int cmnd_size unsigned sense_bytes Arguments scmd SCSI command structure to hijack ses structure to save restore information cmnd CDB to send. Can be NULL if no new cmnd is needed cmnd_size size in bytes of cmnd (must be <= BLK_MAX_CDB) sense_bytes size of sense data to copy. or 0 (if != 0 cmnd is ignored) Description This function is used to save a scsi command information before re-execution as part of the error recovery process. If sense_bytes is 0 the command sent must be one that does not transfer any data. If sense_bytes != 0 cmnd is ignored and this functions sets up a REQUEST_SENSE command and cmnd buffers to read sense_bytes into scmd->sense_buffer. LINUX Kernel Hackers Manual July 2017 scsi_eh_restore_cmnd 9 4.1.27 scsi_eh_restore_cmnd Restore a scsi command info as part of error recovery Synopsis void scsi_eh_restore_cmnd struct scsi_cmnd * scmd struct scsi_eh_save * ses Arguments scmd SCSI command structure to restore ses saved information from a coresponding call to scsi_eh_prep_cmnd Description Undo any damage done by above scsi_eh_prep_cmnd. LINUX Kernel Hackers Manual July 2017 scsi_eh_finish_cmd 9 4.1.27 scsi_eh_finish_cmd Handle a cmd that eh is finished with. Synopsis void scsi_eh_finish_cmd struct scsi_cmnd * scmd struct list_head * done_q Arguments scmd Original SCSI cmd that eh has finished. done_q Queue for processed commands. Notes We don't want to use the normal command completion while we are are still handling errors - it may cause other commands to be queued, and that would disturb what we are doing. Thus we really want to keep a list of pending commands for final completion, and once we are ready to leave error handling we handle completion for real. LINUX Kernel Hackers Manual July 2017 scsi_eh_get_sense 9 4.1.27 scsi_eh_get_sense Get device sense data. Synopsis int scsi_eh_get_sense struct list_head * work_q struct list_head * done_q Arguments work_q Queue of commands to process. done_q Queue of processed commands. Description See if we need to request sense information. if so, then get it now, so we have a better idea of what to do. Notes This has the unfortunate side effect that if a shost adapter does not automatically request sense information, we end up shutting it down before we request it. All drivers should request sense information internally these days, so for now all I have to say is tough noogies if you end up in here. XXX Long term this code should go away, but that needs an audit of all LLDDs first. LINUX Kernel Hackers Manual July 2017 scsi_eh_ready_devs 9 4.1.27 scsi_eh_ready_devs check device ready state and recover if not. Synopsis void scsi_eh_ready_devs struct Scsi_Host * shost struct list_head * work_q struct list_head * done_q Arguments shost host to be recovered. work_q list_head for pending commands. done_q list_head for processed commands. LINUX Kernel Hackers Manual July 2017 scsi_eh_flush_done_q 9 4.1.27 scsi_eh_flush_done_q finish processed commands or retry them. Synopsis void scsi_eh_flush_done_q struct list_head * done_q Arguments done_q list_head of processed commands. LINUX Kernel Hackers Manual July 2017 scsi_ioctl_reset 9 4.1.27 scsi_ioctl_reset Synopsis int scsi_ioctl_reset struct scsi_device * dev int __user * arg Arguments dev scsi_device to operate on arg reset type (see sg.h) LINUX Kernel Hackers Manual July 2017 scsi_normalize_sense 9 4.1.27 scsi_normalize_sense normalize main elements from either fixed or descriptor sense data format into a common format. Synopsis bool scsi_normalize_sense const u8 * sense_buffer int sb_len struct scsi_sense_hdr * sshdr Arguments sense_buffer byte array containing sense data returned by device sb_len number of valid bytes in sense_buffer sshdr pointer to instance of structure that common elements are written to. Notes The main elements from sense data are: response_code, sense_key, asc, ascq and additional_length (only for descriptor format). Typically this function can be called after a device has responded to a SCSI command with the CHECK_CONDITION status. Return value true if valid sense data information found, else false; LINUX Kernel Hackers Manual July 2017 scsi_sense_desc_find 9 4.1.27 scsi_sense_desc_find search for a given descriptor type in descriptor sense data format. Synopsis const u8 * scsi_sense_desc_find const u8 * sense_buffer int sb_len int desc_type Arguments sense_buffer byte array of descriptor format sense data sb_len number of valid bytes in sense_buffer desc_type value of descriptor type to find (e.g. 0 -> information) Notes only valid when sense data is in descriptor format Return value pointer to start of (first) descriptor if found else NULL LINUX Kernel Hackers Manual July 2017 scsi_get_sense_info_fld 9 4.1.27 scsi_get_sense_info_fld get information field from sense data (either fixed or descriptor format) Synopsis int scsi_get_sense_info_fld const u8 * sense_buffer int sb_len u64 * info_out Arguments sense_buffer byte array of sense data sb_len number of valid bytes in sense_buffer info_out pointer to 64 integer where 8 or 4 byte information field will be placed if found. Return value 1 if information field found, 0 if not found. LINUX Kernel Hackers Manual July 2017 scsi_build_sense_buffer 9 4.1.27 scsi_build_sense_buffer build sense data in a buffer Synopsis void scsi_build_sense_buffer int desc u8 * buf u8 key u8 asc u8 ascq Arguments desc Sense format (non zero == descriptor format, 0 == fixed format) buf Where to build sense data key Sense key asc Additional sense code ascq Additional sense code qualifier drivers/scsi/scsi_devinfo.c Manage scsi_dev_info_list, which tracks blacklisted and whitelisted devices. LINUX Kernel Hackers Manual July 2017 scsi_dev_info_list_add 9 4.1.27 scsi_dev_info_list_add add one dev_info list entry. Synopsis int scsi_dev_info_list_add int compatible char * vendor char * model char * strflags int flags Arguments compatible if true, null terminate short strings. Otherwise space pad. vendor vendor string model model (product) string strflags integer string flags if strflags NULL, use this flag value Description Create and add one dev_info entry for vendor, model, strflags or flag. If compatible, add to the tail of the list, do not space pad, and set devinfo->compatible. The scsi_static_device_list entries are added with compatible 1 and clfags NULL. Returns 0 OK, -error on failure. LINUX Kernel Hackers Manual July 2017 scsi_dev_info_list_add_str 9 4.1.27 scsi_dev_info_list_add_str parse dev_list and add to the scsi_dev_info_list. Synopsis int scsi_dev_info_list_add_str char * dev_list Arguments dev_list string of device flags to add Description Parse dev_list, and add entries to the scsi_dev_info_list. dev_list is of the form vendor:product:flag,vendor:product:flag. dev_list is modified via strsep. Can be called for command line addition, for proc or mabye a sysfs interface. Returns 0 if OK, -error on failure. LINUX Kernel Hackers Manual July 2017 scsi_get_device_flags 9 4.1.27 scsi_get_device_flags get device specific flags from the dynamic device list. Synopsis int scsi_get_device_flags struct scsi_device * sdev const unsigned char * vendor const unsigned char * model Arguments sdev scsi_device to get flags for vendor vendor name model model name Description Search the global scsi_dev_info_list (specified by list zero) for an entry matching vendor and model, if found, return the matching flags value, else return the host or global default settings. Called during scan time. LINUX Kernel Hackers Manual July 2017 scsi_exit_devinfo 9 4.1.27 scsi_exit_devinfo remove /proc/scsi/device_info & the scsi_dev_info_list Synopsis void scsi_exit_devinfo void Arguments void no arguments LINUX Kernel Hackers Manual July 2017 scsi_init_devinfo 9 4.1.27 scsi_init_devinfo set up the dynamic device list. Synopsis int scsi_init_devinfo void Arguments void no arguments Description Add command line entries from scsi_dev_flags, then add scsi_static_device_list entries to the scsi device info list. drivers/scsi/scsi_ioctl.c Handle ioctl() calls for SCSI devices. LINUX Kernel Hackers Manual July 2017 scsi_ioctl 9 4.1.27 scsi_ioctl Dispatch ioctl to scsi device Synopsis int scsi_ioctl struct scsi_device * sdev int cmd void __user * arg Arguments sdev scsi device receiving ioctl cmd which ioctl is it arg data associated with ioctl Description The scsi_ioctl function differs from most ioctls in that it does not take a major/minor number as the dev field. Rather, it takes a pointer to a struct scsi_device. drivers/scsi/scsi_lib.c SCSI queuing library. LINUX Kernel Hackers Manual July 2017 scsi_execute 9 4.1.27 scsi_execute insert request and wait for the result Synopsis int scsi_execute struct scsi_device * sdev const unsigned char * cmd int data_direction void * buffer unsigned bufflen unsigned char * sense int timeout int retries u64 flags int * resid Arguments sdev scsi device cmd scsi command data_direction data direction buffer data buffer bufflen len of buffer sense optional sense buffer timeout request timeout in seconds retries number of times to retry request flags or into request flags; resid optional residual length Description returns the req->errors value which is the scsi_cmnd result field. LINUX Kernel Hackers Manual July 2017 scsi_mode_select 9 4.1.27 scsi_mode_select issue a mode select Synopsis int scsi_mode_select struct scsi_device * sdev int pf int sp int modepage unsigned char * buffer int len int timeout int retries struct scsi_mode_data * data struct scsi_sense_hdr * sshdr Arguments sdev SCSI device to be queried pf Page format bit (1 == standard, 0 == vendor specific) sp Save page bit (0 == don't save, 1 == save) modepage mode page being requested buffer request buffer (may not be smaller than eight bytes) len length of request buffer. timeout command timeout retries number of retries before failing data returns a structure abstracting the mode header data sshdr place to put sense data (or NULL if no sense to be collected). must be SCSI_SENSE_BUFFERSIZE big. Description Returns zero if successful; negative error number or scsi status on error LINUX Kernel Hackers Manual July 2017 scsi_mode_sense 9 4.1.27 scsi_mode_sense issue a mode sense, falling back from 10 to six bytes if necessary. Synopsis int scsi_mode_sense struct scsi_device * sdev int dbd int modepage unsigned char * buffer int len int timeout int retries struct scsi_mode_data * data struct scsi_sense_hdr * sshdr Arguments sdev SCSI device to be queried dbd set if mode sense will allow block descriptors to be returned modepage mode page being requested buffer request buffer (may not be smaller than eight bytes) len length of request buffer. timeout command timeout retries number of retries before failing data returns a structure abstracting the mode header data sshdr place to put sense data (or NULL if no sense to be collected). must be SCSI_SENSE_BUFFERSIZE big. Description Returns zero if unsuccessful, or the header offset (either 4 or 8 depending on whether a six or ten byte command was issued) if successful. LINUX Kernel Hackers Manual July 2017 scsi_test_unit_ready 9 4.1.27 scsi_test_unit_ready test if unit is ready Synopsis int scsi_test_unit_ready struct scsi_device * sdev int timeout int retries struct scsi_sense_hdr * sshdr_external Arguments sdev scsi device to change the state of. timeout command timeout retries number of retries before failing sshdr_external Optional pointer to struct scsi_sense_hdr for returning sense. Make sure that this is cleared before passing in. Description Returns zero if unsuccessful or an error if TUR failed. For removable media, UNIT_ATTENTION sets ->changed flag. LINUX Kernel Hackers Manual July 2017 scsi_device_set_state 9 4.1.27 scsi_device_set_state Take the given device through the device state model. Synopsis int scsi_device_set_state struct scsi_device * sdev enum scsi_device_state state Arguments sdev scsi device to change the state of. state state to change to. Description Returns zero if unsuccessful or an error if the requested transition is illegal. LINUX Kernel Hackers Manual July 2017 sdev_evt_send 9 4.1.27 sdev_evt_send send asserted event to uevent thread Synopsis void sdev_evt_send struct scsi_device * sdev struct scsi_event * evt Arguments sdev scsi_device event occurred on evt event to send Description Assert scsi device event asynchronously. LINUX Kernel Hackers Manual July 2017 sdev_evt_alloc 9 4.1.27 sdev_evt_alloc allocate a new scsi event Synopsis struct scsi_event * sdev_evt_alloc enum scsi_device_event evt_type gfp_t gfpflags Arguments evt_type type of event to allocate gfpflags GFP flags for allocation Description Allocates and returns a new scsi_event. LINUX Kernel Hackers Manual July 2017 sdev_evt_send_simple 9 4.1.27 sdev_evt_send_simple send asserted event to uevent thread Synopsis void sdev_evt_send_simple struct scsi_device * sdev enum scsi_device_event evt_type gfp_t gfpflags Arguments sdev scsi_device event occurred on evt_type type of event to send gfpflags GFP flags for allocation Description Assert scsi device event asynchronously, given an event type. LINUX Kernel Hackers Manual July 2017 scsi_device_quiesce 9 4.1.27 scsi_device_quiesce Block user issued commands. Synopsis int scsi_device_quiesce struct scsi_device * sdev Arguments sdev scsi device to quiesce. Description This works by trying to transition to the SDEV_QUIESCE state (which must be a legal transition). When the device is in this state, only special requests will be accepted, all others will be deferred. Since special requests may also be requeued requests, a successful return doesn't guarantee the device will be totally quiescent. Must be called with user context, may sleep. Returns zero if unsuccessful or an error if not. LINUX Kernel Hackers Manual July 2017 scsi_device_resume 9 4.1.27 scsi_device_resume Restart user issued commands to a quiesced device. Synopsis void scsi_device_resume struct scsi_device * sdev Arguments sdev scsi device to resume. Description Moves the device from quiesced back to running and restarts the queues. Must be called with user context, may sleep. LINUX Kernel Hackers Manual July 2017 scsi_internal_device_block 9 4.1.27 scsi_internal_device_block internal function to put a device temporarily into the SDEV_BLOCK state Synopsis int scsi_internal_device_block struct scsi_device * sdev Arguments sdev device to block Description Block request made by scsi lld's to temporarily stop all scsi commands on the specified device. Called from interrupt or normal process context. Returns zero if successful or error if not Notes This routine transitions the device to the SDEV_BLOCK state (which must be a legal transition). When the device is in this state, all commands are deferred until the scsi lld reenables the device with scsi_device_unblock or device_block_tmo fires. LINUX Kernel Hackers Manual July 2017 scsi_internal_device_unblock 9 4.1.27 scsi_internal_device_unblock resume a device after a block request Synopsis int scsi_internal_device_unblock struct scsi_device * sdev enum scsi_device_state new_state Arguments sdev device to resume new_state state to set devices to after unblocking Description Called by scsi lld's or the midlayer to restart the device queue for the previously suspended scsi device. Called from interrupt or normal process context. Returns zero if successful or error if not. Notes This routine transitions the device to the SDEV_RUNNING state or to one of the offline states (which must be a legal transition) allowing the midlayer to goose the queue for this device. LINUX Kernel Hackers Manual July 2017 scsi_kmap_atomic_sg 9 4.1.27 scsi_kmap_atomic_sg find and atomically map an sg-elemnt Synopsis void * scsi_kmap_atomic_sg struct scatterlist * sgl int sg_count size_t * offset size_t * len Arguments sgl scatter-gather list sg_count number of segments in sg offset offset in bytes into sg, on return offset into the mapped area len bytes to map, on return number of bytes mapped Description Returns virtual address of the start of the mapped page LINUX Kernel Hackers Manual July 2017 scsi_kunmap_atomic_sg 9 4.1.27 scsi_kunmap_atomic_sg atomically unmap a virtual address, previously mapped with scsi_kmap_atomic_sg Synopsis void scsi_kunmap_atomic_sg void * virt Arguments virt virtual address to be unmapped drivers/scsi/scsi_lib_dma.c SCSI library functions depending on DMA (map and unmap scatter-gather lists). LINUX Kernel Hackers Manual July 2017 scsi_dma_map 9 4.1.27 scsi_dma_map perform DMA mapping against command's sg lists Synopsis int scsi_dma_map struct scsi_cmnd * cmd Arguments cmd scsi command Description Returns the number of sg lists actually used, zero if the sg lists is NULL, or -ENOMEM if the mapping failed. LINUX Kernel Hackers Manual July 2017 scsi_dma_unmap 9 4.1.27 scsi_dma_unmap unmap command's sg lists mapped by scsi_dma_map Synopsis void scsi_dma_unmap struct scsi_cmnd * cmd Arguments cmd scsi command drivers/scsi/scsi_module.c The file drivers/scsi/scsi_module.c contains legacy support for old-style host templates. It should never be used by any new driver. drivers/scsi/scsi_proc.c The functions in this file provide an interface between the PROC file system and the SCSI device drivers It is mainly used for debugging, statistics and to pass information directly to the lowlevel driver. I.E. plumbing to manage /proc/scsi/* LINUX Kernel Hackers Manual July 2017 scsi_proc_hostdir_add 9 4.1.27 scsi_proc_hostdir_add Create directory in /proc for a scsi host Synopsis void scsi_proc_hostdir_add struct scsi_host_template * sht Arguments sht owner of this directory Description Sets sht->proc_dir to the new directory. LINUX Kernel Hackers Manual July 2017 scsi_proc_hostdir_rm 9 4.1.27 scsi_proc_hostdir_rm remove directory in /proc for a scsi host Synopsis void scsi_proc_hostdir_rm struct scsi_host_template * sht Arguments sht owner of directory LINUX Kernel Hackers Manual July 2017 scsi_proc_host_add 9 4.1.27 scsi_proc_host_add Add entry for this host to appropriate /proc dir Synopsis void scsi_proc_host_add struct Scsi_Host * shost Arguments shost host to add LINUX Kernel Hackers Manual July 2017 scsi_proc_host_rm 9 4.1.27 scsi_proc_host_rm remove this host's entry from /proc Synopsis void scsi_proc_host_rm struct Scsi_Host * shost Arguments shost which host LINUX Kernel Hackers Manual July 2017 proc_print_scsidevice 9 4.1.27 proc_print_scsidevice return data about this host Synopsis int proc_print_scsidevice struct device * dev void * data Arguments dev A scsi device data struct seq_file to output to. Description prints Host, Channel, Id, Lun, Vendor, Model, Rev, Type, and revision. LINUX Kernel Hackers Manual July 2017 scsi_add_single_device 9 4.1.27 scsi_add_single_device Respond to user request to probe for/add device Synopsis int scsi_add_single_device uint host uint channel uint id uint lun Arguments host user-supplied decimal integer channel user-supplied decimal integer id user-supplied decimal integer lun user-supplied decimal integer Description called by writing scsi add-single-device to /proc/scsi/scsi. does scsi_host_lookup and either user_scan if that transport type supports it, or else scsi_scan_host_selected Note this seems to be aimed exclusively at SCSI parallel busses. LINUX Kernel Hackers Manual July 2017 scsi_remove_single_device 9 4.1.27 scsi_remove_single_device Respond to user request to remove a device Synopsis int scsi_remove_single_device uint host uint channel uint id uint lun Arguments host user-supplied decimal integer channel user-supplied decimal integer id user-supplied decimal integer lun user-supplied decimal integer Description called by writing scsi remove-single-device to /proc/scsi/scsi. Does a scsi_device_lookup and scsi_remove_device LINUX Kernel Hackers Manual July 2017 proc_scsi_write 9 4.1.27 proc_scsi_write handle writes to /proc/scsi/scsi Synopsis ssize_t proc_scsi_write struct file * file const char __user * buf size_t length loff_t * ppos Arguments file not used buf buffer to write length length of buf, at most PAGE_SIZE ppos not used Description this provides a legacy mechanism to add or remove devices by Host, Channel, ID, and Lun. To use, echo 'scsi add-single-device 0 1 2 3' > /proc/scsi/scsi or echo 'scsi remove-single-device 0 1 2 3' > /proc/scsi/scsi with 0 1 2 3 replaced by the Host, Channel, Id, and Lun. Note this seems to be aimed at parallel SCSI. Most modern busses (USB, SATA, Firewire, Fibre Channel, etc) dynamically assign these values to provide a unique identifier and nothing more. LINUX Kernel Hackers Manual July 2017 proc_scsi_open 9 4.1.27 proc_scsi_open glue function Synopsis int proc_scsi_open struct inode * inode struct file * file Arguments inode not used file passed to single_open Description Associates proc_scsi_show with this file LINUX Kernel Hackers Manual July 2017 scsi_init_procfs 9 4.1.27 scsi_init_procfs create scsi and scsi/scsi in procfs Synopsis int scsi_init_procfs void Arguments void no arguments LINUX Kernel Hackers Manual July 2017 scsi_exit_procfs 9 4.1.27 scsi_exit_procfs Remove scsi/scsi and scsi from procfs Synopsis void scsi_exit_procfs void Arguments void no arguments drivers/scsi/scsi_netlink.c Infrastructure to provide async events from transports to userspace via netlink, using a single NETLINK_SCSITRANSPORT protocol for all transports. See the original patch submission for more details. LINUX Kernel Hackers Manual July 2017 scsi_nl_rcv_msg 9 4.1.27 scsi_nl_rcv_msg Receive message handler. Synopsis void scsi_nl_rcv_msg struct sk_buff * skb Arguments skb socket receive buffer Description Extracts message from a receive buffer. Validates message header and calls appropriate transport message handler LINUX Kernel Hackers Manual July 2017 scsi_netlink_init 9 4.1.27 scsi_netlink_init Called by SCSI subsystem to initialize the SCSI transport netlink interface Synopsis void scsi_netlink_init void Arguments void no arguments LINUX Kernel Hackers Manual July 2017 scsi_netlink_exit 9 4.1.27 scsi_netlink_exit Called by SCSI subsystem to disable the SCSI transport netlink interface Synopsis void scsi_netlink_exit void Arguments void no arguments Description drivers/scsi/scsi_scan.c Scan a host to determine which (if any) devices are attached. The general scanning/probing algorithm is as follows, exceptions are made to it depending on device specific flags, compilation options, and global variable (boot or module load time) settings. A specific LUN is scanned via an INQUIRY command; if the LUN has a device attached, a scsi_device is allocated and setup for it. For every id of every channel on the given host, start by scanning LUN 0. Skip hosts that don't respond at all to a scan of LUN 0. Otherwise, if LUN 0 has a device attached, allocate and setup a scsi_device for it. If target is SCSI-3 or up, issue a REPORT LUN, and scan all of the LUNs returned by the REPORT LUN; else, sequentially scan LUNs up until some maximum is reached, or a LUN is seen that cannot have a device attached to it. LINUX Kernel Hackers Manual July 2017 scsi_complete_async_scans 9 4.1.27 scsi_complete_async_scans Wait for asynchronous scans to complete Synopsis int scsi_complete_async_scans void Arguments void no arguments Description When this function returns, any host which started scanning before this function was called will have finished its scan. Hosts which started scanning after this function was called may or may not have finished. LINUX Kernel Hackers Manual July 2017 scsi_unlock_floptical 9 4.1.27 scsi_unlock_floptical unlock device via a special MODE SENSE command Synopsis void scsi_unlock_floptical struct scsi_device * sdev unsigned char * result Arguments sdev scsi device to send command to result area to store the result of the MODE SENSE Description Send a vendor specific MODE SENSE (not a MODE SELECT) command. Called for BLIST_KEY devices. LINUX Kernel Hackers Manual July 2017 scsi_alloc_sdev 9 4.1.27 scsi_alloc_sdev allocate and setup a scsi_Device Synopsis struct scsi_device * scsi_alloc_sdev struct scsi_target * starget u64 lun void * hostdata Arguments starget which target to allocate a scsi_device for lun which lun hostdata usually NULL and set by ->slave_alloc instead Description Allocate, initialize for io, and return a pointer to a scsi_Device. Stores the shost, channel, id, and lun in the scsi_Device, and adds scsi_Device to the appropriate list. Return value scsi_Device pointer, or NULL on failure. LINUX Kernel Hackers Manual July 2017 scsi_target_reap_ref_release 9 4.1.27 scsi_target_reap_ref_release remove target from visibility Synopsis void scsi_target_reap_ref_release struct kref * kref Arguments kref the reap_ref in the target being released Description Called on last put of reap_ref, which is the indication that no device under this target is visible anymore, so render the target invisible in sysfs. Note: we have to be in user context here because the target reaps should be done in places where the scsi device visibility is being removed. LINUX Kernel Hackers Manual July 2017 scsi_alloc_target 9 4.1.27 scsi_alloc_target allocate a new or find an existing target Synopsis struct scsi_target * scsi_alloc_target struct device * parent int channel uint id Arguments parent parent of the target (need not be a scsi host) channel target channel number (zero if no channels) id target id number Description Return an existing target if one exists, provided it hasn't already gone into STARGET_DEL state, otherwise allocate a new target. The target is returned with an incremented reference, so the caller is responsible for both reaping and doing a last put LINUX Kernel Hackers Manual July 2017 scsi_target_reap 9 4.1.27 scsi_target_reap check to see if target is in use and destroy if not Synopsis void scsi_target_reap struct scsi_target * starget Arguments starget target to be checked Description This is used after removing a LUN or doing a last put of the target it checks atomically that nothing is using the target and removes it if so. LINUX Kernel Hackers Manual July 2017 sanitize_inquiry_string 9 4.1.27 sanitize_inquiry_string remove non-graphical chars from an INQUIRY result string Synopsis void sanitize_inquiry_string unsigned char * s int len Arguments s INQUIRY result string to sanitize len length of the string Description The SCSI spec says that INQUIRY vendor, product, and revision strings must consist entirely of graphic ASCII characters, padded on the right with spaces. Since not all devices obey this rule, we will replace non-graphic or non-ASCII characters with spaces. Exception: a NUL character is interpreted as a string terminator, so all the following characters are set to spaces. LINUX Kernel Hackers Manual July 2017 scsi_probe_lun 9 4.1.27 scsi_probe_lun probe a single LUN using a SCSI INQUIRY Synopsis int scsi_probe_lun struct scsi_device * sdev unsigned char * inq_result int result_len int * bflags Arguments sdev scsi_device to probe inq_result area to store the INQUIRY result result_len len of inq_result bflags store any bflags found here Description Probe the lun associated with req using a standard SCSI INQUIRY; If the INQUIRY is successful, zero is returned and the INQUIRY data is in inq_result; the scsi_level and INQUIRY length are copied to the scsi_device any flags value is stored in *bflags. LINUX Kernel Hackers Manual July 2017 scsi_add_lun 9 4.1.27 scsi_add_lun allocate and fully initialze a scsi_device Synopsis int scsi_add_lun struct scsi_device * sdev unsigned char * inq_result int * bflags int async Arguments sdev holds information to be stored in the new scsi_device inq_result holds the result of a previous INQUIRY to the LUN bflags black/white list flag async 1 if this device is being scanned asynchronously Description Initialize the scsi_device sdev. Optionally set fields based on values in *bflags. SCSI_SCAN_NO_RESPONSE could not allocate or setup a scsi_device SCSI_SCAN_LUN_PRESENT a new scsi_device was allocated and initialized LINUX Kernel Hackers Manual July 2017 scsi_inq_str 9 4.1.27 scsi_inq_str print INQUIRY data from min to max index, strip trailing whitespace Synopsis unsigned char * scsi_inq_str unsigned char * buf unsigned char * inq unsigned first unsigned end Arguments buf Output buffer with at least end-first+1 bytes of space inq Inquiry buffer (input) first Offset of string into inq end Index after last character in inq LINUX Kernel Hackers Manual July 2017 scsi_probe_and_add_lun 9 4.1.27 scsi_probe_and_add_lun probe a LUN, if a LUN is found add it Synopsis int scsi_probe_and_add_lun struct scsi_target * starget u64 lun int * bflagsp struct scsi_device ** sdevp int rescan void * hostdata Arguments starget pointer to target device structure lun LUN of target device bflagsp store bflags here if not NULL sdevp probe the LUN corresponding to this scsi_device rescan if nonzero skip some code only needed on first scan hostdata passed to scsi_alloc_sdev Description Call scsi_probe_lun, if a LUN with an attached device is found, allocate and set it up by calling scsi_add_lun. SCSI_SCAN_NO_RESPONSE could not allocate or setup a scsi_device SCSI_SCAN_TARGET_PRESENT target responded, but no device is attached at the LUN SCSI_SCAN_LUN_PRESENT a new scsi_device was allocated and initialized LINUX Kernel Hackers Manual July 2017 scsi_sequential_lun_scan 9 4.1.27 scsi_sequential_lun_scan sequentially scan a SCSI target Synopsis void scsi_sequential_lun_scan struct scsi_target * starget int bflags int scsi_level int rescan Arguments starget pointer to target structure to scan bflags black/white list flag for LUN 0 scsi_level Which version of the standard does this device adhere to rescan passed to scsi_probe_add_lun Description Generally, scan from LUN 1 (LUN 0 is assumed to already have been scanned) to some maximum lun until a LUN is found with no device attached. Use the bflags to figure out any oddities. Modifies sdevscan->lun. LINUX Kernel Hackers Manual July 2017 scsi_report_lun_scan 9 4.1.27 scsi_report_lun_scan Scan using SCSI REPORT LUN results Synopsis int scsi_report_lun_scan struct scsi_target * starget int bflags int rescan Arguments starget which target bflags Zero or a mix of BLIST_NOLUN, BLIST_REPORTLUN2, or BLIST_NOREPORTLUN rescan nonzero if we can skip code only needed on first scan Description Fast scanning for modern (SCSI-3) devices by sending a REPORT LUN command. Scan the resulting list of LUNs by calling scsi_probe_and_add_lun. If BLINK_REPORTLUN2 is set, scan a target that supports more than 8 LUNs even if it's older than SCSI-3. If BLIST_NOREPORTLUN is set, return 1 always. If BLIST_NOLUN is set, return 0 always. If starget->no_report_luns is set, return 1 always. 0 scan completed (or no memory, so further scanning is futile) 1 could not scan with REPORT LUN LINUX Kernel Hackers Manual July 2017 scsi_prep_async_scan 9 4.1.27 scsi_prep_async_scan prepare for an async scan Synopsis struct async_scan_data * scsi_prep_async_scan struct Scsi_Host * shost Arguments shost the host which will be scanned Returns a cookie to be passed to scsi_finish_async_scan Tells the midlayer this host is going to do an asynchronous scan. It reserves the host's position in the scanning list and ensures that other asynchronous scans started after this one won't affect the ordering of the discovered devices. LINUX Kernel Hackers Manual July 2017 scsi_finish_async_scan 9 4.1.27 scsi_finish_async_scan asynchronous scan has finished Synopsis void scsi_finish_async_scan struct async_scan_data * data Arguments data cookie returned from earlier call to scsi_prep_async_scan Description All the devices currently attached to this host have been found. This function announces all the devices it has found to the rest of the system. drivers/scsi/scsi_sysctl.c Set up the sysctl entry: "/dev/scsi/logging_level" (DEV_SCSI_LOGGING_LEVEL) which sets/returns scsi_logging_level. drivers/scsi/scsi_sysfs.c SCSI sysfs interface routines. LINUX Kernel Hackers Manual July 2017 scsi_remove_device 9 4.1.27 scsi_remove_device unregister a device from the scsi bus Synopsis void scsi_remove_device struct scsi_device * sdev Arguments sdev scsi_device to unregister LINUX Kernel Hackers Manual July 2017 scsi_remove_target 9 4.1.27 scsi_remove_target try to remove a target and all its devices Synopsis void scsi_remove_target struct device * dev Arguments dev generic starget or parent of generic stargets to be removed Note This is slightly racy. It is possible that if the user requests the addition of another device then the target won't be removed. drivers/scsi/hosts.c mid to lowlevel SCSI driver interface LINUX Kernel Hackers Manual July 2017 scsi_host_set_state 9 4.1.27 scsi_host_set_state Take the given host through the host state model. Synopsis int scsi_host_set_state struct Scsi_Host * shost enum scsi_host_state state Arguments shost scsi host to change the state of. state state to change to. Description Returns zero if unsuccessful or an error if the requested transition is illegal. LINUX Kernel Hackers Manual July 2017 scsi_remove_host 9 4.1.27 scsi_remove_host remove a scsi host Synopsis void scsi_remove_host struct Scsi_Host * shost Arguments shost a pointer to a scsi host to remove LINUX Kernel Hackers Manual July 2017 scsi_add_host_with_dma 9 4.1.27 scsi_add_host_with_dma add a scsi host with dma device Synopsis int scsi_add_host_with_dma struct Scsi_Host * shost struct device * dev struct device * dma_dev Arguments shost scsi host pointer to add dev a struct device of type scsi class dma_dev dma device for the host Note You rarely need to worry about this unless you're in a virtualised host environments, so use the simpler scsi_add_host function instead. Return value 0 on success / != 0 for error LINUX Kernel Hackers Manual July 2017 scsi_host_alloc 9 4.1.27 scsi_host_alloc register a scsi host adapter instance. Synopsis struct Scsi_Host * scsi_host_alloc struct scsi_host_template * sht int privsize Arguments sht pointer to scsi host template privsize extra bytes to allocate for driver Note Allocate a new Scsi_Host and perform basic initialization. The host is not published to the scsi midlayer until scsi_add_host is called. Return value Pointer to a new Scsi_Host LINUX Kernel Hackers Manual July 2017 scsi_host_lookup 9 4.1.27 scsi_host_lookup get a reference to a Scsi_Host by host no Synopsis struct Scsi_Host * scsi_host_lookup unsigned short hostnum Arguments hostnum host number to locate Return value A pointer to located Scsi_Host or NULL. The caller must do a scsi_host_put to drop the reference that scsi_host_get took. The put_device below dropped the reference from class_find_device. LINUX Kernel Hackers Manual July 2017 scsi_host_get 9 4.1.27 scsi_host_get inc a Scsi_Host ref count Synopsis struct Scsi_Host * scsi_host_get struct Scsi_Host * shost Arguments shost Pointer to Scsi_Host to inc. LINUX Kernel Hackers Manual July 2017 scsi_host_put 9 4.1.27 scsi_host_put dec a Scsi_Host ref count Synopsis void scsi_host_put struct Scsi_Host * shost Arguments shost Pointer to Scsi_Host to dec. LINUX Kernel Hackers Manual July 2017 scsi_queue_work 9 4.1.27 scsi_queue_work Queue work to the Scsi_Host workqueue. Synopsis int scsi_queue_work struct Scsi_Host * shost struct work_struct * work Arguments shost Pointer to Scsi_Host. work Work to queue for execution. Return value 1 - work queued for execution 0 - work is already queued -EINVAL - work queue doesn't exist LINUX Kernel Hackers Manual July 2017 scsi_flush_work 9 4.1.27 scsi_flush_work Flush a Scsi_Host's workqueue. Synopsis void scsi_flush_work struct Scsi_Host * shost Arguments shost Pointer to Scsi_Host. drivers/scsi/constants.c mid to lowlevel SCSI driver interface .//drivers/scsi/constants.c Document generation inconsistency Oops The template for this document tried to insert the structured comment from the file .//drivers/scsi/constants.c at this point, but none was found. This dummy section is inserted to allow generation to continue. Transport classes Transport classes are service libraries for drivers in the SCSI lower layer, which expose transport attributes in sysfs. Fibre Channel transport The file drivers/scsi/scsi_transport_fc.c defines transport attributes for Fibre Channel. LINUX Kernel Hackers Manual July 2017 fc_get_event_number 9 4.1.27 fc_get_event_number Obtain the next sequential FC event number Synopsis u32 fc_get_event_number void Arguments void no arguments Notes We could have inlined this, but it would have required fc_event_seq to be exposed. For now, live with the subroutine call. Atomic used to avoid lock/unlock... LINUX Kernel Hackers Manual July 2017 fc_host_post_event 9 4.1.27 fc_host_post_event called to post an even on an fc_host. Synopsis void fc_host_post_event struct Scsi_Host * shost u32 event_number enum fc_host_event_code event_code u32 event_data Arguments shost host the event occurred on event_number fc event number obtained from get_fc_event_number event_code fc_host event being posted event_data 32bits of data for the event being posted Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_host_post_vendor_event 9 4.1.27 fc_host_post_vendor_event called to post a vendor unique event on an fc_host Synopsis void fc_host_post_vendor_event struct Scsi_Host * shost u32 event_number u32 data_len char * data_buf u64 vendor_id Arguments shost host the event occurred on event_number fc event number obtained from get_fc_event_number data_len amount, in bytes, of vendor unique data data_buf pointer to vendor unique data vendor_id Vendor id Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_remove_host 9 4.1.27 fc_remove_host called to terminate any fc_transport-related elements for a scsi host. Synopsis void fc_remove_host struct Scsi_Host * shost Arguments shost Which Scsi_Host Description This routine is expected to be called immediately preceding the a driver's call to scsi_remove_host. WARNING A driver utilizing the fc_transport, which fails to call this routine prior to scsi_remove_host, will leave dangling objects in /sys/class/fc_remote_ports. Access to any of these objects can result in a system crash !!! Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_remote_port_add 9 4.1.27 fc_remote_port_add notify fc transport of the existence of a remote FC port. Synopsis struct fc_rport * fc_remote_port_add struct Scsi_Host * shost int channel struct fc_rport_identifiers * ids Arguments shost scsi host the remote port is connected to. channel Channel on shost port connected to. ids The world wide names, fc address, and FC4 port roles for the remote port. Description The LLDD calls this routine to notify the transport of the existence of a remote port. The LLDD provides the unique identifiers (wwpn,wwn) of the port, it's FC address (port_id), and the FC4 roles that are active for the port. For ports that are FCP targets (aka scsi targets), the FC transport maintains consistent target id bindings on behalf of the LLDD. A consistent target id binding is an assignment of a target id to a remote port identifier, which persists while the scsi host is attached. The remote port can disappear, then later reappear, and it's target id assignment remains the same. This allows for shifts in FC addressing (if binding by wwpn or wwnn) with no apparent changes to the scsi subsystem which is based on scsi host number and target id values. Bindings are only valid during the attachment of the scsi host. If the host detaches, then later re-attaches, target id bindings may change. This routine is responsible for returning a remote port structure. The routine will search the list of remote ports it maintains internally on behalf of consistent target id mappings. If found, the remote port structure will be reused. Otherwise, a new remote port structure will be allocated. Whenever a remote port is allocated, a new fc_remote_port class device is created. Should not be called from interrupt context. Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_remote_port_delete 9 4.1.27 fc_remote_port_delete notifies the fc transport that a remote port is no longer in existence. Synopsis void fc_remote_port_delete struct fc_rport * rport Arguments rport The remote port that no longer exists Description The LLDD calls this routine to notify the transport that a remote port is no longer part of the topology. Note: Although a port may no longer be part of the topology, it may persist in the remote ports displayed by the fc_host. We do this under 2 conditions: 1) If the port was a scsi target, we delay its deletion by blocking it. This allows the port to temporarily disappear, then reappear without disrupting the SCSI device tree attached to it. During the blocked period the port will still exist. 2) If the port was a scsi target and disappears for longer than we expect, we'll delete the port and the tear down the SCSI device tree attached to it. However, we want to semi-persist the target id assigned to that port if it eventually does exist. The port structure will remain (although with minimal information) so that the target id bindings remails. If the remote port is not an FCP Target, it will be fully torn down and deallocated, including the fc_remote_port class device. If the remote port is an FCP Target, the port will be placed in a temporary blocked state. From the LLDD's perspective, the rport no longer exists. From the SCSI midlayer's perspective, the SCSI target exists, but all sdevs on it are blocked from further I/O. The following is then expected. If the remote port does not return (signaled by a LLDD call to fc_remote_port_add) within the dev_loss_tmo timeout, then the scsi target is removed - killing all outstanding i/o and removing the scsi devices attached ot it. The port structure will be marked Not Present and be partially cleared, leaving only enough information to recognize the remote port relative to the scsi target id binding if it later appears. The port will remain as long as there is a valid binding (e.g. until the user changes the binding type or unloads the scsi host with the binding). If the remote port returns within the dev_loss_tmo value (and matches according to the target id binding type), the port structure will be reused. If it is no longer a SCSI target, the target will be torn down. If it continues to be a SCSI target, then the target will be unblocked (allowing i/o to be resumed), and a scan will be activated to ensure that all luns are detected. Called from normal process context only - cannot be called from interrupt. Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_remote_port_rolechg 9 4.1.27 fc_remote_port_rolechg notifies the fc transport that the roles on a remote may have changed. Synopsis void fc_remote_port_rolechg struct fc_rport * rport u32 roles Arguments rport The remote port that changed. roles New roles for this port. Description The LLDD calls this routine to notify the transport that the roles on a remote port may have changed. The largest effect of this is if a port now becomes a FCP Target, it must be allocated a scsi target id. If the port is no longer a FCP target, any scsi target id value assigned to it will persist in case the role changes back to include FCP Target. No changes in the scsi midlayer will be invoked if the role changes (in the expectation that the role will be resumed. If it doesn't normal error processing will take place). Should not be called from interrupt context. Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_block_scsi_eh 9 4.1.27 fc_block_scsi_eh Block SCSI eh thread for blocked fc_rport Synopsis int fc_block_scsi_eh struct scsi_cmnd * cmnd Arguments cmnd SCSI command that scsi_eh is trying to recover Description This routine can be called from a FC LLD scsi_eh callback. It blocks the scsi_eh thread until the fc_rport leaves the FC_PORTSTATE_BLOCKED, or the fast_io_fail_tmo fires. This is necessary to avoid the scsi_eh failing recovery actions for blocked rports which would lead to offlined SCSI devices. Returns 0 if the fc_rport left the state FC_PORTSTATE_BLOCKED. FAST_IO_FAIL if the fast_io_fail_tmo fired, this should be passed back to scsi_eh. LINUX Kernel Hackers Manual July 2017 fc_vport_create 9 4.1.27 fc_vport_create Admin App or LLDD requests creation of a vport Synopsis struct fc_vport * fc_vport_create struct Scsi_Host * shost int channel struct fc_vport_identifiers * ids Arguments shost scsi host the virtual port is connected to. channel channel on shost port connected to. ids The world wide names, FC4 port roles, etc for the virtual port. Notes This routine assumes no locks are held on entry. LINUX Kernel Hackers Manual July 2017 fc_vport_terminate 9 4.1.27 fc_vport_terminate Admin App or LLDD requests termination of a vport Synopsis int fc_vport_terminate struct fc_vport * vport Arguments vport fc_vport to be terminated Description Calls the LLDD vport_delete function, then deallocates and removes the vport from the shost and object tree. Notes This routine assumes no locks are held on entry. iSCSI transport class The file drivers/scsi/scsi_transport_iscsi.c defines transport attributes for the iSCSI class, which sends SCSI packets over TCP/IP connections. LINUX Kernel Hackers Manual July 2017 iscsi_create_flashnode_sess 9 4.1.27 iscsi_create_flashnode_sess Add flashnode session entry in sysfs Synopsis struct iscsi_bus_flash_session * iscsi_create_flashnode_sess struct Scsi_Host * shost int index struct iscsi_transport * transport int dd_size Arguments shost pointer to host data index index of flashnode to add in sysfs transport pointer to transport data dd_size total size to allocate Description Adds a sysfs entry for the flashnode session attributes Returns pointer to allocated flashnode sess on success NULL on failure LINUX Kernel Hackers Manual July 2017 iscsi_create_flashnode_conn 9 4.1.27 iscsi_create_flashnode_conn Add flashnode conn entry in sysfs Synopsis struct iscsi_bus_flash_conn * iscsi_create_flashnode_conn struct Scsi_Host * shost struct iscsi_bus_flash_session * fnode_sess struct iscsi_transport * transport int dd_size Arguments shost pointer to host data fnode_sess pointer to the parent flashnode session entry transport pointer to transport data dd_size total size to allocate Description Adds a sysfs entry for the flashnode connection attributes Returns pointer to allocated flashnode conn on success NULL on failure LINUX Kernel Hackers Manual July 2017 iscsi_is_flashnode_conn_dev 9 4.1.27 iscsi_is_flashnode_conn_dev verify passed device is to be flashnode conn Synopsis int iscsi_is_flashnode_conn_dev struct device * dev void * data Arguments dev device to verify data pointer to data containing value to use for verification Description Verifies if the passed device is flashnode conn device Returns 1 on success 0 on failure LINUX Kernel Hackers Manual July 2017 iscsi_find_flashnode_sess 9 4.1.27 iscsi_find_flashnode_sess finds flashnode session entry Synopsis struct device * iscsi_find_flashnode_sess struct Scsi_Host * shost void * data int (*fn) struct device *dev, void *data Arguments shost pointer to host data data pointer to data containing value to use for comparison fn function pointer that does actual comparison Description Finds the flashnode session object comparing the data passed using logic defined in passed function pointer Returns pointer to found flashnode session device object on success NULL on failure LINUX Kernel Hackers Manual July 2017 iscsi_find_flashnode_conn 9 4.1.27 iscsi_find_flashnode_conn finds flashnode connection entry Synopsis struct device * iscsi_find_flashnode_conn struct iscsi_bus_flash_session * fnode_sess Arguments fnode_sess pointer to parent flashnode session entry Description Finds the flashnode connection object comparing the data passed using logic defined in passed function pointer Returns pointer to found flashnode connection device object on success NULL on failure LINUX Kernel Hackers Manual July 2017 iscsi_destroy_flashnode_sess 9 4.1.27 iscsi_destroy_flashnode_sess destroy flashnode session entry Synopsis void iscsi_destroy_flashnode_sess struct iscsi_bus_flash_session * fnode_sess Arguments fnode_sess pointer to flashnode session entry to be destroyed Description Deletes the flashnode session entry and all children flashnode connection entries from sysfs LINUX Kernel Hackers Manual July 2017 iscsi_destroy_all_flashnode 9 4.1.27 iscsi_destroy_all_flashnode destroy all flashnode session entries Synopsis void iscsi_destroy_all_flashnode struct Scsi_Host * shost Arguments shost pointer to host data Description Destroys all the flashnode session entries and all corresponding children flashnode connection entries from sysfs LINUX Kernel Hackers Manual July 2017 iscsi_scan_finished 9 4.1.27 iscsi_scan_finished helper to report when running scans are done Synopsis int iscsi_scan_finished struct Scsi_Host * shost unsigned long time Arguments shost scsi host time scan run time Description This function can be used by drives like qla4xxx to report to the scsi layer when the scans it kicked off at module load time are done. LINUX Kernel Hackers Manual July 2017 iscsi_block_scsi_eh 9 4.1.27 iscsi_block_scsi_eh block scsi eh until session state has transistioned Synopsis int iscsi_block_scsi_eh struct scsi_cmnd * cmd Arguments cmd scsi cmd passed to scsi eh handler Description If the session is down this function will wait for the recovery timer to fire or for the session to be logged back in. If the recovery timer fires then FAST_IO_FAIL is returned. The caller should pass this error value to the scsi eh. LINUX Kernel Hackers Manual July 2017 iscsi_unblock_session 9 4.1.27 iscsi_unblock_session set a session as logged in and start IO. Synopsis void iscsi_unblock_session struct iscsi_cls_session * session Arguments session iscsi session Description Mark a session as ready to accept IO. LINUX Kernel Hackers Manual July 2017 iscsi_create_session 9 4.1.27 iscsi_create_session create iscsi class session Synopsis struct iscsi_cls_session * iscsi_create_session struct Scsi_Host * shost struct iscsi_transport * transport int dd_size unsigned int target_id Arguments shost scsi host transport iscsi transport dd_size private driver data size target_id which target Description This can be called from a LLD or iscsi_transport. LINUX Kernel Hackers Manual July 2017 iscsi_destroy_session 9 4.1.27 iscsi_destroy_session destroy iscsi session Synopsis int iscsi_destroy_session struct iscsi_cls_session * session Arguments session iscsi_session Description Can be called by a LLD or iscsi_transport. There must not be any running connections. LINUX Kernel Hackers Manual July 2017 iscsi_create_conn 9 4.1.27 iscsi_create_conn create iscsi class connection Synopsis struct iscsi_cls_conn * iscsi_create_conn struct iscsi_cls_session * session int dd_size uint32_t cid Arguments session iscsi cls session dd_size private driver data size cid connection id Description This can be called from a LLD or iscsi_transport. The connection is child of the session so cid must be unique for all connections on the session. Since we do not support MCS, cid will normally be zero. In some cases for software iscsi we could be trying to preallocate a connection struct in which case there could be two connection structs and cid would be non-zero. LINUX Kernel Hackers Manual July 2017 iscsi_destroy_conn 9 4.1.27 iscsi_destroy_conn destroy iscsi class connection Synopsis int iscsi_destroy_conn struct iscsi_cls_conn * conn Arguments conn iscsi cls session Description This can be called from a LLD or iscsi_transport. LINUX Kernel Hackers Manual July 2017 iscsi_session_event 9 4.1.27 iscsi_session_event send session destr. completion event Synopsis int iscsi_session_event struct iscsi_cls_session * session enum iscsi_uevent_e event Arguments session iscsi class session event type of event Serial Attached SCSI (SAS) transport class The file drivers/scsi/scsi_transport_sas.c defines transport attributes for Serial Attached SCSI, a variant of SATA aimed at large high-end systems. The SAS transport class contains common code to deal with SAS HBAs, an aproximated representation of SAS topologies in the driver model, and various sysfs attributes to expose these topologies and management interfaces to userspace. In addition to the basic SCSI core objects this transport class introduces two additional intermediate objects: The SAS PHY as represented by struct sas_phy defines an "outgoing" PHY on a SAS HBA or Expander, and the SAS remote PHY represented by struct sas_rphy defines an "incoming" PHY on a SAS Expander or end device. Note that this is purely a software concept, the underlying hardware for a PHY and a remote PHY is the exactly the same. There is no concept of a SAS port in this code, users can see what PHYs form a wide port based on the port_identifier attribute, which is the same for all PHYs in a port. LINUX Kernel Hackers Manual July 2017 sas_remove_children 9 4.1.27 sas_remove_children tear down a devices SAS data structures Synopsis void sas_remove_children struct device * dev Arguments dev device belonging to the sas object Description Removes all SAS PHYs and remote PHYs for a given object LINUX Kernel Hackers Manual July 2017 sas_remove_host 9 4.1.27 sas_remove_host tear down a Scsi_Host's SAS data structures Synopsis void sas_remove_host struct Scsi_Host * shost Arguments shost Scsi Host that is torn down Description Removes all SAS PHYs and remote PHYs for a given Scsi_Host. Must be called just before scsi_remove_host for SAS HBAs. LINUX Kernel Hackers Manual July 2017 sas_tlr_supported 9 4.1.27 sas_tlr_supported checking TLR bit in vpd 0x90 Synopsis unsigned int sas_tlr_supported struct scsi_device * sdev Arguments sdev scsi device struct Description Check Transport Layer Retries are supported or not. If vpd page 0x90 is present, TRL is supported. LINUX Kernel Hackers Manual July 2017 sas_disable_tlr 9 4.1.27 sas_disable_tlr setting TLR flags Synopsis void sas_disable_tlr struct scsi_device * sdev Arguments sdev scsi device struct Description Seting tlr_enabled flag to 0. LINUX Kernel Hackers Manual July 2017 sas_enable_tlr 9 4.1.27 sas_enable_tlr setting TLR flags Synopsis void sas_enable_tlr struct scsi_device * sdev Arguments sdev scsi device struct Description Seting tlr_enabled flag 1. LINUX Kernel Hackers Manual July 2017 sas_phy_alloc 9 4.1.27 sas_phy_alloc allocates and initialize a SAS PHY structure Synopsis struct sas_phy * sas_phy_alloc struct device * parent int number Arguments parent Parent device number Phy index Description Allocates an SAS PHY structure. It will be added in the device tree below the device specified by parent, which has to be either a Scsi_Host or sas_rphy. Returns SAS PHY allocated or NULL if the allocation failed. LINUX Kernel Hackers Manual July 2017 sas_phy_add 9 4.1.27 sas_phy_add add a SAS PHY to the device hierarchy Synopsis int sas_phy_add struct sas_phy * phy Arguments phy The PHY to be added Description Publishes a SAS PHY to the rest of the system. LINUX Kernel Hackers Manual July 2017 sas_phy_free 9 4.1.27 sas_phy_free free a SAS PHY Synopsis void sas_phy_free struct sas_phy * phy Arguments phy SAS PHY to free Description Frees the specified SAS PHY. Note This function must only be called on a PHY that has not successfully been added using sas_phy_add. LINUX Kernel Hackers Manual July 2017 sas_phy_delete 9 4.1.27 sas_phy_delete remove SAS PHY Synopsis void sas_phy_delete struct sas_phy * phy Arguments phy SAS PHY to remove Description Removes the specified SAS PHY. If the SAS PHY has an associated remote PHY it is removed before. LINUX Kernel Hackers Manual July 2017 scsi_is_sas_phy 9 4.1.27 scsi_is_sas_phy check if a struct device represents a SAS PHY Synopsis int scsi_is_sas_phy const struct device * dev Arguments dev device to check Returns 1 if the device represents a SAS PHY, 0 else LINUX Kernel Hackers Manual July 2017 sas_port_add 9 4.1.27 sas_port_add add a SAS port to the device hierarchy Synopsis int sas_port_add struct sas_port * port Arguments port port to be added Description publishes a port to the rest of the system LINUX Kernel Hackers Manual July 2017 sas_port_free 9 4.1.27 sas_port_free free a SAS PORT Synopsis void sas_port_free struct sas_port * port Arguments port SAS PORT to free Description Frees the specified SAS PORT. Note This function must only be called on a PORT that has not successfully been added using sas_port_add. LINUX Kernel Hackers Manual July 2017 sas_port_delete 9 4.1.27 sas_port_delete remove SAS PORT Synopsis void sas_port_delete struct sas_port * port Arguments port SAS PORT to remove Description Removes the specified SAS PORT. If the SAS PORT has an associated phys, unlink them from the port as well. LINUX Kernel Hackers Manual July 2017 scsi_is_sas_port 9 4.1.27 scsi_is_sas_port check if a struct device represents a SAS port Synopsis int scsi_is_sas_port const struct device * dev Arguments dev device to check Returns 1 if the device represents a SAS Port, 0 else LINUX Kernel Hackers Manual July 2017 sas_port_get_phy 9 4.1.27 sas_port_get_phy try to take a reference on a port member Synopsis struct sas_phy * sas_port_get_phy struct sas_port * port Arguments port port to check LINUX Kernel Hackers Manual July 2017 sas_port_add_phy 9 4.1.27 sas_port_add_phy add another phy to a port to form a wide port Synopsis void sas_port_add_phy struct sas_port * port struct sas_phy * phy Arguments port port to add the phy to phy phy to add Description When a port is initially created, it is empty (has no phys). All ports must have at least one phy to operated, and all wide ports must have at least two. The current code makes no difference between ports and wide ports, but the only object that can be connected to a remote device is a port, so ports must be formed on all devices with phys if they're connected to anything. LINUX Kernel Hackers Manual July 2017 sas_port_delete_phy 9 4.1.27 sas_port_delete_phy remove a phy from a port or wide port Synopsis void sas_port_delete_phy struct sas_port * port struct sas_phy * phy Arguments port port to remove the phy from phy phy to remove Description This operation is used for tearing down ports again. It must be done to every port or wide port before calling sas_port_delete. LINUX Kernel Hackers Manual July 2017 sas_end_device_alloc 9 4.1.27 sas_end_device_alloc allocate an rphy for an end device Synopsis struct sas_rphy * sas_end_device_alloc struct sas_port * parent Arguments parent which port Description Allocates an SAS remote PHY structure, connected to parent. Returns SAS PHY allocated or NULL if the allocation failed. LINUX Kernel Hackers Manual July 2017 sas_expander_alloc 9 4.1.27 sas_expander_alloc allocate an rphy for an end device Synopsis struct sas_rphy * sas_expander_alloc struct sas_port * parent enum sas_device_type type Arguments parent which port type SAS_EDGE_EXPANDER_DEVICE or SAS_FANOUT_EXPANDER_DEVICE Description Allocates an SAS remote PHY structure, connected to parent. Returns SAS PHY allocated or NULL if the allocation failed. LINUX Kernel Hackers Manual July 2017 sas_rphy_add 9 4.1.27 sas_rphy_add add a SAS remote PHY to the device hierarchy Synopsis int sas_rphy_add struct sas_rphy * rphy Arguments rphy The remote PHY to be added Description Publishes a SAS remote PHY to the rest of the system. LINUX Kernel Hackers Manual July 2017 sas_rphy_free 9 4.1.27 sas_rphy_free free a SAS remote PHY Synopsis void sas_rphy_free struct sas_rphy * rphy Arguments rphy SAS remote PHY to free Description Frees the specified SAS remote PHY. Note This function must only be called on a remote PHY that has not successfully been added using sas_rphy_add (or has been sas_rphy_remove'd) LINUX Kernel Hackers Manual July 2017 sas_rphy_delete 9 4.1.27 sas_rphy_delete remove and free SAS remote PHY Synopsis void sas_rphy_delete struct sas_rphy * rphy Arguments rphy SAS remote PHY to remove and free Description Removes the specified SAS remote PHY and frees it. LINUX Kernel Hackers Manual July 2017 sas_rphy_unlink 9 4.1.27 sas_rphy_unlink unlink SAS remote PHY Synopsis void sas_rphy_unlink struct sas_rphy * rphy Arguments rphy SAS remote phy to unlink from its parent port Description Removes port reference to an rphy LINUX Kernel Hackers Manual July 2017 sas_rphy_remove 9 4.1.27 sas_rphy_remove remove SAS remote PHY Synopsis void sas_rphy_remove struct sas_rphy * rphy Arguments rphy SAS remote phy to remove Description Removes the specified SAS remote PHY. LINUX Kernel Hackers Manual July 2017 scsi_is_sas_rphy 9 4.1.27 scsi_is_sas_rphy check if a struct device represents a SAS remote PHY Synopsis int scsi_is_sas_rphy const struct device * dev Arguments dev device to check Returns 1 if the device represents a SAS remote PHY, 0 else LINUX Kernel Hackers Manual July 2017 sas_attach_transport 9 4.1.27 sas_attach_transport instantiate SAS transport template Synopsis struct scsi_transport_template * sas_attach_transport struct sas_function_template * ft Arguments ft SAS transport class function template LINUX Kernel Hackers Manual July 2017 sas_release_transport 9 4.1.27 sas_release_transport release SAS transport template instance Synopsis void sas_release_transport struct scsi_transport_template * t Arguments t transport template instance SATA transport class The SATA transport is handled by libata, which has its own book of documentation in this directory. Parallel SCSI (SPI) transport class The file drivers/scsi/scsi_transport_spi.c defines transport attributes for traditional (fast/wide/ultra) SCSI busses. LINUX Kernel Hackers Manual July 2017 spi_schedule_dv_device 9 4.1.27 spi_schedule_dv_device schedule domain validation to occur on the device Synopsis void spi_schedule_dv_device struct scsi_device * sdev Arguments sdev The device to validate Description Identical to spi_dv_device above, except that the DV will be scheduled to occur in a workqueue later. All memory allocations are atomic, so may be called from any context including those holding SCSI locks. LINUX Kernel Hackers Manual July 2017 spi_display_xfer_agreement 9 4.1.27 spi_display_xfer_agreement Print the current target transfer agreement Synopsis void spi_display_xfer_agreement struct scsi_target * starget Arguments starget The target for which to display the agreement Description Each SPI port is required to maintain a transfer agreement for each other port on the bus. This function prints a one-line summary of the current agreement; more detailed information is available in sysfs. LINUX Kernel Hackers Manual July 2017 spi_populate_tag_msg 9 4.1.27 spi_populate_tag_msg place a tag message in a buffer Synopsis int spi_populate_tag_msg unsigned char * msg struct scsi_cmnd * cmd Arguments msg pointer to the area to place the tag cmd pointer to the scsi command for the tag Notes designed to create the correct type of tag message for the particular request. Returns the size of the tag message. May return 0 if TCQ is disabled for this device. SCSI RDMA (SRP) transport class The file drivers/scsi/scsi_transport_srp.c defines transport attributes for SCSI over Remote Direct Memory Access. LINUX Kernel Hackers Manual July 2017 srp_tmo_valid 9 4.1.27 srp_tmo_valid check timeout combination validity Synopsis int srp_tmo_valid int reconnect_delay int fast_io_fail_tmo int dev_loss_tmo Arguments reconnect_delay Reconnect delay in seconds. fast_io_fail_tmo Fast I/O fail timeout in seconds. dev_loss_tmo Device loss timeout in seconds. Description The combination of the timeout parameters must be such that SCSI commands are finished in a reasonable time. Hence do not allow the fast I/O fail timeout to exceed SCSI_DEVICE_BLOCK_MAX_TIMEOUT nor allow dev_loss_tmo to exceed that limit if failing I/O fast has been disabled. Furthermore, these parameters must be such that multipath can detect failed paths timely. Hence do not allow all three parameters to be disabled simultaneously. LINUX Kernel Hackers Manual July 2017 srp_start_tl_fail_timers 9 4.1.27 srp_start_tl_fail_timers start the transport layer failure timers Synopsis void srp_start_tl_fail_timers struct srp_rport * rport Arguments rport SRP target port. Description Start the transport layer fast I/O failure and device loss timers. Do not modify a timer that was already started. LINUX Kernel Hackers Manual July 2017 srp_reconnect_rport 9 4.1.27 srp_reconnect_rport reconnect to an SRP target port Synopsis int srp_reconnect_rport struct srp_rport * rport Arguments rport SRP target port. Description Blocks SCSI command queueing before invoking reconnect such that queuecommand won't be invoked concurrently with reconnect from outside the SCSI EH. This is important since a reconnect implementation may reallocate resources needed by queuecommand. Notes - This function neither waits until outstanding requests have finished nor tries to abort these. It is the responsibility of the reconnect function to finish outstanding commands before reconnecting to the target port. - It is the responsibility of the caller to ensure that the resources reallocated by the reconnect function won't be used while this function is in progress. One possible strategy is to invoke this function from the context of the SCSI EH thread only. Another possible strategy is to lock the rport mutex inside each SCSI LLD callback that can be invoked by the SCSI EH (the scsi_host_template.eh_*() functions and also the scsi_host_template.queuecommand function). LINUX Kernel Hackers Manual July 2017 srp_rport_get 9 4.1.27 srp_rport_get increment rport reference count Synopsis void srp_rport_get struct srp_rport * rport Arguments rport SRP target port. LINUX Kernel Hackers Manual July 2017 srp_rport_put 9 4.1.27 srp_rport_put decrement rport reference count Synopsis void srp_rport_put struct srp_rport * rport Arguments rport SRP target port. LINUX Kernel Hackers Manual July 2017 srp_rport_add 9 4.1.27 srp_rport_add add a SRP remote port to the device hierarchy Synopsis struct srp_rport * srp_rport_add struct Scsi_Host * shost struct srp_rport_identifiers * ids Arguments shost scsi host the remote port is connected to. ids The port id for the remote port. Description Publishes a port to the rest of the system. LINUX Kernel Hackers Manual July 2017 srp_rport_del 9 4.1.27 srp_rport_del remove a SRP remote port Synopsis void srp_rport_del struct srp_rport * rport Arguments rport SRP remote port to remove Description Removes the specified SRP remote port. LINUX Kernel Hackers Manual July 2017 srp_remove_host 9 4.1.27 srp_remove_host tear down a Scsi_Host's SRP data structures Synopsis void srp_remove_host struct Scsi_Host * shost Arguments shost Scsi Host that is torn down Description Removes all SRP remote ports for a given Scsi_Host. Must be called just before scsi_remove_host for SRP HBAs. LINUX Kernel Hackers Manual July 2017 srp_stop_rport_timers 9 4.1.27 srp_stop_rport_timers stop the transport layer recovery timers Synopsis void srp_stop_rport_timers struct srp_rport * rport Arguments rport SRP remote port for which to stop the timers. Description Must be called after srp_remove_host and scsi_remove_host. The caller must hold a reference on the rport (rport->dev) and on the SCSI host (rport->dev.parent). LINUX Kernel Hackers Manual July 2017 srp_attach_transport 9 4.1.27 srp_attach_transport instantiate SRP transport template Synopsis struct scsi_transport_template * srp_attach_transport struct srp_function_template * ft Arguments ft SRP transport class function template LINUX Kernel Hackers Manual July 2017 srp_release_transport 9 4.1.27 srp_release_transport release SRP transport template instance Synopsis void srp_release_transport struct scsi_transport_template * t Arguments t transport template instance SCSI lower layer Host Bus Adapter transport types Many modern device controllers use the SCSI command set as a protocol to communicate with their devices through many different types of physical connections. In SCSI language a bus capable of carrying SCSI commands is called a "transport", and a controller connecting to such a bus is called a "host bus adapter" (HBA). Debug transport The file drivers/scsi/scsi_debug.c simulates a host adapter with a variable number of disks (or disk like devices) attached, sharing a common amount of RAM. Does a lot of checking to make sure that we are not getting blocks mixed up, and panics the kernel if anything out of the ordinary is seen. To be more realistic, the simulated devices have the transport attributes of SAS disks. For documentation see http://sg.danny.cz/sg/sdebug26.html todo Parallel (fast/wide/ultra) SCSI, USB, SATA, SAS, Fibre Channel, FireWire, ATAPI devices, Infiniband, I20, iSCSI, Parallel ports, netlink...