FreeBSD kernel CAM code
scsi_enc_safte.c File Reference
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/errno.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/queue.h>
#include <sys/sx.h>
#include <sys/systm.h>
#include <sys/sysctl.h>
#include <sys/types.h>
#include <cam/cam.h>
#include <cam/cam_ccb.h>
#include <cam/cam_periph.h>
#include <cam/scsi/scsi_enc.h>
#include <cam/scsi/scsi_enc_internal.h>
#include <cam/scsi/scsi_message.h>
Include dependency graph for scsi_enc_safte.c:

Go to the source code of this file.

Data Structures

struct  safte_control_request
 
struct  scfg
 

Macros

#define ALL_ENC_STAT
 
#define SAFTE_RD_RDCFG   0x00 /* read enclosure configuration */
 
#define SAFTE_RD_RDESTS   0x01 /* read enclosure status */
 
#define SAFTE_RD_RDDSTS   0x04 /* read drive slot status */
 
#define SAFTE_RD_RDGFLG   0x05 /* read global flags */
 
#define SAFTE_WT_DSTAT   0x10 /* write device slot status */
 
#define SAFTE_WT_SLTOP   0x12 /* perform slot operation */
 
#define SAFTE_WT_FANSPD   0x13 /* set fan speed */
 
#define SAFTE_WT_ACTPWS   0x14 /* turn on/off power supply */
 
#define SAFTE_WT_GLOBAL   0x15 /* send global command */
 
#define SAFT_SCRATCH   64
 
#define SCSZ   0x8000
 
#define SAFT_ALARM_OFFSET(cc)   (cc)->slotoff - 1
 
#define SAFT_FLG1_ALARM   0x1
 
#define SAFT_FLG1_GLOBFAIL   0x2
 
#define SAFT_FLG1_GLOBWARN   0x4
 
#define SAFT_FLG1_ENCPWROFF   0x8
 
#define SAFT_FLG1_ENCFANFAIL   0x10
 
#define SAFT_FLG1_ENCPWRFAIL   0x20
 
#define SAFT_FLG1_ENCDRVFAIL   0x40
 
#define SAFT_FLG1_ENCDRVWARN   0x80
 
#define SAFT_FLG2_LOCKDOOR   0x4
 
#define SAFT_PRIVATE   sizeof (struct scfg)
 
#define SAFT_BAIL(r, x)
 
#define DEVON(x)
 
#define IDON(x)   (!!((x)[2] & SESCTL_RQSID))
 

Typedefs

typedef struct safte_control_request safte_control_request_t
 
typedef struct safte_control_reqlist safte_control_reqlist_t
 

Enumerations

enum  safte_update_action {
  SAFTE_UPDATE_NONE , SAFTE_UPDATE_READCONFIG , SAFTE_UPDATE_READGFLAGS , SAFTE_UPDATE_READENCSTATUS ,
  SAFTE_UPDATE_READSLOTSTATUS , SAFTE_PROCESS_CONTROL_REQS , SAFTE_NUM_UPDATE_STATES
}
 
enum  { SES_SETSTATUS_ENC_IDX = -1 }
 

Functions

 __FBSDID ("$FreeBSD$")
 
static int safte_set_enc_status (enc_softc_t *enc, uint8_t encstat, int slpflag)
 
 TAILQ_HEAD (safte_control_reqlist, safte_control_request)
 
static void safte_terminate_control_requests (safte_control_reqlist_t *reqlist, int result)
 
 SYSCTL_INT (_kern_cam_enc, OID_AUTO, emulate_array_devices, CTLFLAG_RWTUN, &emulate_array_devices, 0, "Emulate Array Devices for SAF-TE")
 
static int safte_fill_read_buf_io (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t *buf)
 
static int safte_process_config (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t **bufp, int error, int xfer_len)
 
static int safte_process_gflags (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t **bufp, int error, int xfer_len)
 
static int safte_process_status (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t **bufp, int error, int xfer_len)
 
static int safte_process_slotstatus (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t **bufp, int error, int xfer_len)
 
static int safte_fill_control_request (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t *buf)
 
static int safte_process_control_request (enc_softc_t *enc, struct enc_fsm_state *state, union ccb *ccb, uint8_t **bufp, int error, int xfer_len)
 
