blob: 4be027b359b320ba2f325f211650f5a67d4317eb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_SCSI_ADAPTERS_FASCMD_H
#define _SYS_SCSI_ADAPTERS_FASCMD_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/note.h>
#include <sys/isa_defs.h>
#include <sys/scsi/scsi_types.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* The transport layer deals with things in terms of the following structure.
* Note that the target driver's view of things is the scsi_pkt that is
* enfolded as the first element of the following structure.
*
* the preferred the cdb size is 12. fas is a scsi2 HBA driver and
* rarely needs 16 byte cdb's
*/
/*
* preferred pkt_private length in 64-bit quantities
*/
#ifdef _LP64
#define PKT_PRIV_SIZE 2
#define PKT_PRIV_LEN 16 /* in bytes */
#else /* _ILP32 */
#define PKT_PRIV_SIZE 1
#define PKT_PRIV_LEN 8 /* in bytes */
#endif
#define PKT2CMD(pkt) ((struct fas_cmd *)(pkt)->pkt_ha_private)
#define CMD2PKT(sp) ((sp)->cmd_pkt)
#define EXTCMD_SIZE (sizeof (struct fas_cmd) + scsi_pkt_size())
#define EXTCMDS_STATUS_SIZE (sizeof (struct scsi_arq_status))
struct fas_cmd {
struct scsi_pkt *cmd_pkt; /* the generic packet itself */
struct fas_cmd *cmd_forw; /* ready fifo que link */
uchar_t *cmd_cdbp; /* active command pointer */
uint32_t cmd_data_count; /* aggregate data count */
uint32_t cmd_cur_addr; /* current dma address */
ushort_t cmd_qfull_retries;
ushort_t cmd_nwin; /* number of windows */
ushort_t cmd_cur_win; /* current window */
ushort_t cmd_saved_win; /* saved window */
uint32_t cmd_saved_data_count; /* saved aggr. count */
uint32_t cmd_saved_cur_addr; /* saved virt address */
int cmd_pkt_flags; /* copy of pkt_flags */
ddi_dma_handle_t cmd_dmahandle; /* dma handle */
ddi_dma_cookie_t cmd_dmacookie; /* current dma cookie */
uint32_t cmd_dmacount; /* total xfer count */
uchar_t cmd_cdb[CDB_SIZE]; /* 12 byte cdb */
uint_t cmd_flags; /* private flags */
struct scsi_arq_status cmd_scb;
uint_t cmd_scblen; /* length of scb */
uchar_t cmd_slot;
uchar_t cmd_age; /* cmd age (tagged queing) */
uint_t cmd_cdblen; /* length of cdb */
uint64_t cmd_pkt_private[PKT_PRIV_SIZE];
uint_t cmd_privlen; /* length of tgt private */
uchar_t cmd_tag[2]; /* command tag */
uchar_t cmd_actual_cdblen; /* length of cdb */
};
_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", fas_cmd))
/*
* private data for arq pkt
*/
struct arq_private_data {
struct buf *arq_save_bp;
struct fas_cmd *arq_save_sp;
};
/*
* A note about the cmd_cdb && cmd_scb structures:
*
* If the command allocation requested exceeds the size of CDB_SIZE,
* the cdb will be allocated outside this structure (via kmem_zalloc)
* The same applies to cmd_scb.
*/
/*
* These are the defined flags for this structure.
*/
#define CFLAG_CMDDISC 0x0001 /* cmd currently disconnected */
#define CFLAG_WATCH 0x0002 /* watchdog time for this command */
#define CFLAG_FINISHED 0x0004 /* command completed */
#define CFLAG_CHKSEG 0x0008 /* check cmd_data within seg */
#define CFLAG_COMPLETED 0x0010 /* completion routine called */
#define CFLAG_PREPARED 0x0020 /* pkt has been init'ed */
#define CFLAG_IN_TRANSPORT 0x0040 /* in use by host adapter driver */
#define CFLAG_RESTORE_PTRS 0x0080 /* implicit restore ptr on reconnect */
#define CFLAG_TRANFLAG 0x00ff /* covers transport part of flags */
#define CFLAG_CMDPROXY 0x000100 /* cmd is a 'proxy' command */
#define CFLAG_CMDARQ 0x000200 /* cmd is a 'rqsense' command */
#define CFLAG_DMAVALID 0x000400 /* dma mapping valid */
#define CFLAG_DMASEND 0x000800 /* data is going 'out' */
#define CFLAG_CMDIOPB 0x001000 /* this is an 'iopb' packet */
#define CFLAG_CDBEXTERN 0x002000 /* cdb kmem_alloc'd */
#define CFLAG_SCBEXTERN 0x004000 /* scb kmem_alloc'd */
#define CFLAG_FREE 0x008000 /* packet is on free list */
#define CFLAG_PRIVEXTERN 0x020000 /* target private kmem_alloc'd */
#define CFLAG_DMA_PARTIAL 0x040000 /* partial xfer OK */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_SCSI_ADAPTERS_FASCMD_H */
|