xref: /netbsd/sys/dev/ic/icpvar.h (revision bf9ec67e)
1 /*	$NetBSD: icpvar.h,v 1.1 2002/04/22 21:05:21 ad Exp $	*/
2 
3 /*-
4  * Copyright (c) 2002 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #ifndef _IC_ICPVAR_H_
40 #define _IC_ICPVAR_H_
41 
42 #include "locators.h"
43 
44 /*
45  * Miscellaneous constants.
46  */
47 #define ICP_RETRIES		6
48 #define	ICP_WATCHDOG_FREQ	5
49 #define	ICP_BUSY_WAIT_MS	2500
50 #define	ICP_MAX_XFER		65536
51 #define ICP_SCRATCH_SIZE	8192
52 #define	ICP_SCRATCH_SENSE \
53     (ICP_SCRATCH_SIZE - sizeof(struct scsipi_sense_data) * ICP_NCCBS)
54 
55 #define	ICP_NCCBS		ICP_MAX_CMDS
56 #define	ICP_NCCB_RESERVE	4
57 
58 /*
59  * Context structure for interrupt service.
60  */
61 struct icp_intr_ctx {
62 	u_int32_t	info;
63 	u_int32_t	info2;
64 	u_int16_t	cmd_status;
65 	u_int16_t	service;
66 	u_int8_t	istatus;
67 };
68 
69 /*
70  * Command control block.
71  */
72 struct icp_ccb {
73 	SIMPLEQ_ENTRY(icp_ccb) ic_chain;
74 	u_int		ic_service;
75 	u_int		ic_flags;
76 	u_int		ic_status;
77 	u_int		ic_ident;
78 	u_int		ic_nsgent;
79 	u_int		ic_cmdlen;
80 	u_int		ic_xfer_size;
81 	bus_dmamap_t	ic_xfer_map;
82 	struct icp_sg	*ic_sg;
83 	struct device	*ic_dv;
84 	void		*ic_context;
85 	void		(*ic_intr)(struct icp_ccb *);
86 	struct icp_cmd	ic_cmd;
87 };
88 #define	IC_XFER_IN	0x01	/* Map describes inbound xfer */
89 #define	IC_XFER_OUT	0x02	/* Map describes outbound xfer */
90 #define	IC_WAITING	0x04	/* We have waiters */
91 #define	IC_COMPLETE	0x08	/* Command completed */
92 #define	IC_ALLOCED	0x10	/* CCB allocated */
93 
94 /*
95  * Logical drive information.
96  */
97 struct icp_cachedrv {
98 	u_int		cd_size;
99 	u_int		cd_type;
100 };
101 
102 /*
103  * Per-controller context.
104  */
105 struct icp_softc {
106 	struct device		icp_dv;
107 	void			*icp_ih;
108 	bus_dma_tag_t		icp_dmat;
109 	bus_space_tag_t		icp_dpmemt;
110 	bus_space_handle_t	icp_dpmemh;
111 	bus_addr_t		icp_dpmembase;
112 	bus_space_tag_t		icp_iot;
113 	bus_space_handle_t	icp_ioh;
114 	bus_addr_t		icp_iobase;
115 
116 	int			icp_class;
117 	u_int16_t		icp_ic_all_size;
118 	u_int8_t		icp_bus_cnt;
119 	u_int8_t		icp_bus_id[ICP_MAXBUS];
120 	struct icp_cachedrv	icp_cdr[ICP_MAX_HDRIVES];
121 	int			icp_ndevs;
122 	int			icp_openings;
123 
124 	u_int32_t		icp_info;
125 	u_int32_t		icp_info2;
126 	u_int16_t		icp_status;
127 
128 	bus_dmamap_t		icp_scr_dmamap;
129 	bus_dma_segment_t	icp_scr_seg[1];
130 	caddr_t			icp_scr;
131 
132 	struct icp_ccb		*icp_ccbs;
133 	u_int			icp_nccbs;
134 	SIMPLEQ_HEAD(,icp_ccb)	icp_ccb_freelist;
135 	SIMPLEQ_HEAD(,icp_ccb)	icp_ccb_queue;
136 	struct callout		icp_wdog_callout;
137 
138 	void		(*icp_copy_cmd)(struct icp_softc *, struct icp_ccb *);
139 	u_int8_t	(*icp_get_status)(struct icp_softc *);
140 	void		(*icp_intr)(struct icp_softc *, struct icp_intr_ctx *);
141 	void		(*icp_release_event)(struct icp_softc *,
142 					     struct icp_ccb *);
143 	void		(*icp_set_sema0)(struct icp_softc *);
144 	int		(*icp_test_busy)(struct icp_softc *);
145 };
146 
147 #define ICP_ISA		0x01
148 #define ICP_EISA	0x02
149 #define ICP_PCI		0x03
150 #define ICP_PCINEW	0x04
151 #define ICP_MPR		0x05
152 #define ICP_CLASS_MASK	0x07
153 #define ICP_FC		0x10
154 #define ICP_CLASS(icp)	((icp)->icp_class & ICP_CLASS_MASK)
155 
156 int	icp_init(struct icp_softc *, const char *);
157 int	icp_intr(void *);
158 
159 /*
160  * Consumer interface.
161  */
162 struct icp_attach_args {
163 	int		icpa_unit;
164 };
165 
166 #define	icpacf_unit	cf_loc[ICPCF_UNIT]
167 
168 #define	ICPA_UNIT_SCSI	100
169 
170 struct icp_ccb	*icp_ccb_alloc(struct icp_softc *);
171 void	icp_ccb_enqueue(struct icp_softc *, struct icp_ccb *);
172 void	icp_ccb_free(struct icp_softc *, struct icp_ccb *);
173 int	icp_ccb_map(struct icp_softc *, struct icp_ccb *, void *, int, int);
174 int	icp_ccb_poll(struct icp_softc *, struct icp_ccb *, int);
175 void	icp_ccb_unmap(struct icp_softc *, struct icp_ccb *);
176 int	icp_ccb_wait(struct icp_softc *, struct icp_ccb *, int);
177 int	icp_cmd(struct icp_softc *, u_int8_t, u_int16_t, u_int32_t, u_int32_t,
178 		u_int32_t);
179 
180 #endif	/* !_IC_ICPVAR_H_ */
181