FreeBSD/Linux Kernel Cross Reference
sys/dev/aic/aicvar.h
1 /*-
2 * Copyright (c) 1999 Luoqi Chen.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD$
27 */
28
29 #include "aic.h"
30
31 struct aic_transinfo {
32 u_int8_t period;
33 u_int8_t offset;
34 };
35
36 struct aic_tinfo {
37 u_int16_t lubusy;
38 u_int8_t flags;
39 u_int8_t scsirate;
40 struct aic_transinfo current;
41 struct aic_transinfo goal;
42 struct aic_transinfo user;
43 };
44
45 #define TINFO_DISC_ENB 0x01
46 #define TINFO_TAG_ENB 0x02
47 #define TINFO_SDTR_NEGO 0x04
48 #define TINFO_SDTR_SENT 0x08
49
50 struct aic_scb {
51 union ccb *ccb;
52 u_int8_t flags;
53 u_int8_t tag;
54 u_int8_t target;
55 u_int8_t lun;
56 u_int8_t status;
57 u_int8_t cmd_len;
58 u_int8_t *cmd_ptr;
59 u_int32_t data_len;
60 u_int8_t *data_ptr;
61 };
62
63 #define ccb_scb_ptr spriv_ptr0
64 #define ccb_aic_ptr spriv_ptr1
65
66 #define SCB_ACTIVE 0x01
67 #define SCB_DISCONNECTED 0x02
68 #define SCB_DEVICE_RESET 0x04
69 #define SCB_SENSE 0x08
70
71 struct aic_softc {
72 int unit;
73 bus_space_tag_t tag;
74 bus_space_handle_t bsh;
75 bus_dma_tag_t dmat;
76
77 struct cam_sim *sim;
78 struct cam_path *path;
79 TAILQ_HEAD(,ccb_hdr) pending_ccbs, nexus_ccbs;
80 struct aic_scb *nexus;
81
82 u_int32_t flags;
83 u_int8_t initiator;
84 u_int8_t state;
85 u_int8_t target;
86 u_int8_t lun;
87 u_int8_t prev_phase;
88
89 u_int8_t msg_outq;
90 u_int8_t msg_sent;
91 int msg_len;
92 char msg_buf[8];
93
94 struct aic_tinfo tinfo[8];
95 struct aic_scb scbs[256];
96 #ifdef PC98
97 bus_addr_t *bsh_iat;
98 #endif
99 };
100
101 #define AIC_DISC_ENABLE 0x01
102 #define AIC_DMA_ENABLE 0x02
103 #define AIC_PARITY_ENABLE 0x04
104 #define AIC_DWIO_ENABLE 0x08
105 #define AIC_RESOURCE_SHORTAGE 0x10
106 #define AIC_DROP_MSGIN 0x20
107 #define AIC_BUSFREE_OK 0x40
108
109 #define AIC_IDLE 0x00
110 #define AIC_SELECTING 0x01
111 #define AIC_RESELECTED 0x02
112 #define AIC_RECONNECTING 0x03
113 #define AIC_HASNEXUS 0x04
114
115 #define AIC_MSG_IDENTIFY 0x01
116 #define AIC_MSG_TAG_Q 0x02
117 #define AIC_MSG_SDTR 0x04
118 #define AIC_MSG_WDTR 0x08
119 #define AIC_MSG_MSGBUF 0x80
120
121 #define AIC_SYNC_PERIOD (200 / 4)
122 #define AIC_SYNC_OFFSET 8
123
124 #ifdef PC98
125 #define AIC98_GENERIC 0x00
126 #define AIC98_NEC100 0x01
127
128 #define AIC_TYPE98(x) (((x) >> 16) & 0xff)
129
130 #define aic_inb(aic, port) \
131 bus_space_read_1((aic)->tag, (aic)->bsh, (aic)->bsh_iat[(port)])
132
133 #define aic_outb(aic, port, value) \
134 bus_space_write_1((aic)->tag, (aic)->bsh, (aic)->bsh_iat[(port)], \
135 (value))
136
137 #define aic_insb(aic, port, addr, count) \
138 bus_space_read_multi_1((aic)->tag, (aic)->bsh, \
139 (aic)->bsh_iat[(port)], (addr), (count))
140
141 #define aic_outsb(aic, port, addr, count) \
142 bus_space_write_multi_1((aic)->tag, (aic)->bsh, \
143 (aic)->bsh_iat[(port)], (addr), (count))
144
145 #define aic_insw(aic, port, addr, count) \
146 bus_space_read_multi_2((aic)->tag, (aic)->bsh, \
147 (aic)->bsh_iat[(port)], (u_int16_t *)(addr), (count))
148
149 #define aic_outsw(aic, port, addr, count) \
150 bus_space_write_multi_2((aic)->tag, (aic)->bsh, \
151 (aic)->bsh_iat[(port)], (u_int16_t *)(addr), (count))
152
153 #define aic_insl(aic, port, addr, count) \
154 bus_space_read_multi_4((aic)->tag, (aic)->bsh, \
155 (aic)->bsh_iat[(port)], (u_int32_t *)(addr), (count))
156
157 #define aic_outsl(aic, port, addr, count) \
158 bus_space_write_multi_4((aic)->tag, (aic)->bsh, \
159 (aic)->bsh_iat[(port)], (u_int32_t *)(addr), (count))
160
161 #else /* !PC98 */
162 #define aic_inb(aic, port) \
163 bus_space_read_1((aic)->tag, (aic)->bsh, (port))
164
165 #define aic_outb(aic, port, value) \
166 bus_space_write_1((aic)->tag, (aic)->bsh, (port), (value))
167
168 #define aic_insb(aic, port, addr, count) \
169 bus_space_read_multi_1((aic)->tag, (aic)->bsh, (port), (addr), (count))
170
171 #define aic_outsb(aic, port, addr, count) \
172 bus_space_write_multi_1((aic)->tag, (aic)->bsh, (port), (addr), (count))
173
174 #define aic_insw(aic, port, addr, count) \
175 bus_space_read_multi_2((aic)->tag, (aic)->bsh, (port), \
176 (u_int16_t *)(addr), (count))
177
178 #define aic_outsw(aic, port, addr, count) \
179 bus_space_write_multi_2((aic)->tag, (aic)->bsh, (port), \
180 (u_int16_t *)(addr), (count))
181
182 #define aic_insl(aic, port, addr, count) \
183 bus_space_read_multi_4((aic)->tag, (aic)->bsh, (port), \
184 (u_int32_t *)(addr), (count))
185
186 #define aic_outsl(aic, port, addr, count) \
187 bus_space_write_multi_4((aic)->tag, (aic)->bsh, (port), \
188 (u_int32_t *)(addr), (count))
189 #endif /* PC98 */
190
191 extern int aic_probe __P((struct aic_softc *));
192 extern int aic_attach __P((struct aic_softc *));
193 extern int aic_detach __P((struct aic_softc *));
194 extern void aic_intr __P((void *));
195
196 extern struct aic_softc aic_softcs[];
197 extern int aic_unit;
Cache object: 718f324beb296215b8453db7f95dff94
|