FreeBSD kernel CAM code
scsi_pt.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/types.h>
#include <sys/bio.h>
#include <sys/devicestat.h>
#include <sys/malloc.h>
#include <sys/conf.h>
#include <sys/ptio.h>
#include <cam/cam.h>
#include <cam/cam_ccb.h>
#include <cam/cam_periph.h>
#include <cam/cam_xpt_periph.h>
#include <cam/cam_debug.h>
#include <cam/scsi/scsi_all.h>
#include <cam/scsi/scsi_message.h>
#include <cam/scsi/scsi_pt.h>
#include "opt_pt.h"
Include dependency graph for scsi_pt.c:

Go to the source code of this file.

Data Structures

struct  pt_softc
 

Macros

#define ccb_state   ppriv_field0
 
#define ccb_bp   ppriv_ptr1
 
#define SCSI_PT_DEFAULT_TIMEOUT   60
 

Enumerations

enum  pt_state { PT_STATE_PROBE , PT_STATE_NORMAL }
 
enum  pt_flags { PT_FLAG_NONE = 0x00 , PT_FLAG_OPEN = 0x01 , PT_FLAG_DEVICE_INVALID = 0x02 , PT_FLAG_RETRY_UA = 0x04 }
 
enum  pt_ccb_state { PT_CCB_BUFFER_IO = 0x01 , PT_CCB_RETRY_UA = 0x04 , PT_CCB_BUFFER_IO_UA = PT_CCB_BUFFER_IO|PT_CCB_RETRY_UA }
 

Functions

 __FBSDID ("$FreeBSD$")
 
static void ptasync (void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)
 
static void ptdone (struct cam_periph *periph, union ccb *done_ccb)
 
static int pterror (union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags)
 
void scsi_send_receive (struct ccb_scsiio *csio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int tag_action, int readop, u_int byte2, u_int32_t xfer_len, u_int8_t *data_ptr, u_int8_t sense_len, u_int32_t timeout)
 
 PERIPHDRIVER_DECLARE (pt, ptdriver)
 
static int ptopen (struct cdev *dev, int flags, int fmt, struct thread *td)
 
static int ptclose (struct cdev *dev, int flag, int fmt, struct thread *td)
 
static void ptstrategy (struct bio *bp)
 
static cam_status ptctor (struct cam_periph *periph, void *arg)
 
static void ptoninvalidate (struct cam_periph *periph)
 
static void ptdtor (struct cam_periph *periph)
 
static void ptstart (struct cam_periph *periph, union ccb *start_ccb)
 
