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