1 /* $NetBSD: twevar.h,v 1.28 2009/05/06 10:34:33 cegger Exp $ */
4 * Copyright (c) 2000, 2001, 2002 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #ifndef _PCI_TWEVAR_H_
33 #define _PCI_TWEVAR_H_
35 #define TWE_MAX_QUEUECNT 129
37 /* Callbacks from controller to array. */
38 struct twe_callbacks
{
39 void (*tcb_openings
)(device_t
, int);
42 /* Per-array drive information. */
49 const struct twe_callbacks
*td_callbacks
;
52 /* Per-controller state. */
55 bus_space_tag_t sc_iot
;
56 bus_space_handle_t sc_ioh
;
57 bus_dma_tag_t sc_dmat
;
58 bus_dmamap_t sc_dmamap
;
61 bus_addr_t sc_cmds_paddr
;
63 struct twe_ccb
*sc_ccbs
;
64 SIMPLEQ_HEAD(, twe_ccb
) sc_ccb_queue
;
65 SLIST_HEAD(, twe_ccb
) sc_ccb_freelist
;
69 struct twe_drive sc_units
[TWE_MAX_UNITS
];
71 /* Asynchronous event notification queue for management tools. */
72 #define TWE_AEN_Q_LENGTH 256
73 uint16_t sc_aen_queue
[TWE_AEN_Q_LENGTH
];
77 #define TWEF_OPEN 0x01 /* control device is opened */
78 #define TWEF_AENQ_WAIT 0x02 /* someone waiting for AENs */
79 #define TWEF_AEN 0x04 /* AEN fetch in progress */
80 #define TWEF_WAIT_CCB 0x08 /* someone waiting for a CCB */
82 /* Optional per-command context. */
84 void (*tx_handler
)(struct twe_ccb
*, int);
89 /* Command control block. */
92 SIMPLEQ_ENTRY(twe_ccb
) simpleq
;
93 SLIST_ENTRY(twe_ccb
) slist
;
95 struct twe_cmd
*ccb_cmd
;
101 bus_dmamap_t ccb_dmamap_xfer
;
102 struct twe_context ccb_tx
;
104 #define TWE_CCB_DATA_IN 0x01 /* Map describes inbound xfer */
105 #define TWE_CCB_DATA_OUT 0x02 /* Map describes outbound xfer */
106 #define TWE_CCB_COMPLETE 0x04 /* Command completed */
107 #define TWE_CCB_ACTIVE 0x08 /* Command active */
108 #define TWE_CCB_AEN 0x10 /* For AEN retrieval */
109 #define TWE_CCB_ALLOCED 0x20 /* CCB allocated */
111 struct twe_attach_args
{
115 struct twe_ccb
*twe_ccb_alloc(struct twe_softc
*, int);
116 struct twe_ccb
*twe_ccb_alloc_wait(struct twe_softc
*, int);
117 void twe_ccb_enqueue(struct twe_softc
*sc
, struct twe_ccb
*ccb
);
118 void twe_ccb_free(struct twe_softc
*sc
, struct twe_ccb
*);
119 int twe_ccb_map(struct twe_softc
*, struct twe_ccb
*);
120 int twe_ccb_poll(struct twe_softc
*, struct twe_ccb
*, int);
121 int twe_ccb_submit(struct twe_softc
*, struct twe_ccb
*);
122 void twe_ccb_unmap(struct twe_softc
*, struct twe_ccb
*);
124 void twe_ccb_wait_handler(struct twe_ccb
*, int);
126 int twe_param_get(struct twe_softc
*, int, int, size_t,
127 void (*)(struct twe_ccb
*, int), struct twe_param
**);
128 int twe_param_get_1(struct twe_softc
*, int, int, uint8_t *);
129 int twe_param_get_2(struct twe_softc
*, int, int, uint16_t *);
130 int twe_param_get_4(struct twe_softc
*, int, int, uint32_t *);
132 void twe_register_callbacks(struct twe_softc
*, int,
133 const struct twe_callbacks
*);
135 static __inline
size_t twe_get_maxsegs(void) {
136 size_t max_segs
= ((MAXPHYS
+ PAGE_SIZE
- 1) / PAGE_SIZE
) + 1;
138 if (TWE_SG_SIZE
< max_segs
)
139 max_segs
= TWE_SG_SIZE
;
144 static __inline
size_t twe_get_maxxfer(size_t maxsegs
) {
145 return (maxsegs
- 1) * PAGE_SIZE
;
149 * Structures used to convert numeric codes to strings.
151 struct twe_code_table
{
155 extern const struct twe_code_table twe_table_status
[];
156 extern const struct twe_code_table twe_table_unitstate
[];
157 extern const struct twe_code_table twe_table_unittype
[];
158 extern const struct twe_code_table twe_table_stripedepth
[];
159 extern const struct twe_code_table twe_table_aen
[];
161 const char *twe_describe_code(const struct twe_code_table
*, uint32_t);
163 #endif /* !_PCI_TWEVAR_H_ */