1 | /* $NetBSD: twevar.h,v 1.30 2012/10/27 17:18:35 chs Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2000, 2001, 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 | * |
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. |
30 | */ |
31 | |
32 | #ifndef _PCI_TWEVAR_H_ |
33 | #define _PCI_TWEVAR_H_ |
34 | |
35 | #define TWE_MAX_QUEUECNT 129 |
36 | |
37 | /* Callbacks from controller to array. */ |
38 | struct twe_callbacks { |
39 | void (*tcb_openings)(device_t, int); |
40 | }; |
41 | |
42 | /* Per-array drive information. */ |
43 | struct twe_drive { |
44 | uint32_t td_size; |
45 | uint8_t td_type; |
46 | uint8_t td_stripe; |
47 | |
48 | device_t td_dev; |
49 | const struct twe_callbacks *td_callbacks; |
50 | }; |
51 | |
52 | /* Per-controller state. */ |
53 | struct twe_softc { |
54 | device_t sc_dev; |
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; |
59 | void *sc_ih; |
60 | void * sc_cmds; |
61 | bus_addr_t sc_cmds_paddr; |
62 | int sc_nccbs; |
63 | struct twe_ccb *sc_ccbs; |
64 | SIMPLEQ_HEAD(, twe_ccb) sc_ccb_queue; |
65 | SLIST_HEAD(, twe_ccb) sc_ccb_freelist; |
66 | int sc_flags; |
67 | int sc_openings; |
68 | int sc_nunits; |
69 | struct twe_drive sc_units[TWE_MAX_UNITS]; |
70 | |
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]; |
74 | int sc_aen_head; |
75 | int sc_aen_tail; |
76 | }; |
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 */ |
81 | |
82 | /* Optional per-command context. */ |
83 | struct twe_context { |
84 | void (*tx_handler)(struct twe_ccb *, int); |
85 | void *tx_context; |
86 | device_t tx_dv; |
87 | }; |
88 | |
89 | /* Command control block. */ |
90 | struct twe_ccb { |
91 | union { |
92 | SIMPLEQ_ENTRY(twe_ccb) simpleq; |
93 | SLIST_ENTRY(twe_ccb) slist; |
94 | } ccb_chain; |
95 | struct twe_cmd *ccb_cmd; |
96 | int ccb_cmdid; |
97 | int ccb_flags; |
98 | void *ccb_data; |
99 | int ccb_datasize; |
100 | vaddr_t ccb_abuf; |
101 | bus_dmamap_t ccb_dmamap_xfer; |
102 | struct twe_context ccb_tx; |
103 | }; |
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 */ |
110 | |
111 | struct twe_attach_args { |
112 | int twea_unit; |
113 | }; |
114 | |
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 *); |
123 | |
124 | void twe_ccb_wait_handler(struct twe_ccb *, int); |
125 | |
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 *); |
131 | |
132 | void twe_register_callbacks(struct twe_softc *, int, |
133 | const struct twe_callbacks *); |
134 | |
135 | static __inline size_t twe_get_maxsegs(void) { |
136 | size_t max_segs = ((MAXPHYS + PAGE_SIZE - 1) / PAGE_SIZE) + 1; |
137 | #ifdef TWE_SG_SIZE |
138 | if (TWE_SG_SIZE < max_segs) |
139 | max_segs = TWE_SG_SIZE; |
140 | #endif |
141 | return max_segs; |
142 | } |
143 | |
144 | static __inline size_t twe_get_maxxfer(size_t maxsegs) { |
145 | return (maxsegs - 1) * PAGE_SIZE; |
146 | } |
147 | |
148 | /* |
149 | * Structures used to convert numeric codes to strings. |
150 | */ |
151 | struct twe_code_table { |
152 | uint32_t code; |
153 | const char *string; |
154 | }; |
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[]; |
160 | |
161 | const char *twe_describe_code(const struct twe_code_table *, uint32_t); |
162 | |
163 | #endif /* !_PCI_TWEVAR_H_ */ |
164 | |