static void safte_softc_invalidate (enc_softc_t *enc)
 
static void safte_softc_cleanup (enc_softc_t *enc)
 
static int safte_init_enc (enc_softc_t *enc)
 
static int safte_get_elm_status (enc_softc_t *enc, encioc_elm_status_t *elms, int slpflg)
 
static int safte_set_elm_status (enc_softc_t *enc, encioc_elm_status_t *elms, int slpflag)
 
static void safte_poll_status (enc_softc_t *enc)
 
int safte_softc_init (enc_softc_t *enc)
 

Variables

static fsm_fill_handler_t safte_fill_read_buf_io
 
static fsm_fill_handler_t safte_fill_control_request
 
static fsm_done_handler_t safte_process_config
 
static fsm_done_handler_t safte_process_gflags
 
static fsm_done_handler_t safte_process_status
 
static fsm_done_handler_t safte_process_slotstatus
 
static fsm_done_handler_t safte_process_control_request
 
static struct enc_fsm_state enc_fsm_states [SAFTE_NUM_UPDATE_STATES]
 
static char * safte_2little = "Too Little Data Returned (%d) at line %d\n"
 
int emulate_array_devices = 1
 
static struct enc_vec safte_enc_vec
 

Macro Definition Documentation

◆ ALL_ENC_STAT

#define ALL_ENC_STAT
Value:
SES_ENCSTAT_NONCRITICAL | SES_ENCSTAT_INFO)
#define SES_ENCSTAT_UNRECOV
Definition: scsi_ses.h:2190
#define SES_ENCSTAT_CRITICAL
Definition: scsi_ses.h:2191
#define SES_ENCSTAT_INFO
Definition: scsi_ses.h:2193

Definition at line 59 of file scsi_enc_safte.c.

◆ DEVON

#define DEVON (   x)
Value:
(!(((x)[2] & SESCTL_RQSINS) | \
((x)[2] & SESCTL_RQSRMV) | \
((x)[3] & SESCTL_DEVOFF)))
#define SESCTL_DEVOFF
Definition: scsi_ses.h:2243
#define SESCTL_RQSRMV
Definition: scsi_ses.h:2239
#define SESCTL_RQSINS
Definition: scsi_ses.h:2238

◆ IDON

#define IDON (   x)    (!!((x)[2] & SESCTL_RQSID))

◆ SAFT_ALARM_OFFSET

#define SAFT_ALARM_OFFSET (   cc)    (cc)->slotoff - 1

Definition at line 198 of file scsi_enc_safte.c.

◆ SAFT_BAIL

#define SAFT_BAIL (   r,
 
)
Value:
if ((r) >= (x)) { \
ENC_VLOG(enc, safte_2little, x, __LINE__);\
return (EIO); \
}
static char * safte_2little

Definition at line 223 of file scsi_enc_safte.c.

◆ SAFT_FLG1_ALARM

#define SAFT_FLG1_ALARM   0x1

Definition at line 210 of file scsi_enc_safte.c.

◆ SAFT_FLG1_ENCDRVFAIL

#define SAFT_FLG1_ENCDRVFAIL   0x40

Definition at line 216 of file scsi_enc_safte.c.

◆ SAFT_FLG1_ENCDRVWARN

#define SAFT_FLG1_ENCDRVWARN   0x80

Definition at line 217 of file scsi_enc_safte.c.

◆ SAFT_FLG1_ENCFANFAIL

#define SAFT_FLG1_ENCFANFAIL   0x10

Definition at line 214 of file scsi_enc_safte.c.

◆ SAFT_FLG1_ENCPWRFAIL

#define SAFT_FLG1_ENCPWRFAIL   0x20

Definition at line 215 of file scsi_enc_safte.c.

◆ SAFT_FLG1_ENCPWROFF

#define SAFT_FLG1_ENCPWROFF   0x8

Definition at line 213 of file scsi_enc_safte.c.

◆ SAFT_FLG1_GLOBFAIL

#define SAFT_FLG1_GLOBFAIL   0x2

Definition at line 211 of file scsi_enc_safte.c.

◆ SAFT_FLG1_GLOBWARN

#define SAFT_FLG1_GLOBWARN   0x4

