xref: /freebsd/sys/cam/ctl/ctl_private.h (revision b1d324d98761a8640aef94c76cbccafc22c8dcc8)
1130f4520SKenneth D. Merry /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3bec9534dSPedro F. Giffuni  *
4130f4520SKenneth D. Merry  * Copyright (c) 2003, 2004, 2005, 2008 Silicon Graphics International Corp.
5bb8f9017SAlexander Motin  * Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
6130f4520SKenneth D. Merry  * All rights reserved.
7130f4520SKenneth D. Merry  *
8130f4520SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
9130f4520SKenneth D. Merry  * modification, are permitted provided that the following conditions
10130f4520SKenneth D. Merry  * are met:
11130f4520SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright
12130f4520SKenneth D. Merry  *    notice, this list of conditions, and the following disclaimer,
13130f4520SKenneth D. Merry  *    without modification.
14130f4520SKenneth D. Merry  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
15130f4520SKenneth D. Merry  *    substantially similar to the "NO WARRANTY" disclaimer below
16130f4520SKenneth D. Merry  *    ("Disclaimer") and any redistribution must be conditioned upon
17130f4520SKenneth D. Merry  *    including a substantially similar Disclaimer requirement for further
18130f4520SKenneth D. Merry  *    binary redistribution.
19130f4520SKenneth D. Merry  *
20130f4520SKenneth D. Merry  * NO WARRANTY
21130f4520SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22130f4520SKenneth D. Merry  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23130f4520SKenneth D. Merry  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
24130f4520SKenneth D. Merry  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25130f4520SKenneth D. Merry  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26130f4520SKenneth D. Merry  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27130f4520SKenneth D. Merry  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28130f4520SKenneth D. Merry  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29130f4520SKenneth D. Merry  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30130f4520SKenneth D. Merry  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31130f4520SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGES.
32130f4520SKenneth D. Merry  *
33130f4520SKenneth D. Merry  * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_private.h#7 $
34130f4520SKenneth D. Merry  */
35130f4520SKenneth D. Merry /*
36130f4520SKenneth D. Merry  * CAM Target Layer driver private data structures/definitions.
37130f4520SKenneth D. Merry  *
38130f4520SKenneth D. Merry  * Author: Ken Merry <ken@FreeBSD.org>
39130f4520SKenneth D. Merry  */
40130f4520SKenneth D. Merry 
41130f4520SKenneth D. Merry #ifndef	_CTL_PRIVATE_H_
42130f4520SKenneth D. Merry #define	_CTL_PRIVATE_H_
43130f4520SKenneth D. Merry 
44fc8cf0a8SJohn Baldwin #include <sys/sysctl.h>
45d6e7f6e7SAlexander Motin #include <cam/scsi/scsi_all.h>
46d6e7f6e7SAlexander Motin #include <cam/scsi/scsi_cd.h>
47d6e7f6e7SAlexander Motin #include <cam/scsi/scsi_da.h>
48d6e7f6e7SAlexander Motin 
49130f4520SKenneth D. Merry /*
50130f4520SKenneth D. Merry  * SCSI vendor and product names.
51130f4520SKenneth D. Merry  */
52130f4520SKenneth D. Merry #define	CTL_VENDOR		"FREEBSD "
53130f4520SKenneth D. Merry #define	CTL_DIRECT_PRODUCT	"CTLDISK         "
54130f4520SKenneth D. Merry #define	CTL_PROCESSOR_PRODUCT	"CTLPROCESSOR    "
5591be33dcSAlexander Motin #define	CTL_CDROM_PRODUCT	"CTLCDROM        "
56130f4520SKenneth D. Merry #define	CTL_UNKNOWN_PRODUCT	"CTLDEVICE       "
57130f4520SKenneth D. Merry 
58130f4520SKenneth D. Merry #define CTL_POOL_ENTRIES_OTHER_SC   200
59130f4520SKenneth D. Merry 
60130f4520SKenneth D. Merry struct ctl_io_pool {
611251a76bSAlexander Motin 	char			name[64];
62130f4520SKenneth D. Merry 	uint32_t		id;
63130f4520SKenneth D. Merry 	struct ctl_softc	*ctl_softc;
641251a76bSAlexander Motin 	struct uma_zone		*zone;
65130f4520SKenneth D. Merry };
66130f4520SKenneth D. Merry 
67130f4520SKenneth D. Merry typedef enum {
689d9fd8b7SAlexander Motin 	CTL_SER_SEQ,
69130f4520SKenneth D. Merry 	CTL_SER_PASS,
709d9fd8b7SAlexander Motin 	CTL_SER_EXTENTOPT,
719d9fd8b7SAlexander Motin 	CTL_SER_EXTENT,
729d9fd8b7SAlexander Motin 	CTL_SER_BLOCKOPT,
739d9fd8b7SAlexander Motin 	CTL_SER_BLOCK,
74130f4520SKenneth D. Merry } ctl_serialize_action;
75130f4520SKenneth D. Merry 
76130f4520SKenneth D. Merry typedef enum {
77130f4520SKenneth D. Merry 	CTL_ACTION_PASS,
78130f4520SKenneth D. Merry 	CTL_ACTION_SKIP,
799d9fd8b7SAlexander Motin 	CTL_ACTION_BLOCK,
809d9fd8b7SAlexander Motin 	CTL_ACTION_OVERLAP,
810c4ee619SJohn Baldwin 	CTL_ACTION_OVERLAP_TAG,
820c4ee619SJohn Baldwin 	CTL_ACTION_FUSED,
83130f4520SKenneth D. Merry } ctl_action;
84130f4520SKenneth D. Merry 
85130f4520SKenneth D. Merry /*
86130f4520SKenneth D. Merry  * WARNING:  Keep the bottom nibble here free, we OR in the data direction
87130f4520SKenneth D. Merry  * flags for each command.
88130f4520SKenneth D. Merry  *
89efbf6139SAlexander Motin  * Note:  "OK_ON_NO_LUN"   == we don't have to have a lun configured
90130f4520SKenneth D. Merry  *        "OK_ON_BOTH"     == we have to have a lun configured
911b08cb4eSAlexander Motin  *        "SA5"            == command has 5-bit service action at byte 1
92130f4520SKenneth D. Merry  */
93130f4520SKenneth D. Merry typedef enum {
94130f4520SKenneth D. Merry 	CTL_CMD_FLAG_NONE		= 0x0000,
95130f4520SKenneth D. Merry 	CTL_CMD_FLAG_NO_SENSE		= 0x0010,
96648dfc1aSAlexander Motin 	CTL_CMD_FLAG_ALLOW_ON_RESV	= 0x0020,
97648dfc1aSAlexander Motin 	CTL_CMD_FLAG_ALLOW_ON_PR_RESV	= 0x0040,
98115dc0c7SAlexander Motin 	CTL_CMD_FLAG_ALLOW_ON_PR_WRESV	= 0x0080,
99130f4520SKenneth D. Merry 	CTL_CMD_FLAG_OK_ON_PROC		= 0x0100,
10091be33dcSAlexander Motin 	CTL_CMD_FLAG_OK_ON_DIRECT	= 0x0200,
10191be33dcSAlexander Motin 	CTL_CMD_FLAG_OK_ON_CDROM	= 0x0400,
10291be33dcSAlexander Motin 	CTL_CMD_FLAG_OK_ON_BOTH		= 0x0700,
103648dfc1aSAlexander Motin 	CTL_CMD_FLAG_OK_ON_NO_LUN	= 0x0800,
104648dfc1aSAlexander Motin 	CTL_CMD_FLAG_OK_ON_NO_MEDIA	= 0x1000,
105648dfc1aSAlexander Motin 	CTL_CMD_FLAG_OK_ON_STANDBY	= 0x2000,
106648dfc1aSAlexander Motin 	CTL_CMD_FLAG_OK_ON_UNAVAIL	= 0x4000,
107efbf6139SAlexander Motin 	CTL_CMD_FLAG_SA5		= 0x8000,
108648dfc1aSAlexander Motin 	CTL_CMD_FLAG_RUN_HERE		= 0x10000
109130f4520SKenneth D. Merry } ctl_cmd_flags;
110130f4520SKenneth D. Merry 
111130f4520SKenneth D. Merry typedef enum {
112130f4520SKenneth D. Merry 	CTL_SERIDX_TUR	= 0,
113130f4520SKenneth D. Merry 	CTL_SERIDX_READ,
114130f4520SKenneth D. Merry 	CTL_SERIDX_WRITE,
115004008d6SAlexander Motin 	CTL_SERIDX_UNMAP,
116f2a20b16SAlexander Motin 	CTL_SERIDX_SYNC,
117130f4520SKenneth D. Merry 	CTL_SERIDX_MD_SNS,
118130f4520SKenneth D. Merry 	CTL_SERIDX_MD_SEL,
119130f4520SKenneth D. Merry 	CTL_SERIDX_RQ_SNS,
120130f4520SKenneth D. Merry 	CTL_SERIDX_INQ,
121130f4520SKenneth D. Merry 	CTL_SERIDX_RD_CAP,
1224d877c41SAlexander Motin 	CTL_SERIDX_RES,
123130f4520SKenneth D. Merry 	CTL_SERIDX_LOG_SNS,
124130f4520SKenneth D. Merry 	CTL_SERIDX_FORMAT,
125130f4520SKenneth D. Merry 	CTL_SERIDX_START,
126130f4520SKenneth D. Merry 	/* TBD: others to be filled in as needed */
127130f4520SKenneth D. Merry 	CTL_SERIDX_COUNT, /* LAST, not a normal code, provides # codes */
128130f4520SKenneth D. Merry 	CTL_SERIDX_INVLD = CTL_SERIDX_COUNT
129130f4520SKenneth D. Merry } ctl_seridx;
130130f4520SKenneth D. Merry 
131130f4520SKenneth D. Merry typedef int	ctl_opfunc(struct ctl_scsiio *ctsio);
132130f4520SKenneth D. Merry 
133130f4520SKenneth D. Merry struct ctl_cmd_entry {
134130f4520SKenneth D. Merry 	ctl_opfunc		*execute;
135130f4520SKenneth D. Merry 	ctl_seridx		seridx;
136130f4520SKenneth D. Merry 	ctl_cmd_flags		flags;
137130f4520SKenneth D. Merry 	ctl_lun_error_pattern	pattern;
1381b08cb4eSAlexander Motin 	uint8_t			length;		/* CDB length */
1391b08cb4eSAlexander Motin 	uint8_t			usage[15];	/* Mask of allowed CDB bits
1401b08cb4eSAlexander Motin 						 * after the opcode byte. */
141130f4520SKenneth D. Merry };
142130f4520SKenneth D. Merry 
1430c4ee619SJohn Baldwin /* Only data flags are currently used for NVMe commands. */
1440c4ee619SJohn Baldwin struct ctl_nvme_cmd_entry {
1450c4ee619SJohn Baldwin 	int			(*execute)(struct ctl_nvmeio *);
1460c4ee619SJohn Baldwin 	ctl_io_flags		flags;
1470c4ee619SJohn Baldwin };
1480c4ee619SJohn Baldwin 
149130f4520SKenneth D. Merry typedef enum {
150130f4520SKenneth D. Merry 	CTL_LUN_NONE		= 0x000,
151130f4520SKenneth D. Merry 	CTL_LUN_CONTROL		= 0x001,
152130f4520SKenneth D. Merry 	CTL_LUN_RESERVED	= 0x002,
153130f4520SKenneth D. Merry 	CTL_LUN_INVALID		= 0x004,
154130f4520SKenneth D. Merry 	CTL_LUN_DISABLED	= 0x008,
155130f4520SKenneth D. Merry 	CTL_LUN_STOPPED		= 0x020,
156648dfc1aSAlexander Motin 	CTL_LUN_NO_MEDIA	= 0x040,
157648dfc1aSAlexander Motin 	CTL_LUN_EJECTED		= 0x080,
158130f4520SKenneth D. Merry 	CTL_LUN_PR_RESERVED	= 0x100,
159130f4520SKenneth D. Merry 	CTL_LUN_PRIMARY_SC	= 0x200,
1607ac58230SAlexander Motin 	CTL_LUN_READONLY	= 0x800,
16191be33dcSAlexander Motin 	CTL_LUN_PEER_SC_PRIMARY	= 0x1000,
16291be33dcSAlexander Motin 	CTL_LUN_REMOVABLE	= 0x2000
163130f4520SKenneth D. Merry } ctl_lun_flags;
164130f4520SKenneth D. Merry 
165130f4520SKenneth D. Merry typedef enum {
166130f4520SKenneth D. Merry 	CTLBLOCK_FLAG_NONE	= 0x00,
167130f4520SKenneth D. Merry 	CTLBLOCK_FLAG_INVALID	= 0x01
168130f4520SKenneth D. Merry } ctlblock_flags;
169130f4520SKenneth D. Merry 
170130f4520SKenneth D. Merry union ctl_softcs {
171130f4520SKenneth D. Merry 	struct ctl_softc	*ctl_softc;
172130f4520SKenneth D. Merry 	struct ctlblock_softc	*ctlblock_softc;
173130f4520SKenneth D. Merry };
174130f4520SKenneth D. Merry 
175130f4520SKenneth D. Merry /*
176130f4520SKenneth D. Merry  * Mode page defaults.
177130f4520SKenneth D. Merry  */
1783275003eSAlexander Motin #define	CTL_DEFAULT_ROTATION_RATE	SVPD_NON_ROTATING
179130f4520SKenneth D. Merry 
180130f4520SKenneth D. Merry struct ctl_page_index;
181130f4520SKenneth D. Merry 
182130f4520SKenneth D. Merry typedef int	ctl_modesen_handler(struct ctl_scsiio *ctsio,
183130f4520SKenneth D. Merry 				    struct ctl_page_index *page_index,
184130f4520SKenneth D. Merry 				    int pc);
185130f4520SKenneth D. Merry typedef int	ctl_modesel_handler(struct ctl_scsiio *ctsio,
186130f4520SKenneth D. Merry 				    struct ctl_page_index *page_index,
187130f4520SKenneth D. Merry 				    uint8_t *page_ptr);
188130f4520SKenneth D. Merry 
189130f4520SKenneth D. Merry typedef enum {
190130f4520SKenneth D. Merry 	CTL_PAGE_FLAG_NONE	 = 0x00,
19191be33dcSAlexander Motin 	CTL_PAGE_FLAG_DIRECT	 = 0x01,
19291be33dcSAlexander Motin 	CTL_PAGE_FLAG_PROC	 = 0x02,
19391be33dcSAlexander Motin 	CTL_PAGE_FLAG_CDROM	 = 0x04,
19491be33dcSAlexander Motin 	CTL_PAGE_FLAG_ALL	 = 0x07
195130f4520SKenneth D. Merry } ctl_page_flags;
196130f4520SKenneth D. Merry 
197130f4520SKenneth D. Merry struct ctl_page_index {
198130f4520SKenneth D. Merry 	uint8_t			page_code;
199130f4520SKenneth D. Merry 	uint8_t			subpage;
200130f4520SKenneth D. Merry 	uint16_t		page_len;
201130f4520SKenneth D. Merry 	uint8_t			*page_data;
202130f4520SKenneth D. Merry 	ctl_page_flags		page_flags;
203130f4520SKenneth D. Merry 	ctl_modesen_handler	*sense_handler;
204130f4520SKenneth D. Merry 	ctl_modesel_handler	*select_handler;
205130f4520SKenneth D. Merry };
206130f4520SKenneth D. Merry 
207130f4520SKenneth D. Merry #define	CTL_PAGE_CURRENT	0x00
208130f4520SKenneth D. Merry #define	CTL_PAGE_CHANGEABLE	0x01
209130f4520SKenneth D. Merry #define	CTL_PAGE_DEFAULT	0x02
210130f4520SKenneth D. Merry #define	CTL_PAGE_SAVED		0x03
211130f4520SKenneth D. Merry 
212c3e7ba3eSAlexander Motin #define CTL_NUM_LBP_PARAMS	4
213c3e7ba3eSAlexander Motin #define CTL_NUM_LBP_THRESH	4
214c3e7ba3eSAlexander Motin #define CTL_LBP_EXPONENT	11	/* 2048 sectors */
215c3e7ba3eSAlexander Motin #define CTL_LBP_PERIOD		10	/* 10 seconds */
216c3e7ba3eSAlexander Motin #define CTL_LBP_UA_PERIOD	300	/* 5 minutes */
217c3e7ba3eSAlexander Motin 
218c3e7ba3eSAlexander Motin struct ctl_logical_block_provisioning_page {
219c3e7ba3eSAlexander Motin 	struct scsi_logical_block_provisioning_page	main;
220c3e7ba3eSAlexander Motin 	struct scsi_logical_block_provisioning_page_descr descr[CTL_NUM_LBP_THRESH];
221c3e7ba3eSAlexander Motin };
222c3e7ba3eSAlexander Motin 
223c9951950SDimitry Andric static const struct ctl_page_index page_index_template[] = {
224523f047eSAlexander Motin 	{SMS_RW_ERROR_RECOVERY_PAGE, 0, sizeof(struct scsi_da_rw_recovery_page), NULL,
225d9ba4eefSAlexander Motin 	 CTL_PAGE_FLAG_DIRECT | CTL_PAGE_FLAG_CDROM, NULL, ctl_default_page_handler},
226d9ba4eefSAlexander Motin 	{SMS_VERIFY_ERROR_RECOVERY_PAGE, 0, sizeof(struct scsi_da_verify_recovery_page), NULL,
227d9ba4eefSAlexander Motin 	 CTL_PAGE_FLAG_DIRECT | CTL_PAGE_FLAG_CDROM, NULL, ctl_default_page_handler},
228130f4520SKenneth D. Merry 	{SMS_CACHING_PAGE, 0, sizeof(struct scsi_caching_page), NULL,
22991be33dcSAlexander Motin 	 CTL_PAGE_FLAG_DIRECT | CTL_PAGE_FLAG_CDROM,
230d9ba4eefSAlexander Motin 	 NULL, ctl_default_page_handler},
231130f4520SKenneth D. Merry 	{SMS_CONTROL_MODE_PAGE, 0, sizeof(struct scsi_control_page), NULL,
232d9ba4eefSAlexander Motin 	 CTL_PAGE_FLAG_ALL, NULL, ctl_default_page_handler},
233c5399305SAlexander Motin 	{SMS_CONTROL_MODE_PAGE | SMPH_SPF, 0x01,
234c5399305SAlexander Motin 	 sizeof(struct scsi_control_ext_page), NULL,
2354fc0d1d7SAlexander Motin 	 CTL_PAGE_FLAG_ALL, NULL, ctl_default_page_handler},
236523f047eSAlexander Motin 	{SMS_INFO_EXCEPTIONS_PAGE, 0, sizeof(struct scsi_info_exceptions_page), NULL,
237d9ba4eefSAlexander Motin 	 CTL_PAGE_FLAG_ALL, NULL, ctl_ie_page_handler},
238523f047eSAlexander Motin 	{SMS_INFO_EXCEPTIONS_PAGE | SMPH_SPF, 0x02,
239c3e7ba3eSAlexander Motin 	 sizeof(struct ctl_logical_block_provisioning_page), NULL,
24033e7ba9cSAlexander Motin 	 CTL_PAGE_FLAG_DIRECT, NULL, ctl_default_page_handler},
241d6e7f6e7SAlexander Motin 	{SMS_CDDVD_CAPS_PAGE, 0,
242d6e7f6e7SAlexander Motin 	 sizeof(struct scsi_cddvd_capabilities_page), NULL,
243d6e7f6e7SAlexander Motin 	 CTL_PAGE_FLAG_CDROM, NULL, NULL},
244130f4520SKenneth D. Merry };
245130f4520SKenneth D. Merry 
246130f4520SKenneth D. Merry #define	CTL_NUM_MODE_PAGES sizeof(page_index_template)/   \
247130f4520SKenneth D. Merry 			   sizeof(page_index_template[0])
248130f4520SKenneth D. Merry 
249130f4520SKenneth D. Merry struct ctl_mode_pages {
250523f047eSAlexander Motin 	struct scsi_da_rw_recovery_page	rw_er_page[4];
251d9ba4eefSAlexander Motin 	struct scsi_da_verify_recovery_page	verify_er_page[4];
252130f4520SKenneth D. Merry 	struct scsi_caching_page	caching_page[4];
253130f4520SKenneth D. Merry 	struct scsi_control_page	control_page[4];
254c5399305SAlexander Motin 	struct scsi_control_ext_page	control_ext_page[4];
255523f047eSAlexander Motin 	struct scsi_info_exceptions_page ie_page[4];
256c3e7ba3eSAlexander Motin 	struct ctl_logical_block_provisioning_page lbp_page[4];
257d6e7f6e7SAlexander Motin 	struct scsi_cddvd_capabilities_page cddvd_page[4];
258130f4520SKenneth D. Merry 	struct ctl_page_index		index[CTL_NUM_MODE_PAGES];
259130f4520SKenneth D. Merry };
260130f4520SKenneth D. Merry 
26111887875SAlexander Motin #define	MODE_RWER	mode_pages.rw_er_page[CTL_PAGE_CURRENT]
26211887875SAlexander Motin #define	MODE_VER	mode_pages.verify_er_page[CTL_PAGE_CURRENT]
26311887875SAlexander Motin #define	MODE_CACHING	mode_pages.caching_page[CTL_PAGE_CURRENT]
26411887875SAlexander Motin #define	MODE_CTRL	mode_pages.control_page[CTL_PAGE_CURRENT]
26511887875SAlexander Motin #define	MODE_CTRLE	mode_pages.control_ext_page[CTL_PAGE_CURRENT]
26611887875SAlexander Motin #define	MODE_IE		mode_pages.ie_page[CTL_PAGE_CURRENT]
26711887875SAlexander Motin #define	MODE_LBP	mode_pages.lbp_page[CTL_PAGE_CURRENT]
26811887875SAlexander Motin #define	MODE_CDDVD	mode_pages.cddvd_page[CTL_PAGE_CURRENT]
26911887875SAlexander Motin 
270523f047eSAlexander Motin static const struct ctl_page_index log_page_index_template[] = {
271523f047eSAlexander Motin 	{SLS_SUPPORTED_PAGES_PAGE, 0, 0, NULL,
27291be33dcSAlexander Motin 	 CTL_PAGE_FLAG_ALL, NULL, NULL},
273523f047eSAlexander Motin 	{SLS_SUPPORTED_PAGES_PAGE, SLS_SUPPORTED_SUBPAGES_SUBPAGE, 0, NULL,
27491be33dcSAlexander Motin 	 CTL_PAGE_FLAG_ALL, NULL, NULL},
275ae8828baSAlexander Motin 	{SLS_TEMPERATURE, 0, 0, NULL,
276ae8828baSAlexander Motin 	 CTL_PAGE_FLAG_DIRECT, ctl_temp_log_sense_handler, NULL},
277c3e7ba3eSAlexander Motin 	{SLS_LOGICAL_BLOCK_PROVISIONING, 0, 0, NULL,
27891be33dcSAlexander Motin 	 CTL_PAGE_FLAG_DIRECT, ctl_lbp_log_sense_handler, NULL},
2792c8cab2aSAlexander Motin 	{SLS_STAT_AND_PERF, 0, 0, NULL,
28091be33dcSAlexander Motin 	 CTL_PAGE_FLAG_ALL, ctl_sap_log_sense_handler, NULL},
281d9ba4eefSAlexander Motin 	{SLS_IE_PAGE, 0, 0, NULL,
282d9ba4eefSAlexander Motin 	 CTL_PAGE_FLAG_ALL, ctl_ie_log_sense_handler, NULL},
283523f047eSAlexander Motin };
284523f047eSAlexander Motin 
285523f047eSAlexander Motin #define	CTL_NUM_LOG_PAGES sizeof(log_page_index_template)/   \
286523f047eSAlexander Motin 			  sizeof(log_page_index_template[0])
287523f047eSAlexander Motin 
288523f047eSAlexander Motin struct ctl_log_pages {
289523f047eSAlexander Motin 	uint8_t				pages_page[CTL_NUM_LOG_PAGES];
290523f047eSAlexander Motin 	uint8_t				subpages_page[CTL_NUM_LOG_PAGES * 2];
291c3e7ba3eSAlexander Motin 	uint8_t				lbp_page[12*CTL_NUM_LBP_PARAMS];
2922c8cab2aSAlexander Motin 	struct stat_page {
2932c8cab2aSAlexander Motin 		struct scsi_log_stat_and_perf sap;
2942c8cab2aSAlexander Motin 		struct scsi_log_idle_time it;
2952c8cab2aSAlexander Motin 		struct scsi_log_time_interval ti;
2962c8cab2aSAlexander Motin 	} stat_page;
297ae8828baSAlexander Motin 	struct scsi_log_temperature	temp_page[2];
298d9ba4eefSAlexander Motin 	struct scsi_log_informational_exceptions	ie_page;
299523f047eSAlexander Motin 	struct ctl_page_index		index[CTL_NUM_LOG_PAGES];
300523f047eSAlexander Motin };
301523f047eSAlexander Motin 
302130f4520SKenneth D. Merry struct ctl_lun_delay_info {
303130f4520SKenneth D. Merry 	ctl_delay_type		datamove_type;
304130f4520SKenneth D. Merry 	uint32_t		datamove_delay;
305130f4520SKenneth D. Merry 	ctl_delay_type		done_type;
306130f4520SKenneth D. Merry 	uint32_t		done_delay;
307130f4520SKenneth D. Merry };
308130f4520SKenneth D. Merry 
3098cbf9eaeSAlexander Motin #define CTL_PR_ALL_REGISTRANTS  0xFFFFFFFF
3108cbf9eaeSAlexander Motin #define CTL_PR_NO_RESERVATION   0xFFFFFFF0
311130f4520SKenneth D. Merry 
312027e5269SAlexander Motin struct ctl_devid {
313027e5269SAlexander Motin 	int		len;
314027e5269SAlexander Motin 	uint8_t		data[];
315027e5269SAlexander Motin };
316027e5269SAlexander Motin 
3176bd364b5SAlexander Motin #define NUM_HA_SHELVES		2
318130f4520SKenneth D. Merry 
319b491e75bSAlexander Motin #define CTL_WRITE_BUFFER_SIZE	262144
320b491e75bSAlexander Motin 
321984a2ea9SAlexander Motin struct tpc_list;
322130f4520SKenneth D. Merry struct ctl_lun {
323130f4520SKenneth D. Merry 	struct mtx			lun_lock;
324130f4520SKenneth D. Merry 	uint64_t			lun;
325130f4520SKenneth D. Merry 	ctl_lun_flags			flags;
326130f4520SKenneth D. Merry 	STAILQ_HEAD(,ctl_error_desc)	error_list;
327130f4520SKenneth D. Merry 	uint64_t			error_serial;
328130f4520SKenneth D. Merry 	struct ctl_softc		*ctl_softc;
329130f4520SKenneth D. Merry 	struct ctl_be_lun		*be_lun;
330130f4520SKenneth D. Merry 	struct ctl_backend_driver	*backend;
331130f4520SKenneth D. Merry 	struct ctl_lun_delay_info	delay_info;
3322c8cab2aSAlexander Motin #ifdef CTL_TIME_IO
3332c8cab2aSAlexander Motin 	sbintime_t			idle_time;
3342c8cab2aSAlexander Motin 	sbintime_t			last_busy;
3352c8cab2aSAlexander Motin #endif
33605d882b7SAlexander Motin 	LIST_HEAD(ctl_ooaq, ctl_io_hdr)	ooa_queue;
337130f4520SKenneth D. Merry 	STAILQ_ENTRY(ctl_lun)		links;
338530fdf67SEmmanuel Vadot 	struct scsi_sense_data		**pending_sense;
339530fdf67SEmmanuel Vadot 	ctl_ua_type			**pending_ua;
34062138827SAlexander Motin 	uint8_t				ua_tpt_info[8];
341c3e7ba3eSAlexander Motin 	time_t				lasttpt;
342d9ba4eefSAlexander Motin 	uint8_t				ie_asc;	/* Informational exceptions */
343d9ba4eefSAlexander Motin 	uint8_t				ie_ascq;
344d9ba4eefSAlexander Motin 	int				ie_reported;	/* Already reported */
345d9ba4eefSAlexander Motin 	uint32_t			ie_reportcnt;	/* REPORT COUNT */
346d9ba4eefSAlexander Motin 	struct callout			ie_callout;	/* INTERVAL TIMER */
347130f4520SKenneth D. Merry 	struct ctl_mode_pages		mode_pages;
348523f047eSAlexander Motin 	struct ctl_log_pages		log_pages;
349bb8f9017SAlexander Motin 	struct ctl_io_stats		stats;
3502f872218SAlexander Motin 	uint32_t			res_idx;
351f53270c8SAlexander Motin 	uint32_t			pr_generation;
352530fdf67SEmmanuel Vadot 	uint64_t			**pr_keys;
353130f4520SKenneth D. Merry 	int				pr_key_count;
3548cbf9eaeSAlexander Motin 	uint32_t			pr_res_idx;
355f53270c8SAlexander Motin 	uint8_t				pr_res_type;
35666b69676SAlexander Motin 	int				prevent_count;
3570e2d6474SAlexander Motin 	uint32_t			*prevent;
358670b582dSAlan Somers 
359670b582dSAlan Somers 	/*
360670b582dSAlan Somers 	 * The READ_BUFFER and WRITE_BUFFER commands permit access to a logical
361670b582dSAlan Somers 	 * data buffer associated with a LUN.  Accesses to the data buffer do
362670b582dSAlan Somers 	 * not affect data stored on the storage medium.  To support this,
363670b582dSAlan Somers 	 * allocate a buffer on first use that persists until the LUN is
364670b582dSAlan Somers 	 * destroyed.
365670b582dSAlan Somers 	 */
366b491e75bSAlexander Motin 	uint8_t				*write_buffer;
367027e5269SAlexander Motin 	struct ctl_devid		*lun_devid;
368984a2ea9SAlexander Motin 	TAILQ_HEAD(tpc_lists, tpc_list) tpc_lists;
369130f4520SKenneth D. Merry };
370130f4520SKenneth D. Merry 
371130f4520SKenneth D. Merry typedef enum {
37223b30f56SAlexander Motin 	CTL_FLAG_ACTIVE_SHELF	= 0x04
373130f4520SKenneth D. Merry } ctl_gen_flags;
374130f4520SKenneth D. Merry 
3753a8ce4a3SAlexander Motin #define CTL_MAX_THREADS		16
3763a8ce4a3SAlexander Motin 
3773a8ce4a3SAlexander Motin struct ctl_thread {
3783a8ce4a3SAlexander Motin 	struct mtx_padalign queue_lock;
3793a8ce4a3SAlexander Motin 	struct ctl_softc	*ctl_softc;
3803a8ce4a3SAlexander Motin 	struct thread		*thread;
3813a8ce4a3SAlexander Motin 	STAILQ_HEAD(, ctl_io_hdr) incoming_queue;
3823a8ce4a3SAlexander Motin 	STAILQ_HEAD(, ctl_io_hdr) rtr_queue;
3833a8ce4a3SAlexander Motin 	STAILQ_HEAD(, ctl_io_hdr) done_queue;
3843a8ce4a3SAlexander Motin 	STAILQ_HEAD(, ctl_io_hdr) isc_queue;
3853a8ce4a3SAlexander Motin };
3863a8ce4a3SAlexander Motin 
38725eee848SAlexander Motin struct tpc_token;
388130f4520SKenneth D. Merry struct ctl_softc {
389130f4520SKenneth D. Merry 	struct mtx		ctl_lock;
390130f4520SKenneth D. Merry 	struct cdev		*dev;
391130f4520SKenneth D. Merry 	int			num_luns;
392130f4520SKenneth D. Merry 	ctl_gen_flags		flags;
393130f4520SKenneth D. Merry 	ctl_ha_mode		ha_mode;
39423b30f56SAlexander Motin 	int			ha_id;
39523b30f56SAlexander Motin 	int			is_single;
3967ac58230SAlexander Motin 	ctl_ha_link_state	ha_link;
3977ac58230SAlexander Motin 	int			port_min;
3987ac58230SAlexander Motin 	int			port_max;
3997ac58230SAlexander Motin 	int			port_cnt;
4007ac58230SAlexander Motin 	int			init_min;
4017ac58230SAlexander Motin 	int			init_max;
402bf8f8f34SKenneth D. Merry 	struct sysctl_ctx_list	sysctl_ctx;
403bf8f8f34SKenneth D. Merry 	struct sysctl_oid	*sysctl_tree;
4041251a76bSAlexander Motin 	void			*othersc_pool;
4053a8ce4a3SAlexander Motin 	struct proc		*ctl_proc;
406530fdf67SEmmanuel Vadot 	uint32_t		*ctl_lun_mask;
407530fdf67SEmmanuel Vadot 	struct ctl_lun		**ctl_luns;
408530fdf67SEmmanuel Vadot 	uint32_t		*ctl_port_mask;
409130f4520SKenneth D. Merry 	STAILQ_HEAD(, ctl_lun)	lun_list;
410130f4520SKenneth D. Merry 	uint32_t		num_frontends;
411130f4520SKenneth D. Merry 	STAILQ_HEAD(, ctl_frontend)	fe_list;
41292168f4cSAlexander Motin 	uint32_t		num_ports;
41392168f4cSAlexander Motin 	STAILQ_HEAD(, ctl_port)	port_list;
414530fdf67SEmmanuel Vadot 	struct ctl_port		**ctl_ports;
415130f4520SKenneth D. Merry 	uint32_t		num_backends;
416130f4520SKenneth D. Merry 	STAILQ_HEAD(, ctl_backend_driver)	be_list;
4171251a76bSAlexander Motin 	struct uma_zone		*io_zone;
418130f4520SKenneth D. Merry 	uint32_t		cur_pool_id;
4190c629e28SAlexander Motin 	int			shutdown;
4203a8ce4a3SAlexander Motin 	struct ctl_thread	threads[CTL_MAX_THREADS];
4210c629e28SAlexander Motin 	struct thread		*thresh_thread;
42225eee848SAlexander Motin 	TAILQ_HEAD(tpc_tokens, tpc_token)	tpc_tokens;
42325eee848SAlexander Motin 	struct callout		tpc_timeout;
4242d8b2876SAlexander Motin 	struct mtx		tpc_lock;
425130f4520SKenneth D. Merry };
426130f4520SKenneth D. Merry 
427130f4520SKenneth D. Merry #ifdef _KERNEL
428130f4520SKenneth D. Merry 
429*b1d324d9SJohn Baldwin extern struct ctl_softc *control_softc;
4301b08cb4eSAlexander Motin extern const struct ctl_cmd_entry ctl_cmd_table[256];
4310c4ee619SJohn Baldwin extern const struct ctl_nvme_cmd_entry nvme_admin_cmd_table[256];
4320c4ee619SJohn Baldwin extern const struct ctl_nvme_cmd_entry nvme_nvm_cmd_table[256];
433130f4520SKenneth D. Merry 
434130f4520SKenneth D. Merry uint32_t ctl_get_initindex(struct ctl_nexus *nexus);
435920c6cbaSAlexander Motin int ctl_lun_map_init(struct ctl_port *port);
436920c6cbaSAlexander Motin int ctl_lun_map_deinit(struct ctl_port *port);
437920c6cbaSAlexander Motin int ctl_lun_map_set(struct ctl_port *port, uint32_t plun, uint32_t glun);
438920c6cbaSAlexander Motin int ctl_lun_map_unset(struct ctl_port *port, uint32_t plun);
439920c6cbaSAlexander Motin uint32_t ctl_lun_map_from_port(struct ctl_port *port, uint32_t plun);
440920c6cbaSAlexander Motin uint32_t ctl_lun_map_to_port(struct ctl_port *port, uint32_t glun);
4411251a76bSAlexander Motin int ctl_pool_create(struct ctl_softc *ctl_softc, const char *pool_name,
4421251a76bSAlexander Motin 		    uint32_t total_ctl_io, void **npool);
4438c6d5f82SAlexander Motin void ctl_pool_free(struct ctl_io_pool *pool);
444130f4520SKenneth D. Merry int ctl_scsi_release(struct ctl_scsiio *ctsio);
445130f4520SKenneth D. Merry int ctl_scsi_reserve(struct ctl_scsiio *ctsio);
446130f4520SKenneth D. Merry int ctl_start_stop(struct ctl_scsiio *ctsio);
44791be33dcSAlexander Motin int ctl_prevent_allow(struct ctl_scsiio *ctsio);
448130f4520SKenneth D. Merry int ctl_sync_cache(struct ctl_scsiio *ctsio);
449130f4520SKenneth D. Merry int ctl_format(struct ctl_scsiio *ctsio);
45085165a3fSAlexander Motin int ctl_read_buffer(struct ctl_scsiio *ctsio);
451130f4520SKenneth D. Merry int ctl_write_buffer(struct ctl_scsiio *ctsio);
452ee7f31c0SAlexander Motin int ctl_write_same(struct ctl_scsiio *ctsio);
453ee7f31c0SAlexander Motin int ctl_unmap(struct ctl_scsiio *ctsio);
454130f4520SKenneth D. Merry int ctl_mode_select(struct ctl_scsiio *ctsio);
455130f4520SKenneth D. Merry int ctl_mode_sense(struct ctl_scsiio *ctsio);
456523f047eSAlexander Motin int ctl_log_sense(struct ctl_scsiio *ctsio);
457130f4520SKenneth D. Merry int ctl_read_capacity(struct ctl_scsiio *ctsio);
4581b08cb4eSAlexander Motin int ctl_read_capacity_16(struct ctl_scsiio *ctsio);
459d70698b3SAlexander Motin int ctl_read_defect(struct ctl_scsiio *ctsio);
46091be33dcSAlexander Motin int ctl_read_toc(struct ctl_scsiio *ctsio);
461130f4520SKenneth D. Merry int ctl_read_write(struct ctl_scsiio *ctsio);
46211b569f7SAlexander Motin int ctl_cnw(struct ctl_scsiio *ctsio);
463130f4520SKenneth D. Merry int ctl_report_luns(struct ctl_scsiio *ctsio);
464130f4520SKenneth D. Merry int ctl_request_sense(struct ctl_scsiio *ctsio);
465130f4520SKenneth D. Merry int ctl_tur(struct ctl_scsiio *ctsio);
46611b569f7SAlexander Motin int ctl_verify(struct ctl_scsiio *ctsio);
467130f4520SKenneth D. Merry int ctl_inquiry(struct ctl_scsiio *ctsio);
46891be33dcSAlexander Motin int ctl_get_config(struct ctl_scsiio *ctsio);
46991be33dcSAlexander Motin int ctl_get_event_status(struct ctl_scsiio *ctsio);
47091be33dcSAlexander Motin int ctl_mechanism_status(struct ctl_scsiio *ctsio);
471130f4520SKenneth D. Merry int ctl_persistent_reserve_in(struct ctl_scsiio *ctsio);
472130f4520SKenneth D. Merry int ctl_persistent_reserve_out(struct ctl_scsiio *ctsio);
4738bdf81e4SAlexander Motin int ctl_report_ident_info(struct ctl_scsiio *ctsio);
4741b08cb4eSAlexander Motin int ctl_report_tagret_port_groups(struct ctl_scsiio *ctsio);
4751b08cb4eSAlexander Motin int ctl_report_supported_opcodes(struct ctl_scsiio *ctsio);
4761b08cb4eSAlexander Motin int ctl_report_supported_tmf(struct ctl_scsiio *ctsio);
47725c9d5e5SAlexander Motin int ctl_report_timestamp(struct ctl_scsiio *ctsio);
478ef8daf3fSAlexander Motin int ctl_get_lba_status(struct ctl_scsiio *ctsio);
479130f4520SKenneth D. Merry 
4800c4ee619SJohn Baldwin int ctl_nvme_identify(struct ctl_nvmeio *ctnio);
4810c4ee619SJohn Baldwin int ctl_nvme_flush(struct ctl_nvmeio *ctnio);
4820c4ee619SJohn Baldwin int ctl_nvme_read_write(struct ctl_nvmeio *ctnio);
4830c4ee619SJohn Baldwin int ctl_nvme_write_uncorrectable(struct ctl_nvmeio *ctnio);
4840c4ee619SJohn Baldwin int ctl_nvme_compare(struct ctl_nvmeio *ctnio);
4850c4ee619SJohn Baldwin int ctl_nvme_write_zeroes(struct ctl_nvmeio *ctnio);
4860c4ee619SJohn Baldwin int ctl_nvme_dataset_management(struct ctl_nvmeio *ctnio);
4870c4ee619SJohn Baldwin int ctl_nvme_verify(struct ctl_nvmeio *ctnio);
4880c4ee619SJohn Baldwin 
48925eee848SAlexander Motin void ctl_tpc_init(struct ctl_softc *softc);
49025eee848SAlexander Motin void ctl_tpc_shutdown(struct ctl_softc *softc);
49125eee848SAlexander Motin void ctl_tpc_lun_init(struct ctl_lun *lun);
4929ff948d0SAlexander Motin void ctl_tpc_lun_clear(struct ctl_lun *lun, uint32_t initidx);
49325eee848SAlexander Motin void ctl_tpc_lun_shutdown(struct ctl_lun *lun);
494984a2ea9SAlexander Motin int ctl_inquiry_evpd_tpc(struct ctl_scsiio *ctsio, int alloc_len);
495984a2ea9SAlexander Motin int ctl_receive_copy_status_lid1(struct ctl_scsiio *ctsio);
496984a2ea9SAlexander Motin int ctl_receive_copy_failure_details(struct ctl_scsiio *ctsio);
497984a2ea9SAlexander Motin int ctl_receive_copy_status_lid4(struct ctl_scsiio *ctsio);
498984a2ea9SAlexander Motin int ctl_receive_copy_operating_parameters(struct ctl_scsiio *ctsio);
499984a2ea9SAlexander Motin int ctl_extended_copy_lid1(struct ctl_scsiio *ctsio);
500984a2ea9SAlexander Motin int ctl_extended_copy_lid4(struct ctl_scsiio *ctsio);
501984a2ea9SAlexander Motin int ctl_copy_operation_abort(struct ctl_scsiio *ctsio);
50225eee848SAlexander Motin int ctl_populate_token(struct ctl_scsiio *ctsio);
50325eee848SAlexander Motin int ctl_write_using_token(struct ctl_scsiio *ctsio);
50425eee848SAlexander Motin int ctl_receive_rod_token_information(struct ctl_scsiio *ctsio);
50525eee848SAlexander Motin int ctl_report_all_rod_tokens(struct ctl_scsiio *ctsio);
506984a2ea9SAlexander Motin 
507130f4520SKenneth D. Merry #endif	/* _KERNEL */
508130f4520SKenneth D. Merry 
509130f4520SKenneth D. Merry #endif	/* _CTL_PRIVATE_H_ */
510130f4520SKenneth D. Merry 
511130f4520SKenneth D. Merry /*
512130f4520SKenneth D. Merry  * vim: ts=8
513130f4520SKenneth D. Merry  */
514