1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_1394_TARGETS_SCSA1394_CMD_H
28 #define	_SYS_1394_TARGETS_SCSA1394_CMD_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 /*
33  * scsa1394 command
34  */
35 
36 #include <sys/scsi/scsi_types.h>
37 #include <sys/1394/targets/scsa1394/sbp2.h>
38 #include <sys/note.h>
39 
40 #ifdef	__cplusplus
41 extern "C" {
42 #endif
43 
44 /* preferred pkt_private length in 64-bit quantities */
45 #ifdef  _LP64
46 #define	SCSA1394_CMD_PRIV_SIZE	2
47 #else /* _ILP32 */
48 #define	SCSA1394_CMD_PRIV_SIZE	1
49 #endif
50 #define	SCSA1394_CMD_PRIV_LEN   (SCSA1394_CMD_PRIV_SIZE * sizeof (uint64_t))
51 
52 /* entry describing a page table segment */
53 typedef struct scsa1394_cmd_seg {
54 	size_t			ss_len;
55 	uint64_t		ss_daddr;
56 	uint64_t		ss_baddr;
57 	t1394_addr_handle_t	ss_addr_hdl;
58 } scsa1394_cmd_seg_t;
59 
60 /* command packet structure */
61 typedef struct scsa1394_cmd {
62 	sbp2_task_t		sc_task;	/* corresponding SBP-2 task */
63 	struct scsa1394_lun	*sc_lun;	/* lun it belongs to */
64 	int			sc_state;	/* command state */
65 	int			sc_flags;	/* command flags */
66 	struct buf		*sc_bp;		/* data buffer */
67 	struct scsi_pkt		*sc_pkt;	/* corresponding scsi pkt */
68 	size_t			sc_cdb_len;
69 	size_t			sc_cdb_actual_len;
70 	size_t			sc_scb_len;
71 	size_t			sc_priv_len;
72 	uchar_t			sc_cdb[SCSI_CDB_SIZE];
73 	uchar_t			sc_pkt_cdb[SCSI_CDB_SIZE];
74 	struct scsi_arq_status	sc_scb;
75 	uint64_t		sc_priv[SCSA1394_CMD_PRIV_SIZE];
76 	clock_t			sc_start_time;
77 	int			sc_timeout;
78 
79 	/* DMA: command ORB */
80 	ddi_dma_handle_t	sc_orb_dma_hdl;
81 	ddi_acc_handle_t	sc_orb_acc_hdl;
82 	ddi_dma_cookie_t	sc_orb_dmac;
83 	t1394_addr_handle_t	sc_orb_addr_hdl;
84 
85 	/* DMA: data buffer */
86 	ddi_dma_handle_t	sc_buf_dma_hdl;
87 	uint_t			sc_buf_nsegs;	/* # of segments/cookies */
88 	uint_t			sc_buf_nsegs_alloc; /* # of entries allocated */
89 	scsa1394_cmd_seg_t	*sc_buf_seg;	/* segment array */
90 	scsa1394_cmd_seg_t	sc_buf_seg_mem;	/* backstore for one segment */
91 	uint_t			sc_nwin;	/* # windows */
92 	uint_t			sc_curwin;	/* current window */
93 	off_t			sc_win_offset;	/* current window offset */
94 	size_t			sc_win_len;	/* current window length */
95 	size_t			sc_xfer_bytes;	/* current xfer byte count */
96 	size_t			sc_xfer_blks;	/* current xfer blk count */
97 
98 	/* DMA: page table */
99 	ddi_dma_handle_t	sc_pt_dma_hdl;
100 	ddi_acc_handle_t	sc_pt_acc_hdl;
101 	ddi_dma_cookie_t	sc_pt_dmac;
102 	caddr_t			sc_pt_kaddr;
103 	uint64_t		sc_pt_baddr;
104 	t1394_addr_handle_t	sc_pt_addr_hdl;
105 	size_t			sc_pt_ent_alloc; /* # allocated entries */
106 	int			sc_pt_cmd_size;
107 
108 	/* for symbios mode only */
109 	int			sc_lba;		/* start LBA */
110 	int			sc_blk_size;	/* xfer block size */
111 	size_t			sc_total_blks;	/* total xfer blocks */
112 	size_t			sc_resid_blks;	/* blocks left */
113 
114 	struct scsi_pkt		sc_scsi_pkt;	/* embedded SCSI packet */
115 } scsa1394_cmd_t;
116 
117 _NOTE(SCHEME_PROTECTS_DATA("unique per task", { scsa1394_cmd scsa1394_cmd_seg
118     scsi_pkt scsi_inquiry scsi_extended_sense scsi_cdb scsi_arq_status }))
119 
120 #define	PKT2CMD(pktp)	((scsa1394_cmd_t *)((pktp)->pkt_ha_private))
121 #define	CMD2PKT(cmdp)	((struct scsi_pkt *)((cmdp)->sc_pkt))
122 #define	TASK2CMD(task)	((scsa1394_cmd_t *)(task)->ts_drv_priv)
123 #define	CMD2TASK(cmdp)	((sbp2_task_t *)&(cmdp)->sc_task)
124 
125 /* state */
126 enum {
127 	SCSA1394_CMD_INIT,
128 	SCSA1394_CMD_START,
129 	SCSA1394_CMD_STATUS
130 };
131 
132 /* flags */
133 enum {
134 	SCSA1394_CMD_CDB_EXT		= 0x0001,
135 	SCSA1394_CMD_PRIV_EXT		= 0x0002,
136 	SCSA1394_CMD_SCB_EXT		= 0x0004,
137 	SCSA1394_CMD_EXT		= (SCSA1394_CMD_CDB_EXT |
138 					    SCSA1394_CMD_PRIV_EXT |
139 					    SCSA1394_CMD_SCB_EXT),
140 
141 	SCSA1394_CMD_DMA_CDB_VALID	= 0x0008,
142 	SCSA1394_CMD_DMA_BUF_BIND_VALID	= 0x0010,
143 	SCSA1394_CMD_DMA_BUF_PT_VALID	= 0x0020,
144 	SCSA1394_CMD_DMA_BUF_ADDR_VALID	= 0x0040,
145 	SCSA1394_CMD_DMA_BUF_VALID	= (SCSA1394_CMD_DMA_BUF_BIND_VALID |
146 					    SCSA1394_CMD_DMA_BUF_ADDR_VALID |
147 					    SCSA1394_CMD_DMA_BUF_PT_VALID),
148 	SCSA1394_CMD_DMA_BUF_MAPIN	= 0x0080,
149 
150 	SCSA1394_CMD_READ		= 0x0100,
151 	SCSA1394_CMD_WRITE		= 0x0200,
152 	SCSA1394_CMD_RDWR		= (SCSA1394_CMD_READ |
153 					    SCSA1394_CMD_WRITE),
154 
155 	SCSA1394_CMD_SYMBIOS_BREAKUP	= 0x400
156 };
157 
158 #ifdef	__cplusplus
159 }
160 #endif
161 
162 #endif	/* _SYS_1394_TARGETS_SCSA1394_CMD_H */
163