6811333 Remove prom_printf() message in emlxs driver
[opensolaris.git] / usr / src / uts / common / sys / stmf.h
blob940545b25563454fe85930195c12af918ce70265
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
25 #ifndef _STMF_H
26 #define _STMF_H
28 #include <sys/stmf_defines.h>
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
34 typedef enum stmf_struct_id {
35 STMF_STRUCT_LU_PROVIDER = 1,
36 STMF_STRUCT_PORT_PROVIDER,
37 STMF_STRUCT_STMF_LOCAL_PORT,
38 STMF_STRUCT_STMF_LU,
39 STMF_STRUCT_SCSI_SESSION,
40 STMF_STRUCT_SCSI_TASK,
41 STMF_STRUCT_DATA_BUF,
42 STMF_STRUCT_DBUF_STORE,
43 STMF_MAX_STRUCT_IDS
44 } stmf_struct_id_t;
47 * Provider callback commands
49 #define STMF_PROVIDER_DATA_UPDATED 0x01
52 * Provider callback flags
54 #define STMF_PCB_STMF_ONLINING 0x0001
55 #define STMF_PCB_PREG_COMPLETE 0x0002
57 typedef void *data_seg_handle_t;
58 #define STMF_MAX_LU_CACHE_NTASKS 16
60 #define STMF_NO_HANDLE 0xffffffff
62 #define COMPANY_ID_NONE 0xFFFFFFFF
63 #define COMPANY_ID_SUN 0x00144F
65 typedef struct stmf_data_buf {
66 void *db_stmf_private;
67 void *db_port_private;
68 void *db_lu_private;
69 uint32_t db_buf_size; /* Total size of this buffer */
70 uint32_t db_data_size; /* Intended xfer size of this buffer */
71 uint32_t db_relative_offset;
72 uint16_t db_sglist_length;
73 uint16_t db_flags; /* Direction, auto status etc */
74 stmf_status_t db_xfer_status;
75 uint8_t db_handle; /* To track parallel buffers */
76 struct stmf_sglist_ent {
77 uint32_t seg_length;
78 uint8_t *seg_addr;
79 } db_sglist[1];
80 } stmf_data_buf_t;
83 * db_flags
85 #define DB_DIRECTION_TO_RPORT 0x0001
86 #define DB_DIRECTION_FROM_RPORT 0x0002
87 #define DB_SEND_STATUS_GOOD 0x0004
88 #define DB_STATUS_GOOD_SENT 0x0008
89 #define DB_DONT_CACHE 0x0010
91 typedef struct scsi_task {
92 void *task_stmf_private;
93 void *task_port_private;
95 void *task_lu_private;
96 struct stmf_scsi_session *task_session;
97 struct stmf_local_port *task_lport;
98 struct stmf_lu *task_lu;
99 void *task_lu_itl_handle; /* Assigned by LU */
101 /* CMD information from initiator */
102 uint8_t task_lun_no[8];
103 uint8_t task_flags; /* See def. for task flags */
104 uint8_t task_priority; /* As per SAM-3 */
105 uint8_t task_mgmt_function; /* If this is a TM request */
106 uint8_t task_max_nbufs;
107 uint8_t task_cur_nbufs;
108 uint8_t task_csn_size; /* cmd seq no size in bits */
109 uint16_t task_additional_flags;
110 uint32_t task_cmd_seq_no;
111 uint32_t task_expected_xfer_length;
112 uint32_t task_timeout; /* In seconds */
113 uint16_t task_ext_id;
114 uint16_t task_cdb_length;
115 uint8_t *task_cdb;
117 /* Fields to manage data phase */
118 uint32_t task_cmd_xfer_length; /* xfer len based on CDB */
119 uint32_t task_nbytes_transferred;
121 /* Status Phase */
122 stmf_status_t task_completion_status;
123 uint32_t task_resid;
124 uint8_t task_status_ctrl; /* See def. for status ctrl */
125 uint8_t task_scsi_status;
126 uint16_t task_sense_length;
127 uint8_t *task_sense_data;
129 /* Misc. task data */
130 void *task_extended_cmd;
132 } scsi_task_t;
135 * Maximum expected transfer length. Can also be used when the transfer
136 * length is unknown when the task is allocated (e.g. SAS)
139 #define TASK_MAX_XFER_LENGTH 0xFFFFFFFF
142 * task_flags definitions.
145 * If TF_INITIAL_BURST is set, the dbuf passed with new_task() contains
146 * data from initial burst. Otherwise its just a buffer which the port
147 * passed to the LU.
149 #define TF_INITIAL_BURST 0x80
150 /* Both READ_DATA and WRITE_DATA can be set for bidirectional xfers */
151 #define TF_READ_DATA 0x40
152 #define TF_WRITE_DATA 0x20
153 #define TF_ATTR_MASK 0x07
154 #define TF_ATTR_UNTAGGED 0x0
155 #define TF_ATTR_SIMPLE_QUEUE 0x1
156 #define TF_ATTR_ORDERED_QUEUE 0x2
157 #define TF_ATTR_HEAD_OF_QUEUE 0x3
158 #define TF_ATTR_ACA 0x4
161 * Task Management flags.
163 #define TM_NONE 0x00
164 #define TM_ABORT_TASK 0x01
165 #define TM_ABORT_TASK_SET 0x02
166 #define TM_CLEAR_ACA 0x03
167 #define TM_CLEAR_TASK_SET 0x04
168 #define TM_LUN_RESET 0x05
169 #define TM_TARGET_WARM_RESET 0x06
170 #define TM_TARGET_COLD_RESET 0x07
171 #define TM_TASK_REASSIGN 0x08
172 #define TM_TARGET_RESET 0x09
173 #define TM_QUERY_TASK 0x0A
176 * additional flags
178 #define TASK_AF_ENABLE_COMP_CONF 0x01
179 #define TASK_AF_PORT_LOAD_HIGH 0x02
180 #define TASK_AF_NO_EXPECTED_XFER_LENGTH 0x04
183 * scsi_task_t extension identifiers
185 #define STMF_TASK_EXT_NONE 0
188 * max_nbufs
190 #define STMF_BUFS_MAX 255
193 * Task status ctrl
195 #define TASK_SCTRL_OVER 1
196 #define TASK_SCTRL_UNDER 2
199 * The flags used by I/O flow.
201 #define STMF_IOF_LU_DONE 0x0001
202 #define STMF_IOF_LPORT_DONE 0x0002
205 * struct allocation flags
207 #define AF_FORCE_NOSLEEP 0x0001
209 typedef struct stmf_state_change_info {
210 uint64_t st_rflags; /* Reason behin this change */
211 char *st_additional_info;
212 } stmf_state_change_info_t;
214 typedef struct stmf_change_status {
215 stmf_status_t st_completion_status;
216 char *st_additional_info;
217 } stmf_change_status_t;
220 * conditions causing or affecting the change.
222 #define STMF_RFLAG_USER_REQUEST 0x0001
223 #define STMF_RFLAG_FATAL_ERROR 0x0002
224 #define STMF_RFLAG_STAY_OFFLINED 0x0004
225 #define STMF_RFLAG_RESET 0x0008
226 #define STMF_RFLAG_COLLECT_DEBUG_DUMP 0x0010
227 #define STMF_RFLAG_LU_ABORT 0x0020
228 #define STMF_RFLAG_LPORT_ABORT 0x0040
230 #define STMF_CHANGE_INFO_LEN 160
233 * cmds to stmf_abort entry point
235 #define STMF_QUEUE_TASK_ABORT 1
236 #define STMF_REQUEUE_TASK_ABORT_LPORT 2
237 #define STMF_REQUEUE_TASK_ABORT_LU 3
238 #define STMF_QUEUE_ABORT_LU 4
241 * cmds to be used by stmf ctl
243 #define STMF_CMD_LU_OP 0x0100
244 #define STMF_CMD_LPORT_OP 0x0200
245 #define STMF_CMD_MASK 0x00ff
246 #define STMF_CMD_ONLINE 0x0001
247 #define STMF_CMD_OFFLINE 0x0002
248 #define STMF_CMD_GET_STATUS 0x0003
249 #define STMF_CMD_ONLINE_COMPLETE 0x0004
250 #define STMF_CMD_OFFLINE_COMPLETE 0x0005
251 #define STMF_ACK_ONLINE_COMPLETE 0x0006
252 #define STMF_ACK_OFFLINE_COMPLETE 0x0007
254 #define STMF_CMD_LU_ONLINE (STMF_CMD_LU_OP | STMF_CMD_ONLINE)
255 #define STMF_CMD_LU_OFFLINE (STMF_CMD_LU_OP | STMF_CMD_OFFLINE)
256 #define STMF_CMD_LPORT_ONLINE (STMF_CMD_LPORT_OP | STMF_CMD_ONLINE)
257 #define STMF_CMD_LPORT_OFFLINE (STMF_CMD_LPORT_OP | STMF_CMD_OFFLINE)
258 #define STMF_CMD_GET_LU_STATUS (STMF_CMD_LU_OP | STMF_CMD_GET_STATUS)
259 #define STMF_CMD_GET_LPORT_STATUS \
260 (STMF_CMD_LPORT_OP | STMF_CMD_GET_STATUS)
261 #define STMF_CMD_LU_ONLINE_COMPLETE \
262 (STMF_CMD_LU_OP | STMF_CMD_ONLINE_COMPLETE)
263 #define STMF_CMD_LPORT_ONLINE_COMPLETE \
264 (STMF_CMD_LPORT_OP | STMF_CMD_ONLINE_COMPLETE)
265 #define STMF_ACK_LU_ONLINE_COMPLETE \
266 (STMF_CMD_LU_OP | STMF_ACK_ONLINE_COMPLETE)
267 #define STMF_ACK_LPORT_ONLINE_COMPLETE \
268 (STMF_CMD_LPORT_OP | STMF_ACK_ONLINE_COMPLETE)
269 #define STMF_CMD_LU_OFFLINE_COMPLETE \
270 (STMF_CMD_LU_OP | STMF_CMD_OFFLINE_COMPLETE)
271 #define STMF_CMD_LPORT_OFFLINE_COMPLETE \
272 (STMF_CMD_LPORT_OP | STMF_CMD_OFFLINE_COMPLETE)
273 #define STMF_ACK_LU_OFFLINE_COMPLETE \
274 (STMF_CMD_LU_OP | STMF_ACK_OFFLINE_COMPLETE)
275 #define STMF_ACK_LPORT_OFFLINE_COMPLETE \
276 (STMF_CMD_LPORT_OP | STMF_ACK_OFFLINE_COMPLETE)
278 * For LPORTs and LUs to create their own ctl cmds which dont
279 * conflict with stmf ctl cmds.
281 #define STMF_LPORT_CTL_CMDS 0x1000
282 #define STMF_LU_CTL_CMDS 0x2000
285 * Commands for various info routines.
287 /* Command classifiers */
288 #define SI_LPORT 0x1000000
289 #define SI_STMF 0x2000000
290 #define SI_LU 0x4000000
291 #define SI_LPORT_FC 0x0000000
292 #define SI_LPORT_ISCSI 0x0010000
293 #define SI_LPORT_SAS 0x0020000
294 #define SI_STMF_LU 0x0010000
295 #define SI_STMF_LPORT 0x0020000
297 #define SI_GET_CLASS(v) ((v) & 0xFF000000)
298 #define SI_GET_SUBCLASS(v) ((v) & 0x00FF0000)
300 /* Commands for LPORT info routines */
301 /* XXX - Implement these. */
302 #if 0
303 #define SI_LPORT_FC_PORTINFO (SI_LPORT | SI_LPORT_FC | 1)
304 #define SI_RPORT_FC_PORTINFO (SI_LPORT | SI_LPORT_FC | 2)
305 #endif
308 * Events
310 #define STMF_EVENT_ALL ((int)-1)
311 #define LPORT_EVENT_INITIAL_LUN_MAPPED 0
314 * This needs to go into common/ddi/sunddi.h
316 #define DDI_NT_STMF "ddi_scsi_target:framework"
317 #define DDI_NT_STMF_LP "ddi_scsi_target:lu_provider"
318 #define DDI_NT_STMF_PP "ddi_scsi_target:port_provider"
321 * VPD page bits.
323 #define STMF_VPD_LU_ID 0x01
324 #define STMF_VPD_TARGET_ID 0x02
325 #define STMF_VPD_TP_GROUP 0x04
326 #define STMF_VPD_RELATIVE_TP_ID 0x08
329 * Common macros to simplify coding
331 #define STMF_SEC2TICK(x_sec) (drv_usectohz((x_sec) * 1000000))
333 void stmf_trace(caddr_t ident, const char *fmt, ...);
334 void *stmf_alloc(stmf_struct_id_t sid, int additional_size, int alloc_flags);
335 void stmf_free(void *struct_ptr);
336 struct scsi_task *stmf_task_alloc(struct stmf_local_port *lport,
337 struct stmf_scsi_session *ss, uint8_t *lun, uint16_t cdb_length,
338 uint16_t ext_id);
339 void stmf_post_task(scsi_task_t *task, stmf_data_buf_t *dbuf);
340 stmf_data_buf_t *stmf_alloc_dbuf(scsi_task_t *task, uint32_t size,
341 uint32_t *pminsize, uint32_t flags);
342 void stmf_free_dbuf(scsi_task_t *task, stmf_data_buf_t *dbuf);
343 stmf_status_t stmf_xfer_data(scsi_task_t *task, stmf_data_buf_t *dbuf,
344 uint32_t ioflags);
345 stmf_status_t stmf_send_scsi_status(scsi_task_t *task, uint32_t ioflags);
346 void stmf_data_xfer_done(scsi_task_t *task, stmf_data_buf_t *dbuf,
347 uint32_t iof);
348 void stmf_send_status_done(scsi_task_t *task, stmf_status_t s, uint32_t iof);
349 void stmf_task_lu_done(scsi_task_t *task);
350 void stmf_abort(int abort_cmd, scsi_task_t *task, stmf_status_t s, void *arg);
351 void stmf_task_lu_aborted(scsi_task_t *task, stmf_status_t s, uint32_t iof);
352 void stmf_task_lport_aborted(scsi_task_t *task, stmf_status_t s, uint32_t iof);
353 stmf_status_t stmf_task_poll_lu(scsi_task_t *task, uint32_t timeout);
354 stmf_status_t stmf_task_poll_lport(scsi_task_t *task, uint32_t timeout);
355 stmf_status_t stmf_ctl(int cmd, void *obj, void *arg);
356 stmf_status_t stmf_register_itl_handle(struct stmf_lu *lu, uint8_t *lun,
357 struct stmf_scsi_session *ss, uint64_t session_id, void *itl_handle);
358 stmf_status_t stmf_deregister_itl_handle(struct stmf_lu *lu, uint8_t *lun,
359 struct stmf_scsi_session *ss, uint64_t session_id, void *itl_handle);
360 stmf_status_t stmf_deregister_all_lu_itl_handles(struct stmf_lu *lu);
361 stmf_status_t stmf_get_itl_handle(struct stmf_lu *lu, uint8_t *lun,
362 struct stmf_scsi_session *ss, uint64_t session_id, void **itl_handle_retp);
363 stmf_data_buf_t *stmf_handle_to_buf(scsi_task_t *task, uint8_t h);
364 stmf_status_t stmf_lu_add_event(struct stmf_lu *lu, int eventid);
365 stmf_status_t stmf_lu_remove_event(struct stmf_lu *lu, int eventid);
366 stmf_status_t stmf_lport_add_event(struct stmf_local_port *lport, int eventid);
367 stmf_status_t stmf_lport_remove_event(struct stmf_local_port *lport,
368 int eventid);
369 void stmf_wwn_to_devid_desc(struct scsi_devid_desc *sdid, uint8_t *wwn,
370 uint8_t protocol_id);
371 stmf_status_t stmf_scsilib_uniq_lu_id(uint32_t company_id,
372 struct scsi_devid_desc *lu_id);
373 void stmf_scsilib_send_status(scsi_task_t *task, uint8_t st, uint32_t saa);
374 uint32_t stmf_scsilib_prepare_vpd_page83(scsi_task_t *task, uint8_t *page,
375 uint32_t page_len, uint8_t byte0, uint32_t vpd_mask);
376 void stmf_scsilib_handle_report_tpgs(scsi_task_t *task, stmf_data_buf_t *dbuf);
377 void stmf_scsilib_handle_task_mgmt(scsi_task_t *task);
379 #ifdef __cplusplus
381 #endif
383 #endif /* _STMF_H */