Definition at line 212 of file scsi_enc_safte.c.

◆ SAFT_FLG2_LOCKDOOR

#define SAFT_FLG2_LOCKDOOR   0x4

Definition at line 219 of file scsi_enc_safte.c.

◆ SAFT_PRIVATE

#define SAFT_PRIVATE   sizeof (struct scfg)

Definition at line 220 of file scsi_enc_safte.c.

◆ SAFT_SCRATCH

#define SAFT_SCRATCH   64

Definition at line 82 of file scsi_enc_safte.c.

◆ SAFTE_RD_RDCFG

#define SAFTE_RD_RDCFG   0x00 /* read enclosure configuration */

Definition at line 68 of file scsi_enc_safte.c.

◆ SAFTE_RD_RDDSTS

#define SAFTE_RD_RDDSTS   0x04 /* read drive slot status */

Definition at line 70 of file scsi_enc_safte.c.

◆ SAFTE_RD_RDESTS

#define SAFTE_RD_RDESTS   0x01 /* read enclosure status */

Definition at line 69 of file scsi_enc_safte.c.

◆ SAFTE_RD_RDGFLG

#define SAFTE_RD_RDGFLG   0x05 /* read global flags */

Definition at line 71 of file scsi_enc_safte.c.

◆ SAFTE_WT_ACTPWS

#define SAFTE_WT_ACTPWS   0x14 /* turn on/off power supply */

Definition at line 79 of file scsi_enc_safte.c.

◆ SAFTE_WT_DSTAT

#define SAFTE_WT_DSTAT   0x10 /* write device slot status */

Definition at line 76 of file scsi_enc_safte.c.

◆ SAFTE_WT_FANSPD

#define SAFTE_WT_FANSPD   0x13 /* set fan speed */

Definition at line 78 of file scsi_enc_safte.c.

◆ SAFTE_WT_GLOBAL

#define SAFTE_WT_GLOBAL   0x15 /* send global command */

Definition at line 80 of file scsi_enc_safte.c.

◆ SAFTE_WT_SLTOP

#define SAFTE_WT_SLTOP   0x12 /* perform slot operation */

Definition at line 77 of file scsi_enc_safte.c.

◆ SCSZ

#define SCSZ   0x8000

Definition at line 83 of file scsi_enc_safte.c.

Typedef Documentation

◆ safte_control_reqlist_t

typedef struct safte_control_reqlist safte_control_reqlist_t

Definition at line 160 of file scsi_enc_safte.c.

◆ safte_control_request_t

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
SES_SETSTATUS_ENC_IDX 

Definition at line 161 of file scsi_enc_safte.c.

◆ safte_update_action

Enumerator
SAFTE_UPDATE_NONE 
SAFTE_UPDATE_READCONFIG 
SAFTE_UPDATE_READGFLAGS 
SAFTE_UPDATE_READENCSTATUS 
SAFTE_UPDATE_READSLOTSTATUS 
SAFTE_PROCESS_CONTROL_REQS 
SAFTE_NUM_UPDATE_STATES 

Definition at line 85 of file scsi_enc_safte.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ safte_fill_control_request()

◆ safte_fill_read_buf_io()

static int safte_fill_read_buf_io ( enc_softc_t enc,
struct enc_fsm_state state,
union ccb ccb,
uint8_t *  buf 
)
static

◆ safte_get_elm_status()

static int safte_get_elm_status ( enc_softc_t enc,
encioc_elm_status_t elms,
int  slpflg 
)
static

◆ safte_init_enc()

static int safte_init_enc ( enc_softc_t enc)
static

Definition at line 1005 of file scsi_enc_safte.c.

References enc_softc::enc_private, enc_runcmd(), scfg::flag1, scfg::flag2, safte_set_enc_status(), and SEND_DIAGNOSTIC.

Here is the call graph for this function:

◆ safte_poll_status()

static void safte_poll_status ( enc_softc_t enc)
static

Definition at line 1085 of file scsi_enc_safte.c.

References enc_update_request(), SAFTE_UPDATE_READENCSTATUS, and SAFTE_UPDATE_READSLOTSTATUS.

Here is the call graph for this function:

◆ safte_process_config()

