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