1229997Sken/*-
2229997Sken * Copyright (c) 2003 Silicon Graphics International Corp.
3229997Sken * All rights reserved.
4229997Sken *
5229997Sken * Redistribution and use in source and binary forms, with or without
6229997Sken * modification, are permitted provided that the following conditions
7229997Sken * are met:
8229997Sken * 1. Redistributions of source code must retain the above copyright
9229997Sken *    notice, this list of conditions, and the following disclaimer,
10229997Sken *    without modification.
11229997Sken * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12229997Sken *    substantially similar to the "NO WARRANTY" disclaimer below
13229997Sken *    ("Disclaimer") and any redistribution must be conditioned upon
14229997Sken *    including a substantially similar Disclaimer requirement for further
15229997Sken *    binary redistribution.
16229997Sken *
17229997Sken * NO WARRANTY
18229997Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19229997Sken * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20229997Sken * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
21229997Sken * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22229997Sken * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23229997Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24229997Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25229997Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26229997Sken * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27229997Sken * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28229997Sken * POSSIBILITY OF SUCH DAMAGES.
29229997Sken *
30229997Sken * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl.h#5 $
31229997Sken * $FreeBSD$
32229997Sken */
33229997Sken/*
34229997Sken * Function definitions used both within CTL and potentially in various CTL
35229997Sken * clients.
36229997Sken *
37229997Sken * Author: Ken Merry <ken@FreeBSD.org>
38229997Sken */
39229997Sken
40229997Sken#ifndef	_CTL_H_
41229997Sken#define	_CTL_H_
42229997Sken
43229997Sken#define	ctl_min(x,y)	(((x) < (y)) ? (x) : (y))
44229997Sken#define	CTL_RETVAL_COMPLETE	0
45229997Sken#define	CTL_RETVAL_QUEUED	1
46229997Sken#define	CTL_RETVAL_ALLOCATED	2
47229997Sken#define	CTL_RETVAL_ERROR	3
48229997Sken
49229997Skentypedef enum {
50229997Sken	CTL_PORT_NONE		= 0x00,
51229997Sken	CTL_PORT_FC		= 0x01,
52229997Sken	CTL_PORT_SCSI		= 0x02,
53229997Sken	CTL_PORT_IOCTL		= 0x04,
54229997Sken	CTL_PORT_INTERNAL	= 0x08,
55254759Strasz	CTL_PORT_ISCSI		= 0x10,
56268694Smav	CTL_PORT_SAS		= 0x20,
57229997Sken	CTL_PORT_ALL		= 0xff,
58229997Sken	CTL_PORT_ISC		= 0x100 // FC port for inter-shelf communication
59229997Sken} ctl_port_type;
60229997Sken
61229997Skenstruct ctl_port_entry {
62229997Sken	ctl_port_type		port_type;
63229997Sken	char			port_name[64];
64229997Sken	int32_t			targ_port;
65229997Sken	int			physical_port;
66229997Sken	int			virtual_port;
67229997Sken	u_int			flags;
68229997Sken#define	CTL_PORT_WWNN_VALID	0x01
69229997Sken#define	CTL_PORT_WWPN_VALID	0x02
70229997Sken	uint64_t		wwnn;
71229997Sken	uint64_t		wwpn;
72229997Sken	int			online;
73229997Sken};
74229997Sken
75229997Skenstruct ctl_modepage_header {
76229997Sken	uint8_t page_code;
77229997Sken	uint8_t subpage;
78229997Sken	int32_t len_used;
79229997Sken	int32_t len_left;
80229997Sken};
81229997Sken
82229997Skenstruct ctl_modepage_aps {
83229997Sken	struct ctl_modepage_header header;
84229997Sken	uint8_t lock_active;
85229997Sken};
86229997Sken
87229997Skenunion ctl_modepage_info {
88229997Sken	struct ctl_modepage_header header;
89229997Sken	struct ctl_modepage_aps aps;
90229997Sken};
91229997Sken
92229997Sken/*
93229997Sken * Serial number length, for VPD page 0x80.
94229997Sken */
95229997Sken#define	CTL_SN_LEN	16
96229997Sken
97229997Sken/*
98229997Sken * Device ID length, for VPD page 0x83.
99229997Sken */
100268673Smav#define	CTL_DEVID_LEN	64
101268673Smav#define	CTL_DEVID_MIN_LEN	16
102229997Sken/*
103229997Sken * WWPN length, for VPD page 0x83.
104229997Sken */
105229997Sken#define CTL_WWPN_LEN   8
106229997Sken
107268682Smav#define	CTL_DRIVER_NAME_LEN	32
108268682Smav
109229997Sken/*
110229997Sken * Unit attention types. ASC/ASCQ values for these should be placed in
111229997Sken * ctl_build_ua.  These are also listed in order of reporting priority.
112229997Sken * i.e. a poweron UA is reported first, bus reset second, etc.
113229997Sken */
114229997Skentypedef enum {
115229997Sken	CTL_UA_NONE		= 0x0000,
116229997Sken	CTL_UA_POWERON		= 0x0001,
117229997Sken	CTL_UA_BUS_RESET	= 0x0002,
118229997Sken	CTL_UA_TARG_RESET	= 0x0004,
119268690Smav	CTL_UA_I_T_NEXUS_LOSS	= 0x0008,
120268690Smav	CTL_UA_LUN_RESET	= 0x0010,
121268690Smav	CTL_UA_LUN_CHANGE	= 0x0020,
122272203Smav	CTL_UA_MODE_CHANGE	= 0x0040,
123268690Smav	CTL_UA_LOG_CHANGE	= 0x0080,
124268690Smav	CTL_UA_LVD		= 0x0100,
125268690Smav	CTL_UA_SE		= 0x0200,
126268690Smav	CTL_UA_RES_PREEMPT	= 0x0400,
127268690Smav	CTL_UA_RES_RELEASE	= 0x0800,
128268690Smav	CTL_UA_REG_PREEMPT  	= 0x1000,
129268690Smav	CTL_UA_ASYM_ACC_CHANGE  = 0x2000,
130268690Smav	CTL_UA_CAPACITY_CHANGED = 0x4000
131229997Sken} ctl_ua_type;
132229997Sken
133229997Sken#ifdef	_KERNEL
134229997Sken
135229997SkenMALLOC_DECLARE(M_CTL);
136229997Sken
137229997Skenstruct ctl_page_index;
138229997Sken
139229997Sken#ifdef SYSCTL_DECL	/* from sysctl.h */
140229997SkenSYSCTL_DECL(_kern_cam_ctl);
141229997Sken#endif
142229997Sken
143229997Sken/*
144229997Sken * Call these routines to enable or disable front end ports.
145229997Sken */
146229997Skenint ctl_port_enable(ctl_port_type port_type);
147229997Skenint ctl_port_disable(ctl_port_type port_type);
148229997Sken/*
149229997Sken * This routine grabs a list of frontend ports.
150229997Sken */
151229997Skenint ctl_port_list(struct ctl_port_entry *entries, int num_entries_alloced,
152229997Sken		  int *num_entries_filled, int *num_entries_dropped,
153229997Sken		  ctl_port_type port_type, int no_virtual);
154229997Sken
155229997Sken/*
156229997Sken * Put a string into an sbuf, escaping characters that are illegal or not
157229997Sken * recommended in XML.  Note this doesn't escape everything, just > < and &.
158229997Sken */
159229997Skenint ctl_sbuf_printf_esc(struct sbuf *sb, char *str);
160229997Sken
161229997Skenint ctl_ffz(uint32_t *mask, uint32_t size);
162229997Skenint ctl_set_mask(uint32_t *mask, uint32_t bit);
163229997Skenint ctl_clear_mask(uint32_t *mask, uint32_t bit);
164229997Skenint ctl_is_set(uint32_t *mask, uint32_t bit);
165229997Skenint ctl_control_page_handler(struct ctl_scsiio *ctsio,
166229997Sken			     struct ctl_page_index *page_index,
167229997Sken			     uint8_t *page_ptr);
168229997Sken/**
169229997Skenint ctl_failover_sp_handler(struct ctl_scsiio *ctsio,
170229997Sken			    struct ctl_page_index *page_index,
171229997Sken			    uint8_t *page_ptr);
172229997Sken**/
173229997Skenint ctl_power_sp_handler(struct ctl_scsiio *ctsio,
174229997Sken			 struct ctl_page_index *page_index, uint8_t *page_ptr);
175229997Skenint ctl_power_sp_sense_handler(struct ctl_scsiio *ctsio,
176229997Sken			       struct ctl_page_index *page_index, int pc);
177229997Skenint ctl_aps_sp_handler(struct ctl_scsiio *ctsio,
178229997Sken		       struct ctl_page_index *page_index, uint8_t *page_ptr);
179229997Skenint ctl_debugconf_sp_sense_handler(struct ctl_scsiio *ctsio,
180229997Sken				   struct ctl_page_index *page_index,
181229997Sken				   int pc);
182229997Skenint ctl_debugconf_sp_select_handler(struct ctl_scsiio *ctsio,
183229997Sken				    struct ctl_page_index *page_index,
184229997Sken				    uint8_t *page_ptr);
185229997Skenint ctl_config_move_done(union ctl_io *io);
186229997Skenvoid ctl_datamove(union ctl_io *io);
187229997Skenvoid ctl_done(union ctl_io *io);
188268151Smavvoid ctl_data_submit_done(union ctl_io *io);
189229997Skenvoid ctl_config_write_done(union ctl_io *io);
190229997Skenvoid ctl_portDB_changed(int portnum);
191229997Skenvoid ctl_init_isc_msg(void);
192229997Sken
193268678Smav/*
194268678Smav * KPI to manipulate LUN/port options
195268678Smav */
196268678Smav
197268678Smavstruct ctl_option {
198268678Smav	STAILQ_ENTRY(ctl_option)	links;
199268678Smav	char			*name;
200268678Smav	char			*value;
201268678Smav};
202268678Smavtypedef STAILQ_HEAD(ctl_options, ctl_option) ctl_options_t;
203268678Smav
204268678Smavstruct ctl_be_arg;
205268678Smavvoid ctl_init_opts(ctl_options_t *opts, int num_args, struct ctl_be_arg *args);
206268678Smavvoid ctl_free_opts(ctl_options_t *opts);
207268678Smavchar * ctl_get_opt(ctl_options_t *opts, const char *name);
208268678Smav
209229997Sken#endif	/* _KERNEL */
210229997Sken
211229997Sken#endif	/* _CTL_H_ */
212229997Sken
213229997Sken/*
214229997Sken * vim: ts=8
215229997Sken */
216