FreeBSD kernel CAM code
scsi_ctl.c File Reference
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/condvar.h>
#include <sys/malloc.h>
#include <sys/bus.h>
#include <sys/endian.h>
#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/types.h>
#include <sys/taskqueue.h>
#include <machine/bus.h>
#include <cam/cam.h>
#include <cam/cam_ccb.h>
#include <cam/cam_periph.h>
#include <cam/cam_queue.h>
#include <cam/cam_xpt_periph.h>
#include <cam/cam_debug.h>
#include <cam/cam_sim.h>
#include <cam/cam_xpt.h>
#include <cam/scsi/scsi_all.h>
#include <cam/scsi/scsi_message.h>
#include <cam/ctl/ctl_io.h>
#include <cam/ctl/ctl.h>
#include <cam/ctl/ctl_frontend.h>
#include <cam/ctl/ctl_util.h>
#include <cam/ctl/ctl_error.h>
Include dependency graph for scsi_ctl.c:

Go to the source code of this file.

Data Structures

struct  ctlfe_softc
 
struct  ctlfe_lun_softc
 
struct  ctlfe_cmd_info
 

Macros

#define CTLFE_MAX_SEGS   32
 
#define CTLFE_REQ_CTL_IO   4096
 
#define CTLFE_ATIO_PER_LUN   1024
 
#define CTLFE_IN_PER_LUN   1024
 
#define CTLFE_TIMEOUT   5
 
#define io_ptr   ppriv_ptr0
 
#define ccb_atio   ppriv_ptr1
 
#define PRIV_CCB(io)   ((io)->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptrs[0])
 
#define PRIV_INFO(io)   ((io)->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptrs[1])
 

Enumerations

enum  ctlfe_cmd_flags { CTLFE_CMD_NONE = 0x00 , CTLFE_CMD_PIECEWISE = 0x01 }
 

Functions

 __FBSDID ("$FreeBSD$")
 
 STAILQ_HEAD (ctlfe_softc)
 
 MALLOC_DEFINE (M_CTLFE, "CAM CTL FE", "CAM CTL FE interface")
 
static int ctlfeinitialize (void)
 
static int ctlfeshutdown (void)
 
