scsi_target.h revision 107178
1/*
2 * SCSI Target Emulator
3 *
4 * Copyright (c) 2002 Nate Lawson.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions, and the following disclaimer,
12 *    without modification, immediately at the beginning of the file.
13 * 2. The name of the author may not be used to endorse or promote products
14 *    derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: head/share/examples/scsi_target/scsi_target.h 107178 2002-11-22 22:55:51Z njl $
29 */
30
31#ifndef _SCSI_TARGET_H
32#define _SCSI_TARGET_H
33
34/*
35 * Maximum number of parallel commands to accept
36 * Set to 256 for Fibre Channel (SPI is 16)
37 */
38#define MAX_INITIATORS		16
39#define	SECTOR_SIZE		512
40#define MAX_EVENTS		(MAX_INITIATORS + 5)
41				/* kqueue for AIO, signals */
42
43/* Additional SCSI 3 defines for inquiry response */
44#define SID_Addr16	0x0100
45
46TAILQ_HEAD(io_queue, ccb_hdr);
47
48/* Offset into the private CCB area for storing our descriptor */
49#define targ_descr	periph_priv.entries[1].ptr
50
51/* Descriptor attached to each ATIO */
52struct atio_descr {
53	off_t	  base_off;	/* Base offset for ATIO */
54	size_t	  total_len;	/* Total xfer len for this ATIO */
55	size_t	  init_req;	/* Transfer count requested to/from init */
56	size_t	  init_ack;	/* Data transferred ok to/from init */
57	size_t	  targ_req;	/* Transfer count requested to/from target */
58	size_t	  targ_ack;	/* Data transferred ok to/from target */
59	int	  flags;	/* Flags for CTIOs */
60	u_int8_t *cdb;		/* Pointer to received CDB */
61		  		/* List of completed AIO/CTIOs */
62	struct	  io_queue cmplt_io;
63};
64
65typedef enum {
66	ATIO_WORK,
67	AIO_DONE,
68	CTIO_DONE
69} io_ops;
70
71/* Descriptor attached to each CTIO */
72struct ctio_descr {
73	void	*buf;		/* Backing store */
74	off_t	 offset;	/* Position in transfer (for file, */
75				/* doesn't start at 0) */
76	struct	 aiocb aiocb;	/* AIO descriptor for this CTIO */
77	struct	 ccb_accept_tio *atio;
78				/* ATIO we are satisfying */
79	io_ops	 event;		/* Event that queued this CTIO */
80};
81
82typedef enum {
83        UA_NONE         = 0x00,
84        UA_POWER_ON     = 0x01,
85        UA_BUS_RESET    = 0x02,
86        UA_BDR          = 0x04
87} ua_types;
88
89typedef enum {
90        CA_NONE         = 0x00,
91        CA_UNIT_ATTN    = 0x01,
92        CA_CMD_SENSE    = 0x02
93} ca_types;
94
95struct initiator_state {
96        ua_types   orig_ua;
97        ca_types   orig_ca;
98        ua_types   pending_ua;
99        ca_types   pending_ca;
100        struct     scsi_sense_data sense_data;
101};
102
103/* Global functions */
104extern cam_status	tcmd_init(u_int16_t req_inq_flags,
105				  u_int16_t sim_inq_flags);
106extern int		tcmd_handle(struct ccb_accept_tio *atio,
107				    struct ccb_scsiio *ctio, io_ops event);
108extern void		tcmd_sense(u_int init_id, struct ccb_scsiio *ctio,
109				   u_int8_t flags,
110				   u_int8_t asc, u_int8_t ascq);
111extern void		tcmd_ua(u_int init_id, ua_types new_ua);
112extern int		work_atio(struct ccb_accept_tio *atio);
113extern void		send_ccb(union ccb *ccb, int priority);
114extern void		free_ccb(union ccb *ccb);
115static __inline u_int	min(u_int a, u_int b) { return (a < b ? a : b); }
116
117#endif /* _SCSI_TARGET_H */
118