◆ safte_process_control_request()

◆ safte_process_gflags()

static int safte_process_gflags ( enc_softc_t enc,
struct enc_fsm_state state,
union ccb ccb,
uint8_t **  bufp,
int  error,
int  xfer_len 
)
static

◆ safte_process_slotstatus()

◆ safte_process_status()

◆ safte_set_elm_status()

◆ safte_set_enc_status()

static int safte_set_enc_status ( enc_softc_t enc,
uint8_t  encstat,
int  slpflag 
)
static

◆ safte_softc_cleanup()

static void safte_softc_cleanup ( enc_softc_t enc)
static

◆ safte_softc_init()

◆ safte_softc_invalidate()

static void safte_softc_invalidate ( enc_softc_t enc)
static

Definition at line 987 of file scsi_enc_safte.c.

References enc_softc::enc_private, scfg::requests, and safte_terminate_control_requests().

Here is the call graph for this function:

◆ safte_terminate_control_requests()

static void safte_terminate_control_requests ( safte_control_reqlist_t reqlist,
int  result 
)
static

Definition at line 166 of file scsi_enc_safte.c.

References safte_control_request::result.

Referenced by safte_softc_invalidate().

Here is the caller graph for this function:

◆ SYSCTL_INT()

SYSCTL_INT ( _kern_cam_enc  ,
OID_AUTO  ,
emulate_array_devices  ,
CTLFLAG_RWTUN  ,
emulate_array_devices,
,
"Emulate Array Devices for SAF-TE"   
)

◆ TAILQ_HEAD()

TAILQ_HEAD ( safte_control_reqlist  ,
safte_control_request   
)

Variable Documentation

◆ emulate_array_devices

int emulate_array_devices = 1

Definition at line 229 of file scsi_enc_safte.c.

Referenced by safte_process_config().

◆ enc_fsm_states

struct enc_fsm_state enc_fsm_states[SAFTE_NUM_UPDATE_STATES]
static

Definition at line 103 of file scsi_enc_safte.c.

Referenced by safte_softc_init().

◆ safte_2little

char* safte_2little = "Too Little Data Returned (%d) at line %d\n"
static

Definition at line 222 of file scsi_enc_safte.c.

◆ safte_enc_vec

struct enc_vec safte_enc_vec
static
Initial value:
=
{
.softc_invalidate = safte_softc_invalidate,
.softc_cleanup = safte_softc_cleanup,
.init_enc = safte_init_enc,
.set_enc_status = safte_set_enc_status,
.get_elm_status = safte_get_elm_status,
.set_elm_status = safte_set_elm_status,
.poll_status = safte_poll_status
}
static int safte_init_enc(enc_softc_t *enc)
static int safte_set_enc_status(enc_softc_t *enc, uint8_t encstat, int slpflag)
static int safte_set_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflag)
static int safte_get_elm_status(enc_softc_t *enc, encioc_elm_status_t *elms, int slpflg)
static void safte_softc_invalidate(enc_softc_t *enc)
static void safte_poll_status(enc_softc_t *enc)
static void safte_softc_cleanup(enc_softc_t *enc)

Definition at line 1092 of file scsi_enc_safte.c.

Referenced by safte_softc_init().

◆ safte_fill_control_request

fsm_fill_handler_t safte_fill_control_request
static

Definition at line 96 of file scsi_enc_safte.c.

◆ safte_fill_read_buf_io

fsm_fill_handler_t safte_fill_read_buf_io
static

Definition at line 95 of file scsi_enc_safte.c.

◆ safte_process_config

fsm_done_handler_t safte_process_config
static

Definition at line 97 of file scsi_enc_safte.c.

◆ safte_process_control_request

fsm_done_handler_t safte_process_control_request
static

Definition at line 101 of file scsi_enc_safte.c.

◆ safte_process_gflags

fsm_done_handler_t safte_process_gflags
static

Definition at line 98 of file scsi_enc_safte.c.

◆ safte_process_slotstatus

fsm_done_handler_t safte_process_slotstatus
static

Definition at line 100 of file scsi_enc_safte.c.

◆ safte_process_status

fsm_done_handler_t safte_process_status
static

Definition at line 99 of file scsi_enc_safte.c.