static int ptioctl (struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
 

Variables

static d_open_t ptopen
 
static d_close_t ptclose
 
static d_strategy_t ptstrategy
 
static periph_init_t ptinit
 
static periph_ctor_t ptctor
 
static periph_oninv_t ptoninvalidate
 
static periph_dtor_t ptdtor
 
static periph_start_t ptstart
 
static d_ioctl_t ptioctl
 
static struct periph_driver ptdriver
 
static struct cdevsw pt_cdevsw
 

Macro Definition Documentation

◆ ccb_bp

#define ccb_bp   ppriv_ptr1

Definition at line 77 of file scsi_pt.c.

◆ ccb_state

#define ccb_state   ppriv_field0

Definition at line 76 of file scsi_pt.c.

◆ SCSI_PT_DEFAULT_TIMEOUT

#define SCSI_PT_DEFAULT_TIMEOUT   60

Definition at line 132 of file scsi_pt.c.

Enumeration Type Documentation

◆ pt_ccb_state

Enumerator
PT_CCB_BUFFER_IO 
PT_CCB_RETRY_UA 
PT_CCB_BUFFER_IO_UA 

Definition at line 69 of file scsi_pt.c.

◆ pt_flags

enum pt_flags
Enumerator
PT_FLAG_NONE 
PT_FLAG_OPEN 
PT_FLAG_DEVICE_INVALID 
PT_FLAG_RETRY_UA 

Definition at line 62 of file scsi_pt.c.

◆ pt_state

enum pt_state
Enumerator
PT_STATE_PROBE 
PT_STATE_NORMAL 

Definition at line 57 of file scsi_pt.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ PERIPHDRIVER_DECLARE()

PERIPHDRIVER_DECLARE ( pt  ,
ptdriver   
)

◆ ptasync()

static void ptasync ( void *  callback_arg,
u_int32_t  code,
struct cam_path path,
void *  arg 
)
static

◆ ptclose()

static int ptclose ( struct cdev *  dev,
int  flag,
int  fmt,
struct thread *  td 
)
static

Definition at line 170 of file scsi_pt.c.

References cam_periph_lock, cam_periph_release_locked(), cam_periph_unlock, and cam_periph::softc.

Here is the call graph for this function:

◆ ptctor()

◆ ptdone()

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

◆ ptdtor()

static void ptdtor ( struct cam_periph periph)
static

◆ pterror()

static int pterror ( union ccb ccb,
u_int32_t  cam_flags,
u_int32_t  sense_flags 
)
static

Definition at line 561 of file scsi_pt.c.

References cam_periph_error().

Referenced by ptdone(), and ptioctl().

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

◆ ptioctl()

static int ptioctl ( struct cdev *  dev,
u_long  cmd,
caddr_t  addr,
int  flag,
struct thread *  td 
)
static

Definition at line 568 of file scsi_pt.c.

References cam_periph_ioctl(), cam_periph_lock, cam_periph_unlock, pterror(), and cam_periph::softc.

Here is the call graph for this function:

◆ ptoninvalidate()

static void ptoninvalidate ( struct cam_periph periph)
static

Definition at line 323 of file scsi_pt.c.

References pt_softc::bio_queue, cam_periph::path, PT_FLAG_DEVICE_INVALID, ptasync(), cam_periph::softc, and xpt_register_async().

Here is the call graph for this function:

◆ ptopen()

static int ptopen ( struct cdev *  dev,
int  flags,
int  fmt,
struct thread *  td 
)
static

◆ ptstart()

static void ptstart ( struct cam_periph periph,
union ccb start_ccb 
)
static

◆ ptstrategy()

static void ptstrategy ( struct bio *  bp)
static

Definition at line 192 of file scsi_pt.c.

References pt_softc::bio_queue, cam_periph_lock, cam_periph_unlock, CAM_PRIORITY_NORMAL, PT_FLAG_DEVICE_INVALID, cam_periph::softc, and xpt_schedule().

Here is the call graph for this function:

◆ scsi_send_receive()

void scsi_send_receive ( struct ccb_scsiio csio,
u_int32_t  retries,
void(*)(struct cam_periph *, union ccb *)  cbfcnp,
u_int  tag_action,
int  readop,
u_int  byte2,
u_int32_t  xfer_len,
u_int8_t *  data_ptr,
u_int8_t  sense_len,
u_int32_t  timeout 
)

Definition at line 606 of file scsi_pt.c.

References scsi_send_receive::byte2, CAM_DIR_IN, CAM_DIR_OUT, cam_fill_csio(), cdb_t::cdb_bytes, ccb_scsiio::cdb_io, scsi_send_receive::control, scsi_send_receive::opcode, RECEIVE, scsi_ulto3b(), SEND, and scsi_send_receive::xfer_len.

Referenced by ptstart().

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

Variable Documentation

◆ pt_cdevsw

struct cdevsw pt_cdevsw
static
Initial value:
= {
.d_version = D_VERSION,
.d_flags = 0,
.d_open = ptopen,
.d_close = ptclose,
.d_read = physread,
.d_write = physwrite,
.d_ioctl = ptioctl,
.d_strategy = ptstrategy,
.d_name = "pt",
}
static d_close_t ptclose
Definition: scsi_pt.c:90
static d_ioctl_t ptioctl
Definition: scsi_pt.c:101
static d_strategy_t ptstrategy
Definition: scsi_pt.c:91
static d_open_t ptopen
Definition: scsi_pt.c:89

Definition at line 119 of file scsi_pt.c.

Referenced by ptctor().

◆ ptclose

d_close_t ptclose
static

Definition at line 90 of file scsi_pt.c.

◆ ptctor

periph_ctor_t ptctor
static

Definition at line 95 of file scsi_pt.c.

Referenced by ptasync().

◆ ptdriver

struct periph_driver ptdriver
static
Initial value:
=
{
ptinit, "pt",
TAILQ_HEAD_INITIALIZER(ptdriver.units), 0
}
static struct periph_driver ptdriver
Definition: scsi_pt.c:111
static periph_init_t ptinit
Definition: scsi_pt.c:92

Definition at line 111 of file scsi_pt.c.

◆ ptdtor

periph_dtor_t ptdtor
static

Definition at line 97 of file scsi_pt.c.

Referenced by ptasync().

◆ ptinit

static void ptinit ( void  )
static

Definition at line 92 of file scsi_pt.c.

◆ ptioctl

d_ioctl_t ptioctl
static

Definition at line 101 of file scsi_pt.c.

◆ ptoninvalidate

periph_oninv_t ptoninvalidate
static

Definition at line 96 of file scsi_pt.c.

Referenced by ptasync().

◆ ptopen

d_open_t ptopen
static

Definition at line 89 of file scsi_pt.c.

◆ ptstart

periph_start_t ptstart
static

Definition at line 98 of file scsi_pt.c.

Referenced by ptasync().

◆ ptstrategy

d_strategy_t ptstrategy
static

Definition at line 91 of file scsi_pt.c.