static void ctlfeasync (void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
 
static void ctlfedone (struct cam_periph *periph, union ccb *done_ccb)
 
static void ctlfe_onoffline (void *arg, int online)
 
static void ctlfe_online (void *arg)
 
static void ctlfe_offline (void *arg)
 
static int ctlfe_lun_enable (void *arg, int lun_id)
 
static int ctlfe_lun_disable (void *arg, int lun_id)
 
static void ctlfe_dump_sim (struct cam_sim *sim)
 
static void ctlfe_dump_queue (struct ctlfe_lun_softc *softc)
 
static void ctlfe_datamove (union ctl_io *io)
 
static void ctlfe_done (union ctl_io *io)
 
static void ctlfe_dump (void)
 
static void ctlfe_free_ccb (struct cam_periph *periph, union ccb *ccb)
 
static void ctlfe_requeue_ccb (struct cam_periph *periph, union ccb *ccb, int unlock)
 
 CTL_FRONTEND_DECLARE (ctlfe, ctlfe_frontend)
 
static cam_status ctlferegister (struct cam_periph *periph, void *arg)
 
static void ctlfeoninvalidate (struct cam_periph *periph)
 
static void ctlfecleanup (struct cam_periph *periph)
 
static void ctlfedata (struct ctlfe_lun_softc *softc, union ctl_io *io, ccb_flags *flags, uint8_t **data_ptr, uint32_t *dxfer_len, u_int16_t *sglist_cnt)
 
static void ctlfestart (struct cam_periph *periph, union ccb *start_ccb)
 
static void ctlfe_drain (void *context, int pending)
 
static int ctlfe_adjust_cdb (struct ccb_accept_tio *atio, uint32_t offset)
 

Variables

 ctlfe_lun_flags
 
static periph_init_t ctlfeperiphinit
 
static periph_deinit_t ctlfeperiphdeinit
 
static periph_ctor_t ctlferegister
 
static periph_oninv_t ctlfeoninvalidate
 
static periph_dtor_t ctlfecleanup
 
static periph_start_t ctlfestart
 
static struct periph_driver ctlfe_driver
 
static struct ctl_frontend ctlfe_frontend
 

Macro Definition Documentation

◆ ccb_atio

#define ccb_atio   ppriv_ptr1

Definition at line 171 of file scsi_ctl.c.

◆ CTLFE_ATIO_PER_LUN

#define CTLFE_ATIO_PER_LUN   1024

Definition at line 146 of file scsi_ctl.c.

◆ CTLFE_IN_PER_LUN

#define CTLFE_IN_PER_LUN   1024

Definition at line 152 of file scsi_ctl.c.

◆ CTLFE_MAX_SEGS

#define CTLFE_MAX_SEGS   32

Definition at line 130 of file scsi_ctl.c.

◆ CTLFE_REQ_CTL_IO

#define CTLFE_REQ_CTL_IO   4096

Definition at line 140 of file scsi_ctl.c.

◆ CTLFE_TIMEOUT

#define CTLFE_TIMEOUT   5

Definition at line 157 of file scsi_ctl.c.

◆ io_ptr

#define io_ptr   ppriv_ptr0

Definition at line 168 of file scsi_ctl.c.

◆ PRIV_CCB

#define PRIV_CCB (   io)    ((io)->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptrs[0])

Definition at line 173 of file scsi_ctl.c.

◆ PRIV_INFO

#define PRIV_INFO (   io)    ((io)->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptrs[1])

Definition at line 174 of file scsi_ctl.c.

Enumeration Type Documentation

◆ ctlfe_cmd_flags

Enumerator
CTLFE_CMD_NONE 
CTLFE_CMD_PIECEWISE 

Definition at line 116 of file scsi_ctl.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ CTL_FRONTEND_DECLARE()

CTL_FRONTEND_DECLARE ( ctlfe  ,
ctlfe_frontend   
)

◆ ctlfe_adjust_cdb()

static int ctlfe_adjust_cdb ( struct ccb_accept_tio atio,
uint32_t  offset 
)
static

◆ ctlfe_datamove()

◆ ctlfe_done()

◆ ctlfe_drain()

static void ctlfe_drain ( void *  context,
int  pending 
)
static

Definition at line 918 of file scsi_ctl.c.

References cam_periph_lock, cam_periph_release(), cam_periph_sleep, cam_periph_unlock, ctlfe_lun_softc::periph, ctlfe_lun_softc::refcount, and cam_periph::softc.

Referenced by ctlfe_free_ccb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ctlfe_dump()

static void ctlfe_dump ( void  )
static

Definition at line 1987 of file scsi_ctl.c.

References ctlfe_dump_queue(), ctlfe_dump_sim(), and ctlfe_softc::sim.

Here is the call graph for this function:

◆ ctlfe_dump_queue()

◆ ctlfe_dump_sim()

static void ctlfe_dump_sim ( struct cam_sim sim)
static

Definition at line 1838 of file scsi_ctl.c.

References cam_sim::max_dev_openings, cam_sim::max_tagged_dev_openings, cam_sim::sim_name, and cam_sim::unit_number.

Referenced by ctlfe_dump().

Here is the caller graph for this function:

◆ ctlfe_free_ccb()

static void ctlfe_free_ccb ( struct cam_periph periph,
union ccb ccb 
)
static

◆ ctlfe_lun_disable()

static int ctlfe_lun_disable ( void *  arg,
int  lun_id 
)
static

◆ ctlfe_lun_enable()

◆ ctlfe_offline()

static void ctlfe_offline ( void *  arg)
static

Definition at line 1703 of file scsi_ctl.c.

References CAM_LUN_WILDCARD, cam_periph_find(), cam_periph_invalidate(), CAM_REQ_CMP, CAM_TARGET_WILDCARD, ctlfe_onoffline(), ctlfe_softc::path_id, xpt_create_path(), xpt_free_path(), xpt_path_lock, and xpt_path_unlock.

Referenced by ctlfeasync().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ctlfe_online()

◆ ctlfe_onoffline()

◆ ctlfe_requeue_ccb()

static void ctlfe_requeue_ccb ( struct cam_periph periph,
union ccb ccb,
int  unlock 
)
static

◆ ctlfeasync()

static void ctlfeasync ( void *  callback_arg,
uint32_t  code,
struct cam_path path,
void *  arg 
)
static

Definition at line 268 of file scsi_ctl.c.

References AC_CONTRACT, AC_CONTRACT_DEV_CHG, AC_PATH_DEREGISTERED, AC_PATH_REGISTERED, ac_device_changed::arrived, ccb_pathinq::bus_id, ccb_pathinq::ccb_h, ac_contract::contract_data, ac_contract::contract_number, ctl_add_initiator(), ctl_port_deregister(), CTL_PORT_FC, ctl_port_register(), CTL_PORT_SAS, CTL_PORT_SCSI, ctl_remove_initiator(), ctlfe_datamove(), ctlfe_done(), ctlfe_frontend, ctlfe_lun_disable(), ctlfe_lun_enable(), ctlfe_offline(), ctlfe_online(), CTLFE_REQ_CTL_IO, ccb_pathinq::dev_name, ctl_port::fe_datamove, ctl_port::fe_done, ctl_port::frontend, ccb_pathinq::hba_misc, ctlfe_softc::hba_misc, ccb_pathinq::initiator_id, ctl_port::lun_disable, ctl_port::lun_enable, ctlfe_softc::lun_softc_mtx, ccb_pathinq::maxio, ctlfe_softc::maxio, ctl_port::num_requested_ctl_io, ctl_port::onoff_arg, ccb_hdr::path_id, ctlfe_softc::path_id, ctl_port::physical_port, PIT_PROCESSOR, ac_device_changed::port, ctlfe_softc::port, ctl_port::port_name, ctlfe_softc::port_name, ctl_port::port_offline, ctl_port::port_online, ctl_port::port_type, ctlfe_softc::sim, ctl_port::targ_lun_arg, ctl_port::targ_port, ac_device_changed::target, ctlfe_softc::target_id, ccb_pathinq::target_sprt, ccb_pathinq::transport, ccb_pathinq::unit_number, ctl_port::virtual_port, ac_device_changed::wwpn, XPORT_FC, XPORT_SAS, xpt_path_path_id(), and xpt_path_sim().

Referenced by ctlfe_lun_enable(), and ctlfe_online().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ctlfecleanup()

◆ ctlfedata()

◆ ctlfedone()

static void ctlfedone ( struct cam_periph periph,
union ccb done_ccb 
)
static

Definition at line 1083 of file scsi_ctl.c.

References ccb_abort::abort_ccb, ccb_immediate_notify::arg, ccb::atio, atio_cdb_ptr(), ccb::cab, CAM_BDR_SENT, CAM_CDB_RECVD, CAM_DEV_NOT_THERE, CAM_DEV_QFRZN, CAM_DIS_DISCONNECT, CAM_EXTLUN_BYTE_SWIZZLE, cam_fill_ctio(), CAM_MESSAGE_RECV, cam_periph_mtx(), CAM_PRIORITY_NORMAL, CAM_PROVIDE_FAIL, cam_release_devq(), CAM_REQ_ABORTED, CAM_REQ_CMP, CAM_REQ_INPROG, CAM_REQ_INVALID, CAM_SCSI_BUS_RESET, CAM_SEND_SENSE, CAM_SEND_STATUS, CAM_SENT_SENSE, CAM_STATUS_MASK, CAM_TAG_ACTION_NONE, CAM_TAG_ACTION_VALID, CAM_UNLOCKED, ccb_scsiio::ccb_h, ccb_accept_tio::ccb_h, ccb_immediate_notify::ccb_h, ccb::ccb_h, ctl_scsiio::cdb, ccb_accept_tio::cdb_len, ctl_scsiio::cdb_len, ccb::cin1, ccb::csio, ctlfe_lun_softc::ctios_sent, ctl_alloc_io_nowait(), ctl_datamove_done(), ctl_decode_lun(), CTL_FLAG_DMA_INPROG, CTL_FLAG_DMA_QUEUED, CTL_FLAG_STATUS_SENT, CTL_IO_SCSI, CTL_IO_TASK, ctl_port::ctl_pool_ref, ctl_queue(), ctl_queue_sense(), ctl_set_data_phase_error(), CTL_STATUS_NONE, CTL_TAG_ACA, CTL_TAG_HEAD_OF_QUEUE, CTL_TAG_ORDERED, CTL_TAG_SIMPLE, CTL_TAG_UNTAGGED, CTL_TASK_ABORT_TASK, CTL_TASK_ABORT_TASK_SET, CTL_TASK_BUS_RESET, CTL_TASK_CLEAR_ACA, CTL_TASK_CLEAR_TASK_SET, CTL_TASK_LUN_RESET, CTL_TASK_QUERY_ASYNC_EVENT, CTL_TASK_QUERY_TASK, CTL_TASK_QUERY_TASK_SET, CTL_TASK_TARGET_RESET, ctl_zero_io(), ctlfe_adjust_cdb(), CTLFE_CMD_PIECEWISE, ctlfe_free_ccb(), ctlfe_requeue_ccb(), CTLFE_TIMEOUT, ctlfedata(), ctlfedone(), ccb_scsiio::data_ptr, ccb_scsiio::dxfer_len, ctl_scsiio::ext_data_filled, ccb_hdr::flags, ctl_io_hdr::flags, ctlfe_cmd_info::flags, ccb_hdr::func_code, ctlfe_softc::hba_misc, ccb_accept_tio::init_id, ccb_immediate_notify::initiator_id, ctl_nexus::initid, ctl_scsiio::io_hdr, ctl_io::io_hdr, ctl_io_hdr::io_type, ctl_scsiio::kern_data_len, ctl_scsiio::kern_data_resid, ctl_scsiio::kern_rel_offset, MSG_ABORT_TASK, MSG_ABORT_TASK_SET, MSG_ACA_TASK, MSG_CLEAR_ACA, MSG_CLEAR_TASK_SET, MSG_EXTENDED, MSG_HEAD_OF_QUEUE_TASK, MSG_LOGICAL_UNIT_RESET, MSG_NOOP, MSG_ORDERED_TASK, ccb_scsiio::msg_ptr, MSG_QUERY_ASYNC_EVENT, MSG_QUERY_TASK, MSG_QUERY_TASK_SET, MSG_SIMPLE_Q_TAG, MSG_SIMPLE_TASK, MSG_TARGET_RESET, ctl_io_hdr::nexus, ctlfe_lun_softc::parent_softc, cam_periph::path, ctlfe_lun_softc::periph, PIM_EXTLUNS, ctlfe_softc::port, ctl_io_hdr::port_status, ccb_accept_tio::priority, ctl_scsiio::priority, PRIV_CCB, PRIV_INFO, ccb_scsiio::resid, ctl_io::scsiio, ccb_immediate_notify::seq_id, ccb_scsiio::sglist_cnt, cam_periph::softc, ccb_hdr::status, ctl_io_hdr::status, ccb_accept_tio::tag_action, ccb_accept_tio::tag_id, ctl_scsiio::tag_num, ctl_taskio::tag_num, ctl_scsiio::tag_type, ctl_nexus::targ_lun, ctl_port::targ_port, ctl_nexus::targ_port, ccb_hdr::target_lun, ctl_taskio::task_action, ctl_io::taskio, XPT_ABORT, XPT_ACCEPT_TARGET_IO, xpt_action(), XPT_CONT_TARGET_IO, XPT_GET_SIM_KNOB, XPT_GET_SIM_KNOB_OLD, XPT_IMMEDIATE_NOTIFY, XPT_NOTIFY_ACKNOWLEDGE, xpt_print(), xpt_release_ccb(), xpt_schedule(), and XPT_SET_SIM_KNOB.

Referenced by ctlfedone(), ctlferegister(), and ctlfestart().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ctlfeinitialize()

static int ctlfeinitialize ( void  )
static

Definition at line 222 of file scsi_ctl.c.

References ctlfe_driver, and periphdriver_register().

Here is the call graph for this function:

◆ ctlfeoninvalidate()

◆ ctlferegister()

◆ ctlfeshutdown()

static int ctlfeshutdown ( void  )
static

Definition at line 232 of file scsi_ctl.c.

References ctlfe_driver, and periphdriver_unregister().

Here is the call graph for this function:

◆ ctlfestart()

◆ MALLOC_DEFINE()

MALLOC_DEFINE ( M_CTLFE  ,
"CAM CTL FE"  ,
"CAM CTL FE interface"   
)

◆ STAILQ_HEAD()

STAILQ_HEAD ( ctlfe_softc  )

Definition at line 92 of file scsi_ctl.c.

Referenced by xpt_async_td(), and xpt_done_td().

Here is the caller graph for this function:

Variable Documentation

◆ ctlfe_driver

struct periph_driver ctlfe_driver
static
Initial value:
=
{
TAILQ_HEAD_INITIALIZER(ctlfe_driver.units), 0,
}
#define CAM_PERIPH_DRV_EARLY
Definition: cam_periph.h:99
static periph_deinit_t ctlfeperiphdeinit
Definition: scsi_ctl.c:179
static periph_init_t ctlfeperiphinit
Definition: scsi_ctl.c:178
static struct periph_driver ctlfe_driver
Definition: scsi_ctl.c:204

Definition at line 204 of file scsi_ctl.c.

Referenced by ctlfeinitialize(), and ctlfeshutdown().

◆ ctlfe_frontend

struct ctl_frontend ctlfe_frontend
static
Initial value:
=
{
.name = "camtgt",
.init = ctlfeinitialize,
.fe_dump = ctlfe_dump,
.shutdown = ctlfeshutdown,
}
static int ctlfeinitialize(void)
Definition: scsi_ctl.c:222
static void ctlfe_dump(void)
Definition: scsi_ctl.c:1987
static int ctlfeshutdown(void)
Definition: scsi_ctl.c:232

Definition at line 212 of file scsi_ctl.c.

Referenced by ctlfeasync().

◆ ctlfe_lun_flags

ctlfe_lun_flags

Definition at line 99 of file scsi_ctl.c.

◆ ctlfecleanup

periph_dtor_t ctlfecleanup
static

Definition at line 184 of file scsi_ctl.c.

Referenced by ctlfe_lun_enable(), and ctlfe_online().

◆ ctlfeoninvalidate

periph_oninv_t ctlfeoninvalidate
static

Definition at line 183 of file scsi_ctl.c.

Referenced by ctlfe_lun_enable(), and ctlfe_online().

◆ ctlfeperiphdeinit

static int ctlfeperiphdeinit ( void  )
static

Definition at line 179 of file scsi_ctl.c.

◆ ctlfeperiphinit

static void ctlfeperiphinit ( void  )
static

Definition at line 178 of file scsi_ctl.c.

◆ ctlferegister

periph_ctor_t ctlferegister
static

Definition at line 182 of file scsi_ctl.c.

Referenced by ctlfe_lun_enable(), and ctlfe_online().

◆ ctlfestart

periph_start_t ctlfestart
static

Definition at line 185 of file scsi_ctl.c.

Referenced by ctlfe_lun_enable(), and ctlfe_online().